ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZDU4YWMKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDQgQEAKK01ha2VmaWxlCisqfgorKi5vCiticGZfZmlsdGVyLmMKK2NvbmZpZy5oCitjb25maWcubG9nCitjb25maWcuY2FjaGUKK2NvbmZpZy5zdGF0dXMKK3N0YW1wLWgKK3N0YW1wLWguaW4KK2F1dG9tNHRlLmNhY2hlLworLmRldmVsCitmaWx0ZXJ0ZXN0CitmaW5kYWxsZGV2c3Rlc3QKK2dyYW1tYXIuYworbGlicGNhcC5hCitsaWJwY2FwLiouZHlsaWIKK2xpYnBjYXAuc2wKK2xpYnBjYXAuc28uKgorbGlicGNhcC0qLnRhci5negorbmV0Citvcy1wcm90by5oCitwY2FwLWNvbmZpZworcGNhcC1maWx0ZXIubWFubWlzYworcGNhcC1saW5rdHlwZS5tYW5taXNjCitwY2FwLXNhdmVmaWxlLm1hbmZpbGUKK3BjYXAtdHN0YW1wLm1hbm1pc2MKK3BjYXAuM3BjYXAKK3BjYXBfY29tcGlsZS4zcGNhcAorcGNhcF9kYXRhbGluay4zcGNhcAorcGNhcF9kdW1wX29wZW4uM3BjYXAKK3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKK3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAKK3BjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAKK3BjYXBfb3Blbl9kZWFkLjNwY2FwCitwY2FwX29wZW5fb2ZmbGluZS4zcGNhcAorcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcAorcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAKK3NjYW5uZXIuYworc2Nhbm5lci5oCitzZWxwb2xsdGVzdAordG9rZGVmcy5oCit2ZXJzaW9uLmMKK3ZlcnNpb24uaApkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdmYWMxCi0tLSAvZGV2L251bGwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTAsMCArMSw1IEBACitsYW5ndWFnZTogYworCitzY3JpcHQ6CisgIC0gLi9jb25maWd1cmUKKyAgLSBtYWtlCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawppbmRleCAxMzM1ZDc1Li4yZDgyYmFmIDEwMDY0NAotLS0gYS9BbmRyb2lkLm1rCisrKyBiL0FuZHJvaWQubWsKQEAgLTEsMjIgKzEsMTggQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK2xpYnBjYXBfUFNSQyA9CXBjYXAtbGludXguYyBwY2FwLXVzYi1saW51eC5jICBwY2FwLWNhbi1saW51eC5jIHBjYXAtbmV0ZmlsdGVyLWxpbnV4LmMgIAorbGlicGNhcF9GU1JDID0gIGZhZC1naWZjLmMKK2xpYnBjYXBfQ1NSQyA9CXBjYXAuYyBpbmV0LmMgZ2VuY29kZS5jIG9wdGltaXplLmMgbmFtZXRvYWRkci5jIGV0aGVyZW50LmMgXAorCXNhdmVmaWxlLmMgc2YtcGNhcC5jIHNmLXBjYXAtbmcuYyBwY2FwLWNvbW1vbi5jIFwKKwlicGZfaW1hZ2UuYyBicGZfZHVtcC5jCitsaWJwY2FwX0dFTlNSQyA9IHNjYW5uZXIuYyBncmFtbWFyLmMgYnBmX2ZpbHRlci5jIHZlcnNpb24uYworCitsaWJwY2FwX1NSQyA9CSQobGlicGNhcF9QU1JDKSAkKGxpYnBjYXBfRlNSQykgJChsaWJwY2FwX0NTUkMpICQobGlicGNhcF9HRU5TUkMpCisKKwogTE9DQUxfU1JDX0ZJTEVTOj1cCi0JYnBmX2R1bXAuY1wKLQlicGYvbmV0L2JwZl9maWx0ZXIuY1wKLQlicGZfaW1hZ2UuY1wKLQlldGhlcmVudC5jXAotCWZhZC1naWZjLmNcCi0JZ2VuY29kZS5jXAotCWdyYW1tYXIuY1wKLQlpbmV0LmNcCi0JbmFtZXRvYWRkci5jXAotCW9wdGltaXplLmNcCi0JcGNhcC5jXAotCXBjYXAtbGludXguY1wKLQlzYXZlZmlsZS5jXAotCXNjYW5uZXIuY1wKLQl2ZXJzaW9uLmMKKwkkKGxpYnBjYXBfU1JDKQogCiBMT0NBTF9DRkxBR1M6PS1PMiAtZwogTE9DQUxfQ0ZMQUdTKz0tREhBVkVfQ09ORklHX0ggLURfVV89Il9fYXR0cmlidXRlX18oKHVudXNlZCkpIiAtRGxpbnV4IC1EX19HTElCQ19fIC1EX0dOVV9TT1VSQ0UKZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmluZGV4IDUzNmUxYTIuLjY0NzM0YjUgMTAwNjQ0Ci0tLSBhL0NIQU5HRVMKKysrIGIvQ0hBTkdFUwpAQCAtMSwyOCArMSwyNzggQEAKLUAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvQ0hBTkdFUyx2IDEuNTkuMi4xMyAyMDA3LzA5LzEyIDIyOjQwOjA0IGtlbiBFeHAgJCAoTEJMKQorV2VkbmVzZGF5IERlY2VtYmVyIDE4LCAyMDEzIGd1eUBhbHVtLm1pdC5lZHUKK1N1bW1hcnkgZm9yIDEuNS4zIGxpYnBjYXAgcmVsZWFzZQorCURvbid0IGxldCBwYWNrZXRzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgZmlsdGVyIGdldCB0byB0aGUKKwkgICAgYXBwbGljYXRpb24gd2hlbiBUUEFDS0VUX1YzIGlzIHVzZWQuIChHaXRIdWIgaXNzdWUgIzMzMSkKKwlGaXggaGFuZGxpbmcgb2YgcGNhcF9sb29wKCkvcGNhcF9kaXNwYXRjaCgpIHdpdGggYSBwYWNrZXQgY291bnQKKwkgICAgb2YgMCBvbiBzb21lIHBsYXRmb3JtcyAoaW5jbHVkaW5nIExpbnV4IHdpdGggVFBBQ0tFVF9WMykuCisJICAgIChHaXRIdWIgaXNzdWUgIzMzMykKKwlXb3JrIGFyb3VuZCBUUEFDS0VUX1YzIGRlZmljaWVuY3kgdGhhdCBjYXVzZXMgcGFja2V0cyB0byBiZSBsb3N0CisJICAgIHdoZW4gYSB0aW1lb3V0IG9mIDAgaXMgc3BlY2lmaWVkLiAoR2l0SHViIGlzc3VlICMzMzUpCisJTWFuIHBhZ2UgZm9ybWF0dGluZyBmaXhlcy4KIAotTW9uLglTZXB0ZW1iZXIgMTAsIDIwMDcuICBrZW5AeGVsZXJhbmNlLmNvbS4gIFN1bW1hcnkgZm9yIDAuOS44IGxpYnBjYXAgcmVsZWFzZQotCUNoYW5nZSBidWlsZCBwcm9jZXNzIHRvIHB1dCBwdWJsaWMgbGlicGNhcCBoZWFkZXJzIGludG8gcGNhcCBzdWJpcgotCURMVDogQWRkIHZhbHVlIGZvciBJUE1JIElQTUIgcGFja2V0cwotCURMVDogQWRkIHZhbHVlIGZvciB1MTAgTmV0d29ya3MgYm9hcmRzCi0JUmVxdWlyZSA8bmV0L3BmdmFyLmg+IGZvciBwZiBkZWZpbml0aW9ucyAtIGFsbG93cyByZWFkaW5nIG9mIHBmbG9nIGZvcm1hdHRlZCAKLQkgbGlicGNhcCBmaWxlcyBvbiBhbiBPUyBvdGhlciB0aGFuIHdoZXJlIHRoZSBmaWxlIHdhcyBnZW5lcmF0ZWQKK1dlZG5lc2RheSBEZWNlbWJlciA0LCAyMDEzIGd1eUBhbHVtLm1pdC5lZHUKK1N1bW1hcnkgZm9yIDEuNS4yIGxpYnBjYXAgcmVsZWFzZQorCUZpeCBsaWJwY2FwIHRvIHdvcmsgd2hlbiBjb21waWxlZCB3aXRoIFRQQUNLRVRfVjMgc3VwcG9ydCBhbmQKKwkgICAgcnVubmluZyBvbiBhIGtlcm5lbCB3aXRob3V0IFRQQUNLRVRfVjMgc3VwcG9ydC4gKEdpdEh1YgorCSAgICBpc3N1ZSAjMzI5KQogCi1XZWQuCUp1bHkgMjMsIDIwMDcuICBtY3JAeGVsZXJhbmNlLmNvbS4gIFN1bW1hcnkgZm9yIDAuOS43IGxpYnBjYXAgcmVsZWFzZQorV2VkbmVzZGF5IE5vdmVtYmVyIDIwLCAyMDEzIGd1eUBhbHVtLm1pdC5lZHUKK1N1bW1hcnkgZm9yIDEuNS4xIGxpYnBjYXAgcmVsZWFzZQorCVJlcG9ydCBhbiBlcnJvciwgcmF0aGVyIHRoYW4gY3Jhc2hpbmcsIGlmIGFuIElQdjYgYWRkcmVzcyBpcworCSAgICB1c2VkIGZvciBsaW5rLWxheWVyIGZpbHRlcmluZy4gIChXaXJlc2hhcmsgYnVnIDkzNzYpCiAKLQlGSVhFRCB2ZXJzaW9uIGZpbGUgdG8gYmUgMC45LjcgaW5zdGVhZCBvZiAwLjkuNS4KLQlhZGRlZCBmbGFncy9jb25maWd1cmF0aW9uIGZvciBjbG9uaW5nIGJwZiBkZXZpY2UuCi0JYWRkZWQgRExUX01UUDJfV0lUSF9QSERSIHN1cHBvcnQgKFBQSSkKLSAgICAgICAgImZpeCIgdGhlICJtZW1vcnkgbGVhayIgaW4gaWNvZGVfdG9fZmNvZGUoKSAtLSBkb2N1bWVudGF0aW9uIGJ1ZwotICAgICAgICBWYXJpb3VzIGxpbmstbGF5ZXIgdHlwZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyLCBmb3IgU0lUQSBodHRwOi8vd3d3LnNpdGEuYWVyby8KLQlpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBEQUcgRVJGIHR5cGUgVFlQRV9DT0xPUl9NQ19IRExDX1BPUy4KLQlCYXNpYyBCUEYgZmlsdGVyaW5nIHN1cHBvcnQgZm9yIERMVF9NVFAyX1dJVEhfUEhEUiBpcyBhbHNvIGFkZGVkLgotICAgICAgICBjaGVjayBmb3IgSVB2NCBhbmQgSVB2NiwgZXZlbiBmb3IgRExUX1JBVyAKLQlhZGQgc3VwcG9ydCBmb3IgRExUX0pVTklQRVJfSVNNCi0gIAlQaWNrIHVwIGNoYW5nZXMgZnJvbSBOZXRCU0Q6IG1hbnkgZnJvbSB0cm9uLCBjaHJpc3RvcywgZHJvY2huZXIKLQlBbGxvY2F0ZSBETFRfIGZvciA4MDIuMTUuNCB3aXRob3V0IGFueSBoZWFkZXIgbXVuZ2luZywgZm9yIE1pa2tvIFNhYXJuaXZhbGEuCi0JSGVhZGVyIGZvciA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyIHBsdXMgYSByYWRpb3RhcCByYWRpbyBoZWFkZXIKK1dlZG5lc2RheSBPY3RvYmVyIDMwLCAyMDEzIGd1eUBhbHVtLm1pdC5lZHUKK1N1bW1hcnkgZm9yIDEuNS4wIGxpYnBjYXAgcmVsZWFzZQorCVRQQUNLRVRfVjMgc3VwcG9ydCBhZGRlZCBmb3IgTGludXgKKwlQb2ludCB1c2VycyB0byB0aGUgdGhlLXRjcGR1bXAtZ3JvdXAgcmVwb3NpdG9yeSBvbiBHaXRIdWIgcmF0aGVyCisJICAgIHRoYW4gdGhlIG1jciByZXBvc2l0b3J5CisJQ2hlY2tzIGFkZGVkIGZvciBtYWxsb2MoKS9yZWFsbG9jKCkvZXRjLiBmYWlsdXJlcworCUZpeGVkIGJ1aWxkIG9uIFNvbGFyaXMgMTEKKwlTdXBwb3J0IGZpbHRlcmluZyBmaWx0ZXJpbmcgRTEgU1M3IHRyYWZmaWMgb24gTVRQMiBsYXllciBBbm5leCBBCisJVXNlICJsbiAtcyIgdG8gbGluayBtYW4gcGFnZXMgYnkgZGVmYXVsdAorICAgICAgICBBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyBuYW5vc2Vjb25kLXJlc29sdXRpb24gdGltZSBzdGFtcHMgd2hlbgorCSAgICBjYXB0dXJpbmcgYW5kIHJlYWRpbmcgY2FwdHVyZSBmaWxlcworICAgICAgICBNYW55IGNoYW5nZXMgdG8gYXV0b2NvbmYgdG8gZGVhbCBiZXR0ZXIgd2l0aCBub24tR0NDIGNvbXBpbGVycworICAgICAgICBhZGRlZCBtYW55IG5ldyBETFQgdHlwZXMKIAotV2VkLglBcHJpbCAyNSwgMjAwNy4ga2VuQHhlbGVyYW5jZS5jb20uICBTdW1tYXJ5IGZvciAwLjkuNiBsaWJwY2FwIHJlbGVhc2UKK1NhdHVyZGF5IEFwcmlsIDYsIDIwMTMgZ3V5QGFsdW0ubWl0LmVkdQorU3VtbWFyeSBmb3IgMS40LjAgbGlicGNhcCByZWxlYXNlCisJQWRkIG5ldGZpbHRlci9uZnF1ZXVlIGludGVyZmFjZS4KKwlJZiB3ZSBkb24ndCBoYXZlIHN1cHBvcnQgZm9yIElQdjYgYWRkcmVzcyByZXNvbHV0aW9uLCBzdXBwb3J0LAorCSAgICBpbiBmaWx0ZXIgZXhwcmVzc2lvbnMsIHdoYXQgSVB2NiBzdHVmZiB3ZSBjYW4uCisJRml4IHBjYXAtY29uZmlnIHRvIGluY2x1ZGUgLWxwdGhyZWFkIGlmIGNhbnVzYiBzdXBwb3J0IGlzCisJICAgIHByZXNlbnQKKwlUcnkgdG8gZml4ICJwY2FwX3BhcnNlIG5vdCBkZWZpbmVkIiBwcm9ibGVtcyB3aGVuIC0td2l0aG91dC1mbGV4CisJICAgIGFuZCAtLXdpdGhvdXQtYmlzb24gYXJlIHVzZWQgd2hlbiB5b3UgaGF2ZSBGbGV4IGFuZCBCaXNvbgorCUZpeCBzb21lIGlzc3VlcyB3aXRoIHRoZSBwY2FwX2xvb3AgbWFuIHBhZ2UuCisJRml4IHBjYXBfZ2V0bm9uYmxvY2soKSBhbmQgcGNhcF9zZXRub25ibG9jaygpIHRvIGZpbGwgaW4gdGhlCisJICAgIHN1cHBsaWVkIGVycm9yIG1lc3NhZ2UgYnVmZmVyCisJRml4IHR5cG8gdGhhdCwgaXQgYXBwZWFyZWQsIHdvdWxkIGNhdXNlIHBjYXAtbGliZGxwaS5jIG5vdCB0bworCSAgICBjb21waWxlIChwZXJoYXBzIHN5c3RlbXMgd2l0aCBsaWJkbHBpIGFsc28gaGF2ZSBCUEYgYW5kIHVzZQorCSAgICB0aGF0IGluc3RlYWQpCisJQ2F0Y2ggYXR0ZW1wdHMgdG8gY2FsbCBwY2FwX2NvbXBpbGUoKSBvbiBhIG5vbi1hY3RpdmF0ZWQgcGNhcF90CisJRml4IGNyYXNoIG9uIExpbnV4IHdpdGggQ0FOLVVTQiBzdXBwb3J0IHdpdGhvdXQgdXNiZnMKKwlGaXggYWRkaXRpb24gb2YgVkxBTiB0YWdzIGZvciBMaW51eCBjb29rZWQgY2FwdHVyZXMKKwlDaGVjayBmb3IgYm90aCBFT1BOT1RTVVBQIGFuZCBFSU5WQUwgYWZ0ZXIgU0lPQ0VUSFRPT0wgaW9jdGwsIHNvCisJICAgIHRoYXQgdGhlIGRyaXZlciBjYW4gcmVwb3J0IGVpdGhlciBvbmUgaWYgaXQgZG9lc24ndCBzdXBwb3J0CisJICAgIFNJT0NFVEhUT09MCisJQWRkIERMVF9JTkZJTklCQU5EIGFuZCBETFRfU0NUUAorCURlc2NyaWJlICJwcm90byBYWFgiIGFuZCAicHJvdG9jaGFpbiBYWFgiIGluIHRoZSBwY2FwLWZpbHRlciBtYW4KKwkgICAgcGFnZQorCUhhbmRsZSBlaXRoZXIgZGlyZWN0b3JpZXMsIG9yIHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzLCB0aGF0CisJICAgIGNvcnJlc3BvbmQgdG8gaW50ZXJmYWNlcyBpbiAvc3lzL2NsYXNzL25ldAorCUZpeCBoYW5kbGluZyBvZiBWTEFOIHRhZyBpbnNlcnRpb24gdG8gY2hlY2ssIG9uIExpbnV4IDMueAorCSAgICBrZXJuZWxzLCBmb3IgVkxBTiB0YWcgdmFsaWQgZmxhZworCUNsZWFuIHVwIHNvbWUgbWFuIHBhZ2VzCisJU3VwcG9ydCBsaWJubDMgYXMgd2VsbCBhcyBsaWJubDEgYW5kIGxpYm5sMiBvbiBMaW51eAorCUZpeCBoYW5kbGluZyBvZiBCbHVldG9vdGggZGV2aWNlcyBvbiAzLnggTGludXgga2VybmVscworCitGcmlkYXkgIE1hcmNoIDMwLCAyMDEyLiAgbWNyQHNhbmRlbG1hbi5jYQorU3VtbWFyeSBmb3IgMS4zLjAgbGlicGNhcCByZWxlYXNlCisgICAgICAgIEhhbmRsZSBETFRfUEZTWU5DIGluIHtGcmVlQlNELCBvdGhlciAqQlNEK01hYyBPUyBYLCBvdGhlcn0uCisgICAgICAgIExpbnV4OiBEb24ndCBmYWlsIGlmIG5ldGZpbHRlciBpc24ndCBlbmFibGVkIGluIHRoZSBrZXJuZWwuCisgICAgICAgIEFkZCBuZXcgbGluay1sYXllciB0eXBlIGZvciBORkMgRm9ydW0gTExDUC4KKyAgICAgICAgUHV0IHRoZSBDQU5VU0Igc3R1ZmYgaW50byBFWFRSQV9ESVNULCBzbyBpdCBzaG93cyB1cCBpbiB0aGUgcmVsZWFzZSB0YXJiYWxsLgorICAgICAgICBBZGQgTElOS1RZUEVfTkc0MC9ETFRfTkc0MC4KKyAgICAgICAgQWRkIERMVF9NUEVHXzJfVFMvTElOS1RZUEVfTVBFR18yX1RTIGZvciBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbXMuCisgICAgICAgIFtQQVRDSF0gRml4IEFJWC0zLjUgY3Jhc2ggd2l0aCByZWFkIGZhaWx1cmUgZHVyaW5nIHN0cmVzcworICAgICAgICBBSVggZml4ZXMuCisgICAgICAgIEludHJvZHVjZSAtLWRpc2FibGUtc2hhcmVkIGNvbmZpZ3VyZSBvcHRpb24uCisgICAgICAgIEFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgY2FudXNiIGRldmljZXMuCisgICAgICAgIEluY2x1ZGUgdGhlIHBjYXAoM1BDQVApIGFkZGl0aW9ucyBhcyAxLjIuMSBjaGFuZ2VzLgorICAgICAgICBtYW55IHVwZGF0ZXMgdG8gZG9jdW1lbnRhdGlvbjogcGNhcC4zcGNhcC5pbgorICAgICAgICBJbXByb3ZlICdpbmJvdW5kJy8nb3V0Ym91bmQnIGNhcHR1cmUgZmlsdGVycyB1bmRlciBMaW51eC4KKyAgICAgICAgTm90ZSB0aGUgY2xlYW51cCBvZiBoYW5kbGluZyBvZiBuZXcgRExUXy9MSU5LVFlQRV8gdmFsdWVzLgorICAgICAgICBPbiBMaW9uLCBkb24ndCBidWlsZCBmb3IgUFBDLgorICAgICAgICBGb3IgbWFjODAyMTEgZGV2aWNlcyB3ZSBuZWVkIHRvIGNsZWFuIHVwIG1vbml0b3IgbW9kZSBvbiBleGl0LgorCitGcmlkYXkgIERlY2VtYmVyIDksIDIwMTEuICBndXlAYWx1bS5taXQuZWR1LgorU3VtbWFyeSBmb3IgMS4yLjEgbGlicGNhcCByZWxlYXNlCisJVXBkYXRlIFJFQURNRSBmaWxlLgorCUZpeCB0eXBvZXMgaW4gUkVBRE1FLmxpbnV4IGZpbGUuCisJQ2xlYW4gdXAgc29tZSBjb21waWxlciB3YXJuaW5ncy4KKwlGaXggTGludXggY29tcGlsZSBwcm9ibGVtcyBhbmQgdGVzdHMgZm9yIGV0aHRvb2wuaC4KKwlUcmVhdCBEZWJpYW4va0ZyZWVCU0QgYW5kIEdOVS9IdXJkIGFzIHN5c3RlbXMgd2l0aCBHTlUKKwkgdG9vbGNoYWlucy4KKwlTdXBwb3J0IDgwMi4xIFFpblEgYXMgYSBmb3JtIG9mIFZMQU4gaW4gZmlsdGVycy4KKwlUcmVhdCAiY2FycCIgYXMgZXF1aXZhbGVudCB0byAidnJycCIgaW4gZmlsdGVycy4KKwlGaXggY29kZSBnZW5lcmF0ZWQgZm9yICJpcDYgcHJvdG9jaGFpbiIuCisJQWRkIHNvbWUgbmV3IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzLgorCVN1cHBvcnQgY2FwdHVyaW5nIE5ldEZpbHRlciBsb2cgbWVzc2FnZXMgb24gTGludXguCisJQ2xlYW4gdXAgc29tZSBlcnJvciBtZXNzYWdlcy4KKwlUdXJuIG9mZiBtb25pdG9yIG1vZGUgb24gZXhpdCBmb3IgbWFjODAyMTEgaW50ZXJmYWNlcyBvbiBMaW51eC4KKwlGaXggcHJvYmxlbXMgdHVybmluZyBtb25pdG9yIG1vZGUgb24gZm9yIG5vbi1tYWM4MDIxMSBpbnRlcmZhY2VzCisJIG9uIExpbnV4LgorCVByb3Blcmx5IGZhaWwgaWYgL3N5cy9jbGFzcy9uZXQgb3IgL3Byb2MvbmV0L2RldiBleGlzdCBidXQgY2FuJ3QKKwkgYmUgb3BlbmVkLgorCUZhaWwgaWYgcGNhcF9hY3RpdmF0ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5LWFjdGl2YXRlZAorCSBwY2FwX3QsIGFuZCBhZGQgYSB0ZXN0IHByb2dyYW0gZm9yIHRoYXQuCisJRml4IGZpbHRlcmluZyBpbiBwY2FwLW5nIGZpbGVzLgorCURvbid0IGJ1aWxkIGZvciBQb3dlclBDIG9uIE1hYyBPUyBYIExpb24uCisJU2ltcGxpZnkgaGFuZGxpbmcgb2YgbmV3IERMVF8vTElOS1RZUEVfIHZhbHVlcy4KKwlFeHBhbmQgcGNhcCgzUENBUCkgbWFuIHBhZ2UuCisKK1N1bmRheSAgSnVseSAyNCwgMjAxMS4gIG1jckBzYW5kZWxtYW4uY2EuCitTdW1tYXJ5IGZvciAxLjIgbGlicGNhcCByZWxlYXNlCisgICAgICAgIEFsbCBvZiB0aGUgY2hhbmdlcyBsaXN0ZWQgYmVsb3cgZm9yIDEuMS4xIGFuZCAxLjEuMi4KKyAgICAgICAgQ2hhbmdlcyB0byBlcnJvciBoYW5kbGluZyBmb3IgcGNhcF9maW5kYWxsZGV2cygpLgorICAgICAgICBGaXggdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBmcmFtZSBzaXplIGluIG1lbW9yeS1tYXBwZWQgY2FwdHVyZXMuCisgICAgICAgIEFkZCBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIFNUQU5BRyA1MDY2IERfUERVcy4KKyAgICAgICAgQWRkIGEgbGluay1sYXllciB0eXBlIGZvciBhIHZhcmlhbnQgb2YgM0dQUCBUUyAyNy4wMTAuCisgICAgICAgIE5vdGVkIHJlYWwgbmF0dXJlIG9mIExJTktUWVBFX0FSQ05FVC4KKyAgICAgICAgQWRkIGEgbGluay1sYXllciB0eXBlIGZvciBEVkItQ0kuCisgICAgICAgIEZpeCBjb25maWd1cmUtc2NyaXB0IGRpc2NvdmVyeSBvZiBWTEFOIGFjY2VsZXJhdGlvbiBzdXBwb3J0LgorICAgICAgICAgc2VlIGh0dHA6Ly9uZXRvcHRpbWl6ZXIuYmxvZ3Nwb3QuY29tLzIwMTAvMDkvdGNwZHVtcC12cy12bGFuLXRhZ3MuaHRtbAorICAgICAgICBMaW51eCwgSFAtVVgsIEFJWCwgTmV0QlNEIGFuZCBPcGVuQlNEIGNvbXBpbGF0aW9uL2NvbmZsaWN0IGZpeGVzLgorICAgICAgICBQcm90ZWN0IGFnYWluc3QgaW5jbHVkaW5nIEFJWCA1LngncyA8bmV0L2JwZi5oPiBoYXZpbmcgYmVlbiBpbmNsdWRlZC4KKyAgICAgICAgQWRkIERMVF9EQlVTLCBmb3IgcmF3IEQtQnVzIG1lc3NhZ2VzLgorICAgICAgICBUcmVhdCBlaXRoZXIgRVBFUk0gb3IgRUFDQ0VTIGFzICJubyBzb3VwIGZvciB5b3UiLgorICAgICAgICBDaGFuZ2VzIHRvIHBlcm1pc3Npb25zIG9uIERMUEkgc3lzdGVtcy4KKyAgICAgICAgQWRkIERMVF9JRUVFODAyXzE1XzRfTk9GQ1MgZm9yIDgwMi4xNS40IGludGVyZmFjZXMuCisKK0ZyaS4gICAgQXVndXN0IDYsIDIwMTAuICBndXlAYWx1bS5taXQuZWR1LgorU3VtbWFyeSBmb3IgMS4xLjIgbGlicGNhcCByZWxlYXNlCisJUmV0dXJuIERMVF8gdmFsdWVzLCBub3QgcmF3IExJTktUWVBFXyB2YWx1ZXMgZnJvbQorCSAgcGNhcF9kYXRhbGluaygpIHdoZW4gcmVhZGluZyBwY2FwLW5nIGZpbGVzCisJQWRkIHN1cHBvcnQgZm9yICJ3bGFuIHJhIiBhbmQgIndsYW4gdGEiLCB0byBjaGVjayB0aGUgUkEgYW5kIFRBCisJICBvZiBXTEFOIGZyYW1lcyB0aGF0IGhhdmUgdGhlbQorCURvbid0IGNyYXNoIGlmICJ3bGFuIGFkZHJ7MSwyLDMsNH0iIGFyZSB1c2VkIHdpdGhvdXQgODAyLjExCisJICBoZWFkZXJzCisJRG8gZmlsdGVyaW5nIG9uIFVTQiBhbmQgQmx1ZXRvb3RoIGNhcHR1cmluZworCU9uIEZyZWVCU0QvU1BBUkM2NCwgdXNlIC1mUElDIC0gaXQncyBhcHBhcmVudGx5IG5lY2Vzc2FyeQorCUNoZWNrIGZvciB2YWxpZCBwb3J0IG51bWJlcnMgKGZpdCBpbiBhIDE2LWJpdCB1bnNpZ25lZCBmaWVsZCkgaW4KKwkgICJwb3J0IiBmaWx0ZXJzCisJUmVqZWN0IGF0dGVtcHRzIHRvIHB1dCBzYXZlZmlsZXMgaW50byBub24tYmxvY2tpbmcgbW9kZQorCUNoZWNrIGZvciAibm8gc3VjaCBkZXZpY2UiIGZvciB0aGUgImdldCB0aGUgbWVkaWEgdHlwZXMiIGlvY3RsCisJICBpbiAqQlNECisJSW1wcm92ZSBlcnJvciBtZXNzYWdlcyBmcm9tIGJwZl9vcGVuKCksIGFuZCBsZXQgaXQgZG8gdGhlIGVycm9yCisJICBoYW5kbGluZworCVJldHVybiBtb3JlIHNwZWNpZmljIGVycm9ycyBmcm9tIHBjYXBfY2FuX3NldF9yZm1vbigpOyBmaXgKKwkgIGRvY3VtZW50YXRpb24KKwlVcGRhdGUgZGVzY3JpcHRpb24gZmV0Y2hpbmcgY29kZSBmb3IgRnJlZUJTRCwgZml4IGNvZGUgZm9yCisJICBPcGVuQlNECisJSWdub3JlIC9zeXMvbmV0L2RldiBmaWxlcyBpZiB3ZSBnZXQgRU5PREVWIGZvciB0aGVtLCBub3QganVzdAorCSAgRU5YSU87IGZpeGVzIGhhbmRsaW5nIG9mIGJvbmRpbmcgZGV2aWNlcyBvbiBMaW51eAorCUZpeCBjaGVjayBmb3IgYSBjb25zdGFudCAwIGFyZ3VtZW50IHRvIEJQRl9ESVYKKwlVc2UgdGhlIHJpZ2h0IHZlcnNpb24gb2YgYXIgd2hlbiBjcm9zcy1idWlsZGluZworCUZyZWUgYW55IGZpbHRlciBzZXQgb24gYSBzYXZlZmlsZSB3aGVuIHRoZSBzYXZlZmlsZSBpcyBjbG9zZWQKKwlJbmNsdWRlIHRoZSBDRkxBR1Mgc2V0dGluZyB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuIGluIHRoZQorCSAgY29tcGlsZXIgZmxhZ3MKKwlBZGQgc3VwcG9ydCBmb3IgODAyLjE1LjQgaW50ZXJmYWNlcyBvbiBMaW51eAorCitUaHUuICAgIEFwcmlsIDEsIDIwMTAuICBndXlAYWx1bS5taXQuZWR1LgorU3VtbWFyeSBmb3IgMS4xLjEgbGlicGNhcCByZWxlYXNlCisJVXBkYXRlIENIQU5HRVMgdG8gcmVmbGVjdCBtb3JlIG9mIHRoZSBjaGFuZ2VzIGluIDEuMS4wLgorCUZpeCBidWlsZCBvbiBSSEVMNS4KKwlGaXggc2hhcmVkIGxpYnJhcnkgYnVpbGQgb24gQUlYLgorCitUaHUuCU1hcmNoIDExLCAyMDEwLiAga2VuQG5ldGZ1bmN0aW9uYWwuY2EvZ3V5QGFsdW0ubWl0LmVkdS4KK1N1bW1hcnkgZm9yIDEuMS4wIGxpYnBjYXAgcmVsZWFzZQorCUFkZCBTb2NrZXRDQU4gY2FwdHVyZSBzdXBwb3J0CisJQWRkIE15cmljb20gU05GIEFQSSBzdXBwb3J0CisJVXBkYXRlIEVuZGFjZSBEQUcgYW5kIEVSRiBzdXBwb3J0CisJQWRkIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcywgSFAtVVgsIGFuZCBBSVgKKwlCdWlsZCwgaW5zdGFsbCwgYW5kIHVuLWluc3RhbGwgc2hhcmVkIGxpYnJhcmllcyBieSBkZWZhdWx0OworCSAgZG9uJ3QgYnVpbGQvaW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzIG9uIHBsYXRmb3JtcyB3ZSBkb24ndCBzdXBwb3J0CisJRml4IGJ1aWxkaW5nIGZyb20gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgc291cmNlIGRpcmVjdG9yeQorCUZpeCBjb21waWxlciB3YXJuaW5ncyBhbmQgYnVpbGRzIG9uIHNvbWUgcGxhdGZvcm1zCisJVXBkYXRlIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1YgorCVN1cHBvcnQgbW9uaXRvciBtb2RlIG9uIG1hYzgwMjExIGRldmljZXMgb24gTGludXgKKwlGaXggVVNCIG1lbW9yeS1tYXBwZWQgY2FwdHVyaW5nIG9uIExpbnV4OyBpdCByZXF1aXJlcyBhIG5ldyBETFRfCisJICB2YWx1ZQorCU9uIExpbnV4LCBzY2FuIC9zeXMvY2xhc3MvbmV0IGZvciBkZXZpY2VzIGlmIHdlIGhhdmUgaXQ7IHNjYW4KKwkgIGl0LCBvciAvcHJvYy9uZXQvZGV2IGlmIHdlIGRvbid0IGhhdmUgL3N5cy9jbGFzcy9uZXQsIGV2ZW4gaWYKKwkgIHdlIGhhdmUgZ2V0aWZhZGRycygpLCBhcyBpdCdsbCBmaW5kIGludGVyZmFjZXMgd2l0aCBubworCSAgYWRkcmVzc2VzCisJQWRkIGxpbWl0ZWQgc3VwcG9ydCBmb3IgcmVhZGluZyBwY2FwLW5nIGZpbGVzCisJRml4IEJQRiBkcml2ZXItbG9hZGluZyBlcnJvciBoYW5kbGluZyBvbiBBSVgKKwlTdXBwb3J0IGdldHRpbmcgdGhlIGZ1bGwtbGVuZ3RoIGludGVyZmFjZSBkZXNjcmlwdGlvbiBvbiBGcmVlQlNECisJSW4gdGhlIGxleGljYWwgYW5hbHl6ZXIsIGZyZWUgdXAgYW55IGFkZHJpbmZvIHN0cnVjdHVyZSB3ZSBnb3QgYmFjaworCSAgZnJvbSBnZXRhZGRyaW5mbygpLgorCUFkZCBzdXBwb3J0IGZvciBCUEYgYW5kIGxpYmRscGkgaW4gT3BlblNvbGFyaXMgKGFuZCBTWENFKQorCUh5cGhlbmF0ZSAibGluay1sYXllciIgZXZlcnl3aGVyZQorCUFkZCAvc3lzL2tlcm5lbC9kZWJ1Zy91c2IvdXNibW9uIHRvIHRoZSBsaXN0IG9mIHVzYm1vbiBsb2NhdGlvbnMKKwlJbiBwY2FwX3JlYWRfbGludXhfbW1hcCgpLCBpZiB0aGVyZSBhcmUgbm8gZnJhbWVzIGF2YWlsYWJsZSwgY2FsbAorCSAgcG9sbCgpIGV2ZW4gaWYgd2UncmUgaW4gbm9uLWJsb2NraW5nIG1vZGUsIHNvIHdlIHBpY2sgdXAKKwkgIGVycm9ycywgYW5kIGNoZWNrIGZvciB0aGUgZXJyb3JzIGluIHF1ZXN0aW9uLgorCU5vdGUgdGhhdCBwb2xsKCkgd29ya3Mgb24gQlBGIGRldmljZXMgaXMgU25vdyBMZW9wYXJkCisJSWYgYW4gRU5YSU8gb3IgRU5FVERPV04gaXMgcmVjZWl2ZWQsIGl0IG1heSBtZWFuIHRoZSBkZXZpY2UgaGFzCisJICBnb25lIGF3YXkuICBEZWFsIHdpdGggaXQuCisJRm9yIEJQRiwgcmFpc2UgdGhlIGRlZmF1bHQgY2FwdHVyZSBidWZmZXIgc2l6ZSB0byBmcm9tIDMyayB0byA1MTJrCisJU3VwcG9ydCBwc19pZmRyb3Agb24gTGludXgKKwlBZGRlZCBhIGJ1bmNoIG9mICNpZmRlZiBkaXJlY3RpdmVzIHRvIG1ha2Ugd3BjYXAuZGxsIChXaW5QY2FwKSBjb21waWxlCisJIHVuZGVyIGN5Z3dpbi4KKwlDaGFuZ2VzIHRvIExpbnV4IG1tYXBwZWQgY2FwdHVyZXMuCisJRml4IGJ1ZyB3aGVyZSBjcmVhdGVfcmluZyB3b3VsZCBmYWlsIGZvciBwYXJ0aWN1bGFyIHNuYXBsZW4gYW5kCisJICBidWZmZXIgc2l6ZSBjb21iaW5hdGlvbnMKKwlVcGRhdGUgcGNhcC1jb25maWcgc28gdGhhdCBpdCBoYW5kbGVzIGxpYnBjYXAgcmVxdWlyaW5nCisJICBhZGRpdGlvbmFsIGxpYnJhcmllcworCUFkZCB3b3JrYXJvdW5kIGZvciB0aHJlYWRzYWZlbmVzcyBvbiBXaW5kb3dzCisJQWRkIG1pc3NpbmcgbWFwcGluZyBmb3IgRExUX0VOQyA8LT4gTElOS1RZUEVfRU5DCisJRExUOiBBZGQgRExUX0NBTl9TT0NLRVRDQU4KKwlETFQ6IEFkZCBTb2xhcmlzIGlwbmV0CisJRG9uJ3QgY2hlY2sgZm9yIERMVF9JUE5FVCBpZiBpdCdzIG5vdCBkZWZpbmVkCisJQWRkIGxpbmstbGF5ZXIgdHlwZXMgZm9yIEZpYnJlIENoYW5uZWwgRkMtMgorCUFkZCBsaW5rLWxheWVyIHR5cGVzIGZvciBXaXJlbGVzcyBIQVJUCisJQWRkIGxpbmstbGF5ZXIgdHlwZXMgZm9yIEFPUworCUFkZCBsaW5rLWxheWVyIHR5cGVzIGZvciBERUNUCisJQXV0b2NvbmYgZml4ZXMgKEFJWCwgSFAtVVgsIE9TRi8xLCBUcnU2NCBjbGVhbnVwcykKKwlJbnN0YWxsIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5LCBhbmQgaW5jbHVkZSB2bGFuLmgvYmx1ZXRvb3RoLmggaWYKKwkgIGVuYWJsZWQKKwlBdXRvY29uZiBmaXhlcytjbGVhbnVwCisJU3VwcG9ydCBlbmFibGluZy9kaXNhYmxpbmcgYmx1ZXRvb3RoICgtLXtlbixkaXN9YWJsZS1ibHVldG9vdGgpCisJU3VwcG9ydCBkaXNhYmxpbmcgU0lUQSBzdXBwb3J0ICgtLXdpdGhvdXQtc2l0YSkKKwlSZXR1cm4gLTEgb24gZmFpbHVyZSB0byBjcmVhdGUgcGFja2V0IHJpbmcgKGlmIHN1cHBvcnRlZCBidXQKKwkgIGNyZWF0aW9uIGZhaWxlZCkKKwlGaXggaGFuZGxpbmcgb2YgJ2FueScgZGV2aWNlLCBzbyB0aGF0IGl0IGNhbiBiZSBvcGVuZWQsIGFuZCBubyBsb25nZXIKKwkgIGF0dGVtcHQgdG8gb3BlbiBpdCBpbiBNb25pdG9yIG1vZGUKKwlBZGQgc3VwcG9ydCBmb3Igc25hcHNob3QgbGVuZ3RoIGZvciBVU0IgTWVtb3J5LU1hcHBlZCBJbnRlcmZhY2UKKwlGaXggY29uZmlndXJlIGFuZCBidWlsZCBvbiByZWNlbnQgTGludXgga2VybmVscworCUZpeCBtZW1vcnktbWFwcGVkIExpbnV4IGNhcHR1cmUgdG8gc3VwcG9ydCBwY2FwX25leHQoKSBhbmQKKwkgIHBjYXBfbmV4dF9leCgpCisJRml4ZXMgZm9yIExpbnV4IFVTQiBjYXB0dXJlCisJRExUOiBBZGQgRExUX0xJTlVYX0VWREVWCisJRExUOiBBZGQgRExUX0dTTVRBUF9VTQorCURMVDogQWRkIERMVF9HU01UQVBfQUJJUworCitNb24uICAgIE9jdG9iZXIgMjcsIDIwMDguICBrZW5AbmV0ZnVuY3Rpb25hbC5jYS4gIFN1bW1hcnkgZm9yIDEuMC4wIGxpYnBjYXAgcmVsZWFzZQorCUNvbXBpbGUgd2l0aCBJUHY2IHN1cHBvcnQgYnkgZGVmYXVsdAorCUNvbXBpbGUgd2l0aCBsYXJnZSBmaWxlIHN1cHBvcnQgb24gYnkgZGVmYXVsdAorCUFkZCBwY2FwLWNvbmZpZyBzY3JpcHQsIHdoaWNoIGRlYWxzIHdpdGggLUkvLUwgZmxhZ3MgZm9yIGNvbXBpbGluZworCURMVDogQWRkIElQTUIKKwlETFQ6IEFkZCBMQVBECisJRExUOiBBZGQgQVgyNSAoQVguMjUgdy9LSVNTIGhlYWRlcikKKwlETFQ6IEFkZCBKVU5JUEVSX1NUCisJODAyLjE1LjQgc3VwcG9ydAorCVZhcmlhYmxlIGxlbmd0aCA4MDIuMTEgaGVhZGVyIHN1cHBvcnQKKwlYMkUgZGF0YSB0eXBlIHN1cHBvcnQgCisJU0lUQSBBQ04gSW50ZXJmYWNlIHN1cHBvcnQgLSBzZWUgUkVBRE1FLnNpdGEKKwlTdXBwb3J0IGZvciBtZW1vcnktbWFwcGVkIGNhcHR1cmUgb24gTGludXgKKwlTdXBwb3J0IGZvciB6ZXJvY29weSBCUEYgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBpdAorCVN1cHBvcnQgZm9yIHNldHRpbmcgYnVmZmVyIHNpemUgd2hlbiBvcGVuaW5nIGRldmljZXMKKwlTdXBwb3J0IGZvciBzZXR0aW5nIG1vbml0b3IgbW9kZSB3aGVuIG9wZW5pbmcgODAyLjExIGRldmljZXMKKwlCZXR0ZXIgc3VwcG9ydCBmb3IgZGVhbGluZyB3aXRoIFZMQU4gdGFnZ2luZy9zdHJpcHBpbmcgb24gTGludXgKKwlGaXggZHluYW1pYyBsaWJyYXJ5IHN1cHBvcnQgb24gT1NYCisJUmV0dXJuIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQIGlmIHRoZSBpbnRlcmZhY2UgaXNuJ3QgJ1VQJywgc28gYXBwbGljYXRpb25zCisJIGNhbiBwcmludCBiZXR0ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbgorCVJldHVybiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEIGlmIHdlIGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIGEgZGV2aWNlLCBzbworCSBhcHBsaWNhdGlvbnMgY2FuIHRlbGwgdGhlIHVzZXIgdGhleSBuZWVkIHRvIGdvIHBsYXkgd2l0aCBwZXJtaXNzaW9ucworCU9uIExpbnV4LCBpZ25vcmUgRU5FVERPV04gc28gd2UgY2FuIGNvbnRpbnVlIHRvIGNhcHR1cmUgcGFja2V0cyBpZiB0aGUgCisJIGludGVyZmFjZSBnb2VzIGRvd24gYW5kIGNvbWVzIGJhY2sgdXAgYWdhaW4uCisJT24gTGludXgsIHN1cHBvcnQgbmV3IHRwYWNrZXQgZnJhbWUgaGVhZGVycyAoMi42LjI3KykKKwlPbiBNYWMgT1MgWCwgYWRkIHNjcmlwdHMgZm9yIGNoYW5naW5nIHBlcm1pc3Npb25zIG9uIC9kZXYvYnBmKiBhbmQgbGF1bmNoZCBwbGlzdAorCU9uIFNvbGFyaXMsIHN1cHBvcnQgJ3Bhc3NpdmUgbW9kZScgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQKKwlGaXhlcyB0byBhdXRvY29uZiBhbmQgZ2VuZXJhbCBidWlsZCBlbnZpcm9ubWVudAorCU1hbiBwYWdlIHJlb3JnYW5pemF0aW9uICsgY2xlYW51cAorCUF1dG9nZW5lcmF0ZSBWRVJTSU9OIG51bWJlcnMgYmV0dGVyCisKK01vbi4gICAgU2VwdGVtYmVyIDEwLCAyMDA3LiAga2VuQHhlbGVyYW5jZS5jb20uICBTdW1tYXJ5IGZvciAwLjkuOCBsaWJwY2FwIHJlbGVhc2UKKyAgICAgICAgQ2hhbmdlIGJ1aWxkIHByb2Nlc3MgdG8gcHV0IHB1YmxpYyBsaWJwY2FwIGhlYWRlcnMgaW50byBwY2FwIHN1YmlyCisgICAgICAgIERMVDogQWRkIHZhbHVlIGZvciBJUE1JIElQTUIgcGFja2V0cworICAgICAgICBETFQ6IEFkZCB2YWx1ZSBmb3IgdTEwIE5ldHdvcmtzIGJvYXJkcworICAgICAgICBSZXF1aXJlIDxuZXQvcGZ2YXIuaD4gZm9yIHBmIGRlZmluaXRpb25zIC0gYWxsb3dzIHJlYWRpbmcgb2YgcGZsb2cgZm9ybWF0dGVkIAorICAgICAgICAgbGlicGNhcCBmaWxlcyBvbiBhbiBPUyBvdGhlciB0aGFuIHdoZXJlIHRoZSBmaWxlIHdhcyBnZW5lcmF0ZWQKKworV2VkLglBcHJpbCAyNSwgMjAwNy4gIGtlbkB4ZWxlcmFuY2UuY29tLiAgU3VtbWFyeSBmb3IgMC45LjYgbGlicGNhcCByZWxlYXNlCiAKIAlQdXQgdGhlIHB1YmxpYyBsaWJwY2FwIGhlYWRlcnMgaW50byBhIHBjYXAgc3ViZGlyZWN0b3J5IGluIGJvdGggdGhlCiAJIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZSB0YXJnZXQgaW5jbHVkZSBkaXJlY3RvcnksIGFuZCBoYXZlIGluY2x1ZGUKZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDJlNTRhYWIuLjY5Y2JiZjAgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMSwxMDggKzEsMTc3IEBACiBUaGlzIGZpbGUgbGlzdHMgcGVvcGxlIHdobyBoYXZlIGNvbnRyaWJ1dGVkIHRvIGxpYnBjYXA6CiAKIFRoZSBjdXJyZW50IG1haW50YWluZXJzOgotCUJpbGwgRmVubmVyCQkJPGZlbm5lckByZXNlYXJjaC5hdHQuY29tPgotCUZ1bHZpbyBSaXNzbwkJCTxyaXNzb0Bwb2xpdG8uaXQ+Ci0JR3V5IEhhcnJpcwkgCQk8Z3V5QGFsdW0ubWl0LmVkdT4KLQlIYW5uZXMgR3JlZGxlcgkJCTxoYW5uZXNAanVuaXBlci5uZXQ+Ci0JSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vCTxpdG9qdW5AaWlqbGFiLm5ldD4KLQlNaWNoYWVsIFJpY2hhcmRzb24JIAk8bWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2E+CisgICAgQmlsbCBGZW5uZXIgICAgICAgICAgICAgICAgICAgPGZlbm5lciBhdCByZXNlYXJjaCBkb3QgYXR0IGRvdCBjb20+CisgICAgRGVuaXMgT3ZzaWVua28gICAgICAgICAgICAgICAgPGluZnJhc3RhdGlvbiBhdCB5YW5kZXggZG90IHJ1PgorICAgIEZ1bHZpbyBSaXNzbyAgICAgICAgICAgICAgICAgIDxyaXNzbyBhdCBwb2xpdG8gZG90IGl0PgorICAgIEd1eSBIYXJyaXMgICAgICAgICAgICAgICAgICAgIDxndXkgYXQgYWx1bSBkb3QgbWl0IGRvdCBlZHU+CisgICAgSGFubmVzIEdyZWRsZXIgICAgICAgICAgICAgICAgPGhhbm5lcyBhdCBqdW5pcGVyIGRvdCBuZXQ+CisgICAgTWljaGFlbCBSaWNoYXJkc29uICAgICAgICAgICAgPG1jciBhdCBzYW5kZWxtYW4gZG90IG90dGF3YSBkb3Qgb24gZG90IGNhPgogCiBBZGRpdGlvbmFsIHBlb3BsZSB3aG8gaGF2ZSBjb250cmlidXRlZCBwYXRjaGVzOgogCi0JQWxhbiBCYXdkZW4JCQk8QWxhbkBMQ1MuTUlULkVEVT4KLQlBbGV4ZXkgS3V6bmV0c292CQk8a3V6bmV0QG1zMi5pbnIuYWMucnU+Ci0JQWxiZXJ0IENoaW4JCQk8Y2hpbmFAdGhld3JpdHRlbndvcmQuY29tPgotCUFuZHJldyBCcm93bgkJCTxhdGF0YXRAYXRhdGRvdC5uZXQ+Ci0JQW50dGkgS2FudGVlCQkJPHBvb2thQG5ldGJzZC5vcmc+Ci0JQXJrYWRpdXN6IE1pc2tpZXdpY3oJCTxtaXNpZWtAcGxkLm9yZy5wbD4KLQlBcm1hbmRvIEwuIENhcm8gSnIuCQk8YWNhcm9AbWFpbC5lZWNpcy51ZGVsLmVkdT4KLQlBc3NhciBXZXN0ZXJsdW5kCSAJPGFzc2FyQHNpY3Muc2U+Ci0JQnJpYW4gR2luc2JhY2gJCQk8Z2luc2JhY2hAY3JheS5jb20+Ci0JQ2hhcmxlcyBNLiBIYW5udW0JCTxteWNyb2Z0QG5ldGJzZC5vcmc+Ci0JQ2hyaXMgRy4gRGVtZXRyaW91CQk8Y2dkQG5ldGJzZC5vcmc+Ci0JQ2hyaXMgTGlnaHRmb290CQkJPGN3cmxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCUNocmlzIFBlcHBlcgkJCTxwZXBwZXJAbWFpbC5yZXBwZXAuY29tPgotCURhbmllbGUgT3JsYW5kaQkJCTxkYW5pZWxlQG9ybGFuZGkuY29tPgotCURhcnJlbiBSZWVkCQkJPGRhcnJlbnJAcmVlZC53YXR0bGUuaWQuYXU+Ci0JRGF2aWQgS2FlbGJsaW5nCQkJPGRya0BzZ2kuY29tPgotCURhdmlkIFlvdW5nCQkJPGR5b3VuZ0BvamN0ZWNoLmNvbT4KLQlEZWFuIEdhdWRldAkJCTxkZWFuQGFyY3RpYy5vcmc+Ci0JRG9uIEVicmlnaHQJCQk8RG9uLkVicmlnaHRAY29tcHV3YXJlLmNvbT4gCi0JRHVnIFNvbmcJCQk8ZHVnc29uZ0Btb25rZXkub3JnPgotCUVyaWMgQW5kZXJzb24JCQk8YW5kZXJzZUBocGwuaHAuY29tPgotICAgICAgICBFcmlrIGRlIENhc3RybyBMb3BvICAgICAgICAgICAgIDxlcmlrLmRlLmNhc3Ryby5sb3BvQHNlbnNvcnluZXR3b3Jrcy5jb20+Ci0JRmxvcmVudCBEcm91aW4JCQk8RmxvcmVudC5Ecm91aW5AYWxjYXRlbC1sdWNlbnQuZnI+Ci0JRnJhbnogU2NoYWVmZXIJCQk8c2NoYWVmZXJAbW9uZC5hdD4KLQlHaWFubHVjYSBWYXJlbm5pCQk8dmFyZW5uaUBuZXRncm91cC1zZXJ2LnBvbGl0by5pdD4KLQlHaWxiZXJ0IEhveWVrCQkJPGdpbF9ob3lla0Bob3RtYWlsLmNvbT4KLQlHaXNsZSBWYW5lbQkJCTxnaXZhQGJnbmV0dC5ubz4KLQlHcmFlbWUgSGV3c29uCQkJPGdoZXdzb25AY2l4LmNvbXB1bGluay5jby51az4KLQlHcmVnIFN0YXJrCQkJPGdzc3RhcmtAbWl0LmVkdT4KLQlHcmVnIFRyb3hlbAkJCTxnZHRAaXIuYmJuLmNvbT4KLQlHdWlsbGF1bWUgUGVsYXQJCQk8ZW5keW1pb25fQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlIeXVuZyBTaWsgWW9vbgkJCTxoc3luQGtyLmlibS5jb20+Ci0JSWdvciBLaHJpc3RvcGhvcm92CQk8aWdvckBhdGRvdC5vcmc+Ci0JSmFuLVBoaWxpcCBWZWxkZXJzCQk8anB2QHZlbGRlcnNqZXMubmV0PgotCUphc29uIFIuIFRob3JwZQkJCTx0aG9ycGVqQG5ldGJzZC5vcmc+Ci0JSmF2aWVyIEFjaGlyaWNhCQkJPGFjaGlyaWNhQHR0ZC5uZXQ+Ci0JSmVhbiBUb3VycmlsaGVzCQkJPGp0QGhwbC5ocC5jb20+Ci0JSmVmZmVyc29uIE9nYXRhCQkJPGpvZ2F0YUBub2RjLm5vYWEuZ292PgotCUplc3BlciBQZXRlcnNvbgkJCTxqZXNwZXJAZW5kYWNlLmNvbT4KLQlKb2huIEJhbmtpZXIJCQk8amJhbmtpZXJAcmFpbmZpbml0eS5jb20+Ci0JSm9uIExpbmRncmVuCQkJPGpvbmxAeXVieXViLm5ldD4KLQlKdWVyZ2VuIFNjaG9lbndhZWxkZXIJCTxzY2hvZW53QGlici5jcy50dS1icy5kZT4KLQlKdW5nLXVrIEtpbQkJCTxqa2ltQEZyZWVCU0Qub3JnPgotCUthenVzaGkgU3VneW8JCQk8c3VneW9AcGIuanAubmVjLmNvbT4KLQlLbGF1cyBLbGVpbgkJCTxrbGVpbmtAbmV0YnNkLm9yZz4KLQlLb3J5biBHcmFudAkJCTxrb3J5bkBlbmRhY2UuY29tPgotCUtyenlzenRvZiBIYWxhc2EJCTxraGNAcG0ud2F3LnBsPgotCUxvcmVuem8gQ2F2YWxsYXJvCQk8c3VsbGl2YW5Ac2lrdXJlenphLm9yZz4KLQlMb3JpcyBEZWdpb2FubmkJCQk8bG9yaXNAbmV0Z3JvdXAtc2Vydi5wb2xpdG8uaXQ+Ci0JTG92ZSBI9nJucXVpc3QtxXN0cmFuZAkJPGxoYUBzdGFja2VuLmt0aC5zZT4KLQlNYWNpZWogVy4gUm96eWNraQkJPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0JTWFyY3VzIEZlbGlwZSBQZXJlaXJhCQk8bWFyY3VzQHRhc2suY29tLmJyPgotCU1hcmsgQy4gQnJvd24JCQk8bWJyb3duQGhwLmNvbT4KLQlNYXJrIFBpenpvbGF0bwkJCTxMaXN0LXRjcGR1bXAtd29ya2Vyc0BzdWJzY3JpcHRpb25zLnBpenpvbGF0by5uZXQ+Ci0JTWFydGluIEh1c2VtYW5uCQkJPG1hcnRpbkBuZXRic2Qub3JnPgotCU1hdHRoZXcgTHVja2llCQkJPG1qbEBsdWNraWUub3JnLm56PgotCU1heCBMYWllcgkJCTxtYXhAbG92ZTJwYXJ0eS5uZXQ+Ci0JTWlrZSBLZXJzaGF3CQkJPGRyYWdvcm5Aa2lzbWV0d2lyZWxlc3MubmV0PgotCU1pa2UgV2lhY2VrCQkJPG1pa2VAaXJvb3QubmV0PgotCU1vbnJvZSBXaWxsaWFtcwkJCTxtb25yb2VAcG9ib3guY29tPgotCU5pY29sYXMgRGFkZQkJCTxuZGFkZUBuc2QuZHluZG5zLm9yZz4KLQlPY3RhdmlhbiBDZXJuYQkJCTx0YXZ5QHlsYWJzLmNvbT4KLQlPbGFmIEtpcmNoCQkJPG9raXJAY2FsZGVyYS5kZT4KLQlPbGxpZSBXaWxkCQkJPGFhd0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0JT25ubyB2YW4gZGVyIExpbmRlbgkJPG9ubm9Ac2ltcGxleC5ubD4KLQlQYXRyaWNrIE1hcmllCQkJPG15Y3JvZnRAdmlyZ2FyaWEub3JnPgotCVBhdWwgTXVuZHQJCQk8bGV0aGFsQGxpbnV4LXNoLm9yZz4KLQlQYXZlbCBLYW5rb3Zza3kJCQk8a2FuQGRjaXQuY3o+Ci0JUGF3ZWwgUG9rcnl3a2EJCQk8cHVibGljcHBAZ21haWwuY29tPgotCVBldGVyIEZhbGVzCQkJPHBldGVyQGZhbGVzLWxvcmVuei5uZXQ+Ci0JUGV0ZXIgSmVyZW15CQkJPHBldGVyLmplcmVteUBhbGNhdGVsLmNvbS5hdT4KLQlQaGlsIFdvb2QJCQk8Y3B3QGxhbmwuZ292PgotCVJhZmFsIE1hc3prb3dza2kJCTxyem1AaWNtLmVkdS5wbD4KLQkJCQkJPHJjYi1pc2lzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlSaWNrIEpvbmVzCQkJPHJhakBjdXAuaHAuY29tPgotCVNjb3R0IEJhcnJvbgkJCTxzYjEyNTQ5OUBvaGlvdS5lZHU+Ci0JU2NvdHQgR2lmZm9yZAkJCTxzZ2lmZm9yZEB0aXIuY29tPgotCVNlYmFzdGlhbiBLcmFobWVyCQk8a3JhaG1lckBjcy51bmktcG90c2RhbS5kZT4KLQlTaGF1biBDbG93ZXMJCQk8ZGVsaXVzQHByb2dzb2MudXRzLmVkdS5hdT4KLQlTb2xvbW9uIFBlYWNoeQkJCTxwaXp6YUBzaGFmdG5ldC5vcmc+Ci0JU3RlZmFuIEh1ZHNvbgkJCTxodWRzb25AbWJheS5uZXQ+Ci0JU3RlcGhlbiBEb25uZWxseQkJPHN0ZXBoZW5AZW5kYWNlLmNvbT4KLQlUYWthc2hpIFlhbWFtb3RvCQk8eWFtdEBtd2QuYmlnbG9iZS5uZS5qcD4KLSAgICAgICAgVGFuYWthIFNoaW4teWEgICAgICAgICAgICAgICAgICA8enN0YW5ha2FAYXJjaGVyLmxpdmVkb29yLmNvbT4KLQlUb255IExpCQkJCTx0bGlAcHJvY2tldC5jb20+Ci0JVG9yc3RlbiBMYW5kc2Nob2ZmCSAJPHRvcnN0ZW5AZGViaWFuLm9yZz4KLQlVbnMgTGlkZXIJCQk8dW5zbGlkZXJAbWlyYW5kYS5vcmc+Ci0JVXdlIEdpcmxpY2gJCQk8VXdlLkdpcmxpY2hAcGhpbG9zeXMuZGU+Ci0JWGlhbmppZSBaaGFuZwkJCTx4emhhbmdAY3VwLmhwLmNvbT4KLQlZZW4gWWVuIExpbQotCVlvYW5uIFZhbmRvb3JzZWxhZXJlCQk8eW9hbm5AcHJlbHVkZS1pZHMub3JnPgorICAgIEFrb3MgVmFuZHJhICAgICAgICAgICAgICAgICAgIDxheG9zODggYXQgZ21haWwgZG90IGNvbT4KKyAgICBBbGFuIEJhd2RlbiAgICAgICAgICAgICAgICAgICA8QWxhbiBhdCBMQ1MgZG90IE1JVCBkb3QgRURVPgorICAgIEFsYmVydCBDaGluICAgICAgICAgICAgICAgICAgIDxjaGluYSBhdCB0aGV3cml0dGVud29yZCBkb3QgY29tPgorICAgIEFsZXhhbmRlciAnTGVvJyBCZXJnb2x0aCAgICAgIDxMZW8gZG90IEJlcmdvbHRoIGF0IHd1LXdpZW4gZG90IGFjIGRvdCBhdD4KKyAgICBBbGV4ZXkgS3V6bmV0c292ICAgICAgICAgICAgICA8a3V6bmV0IGF0IG1zMiBkb3QgaW5yIGRvdCBhYyBkb3QgcnU+CisgICAgQWxvbiBCYXItTGV2ICAgICAgICAgICAgICAgICAgPGFsb25ibCBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIEFuZHJlcyBQZXJlcmEgICAgICAgICAgICAgICAgIDxhbmRyZXMgZG90IHAgYXQgem9obyBkb3QgY29tPgorICAgIEFuZHJldyBCcm93biAgICAgICAgICAgICAgICAgIDxhdGF0YXQgYXQgYXRhdGRvdCBkb3QgbmV0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbmR5LTEgYXQgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBBbmkgU2luaGEgICAgICAgICAgICAgICAgICAgICA8YW5pIGF0IGFyaXN0YW5ldHdvcmtzIGRvdCBjb20+CisgICAgQW50dGkgS2FudGVlICAgICAgICAgICAgICAgICAgPHBvb2thIGF0IG5ldGJzZCBkb3Qgb3JnPgorICAgIEFyaWVuIFZpam4gICAgICAgICAgICAgICAgICAgIDxhcmllbnZpam4gYXQgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBBcmthZGl1c3ogTWlza2lld2ljeiAgICAgICAgICA8bWlzaWVrIGF0IHBsZCBkb3Qgb3JnIGRvdCBwbD4KKyAgICBBcm1hbmRvIEwuIENhcm8gSnIuICAgICAgICAgICA8YWNhcm8gYXQgbWFpbCBkb3QgZWVjaXMgZG90IHVkZWwgZG90IGVkdT4KKyAgICBBc3NhciBXZXN0ZXJsdW5kICAgICAgICAgICAgICA8YXNzYXIgYXQgc2ljcyBkb3Qgc2U+CisgICAgQmlsbCBQYXJrZXIgICAgICAgICAgICAgICAgICAgPHdwMDI4NTUgYXQgZ21haWwgZG90IGNvbT4KKyAgICBCcmVudCBDb29rICAgICAgICAgICAgICAgICAgICA8YnJlbnQgYXQgYm91bmRhcnkgZG90IGNvbT4KKyAgICBCcmlhbiBHaW5zYmFjaCAgICAgICAgICAgICAgICA8Z2luc2JhY2ggYXQgY3JheSBkb3QgY29tPgorICAgIENoYXJsZXMgTS4gSGFubnVtICAgICAgICAgICAgIDxteWNyb2Z0IGF0IG5ldGJzZCBkb3Qgb3JnPgorICAgIENocmlzIEcuIERlbWV0cmlvdSAgICAgICAgICAgIDxjZ2QgYXQgbmV0YnNkIGRvdCBvcmc+CisgICAgQ2hyaXMgTGlnaHRmb290ICAgICAgICAgICAgICAgPGN3cmwgYXQgdXNlcnMgZG90IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgQ2hyaXMgTWF5bmFyZCAgICAgICAgICAgICAgICAgPENocmlzIGRvdCBNYXluYXJkIGF0IGd0ZWNoIGRvdCBjb20+CisgICAgQ2hyaXMgUGVwcGVyICAgICAgICAgICAgICAgICAgPHBlcHBlciBhdCBtYWlsIGRvdCByZXBwZXAgZG90IGNvbT4KKyAgICBDaHJpc3RpYW4gQmVsbCAgICAgICAgICAgICAgICA8Y3NiZWxsIGF0IG15cmkgZG90IGNvbT4KKyAgICBDaHJpc3RpYW4gUGVyb24gICAgICAgICAgICAgICA8Y3NqcCBhdCBmcmVlYnNkIGRvdCBvcmc+CisgICAgQ2hyaXN0aWFuIFN2ZW5zc29uICAgICAgICAgICAgPGJsdWUgYXQgY21kIGRvdCBudT4KKyAgICBEYW5pZWxlIE9ybGFuZGkgICAgICAgICAgICAgICA8ZGFuaWVsZSBhdCBvcmxhbmRpIGRvdCBjb20+CisgICAgRGFycmVuIExpbSAgICAgICAgICAgICAgICAgICAgPGRhcnJlbiBkb3QgbGltIGF0IGVuZGFjZSBkb3QgY29tPgorICAgIERhcnJlbiBSZWVkICAgICAgICAgICAgICAgICAgIDxkYXJyZW5yIGF0IHN1biBkb3QgY29tPgorICAgIERhdmlkIENsYXJrICAgICAgICAgICAgICAgICAgIDxkYXZpZCBkb3QgY2xhcmsgYXQgZGF0YXNvZnQgZG90IGNvbT4KKyAgICBEYXZpZCBLYWVsYmxpbmcgICAgICAgICAgICAgICA8ZHJrIGF0IHNnaSBkb3QgY29tPgorICAgIERhdmlkIFdhcmQgICAgICAgICAgICAgICAgICAgIDxkYXZpZCBkb3Qgd2FyZCBhdCBsbCBkb3QgbWl0IGRvdCBlZHU+CisgICAgRGF2aWQgWW91bmcgICAgICAgICAgICAgICAgICAgPGR5b3VuZyBhdCBvamN0ZWNoIGRvdCBjb20+CisgICAgRGVhbiBHYXVkZXQgICAgICAgICAgICAgICAgICAgPGRlYW4gYXQgYXJjdGljIGRvdCBvcmc+CisgICAgZGhydXYgICAgICAgICAgICAgICAgICAgICAgICAgPHJzcml2YXQgYXQgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBEb24gRWJyaWdodCAgICAgICAgICAgICAgICAgICA8RG9uIGRvdCBFYnJpZ2h0IGF0IGNvbXB1d2FyZSBkb3QgY29tPiAKKyAgICBEdWcgU29uZyAgICAgICAgICAgICAgICAgICAgICA8ZHVnc29uZyBhdCBtb25rZXkgZG90IG9yZz4KKyAgICBEdXN0aW4gU3BpY3V6emEgICAgICAgICAgICAgICA8ZHVzdGluIGF0IHZpcnR1YWxyb2Fkc2lkZSBkb3QgY29tPgorICAgIGR6ZWphcmN6ZWNoICAgICAgICAgICAgICAgICAgIDxkemVqYXJjemVjaCBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIEVkd2FyZCBTaGVsZHJha2UgICAgICAgICAgICAgIDxlanMxOTIwIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgRXJpYyBBbmRlcnNvbiAgICAgICAgICAgICAgICAgPGFuZGVyc2UgYXQgaHBsIGRvdCBocCBkb3QgY29tPgorICAgIEVyaWsgZGUgQ2FzdHJvIExvcG8gICAgICAgICAgIDxlcmlrIGRvdCBkZSBkb3QgY2FzdHJvIGRvdCBsb3BvIGF0IHNlbnNvcnluZXR3b3JrcyBkb3QgY29tPgorICAgIEZlbGl4IE9iZW5odWJlciAgICAgICAgICAgICAgIDxmZWxpeCBhdCBvYmVuaHViZXIgZG90IGRlPgorICAgIEZsb3JlbnQgRHJvdWluICAgICAgICAgICAgICAgIDxGbG9yZW50IGRvdCBEcm91aW4gYXQgYWxjYXRlbC1sdWNlbnQgZG90IGZyPgorICAgIEZyYW56IFNjaGFlZmVyICAgICAgICAgICAgICAgIDxzY2hhZWZlciBhdCBtb25kIGRvdCBhdD4KKyAgICBmcmVkZXJpY2ggICAgICAgICAgICAgICAgICAgICA8ZnJlZGVyaWNoIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgRnVsa28gSGV3ICAgICAgICAgICAgICAgICAgICAgPGZ1bGtvIGRvdCBoZXcgYXQgZ21haWwgZG90IGNvbT4KKyAgICBGdW1peXVraSBTaGltaXp1ICAgICAgICAgICAgICA8ZnVtaWZ1bWkgYXQgYWJhY3VzdGVjaCBkb3QganA+CisgICAgR2Fib3IgVGF0YXJrYSAgICAgICAgICAgICAgICAgPGdhYm9yIGRvdCB0YXRhcmthIGF0IGVyaWNzc29uIGRvdCBjb20+CisgICAgR2FycmV0dCBDb29wZXIgICAgICAgICAgICAgICAgPHlhYmVyYXVuZXlhIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgR2VvcmdlIE5ldmlsbGUtTmVpbCAgICAgICAgICAgPGdubiBhdCBmcmVlYnNkIGRvdCBvcmc+CisgICAgR2lhbmx1Y2EgVmFyZW5uaSAgICAgICAgICAgICAgPGdpYW5sdWNhIGRvdCB2YXJlbm5pIGF0IGdtYWlsIGRvdCBjb20+CisgICAgR2lsYmVydCBIb3llayAgICAgICAgICAgICAgICAgPGdpbF9ob3llayBhdCBob3RtYWlsIGRvdCBjb20+CisgICAgR2lzbGUgVmFuZW0gICAgICAgICAgICAgICAgICAgPGd2YW5lbSBhdCBicm9hZHBhcmsgZG90IG5vPgorICAgIEdyYWVtZSBIZXdzb24gICAgICAgICAgICAgICAgIDxnaGV3c29uIGF0IGNpeCBkb3QgY29tcHVsaW5rIGRvdCBjbyBkb3QgdWs+CisgICAgR3JlZ29yIE1haWVyICAgICAgICAgICAgICAgICAgPGdyZWdvciBhdCBuZXQgZG90IGluIGRvdCB0dW0gZG90IGRlPgorICAgIEdyZWcgU3RhcmsgICAgICAgICAgICAgICAgICAgIDxnc3N0YXJrIGF0IG1pdCBkb3QgZWR1PgorICAgIEdyZWcgVHJveGVsICAgICAgICAgICAgICAgICAgIDxnZHQgYXQgaXIgZG90IGJibiBkb3QgY29tPgorICAgIEd1aWxsYXVtZSBQZWxhdCAgICAgICAgICAgICAgIDxlbmR5bWlvbl8gYXQgdXNlcnMgZG90IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgR3VzdGF2byBaYWNhcmlhcyAgICAgICAgICAgICAgPGd1c3Rhdm8gYXQgemFjYXJpYXMgZG90IGNvbSBkb3QgYXI+CisgICAgSGFnZW4gUGF1bCBQZmVpZmVyICAgICAgICAgICAgPGhhZ2VuIGF0IGphdXUgZG90IG5ldD4KKyAgICBIZW5yaSBEb3JlYXUgICAgICAgICAgICAgICAgICA8aGRvcmVhdSBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIEh5dW5nIFNpayBZb29uICAgICAgICAgICAgICAgIDxoc3luIGF0IGtyIGRvdCBpYm0gZG90IGNvbT4KKyAgICBJZ29yIEtocmlzdG9waG9yb3YgICAgICAgICAgICA8aWdvciBhdCBhdGRvdCBkb3Qgb3JnPgorICAgIEpha3ViIFphd2FkemtpICAgICAgICAgICAgICAgIDxkYXJramFtZXMgYXQgZGFya2phbWVzIGRvdCBwbD4KKyAgICBKYW4tUGhpbGlwIFZlbGRlcnMgICAgICAgICAgICA8anB2IGF0IHZlbGRlcnNqZXMgZG90IG5ldD4KKyAgICBKYXNvbiBSLiBUaG9ycGUgICAgICAgICAgICAgICA8dGhvcnBlaiBhdCBuZXRic2QgZG90IG9yZz4KKyAgICBKYXZpZXIgQWNoaXJpY2EgICAgICAgICAgICAgICA8YWNoaXJpY2EgYXQgdHRkIGRvdCBuZXQ+CisgICAgSmVhbi1Mb3VpcyBDaGFydG9uICAgICAgICAgICAgPEplYW4tTG91aXMgZG90IENIQVJUT04gYXQgb2lraWFsb2cgZG90IGNvbT4KKyAgICBKZWFuIFRvdXJyaWxoZXMgICAgICAgICAgICAgICA8anQgYXQgaHBsIGRvdCBocCBkb3QgY29tPgorICAgIEplZmZlcnNvbiBPZ2F0YSAgICAgICAgICAgICAgIDxqb2dhdGEgYXQgbm9kYyBkb3Qgbm9hYSBkb3QgZ292PgorICAgIEplc3BlciBEYW5nYWFyZCBCcm91ZXIgICAgICAgIDxoYXdrIGF0IGNvbXggZG90IGRrPgorICAgIEplc3BlciBQZXRlcnNvbiAgICAgICAgICAgICAgIDxqZXNwZXIgYXQgZW5kYWNlIGRvdCBjb20+CisgICAgSmlyaSBTbGFieSAgICAgICAgICAgICAgICAgICAgPGppcmlzbGFieSBhdCBnbWFpbCBkb3QgY29tPgorICAgIEpvZXJnIE1heWVyICAgICAgICAgICAgICAgICAgIDxqbWF5ZXIgYXQgbG9wbG9mIGRvdCBkZT4KKyAgICBKb2huIEJhbmtpZXIgICAgICAgICAgICAgICAgICA8amJhbmtpZXIgYXQgcmFpbmZpbml0eSBkb3QgY29tPgorICAgIEpvbiBMaW5kZ3JlbiAgICAgICAgICAgICAgICAgIDxqb25sIGF0IHl1Ynl1YiBkb3QgbmV0PgorICAgIEpvbiBTbWlybCAgICAgICAgICAgICAgICAgICAgIDxqb25zbWlybCBhdCBnbWFpbCBkb3QgY29tPgorICAgIEpvcmdlIEJvbmNvbXB0ZSBbRFRJMl0gICAgICAgIDxqb3JnZSBhdCBkdGkyIGRvdCBuZXQ+CisgICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyICAgICAgICAgPHNjaG9lbncgYXQgaWJyIGRvdCBjcyBkb3QgdHUtYnMgZG90IGRlPgorICAgIEp1bGllbiBNb3V0aW5obyAgICAgICAgICAgICAgIDxqdWxtIGF0IHNhdmluZXMgZG90IGFscGVzIGRvdCBmciBkb3QgZXUgZG90IG9yZz4KKyAgICBKdW5nLXVrIEtpbSAgICAgICAgICAgICAgICAgICA8amtpbSBhdCBGcmVlQlNEIGRvdCBvcmc+CisgICAgS2F6dXNoaSBTdWd5byAgICAgICAgICAgICAgICAgPHN1Z3lvIGF0IHBiIGRvdCBqcCBkb3QgbmVjIGRvdCBjb20+CisgICAgS2xhdXMgS2xlaW4gICAgICAgICAgICAgICAgICAgPGtsZWluayBhdCBuZXRic2QgZG90IG9yZz4KKyAgICBLb3J5biBHcmFudCAgICAgICAgICAgICAgICAgICA8a29yeW4gYXQgZW5kYWNlIGRvdCBjb20+CisgICAgS3JpcyBLYXR0ZXJqb2huICAgICAgICAgICAgICAgPGthdHRlcmpvaG4gYXQgZ21haWwgZG90IGNvbT4KKyAgICBLcnp5c3p0b2YgSGFsYXNhICAgICAgICAgICAgICA8a2hjIGF0IHBtIGRvdCB3YXcgZG90IHBsPgorICAgIExvcmVuem8gQ2F2YWxsYXJvICAgICAgICAgICAgIDxzdWxsaXZhbiBhdCBzaWt1cmV6emEgZG90IG9yZz4KKyAgICBMb3JpcyBEZWdpb2FubmkgICAgICAgICAgICAgICA8bG9yaXMgYXQgbmV0Z3JvdXAtc2VydiBkb3QgcG9saXRvIGRvdCBpdD4KKyAgICBMb3ZlIEjDtnJucXVpc3Qtw4VzdHJhbmQgICAgICAgIDxsaGEgYXQgc3RhY2tlbiBkb3Qga3RoIGRvdCBzZT4KKyAgICBMdWlzIE1hcnRpbkdhcmNpYSAgICAgICAgICAgICA8bHVpcyBkb3QgbWdhcmMgYXQgZ21haWwgZG90IGNvbT4KKyAgICBNYWNpZWogVy4gUm96eWNraSAgICAgICAgICAgICA8bWFjcm8gYXQgZHMyIGRvdCBwZyBkb3QgZ2RhIGRvdCBwbD4KKyAgICBNYW5zb3VyIEJlaGFiYWRpICAgICAgICAgICAgICA8bWFuc291ciBhdCBveHBsb3QgZG90IGNvbT4KKyAgICBNYXJjdXMgRmVsaXBlIFBlcmVpcmEgICAgICAgICA8bWFyY3VzIGF0IHRhc2sgZG90IGNvbSBkb3QgYnI+CisgICAgTWFyayBDLiBCcm93biAgICAgICAgICAgICAgICAgPG1icm93biBhdCBocCBkb3QgY29tPgorICAgIE1hcmsgUGl6em9sYXRvICAgICAgICAgICAgICAgIDxMaXN0LXRjcGR1bXAtd29ya2VycyBhdCBzdWJzY3JpcHRpb25zIGRvdCBwaXp6b2xhdG8gZG90IG5ldD4KKyAgICBNYXJrdXMgTWF5ZXIgICAgICAgICAgICAgICAgICA8bWFya3VzX21heWVyIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgTWFydGluIEh1c2VtYW5uICAgICAgICAgICAgICAgPG1hcnRpbiBhdCBuZXRic2QgZG90IG9yZz4KKyAgICBNw6FydG9uIE7DqW1ldGggICAgICAgICAgICAgICAgIDxubTEyNyBhdCBmcmVlbWFpbCBkb3QgaHU+CisgICAgTWF0dGhldyBMdWNraWUgICAgICAgICAgICAgICAgPG1qbCBhdCBsdWNraWUgZG90IG9yZyBkb3Qgbno+CisgICAgTWF4IExhaWVyICAgICAgICAgICAgICAgICAgICAgPG1heCBhdCBsb3ZlMnBhcnR5IGRvdCBuZXQ+CisgICAgTWljaGFsIExhYmVkemtpICAgICAgICAgICAgICAgCisgICAgTWljaGFsIFNla2xldGFyICAgICAgICAgICAgICAgPG1zZWtsZXRhIGF0IHJlZGhhdCBkb3QgY29tPgorICAgIE1pa2UgRnJ5c2luZ2VyICAgICAgICAgICAgICAgIDx2YXBpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAgICBNaWtlIEtlcnNoYXcgICAgICAgICAgICAgICAgICA8ZHJhZ29ybiBhdCBraXNtZXR3aXJlbGVzcyBkb3QgbmV0PgorICAgIE1pa2UgV2lhY2VrICAgICAgICAgICAgICAgICAgIDxtaWtlIGF0IGlyb290IGRvdCBuZXQ+CisgICAgTWlyb3NsYXYgTGljaHZhciAgICAgICAgICAgICAgPG1saWNodmFyIGF0IHJlZGhhdCBkb3QgY29tPgorICAgIE1vbnJvZSBXaWxsaWFtcyAgICAgICAgICAgICAgIDxtb25yb2UgYXQgcG9ib3ggZG90IGNvbT4KKyAgICBOaWNvbGFzIERhZGUgICAgICAgICAgICAgICAgICA8bmRhZGUgYXQgbnNkIGRvdCBkeW5kbnMgZG90IG9yZz4KKyAgICBOaWtvIERlbGFyaWNoICAgICAgICAgICAgICAgICA8bmlrbyBkb3QgZGVsYXJpY2ggYXQgZ21haWwgZG90IGNvbT4KKyAgICBOLiBMZWl0ZW4gICAgICAgICAgICAgICAgICAgICA8bmxlaXRlbiBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudmVyY2FtbSBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIE9jdGF2aWFuIENlcm5hICAgICAgICAgICAgICAgIDx0YXZ5IGF0IHlsYWJzIGRvdCBjb20+CisgICAgT2xhZiBLaXJjaCAgICAgICAgICAgICAgICAgICAgPG9raXIgYXQgY2FsZGVyYSBkb3QgZGU+CisgICAgT2xsaWUgV2lsZCAgICAgICAgICAgICAgICAgICAgPGFhdyBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBPbm5vIHZhbiBkZXIgTGluZGVuICAgICAgICAgICA8b25ubyBhdCBzaW1wbGV4IGRvdCBubD4KKyAgICBQYW9sbyBBYmVuaSAgICAgICAgICAgICAgICAgICA8cGFvbG8gZG90IGFiZW5pIGF0IGVtYWlsIGRvdCBpdD4KKyAgICBQYXRyaWNrIE1hcmllICAgICAgICAgICAgICAgICA8bXljcm9mdCBhdCB2aXJnYXJpYSBkb3Qgb3JnPgorICAgIFBhdHJpY2sgTWNIYXJkeSAgICAgICAgICAgICAgIDxrYWJlciBhdCB0cmFzaCBub3QgbmV0PgorICAgIFBhdWwgTXVuZHQgICAgICAgICAgICAgICAgICAgIDxsZXRoYWwgYXQgbGludXgtc2ggZG90IG9yZz4KKyAgICBQYXZlbCBLYW5rb3Zza3kgICAgICAgICAgICAgICA8a2FuIGF0IGRjaXQgZG90IGN6PgorICAgIFBhd2VsIFBva3J5d2thICAgICAgICAgICAgICAgIDxwdWJsaWNwcCBhdCBnbWFpbCBkb3QgY29tPgorICAgIFBldGVyIEZhbGVzICAgICAgICAgICAgICAgICAgIDxwZXRlciBhdCBmYWxlcy1sb3JlbnogZG90IG5ldD4KKyAgICBQZXRlciBKZXJlbXkgICAgICAgICAgICAgICAgICA8cGV0ZXIgZG90IGplcmVteSBhdCBhbGNhdGVsIGRvdCBjb20gZG90IGF1PgorICAgIFBldGVyIFZvbGtvdiAgICAgICAgICAgICAgICAgIDxwdmEgYXQgZ2VudG9vIGRvdCBvcmc+CisgICAgUGhpbCBXb29kICAgICAgICAgICAgICAgICAgICAgPGNwdyBhdCBsYW5sIGRvdCBnb3Y+CisgICAgUmFmYWwgTWFzemtvd3NraSAgICAgICAgICAgICAgPHJ6bSBhdCBpY20gZG90IGVkdSBkb3QgcGw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJjYi1pc2lzIGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIFJpY2hhcmQgU3RlYXJuICAgICAgICAgICAgICAgIDxyaWNoYXJkIGF0IHJucy1zdGVhcm4gZG90IGRlbW9uIGRvdCBjbyBkb3QgdWs+CisgICAgUmljayBKb25lcyAgICAgICAgICAgICAgICAgICAgPHJhaiBhdCBjdXAgZG90IGhwIGRvdCBjb20+CisgICAgUm9iZXJ0IEVkbW9uZHMgICAgICAgICAgICAgICAgPHN0dS00MiBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIFJvYmVydG8gTWFyaWFuaSAgICAgICAgICAgICAgIDxqZWxvdC10Y3BkdW1wIGF0IGplbG90IGRvdCBpdD4KKyAgICBSb21haW4gRnJhbmNvaXNlICAgICAgICAgICAgICA8cmZyYW5jb2lzZSBhdCBkZWJpYW4gZG90IG9yZz4KKyAgICBTYWd1biBTaGFreWEgICAgICAgICAgICAgICAgICA8c2FndW4gZG90IHNoYWt5YSBhdCBzdW4gZG90IGNvbT4KKyAgICBTY290dCBCYXJyb24gICAgICAgICAgICAgICAgICA8c2IxMjU0OTkgYXQgb2hpb3UgZG90IGVkdT4KKyAgICBTY290dCBHaWZmb3JkICAgICAgICAgICAgICAgICA8c2dpZmZvcmQgYXQgdGlyIGRvdCBjb20+CisgICAgU2NvdHQgTWNtaWxsYW4gICAgICAgICAgICAgICAgPHNjb3R0IGRvdCBhIGRvdCBtY21pbGxhbiBhdCBpbnRlbCBkb3QgY29tPgorICAgIFNlYmFzdGlhbiBLcmFobWVyICAgICAgICAgICAgIDxrcmFobWVyIGF0IGNzIGRvdCB1bmktcG90c2RhbSBkb3QgZGU+CisgICAgU2ViYXN0aWVuIFJveSAgICAgICAgICAgICAgICAgPFNlYmFzdGllbiBkb3QgUm95IGF0IFN1biBkb3QgQ09NPgorICAgIFNlcGhlcm9zYSBaaWVoYXUgICAgICAgICAgICAgIDxzZXBoZXJvc2EgYXQgZ21haWwgZG90IGNvbT4KKyAgICBTaGF1biBDbG93ZXMgICAgICAgICAgICAgICAgICA8ZGVsaXVzIGF0IHByb2dzb2MgZG90IHV0cyBkb3QgZWR1IGRvdCBhdT4KKyAgICBTb2xvbW9uIFBlYWNoeSAgICAgICAgICAgICAgICA8cGl6emEgYXQgc2hhZnRuZXQgZG90IG9yZz4KKyAgICBTdGVmYW4gSHVkc29uICAgICAgICAgICAgICAgICA8aHVkc29uIGF0IG1iYXkgZG90IG5ldD4KKyAgICBTdGVwaGVuIERvbm5lbGx5ICAgICAgICAgICAgICA8c3RlcGhlbiBhdCBlbmRhY2UgZG90IGNvbT4KKyAgICBUYWthc2hpIFlhbWFtb3RvICAgICAgICAgICAgICA8eWFtdCBhdCBtd2QgZG90IGJpZ2xvYmUgZG90IG5lIGRvdCBqcD4KKyAgICBUYW5ha2EgU2hpbi15YSAgICAgICAgICAgICAgICA8enN0YW5ha2EgYXQgYXJjaGVyIGRvdCBsaXZlZG9vciBkb3QgY29tPgorICAgIFRvYmlhcyBQb3NjaHdhdHRhICAgICAgICAgICAgIDxwb3NjaCBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIFRvbnkgTGkgICAgICAgICAgICAgICAgICAgICAgIDx0bGkgYXQgcHJvY2tldCBkb3QgY29tPgorICAgIFRvcnN0ZW4gTGFuZHNjaG9mZiAgICAgICAgICAgIDx0b3JzdGVuIGF0IGRlYmlhbiBkb3Qgb3JnPgorICAgIFVucyBMaWRlciAgICAgICAgICAgICAgICAgICAgIDx1bnNsaWRlciBhdCBtaXJhbmRhIGRvdCBvcmc+CisgICAgVXdlIEdpcmxpY2ggICAgICAgICAgICAgICAgICAgPFV3ZSBkb3QgR2lybGljaCBhdCBwaGlsb3N5cyBkb3QgZGU+CisgICAgV2VzbGV5IFNoaWVsZHMgICAgICAgICAgICAgICAgPHd4cyBhdCBGcmVlQlNEIGRvdCBvcmc+CisgICAgWGlhbmppZSBaaGFuZyAgICAgICAgICAgICAgICAgPHh6aGFuZyBhdCBjdXAgZG90IGhwIGRvdCBjb20+CisgICAgWGluIExpICAgICAgICAgICAgICAgICAgICAgICAgPGRlbHBoaWogYXQgRnJlZUJTRCBkb3Qgb3JnPgorICAgIFllbiBZZW4gTGltCisgICAgWW9hbm4gVmFuZG9vcnNlbGFlcmUgICAgICAgICAgPHlvYW5uIGF0IHByZWx1ZGUtaWRzIGRvdCBvcmc+CisgICAgWXZhbiBWYW5odWxsZWJ1cyAgICAgICAgICAgICAgPHZhbmh1IGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CiAKIFRoZSBvcmlnaW5hbCBMQkwgY3JldzoKLQlTdGV2ZSBNY0Nhbm5lCi0JQ3JhaWcgTGVyZXMKLQlWYW4gSmFjb2Jzb24KKyAgICBTdGV2ZSBNY0Nhbm5lCisgICAgQ3JhaWcgTGVyZXMKKyAgICBWYW4gSmFjb2Jzb24KKworUGFzdCBtYWludGFpbmVyczoKKyAgICBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gICAgICAgICA8aXRvanVuIGF0IGlpamxhYiBkb3QgbmV0PgkJQWxzbyBzZWU6IGh0dHA6Ly93d3cud2lkZS5hZC5qcC9pdG9qdW4tYXdhcmQvCmRpZmYgLS1naXQgYS9DaG1vZEJQRi9TdGFydHVwUGFyYW1ldGVycy5wbGlzdCBiL0NobW9kQlBGL1N0YXJ0dXBQYXJhbWV0ZXJzLnBsaXN0CmluZGV4IDU0NWUyYTYuLmNiYTIxNjYgMTAwNjQ0Ci0tLSBhL0NobW9kQlBGL1N0YXJ0dXBQYXJhbWV0ZXJzLnBsaXN0CisrKyBiL0NobW9kQlBGL1N0YXJ0dXBQYXJhbWV0ZXJzLnBsaXN0CkBAIC0xLDQgKzEsNCBAQAogewogICBEZXNjcmlwdGlvbiAgICAgPSAiQ2hhbmdlIEJQRiBwZXJtaXNzaW9ucyI7Ci0gIFByb3ZpZGVzICAgICAgICA9ICgiTm9uLXJvb3QgcGVybWlzc2lvbiB0byBjYXB0dXJlIG9yIHNlbmQgcmF3IHBhY2tldHMiKTsKKyAgUHJvdmlkZXMgICAgICAgID0gKCJDaG1vZEJQRiIpOwogfQpkaWZmIC0tZ2l0IGEvRklMRVMgYi9GSUxFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjMjA0YS4uMDAwMDAwMAotLS0gYS9GSUxFUworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi1DSEFOR0VTCi1DaG1vZEJQRi9DaG1vZEJQRgotQ2htb2RCUEYvU3RhcnR1cFBhcmFtZXRlcnMucGxpc3QKLUNSRURJVFMKLUZJTEVTCi1JTlNUQUxMLnR4dAotTElDRU5TRQotTWFrZWZpbGUuaW4KLVJFQURNRQotUkVBRE1FLmFpeAotUkVBRE1FLmRhZwotUkVBRE1FLmhwdXgKLVJFQURNRS5saW51eAotUkVBRE1FLm1hY29zeAotUkVBRE1FLnNlcHRlbAotUkVBRE1FLnRydTY0Ci1SRUFETUUuV2luMzIKLVNVTk9TNC9uaXRfaWYuby5zcGFyYwotU1VOT1M0L25pdF9pZi5vLnN1bjMKLVNVTk9TNC9uaXRfaWYuby5zdW40Yy40LjAuM2MKLVRPRE8KLVZFUlNJT04KLWFjY29uZmlnLmgKLWFjbG9jYWwubTQKLWFyY25ldC5oCi1hdG11bmkzMS5oCi1icGYvbmV0L2JwZl9maWx0ZXIuYwotYnBmX2R1bXAuYwotYnBmX2ltYWdlLmMKLWNvbmZpZy5ndWVzcwotY29uZmlnLmguaW4KLWNvbmZpZy5zdWIKLWNvbmZpZ3VyZQotY29uZmlndXJlLmluCi1ldGhlcmVudC5jCi1ldGhlcnR5cGUuaAotZmFkLWdldGFkLmMKLWZhZC1naWZjLmMKLWZhZC1nbGlmYy5jCi1mYWQtbnVsbC5jCi1mYWQtd2luMzIuYwotZ2VuY29kZS5jCi1nZW5jb2RlLmgKLWdyYW1tYXIueQotaW5ldC5jCi1pbnN0YWxsLXNoCi1sYmwvb3MtYWl4NC5oCi1sYmwvb3MtaHB1eDExLmgKLWxibC9vcy1vc2Y0LmgKLWxibC9vcy1vc2Y1LmgKLWxibC9vcy1zb2xhcmlzMi5oCi1sYmwvb3Mtc3Vub3M0LmgKLWxibC9vcy11bHRyaXg0LmgKLWxsYy5oCi1taXNzaW5nL3NucHJpbnRmLmMKLW1rZGVwCi1tc2Rvcy9iaW4yYy5jCi1tc2Rvcy9jb21tb24uZGoKLW1zZG9zL21ha2VmaWxlCi1tc2Rvcy9tYWtlZmlsZS5kagotbXNkb3MvbWFrZWZpbGUud2MKLW1zZG9zL25kaXMyLmMKLW1zZG9zL25kaXMyLmgKLW1zZG9zL25kaXNfMC5hc20KLW1zZG9zL3BrdF9yeDAuYXNtCi1tc2Rvcy9wa3RfcngxLnMKLW1zZG9zL3BrdGRydnIuYwotbXNkb3MvcGt0ZHJ2ci5oCi1tc2Rvcy9yZWFkbWUuZG9zCi1uYW1ldG9hZGRyLmMKLW5scGlkLmgKLW9wdGltaXplLmMKLXBhY2thZ2luZy9wY2FwLnNwZWMKLXBhY2thZ2luZy9wY2FwLnNwZWMuaW4KLXBjYXAtYnBmLmMKLXBjYXAtYnBmLmgKLXBjYXAtZGFnLmMKLXBjYXAtZGFnLmgKLXBjYXAtZGxwaS5jCi1wY2FwLWRvcy5jCi1wY2FwLWRvcy5oCi1wY2FwLWVuZXQuYwotcGNhcC1pbnQuaAotcGNhcC1saW51eC5jCi1wY2FwLW5hbWVkYi5oCi1wY2FwLW5pdC5jCi1wY2FwLW5pdC5oCi1wY2FwLW51bGwuYwotcGNhcC1wZi5jCi1wY2FwLXBmLmgKLXBjYXAtc2VwdGVsLmMKLXBjYXAtc2VwdGVsLmgKLXBjYXAtc3RkaW5jLmgKLXBjYXAtc25pdC5jCi1wY2FwLXNub29wLmMKLXBjYXAtd2luMzIuYwotcGNhcC4zCi1wY2FwLmMKLXBjYXAuaAotcHBwLmgKLXNhdmVmaWxlLmMKLXNjYW5uZXIubAotc2xsLmgKLXN1bmF0bXBvcy5oCi1XaW4zMi9JbmNsdWRlL0dudWMuaAotV2luMzIvSW5jbHVkZS9hZGRyaW5mby5oCi1XaW4zMi9JbmNsdWRlL2JpdHR5cGVzLmgKLVdpbjMyL0luY2x1ZGUvY2RlY2xfZXh0LmgKLVdpbjMyL0luY2x1ZGUvaW5ldHByaXZhdGUuaAotV2luMzIvSW5jbHVkZS9pcDZfbWlzYy5oCi1XaW4zMi9JbmNsdWRlL3NvY2tzdG9yYWdlLmgKLVdpbjMyL0luY2x1ZGUvYXJwYS9uYW1lc2VyLmgKLVdpbjMyL0luY2x1ZGUvbmV0L2lmLmgKLVdpbjMyL0luY2x1ZGUvbmV0L25ldGRiLmgKLVdpbjMyL0luY2x1ZGUvbmV0L3BhdGhzLmgKLVdpbjMyL1NyYy9mZnMuYwotV2luMzIvU3JjL2dldGFkZHJpbmZvLmMKLVdpbjMyL1NyYy9nZXRuZXRieW5tLmMKLVdpbjMyL1NyYy9nZXRuZXRlbnQuYwotV2luMzIvU3JjL2dldG9wdC5jCi1XaW4zMi9TcmMvZ2V0c2VydmVudC5jCi1XaW4zMi9TcmMvaW5ldF9hdG9uLmMKLVdpbjMyL1NyYy9pbmV0X25ldC5jCi1XaW4zMi9TcmMvaW5ldF9wdG9uLmMKZGlmZiAtLWdpdCBhL0lOU1RBTEwudHh0IGIvSU5TVEFMTC50eHQKaW5kZXggNzY0NDVhNy4uNThkOGUzYyAxMDA2NDQKLS0tIGEvSU5TVEFMTC50eHQKKysrIGIvSU5TVEFMTC50eHQKQEAgLTEsNCArMSw0IEBACi1AKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL0lOU1RBTEwudHh0LHYgMS4xMi4yLjIgMjAwNy8wOS8xMiAxOToxNzoyNCBndXkgRXhwICQgKExCTCkKK0AoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvSU5TVEFMTC50eHQsdiAxLjI5IDIwMDgtMDYtMTIgMjA6MjE6NTEgZ3V5IEV4cCAkIChMQkwpCiAKIFRvIGJ1aWxkIGxpYnBjYXAsIHJ1biAiLi9jb25maWd1cmUiIChhIHNoZWxsIHNjcmlwdCkuIFRoZSBjb25maWd1cmUKIHNjcmlwdCB3aWxsIGRldGVybWluZSB5b3VyIHN5c3RlbSBhdHRyaWJ1dGVzIGFuZCBnZW5lcmF0ZSBhbgpAQCAtMjExLDggKzIxMSw3IEBACiBjb25maWd1cmluZyB5b3VyIHN5c3RlbSB0byBiZSBhYmxlIHRvIHN1cHBvcnQgbGlicGNhcC4KIAogSWYgeW91IHVzZSBOZVhUU1RFUCwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gYnVpbGQgbGlicGNhcCBmcm9tIHRoaXMKLXJlbGVhc2UuIFdlIGhvcGUgdG8gc3VwcG9ydCB0aGlzIG9wZXJhdGluZyBzeXN0ZW0gaW4gc29tZSBmdXR1cmUKLXJlbGVhc2Ugb2YgbGlicGNhcC4KK3JlbGVhc2UuCiAKIElmIHlvdSB1c2UgU0lOSVgsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBidWlsZCBsaWJwY2FwIGZyb20gdGhpcwogcmVsZWFzZS4gSXQgaXMga25vd24gdG8gY29tcGlsZSBhbmQgcnVuIG9uIFNJTklYLVkvTiA1LjQyIHdpdGggdGhlIEMtRFMKQEAgLTIyOSwyMiArMjI4LDIyIEBACiAKIElmIHlvdSB1c2UgU0NPLCB5b3UgbWlnaHQgaGF2ZSB0cm91YmxlIGJ1aWxkaW5nIGxpYnBjYXAgZnJvbSB0aGlzCiByZWxlYXNlLiBXZSBkbyBub3QgaGF2ZSBhIG1hY2hpbmUgcnVubmluZyBTQ08gYW5kIGhhdmUgbm90IGhhZCByZXBvcnRzCi1vZiBhbnlvbmUgc3VjY2Vzc2Z1bGx5IGJ1aWxkaW5nIG9uIGl0LiBTaW5jZSBTQ08gYXBwYXJlbnRseSBzdXBwb3J0cwotRExQSSwgaXQncyBwb3NzaWJsZSB0aGUgY3VycmVudCB2ZXJzaW9uIHdvcmtzLiBNZWFud2hpbGUsIFNDTyBwcm92aWRlcwotYSB0Y3BkdW1wIGJpbmFyeSBhcyBwYXJ0IG9mIHRoZWlyICJOZXR3b3JrL1NlY3VyaXR5IFRvb2xzIiBwYWNrYWdlOgorb2YgYW55b25lIHN1Y2Nlc3NmdWxseSBidWlsZGluZyBvbiBpdDsgdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBsaWJwY2FwCitkb2VzIG5vdCBjb21waWxlIG9uIFNDTyBPcGVuU2VydmVyIDUuICBBbHRob3VnaCBTQ08gYXBwYXJlbnRseSBzdXBwb3J0cworRExQSSB0byBzb21lIGV4dGVudCwgdGhlIERMUEkgaW4gT3BlblNlcnZlciA1IGlzIHZlcnkgbm9uLXN0YW5kYXJkLCBhbmQKK2l0IGFwcGVhcnMgdGhhdCBjb21wbGV0ZWx5IG5ldyBjb2RlIHdvdWxkIG5lZWQgdG8gYmUgd3JpdHRlbiB0byBjYXB0dXJlCituZXR3b3JrIHRyYWZmaWMuICBTQ08gZG8gbm90IGFwcGVhciB0byBwcm92aWRlIHRjcGR1bXAgYmluYXJpZXMgZm9yCitPcGVuU2VydmVyIDUgb3IgT3BlblNlcnZlciA2IGFzIHBhcnQgb2YgU0NPIFNrdW5rd2FyZToKIAotICAgIGh0dHA6Ly93d3cuc2NvLmNvbS90ZWNobm9sb2d5L2ludGVybmV0L2dvb2RpZXMvI1NFQ1VSSVRZCisJaHR0cDovL3d3dy5zY28uY29tL3NrdW5rd2FyZS8KIAotVGhlcmUgaXMgYWxzbyBhIFJFQURNRSB0aGF0IGV4cGxhaW5zIGhvdyB0byBlbmFibGUgcGFja2V0IGNhcHR1cmUuCi0KLUlmIHlvdSB1c2UgVW5peFdhcmUsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIGxpYnBjYXAgZnJvbSB0aGlzCi1yZWxlYXNlLiBXZSBob3BlIHRvIHN1cHBvcnQgdGhpcyBvcGVyYXRpbmcgc3lzdGVtIGluIHNvbWUgZnV0dXJlCi1yZWxlYXNlIG9mIGxpYnBjYXAuIE1lYW53aGlsZSwgdGhlcmUgYXBwZWFycyB0byBiZSBhbiBVbml4V2FyZSBwb3J0IG9mCi1saWJwY2FwIDAuMCAoYW5kIHRjcGR1bXAgMy4wKSBpbjoKLQotICAgIGZ0cDovL2Z0cDEuZnJlZWJpcmQub3JnL3B1Yi9taXJyb3IvZnJlZWJpcmQvaW50ZXJuZXQvc3lzdG9vbHMvCi0KLVVuaXhXYXJlIGFwcGVhcnMgdG8gdXNlIGEgaGFja2VkIHZlcnNpb24gb2YgRExQSS4KK0lmIHlvdSB1c2UgVW5peFdhcmUsIHlvdSBtaWdodCBiZSBhYmxlIHRvIGJ1aWxkIGxpYnBjYXAgZnJvbSB0aGlzCityZWxlYXNlLCBvciB5b3UgbWlnaHQgbm90LiAgV2UgZG8gbm90IGhhdmUgYSBtYWNoaW5lIHJ1bm5pbmcgVW5peFdhcmUsCitzbyB3ZSBoYXZlIG5vdCB0ZXN0ZWQgaXQ7IGhvd2V2ZXIsIFNDTyBwcm92aWRlIHBhY2thZ2VzIGZvciBsaWJwY2FwCiswLjYuMiBhbmQgdGNwZHVtcCAzLjcuMSBpbiB0aGUgVW5peFdhcmUgNy9PcGVuIFVOSVggOCBwYXJ0IG9mIFNDTworU2t1bmt3YXJlLCBhbmQgdGhlIHNvdXJjZSBwYWNrYWdlIGZvciBsaWJwY2FwIDAuNi4yIGlzIG5vdCBjaGFuZ2VkIGZyb20KK3RoZSBsaWJwY2FwIDAuNi4yIHNvdXJjZSByZWxlYXNlLCBzbyB0aGlzIHJlbGVhc2Ugb2YgbGlicGNhcCBtaWdodCBhbHNvCitidWlsZCB3aXRob3V0IGNoYW5nZXMgb24gVW5peFdhcmUgNy4KIAogSWYgbGlua2luZyB0Y3BkdW1wIGZhaWxzIHdpdGggIlVuZGVmaW5lZDogX2FsbG9jYSIgd2hlbiB1c2luZyBiaXNvbiBvbgogYSBTdW40LCB5b3VyIHZlcnNpb24gb2YgYmlzb24gaXMgYnJva2VuLiBJbiBhbnkgY2FzZSB2ZXJzaW9uIDEuMTYgb3IKQEAgLTI5OCw3ICsyOTcsNiBAQAogQ2htb2RCUEYvKgktIE1hYyBPUyBYIHN0YXJ0dXAgaXRlbSB0byBzZXQgb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucwogCQkgIG9uIC9kZXYvYnBmKgogQ1JFRElUUwkJLSBwZW9wbGUgdGhhdCBoYXZlIGhlbHBlZCBsaWJwY2FwIGFsb25nCi1GSUxFUwkJLSBsaXN0IG9mIGZpbGVzIGV4cG9ydGVkIGFzIHBhcnQgb2YgdGhlIGRpc3RyaWJ1dGlvbgogSU5TVEFMTC50eHQJLSB0aGlzIGZpbGUKIExJQ0VOU0UJCS0gdGhlIGxpY2Vuc2UgdW5kZXIgd2hpY2ggdGNwZHVtcCBpcyBkaXN0cmlidXRlZAogTWFrZWZpbGUuaW4JLSBjb21waWxhdGlvbiBydWxlcyAoaW5wdXQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQpCkBAIC0zMDksNiArMzA3LDcgQEAKIFJFQURNRS5saW51eAktIG5vdGVzIG9uIHVzaW5nIGxpYnBjYXAgb24gTGludXgKIFJFQURNRS5tYWNvc3gJLSBub3RlcyBvbiB1c2luZyBsaWJwY2FwIG9uIE1hYyBPUyBYCiBSRUFETUUuc2VwdGVsICAgLSBub3RlcyBvbiB1c2luZyBsaWJwY2FwIHRvIGNhcHR1cmUgb24gSW50ZWwvU2VwdGVsIGRldmljZXMKK1JFQURNRS5zaXRhCS0gbm90ZXMgb24gdXNpbmcgbGlicGNhcCB0byBjYXB0dXJlIG9uIFNJVEEgZGV2aWNlcwogUkVBRE1FLnRydTY0CS0gbm90ZXMgb24gdXNpbmcgbGlicGNhcCBvbiBEaWdpdGFsL1RydTY0IFVOSVgKIFJFQURNRS5XaW4zMgktIG5vdGVzIG9uIHVzaW5nIGxpYnBjYXAgb24gV2luMzIgc3lzdGVtcyAod2l0aCBXaW5QY2FwKQogU1VOT1M0CQktIHByZS1TdW5PUyA0LjEgcmVwbGFjZW1lbnQga2VybmVsIG5pdCBtb2R1bGVzCkBAIC0zMjYsMTYgKzMyNSwyMiBAQAogY29uZmlnLnN1YgktIGF1dG9jb25mIHN1cHBvcnQKIGNvbmZpZ3VyZQktIGNvbmZpZ3VyZSBzY3JpcHQgKHJ1biB0aGlzIGZpcnN0KQogY29uZmlndXJlLmluCS0gY29uZmlndXJlIHNjcmlwdCBzb3VyY2UKK2RscGlzdWJzLmMJLSBETFBJLXJlbGF0ZWQgZnVuY3Rpb25zIGZvciBwY2FwLWRscGkuYyBhbmQgcGNhcC1saWJkbHBpLmMKK2RscGlzdWJzLmgJLSBETFBJLXJlbGF0ZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zCiBldGhlcmVudC5jCS0gL2V0Yy9ldGhlcnMgc3VwcG9ydCByb3V0aW5lcwogZXRoZXJ0eXBlLmgJLSBFdGhlcm5ldCBwcm90b2NvbCB0eXBlcyBhbmQgbmFtZXMgZGVmaW5pdGlvbnMKIGZhZC1nZXRhZC5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGggZ2V0aWZhZGRycygpCiBmYWQtZ2lmYy5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGggb25seSBTSU9DR0lGTElTVAogZmFkLWdsaWZjLmMJLSBwY2FwX2ZpbmRhbGxkZXZzKCkgZm9yIHN5c3RlbXMgd2l0aCBTSU9DR0xJRkNPTkYKIGZhZC1udWxsLmMJLSBwY2FwX2ZpbmRhbGxkZXZzKCkgZm9yIHN5c3RlbXMgd2l0aG91dCBjYXB0dXJlIHN1cHBvcnQKK2ZhZC1zaXRhLmMJLSBwY2FwX2ZpbmRhbGxkZXZzKCkgZm9yIHN5c3RlbXMgd2l0aCBTSVRBIHN1cHBvcnQKIGZhZC13aW4zMi5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBXaW5QY2FwCitmaWx0ZXJ0ZXN0LmMJLSB0ZXN0IHByb2dyYW0gZm9yIEJQRiBjb21waWxlcgorZmluZGFsbGRldnN0ZXN0LmMgLSB0ZXN0IHByb2dyYW0gZm9yIHBjYXBfZmluZGFsbGRldnMoKQogZ2VuY29kZS5jCS0gQlBGIGNvZGUgZ2VuZXJhdGlvbiByb3V0aW5lcwogZ2VuY29kZS5oCS0gQlBGIGNvZGUgZ2VuZXJhdGlvbiBkZWZpbml0aW9ucwogZ3JhbW1hci55CS0gZmlsdGVyIHN0cmluZyBncmFtbWFyCitpZWVlODAyMTEuaAktIDgwMi4xMSBkZWZpbml0aW9ucwogaW5ldC5jCQktIG5ldHdvcmsgcm91dGluZXMKIGluc3RhbGwtc2gJLSBCU0Qgc3R5bGUgaW5zdGFsbCBzY3JpcHQKIGxibC9vcy0qLmgJLSBPUy1kZXBlbmRlbnQgZGVmaW5lcyBhbmQgcHJvdG90eXBlcwpAQCAtMzQ4LDggKzM1MywxNiBAQAogbmV0CQktIHN5bWxpbmsgdG8gYnBmL25ldAogb3B0aW1pemUuYwktIEJQRiBvcHRpbWl6YXRpb24gcm91dGluZXMKIHBhY2thZ2luZwktIHBhY2thZ2luZyBpbmZvcm1hdGlvbiBmb3IgYnVpbGRpbmcgbGlicGNhcCBSUE1zCitwY2FwL2JsdWV0b290aC5oIC0gcHVibGljIGRlZmluaXRpb24gb2YgRExUX0JMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSIGhlYWRlcgorcGNhcC9icGYuaAktIEJQRiBkZWZpbml0aW9ucworcGNhcC9uYW1lZGIuaAktIHB1YmxpYyBsaWJwY2FwIG5hbWUgZGF0YWJhc2UgZGVmaW5pdGlvbnMKK3BjYXAvcGNhcC5oCS0gcHVibGljIGxpYnBjYXAgZGVmaW5pdGlvbnMKK3BjYXAvc2xsLmgJLSBwdWJsaWMgZGVmaW5pdGlvbiBvZiBETFRfTElOVVhfU0xMIGhlYWRlcgorcGNhcC91c2IuaAktIHB1YmxpYyBkZWZpbml0aW9uIG9mIERMVF9VU0IgaGVhZGVyCiBwY2FwLWJwZi5jCS0gQlNEIFBhY2tldCBGaWx0ZXIgc3VwcG9ydAotcGNhcC1icGYuaAktIEJQRiBkZWZpbml0aW9ucworcGNhcC1icGYuaAktIGhlYWRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK3BjYXAtYnQtbGludXguYwktIEJsdWV0b290aCBjYXB0dXJlIHN1cHBvcnQgZm9yIExpbnV4CitwY2FwLWJ0LWxpbnV4LmgJLSBCbHVldG9vdGggY2FwdHVyZSBzdXBwb3J0IGZvciBMaW51eAogcGNhcC1kYWcuYwktIEVuZGFjZSBEQUcgZGV2aWNlIGNhcHR1cmUgc3VwcG9ydAogcGNhcC1kYWcuaAktIEVuZGFjZSBEQUcgZGV2aWNlIGNhcHR1cmUgc3VwcG9ydAogcGNhcC1kbHBpLmMJLSBEYXRhIExpbmsgUHJvdmlkZXIgSW50ZXJmYWNlIHN1cHBvcnQKQEAgLTM1NywyNiArMzcwLDM0IEBACiBwY2FwLWRvcy5oCS0gaGVhZGVycyBmb3IgTVMtRE9TIGNhcHR1cmUgc3VwcG9ydAogcGNhcC1lbmV0LmMJLSBlbmV0IHN1cHBvcnQKIHBjYXAtaW50LmgJLSBpbnRlcm5hbCBsaWJwY2FwIGRlZmluaXRpb25zCitwY2FwLWxpYmRscGkuYwktIERhdGEgTGluayBQcm92aWRlciBJbnRlcmZhY2Ugc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIGxpYmRscGkKIHBjYXAtbGludXguYwktIExpbnV4IHBhY2tldCBzb2NrZXQgc3VwcG9ydAotcGNhcC1uYW1lZGIuaAktIHB1YmxpYyBsaWJwY2FwIG5hbWUgZGF0YWJhc2UgZGVmaW5pdGlvbnMKK3BjYXAtbmFtZWRiLmgJLSBoZWFkZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiBwY2FwLW5pdC5jCS0gU3VuT1MgTmV0d29yayBJbnRlcmZhY2UgVGFwIHN1cHBvcnQKIHBjYXAtbml0LmgJLSBTdW5PUyBOZXR3b3JrIEludGVyZmFjZSBUYXAgZGVmaW5pdGlvbnMKIHBjYXAtbnVsbC5jCS0gZHVtbXkgbW9uaXRvciBzdXBwb3J0IChhbGxvd3Mgb2ZmbGluZSB1c2Ugb2YgbGlicGNhcCkKIHBjYXAtcGYuYwktIFVsdHJpeCBhbmQgRGlnaXRhbC9UcnU2NCBVTklYIFBhY2tldCBGaWx0ZXIgc3VwcG9ydAogcGNhcC1wZi5oCS0gVWx0cml4IGFuZCBEaWdpdGFsL1RydTY0IFVOSVggUGFja2V0IEZpbHRlciBkZWZpbml0aW9ucwotcGNhcC1zZXB0ZWwuYyAgIC0gSU5URUwvU2VwdGVsIGRldmljZSBjYXB0dXJlIHN1cHBvcnQKLXBjYXAtc2VwdGVsLmggICAtIElOVEVML1NlcHRlbCBkZXZpY2UgY2FwdHVyZSBzdXBwb3J0CitwY2FwLXNlcHRlbC5jICAgLSBJbnRlbC9TZXB0ZWwgZGV2aWNlIGNhcHR1cmUgc3VwcG9ydAorcGNhcC1zZXB0ZWwuaCAgIC0gSW50ZWwvU2VwdGVsIGRldmljZSBjYXB0dXJlIHN1cHBvcnQKK3BjYXAtc2l0YS5jCS0gU0lUQSBkZXZpY2UgY2FwdHVyZSBzdXBwb3J0CitwY2FwLXNpdGEuaAktIFNJVEEgZGV2aWNlIGNhcHR1cmUgc3VwcG9ydAorcGNhcC1zaXRhLmh0bWwJLSBTSVRBIGRldmljZSBjYXB0dXJlIGRvY3VtZW50YXRpb24KIHBjYXAtc3RkaW5jLmgJLSBpbmNsdWRlcyBhbmQgI2RlZmluZXMgZm9yIGNvbXBpbGluZyBvbiBXaW4zMiBzeXN0ZW1zCiBwY2FwLXNuaXQuYwktIFN1bk9TIDQueCBTVFJFQU1TLWJhc2VkIE5ldHdvcmsgSW50ZXJmYWNlIFRhcCBzdXBwb3J0CiBwY2FwLXNub29wLmMJLSBJUklYIFNub29wIG5ldHdvcmsgbW9uaXRvcmluZyBzdXBwb3J0CitwY2FwLXVzYi1saW51eC5jIC0gVVNCIGNhcHR1cmUgc3VwcG9ydCBmb3IgTGludXgKK3BjYXAtdXNiLWxpbnV4LmggLSBVU0IgY2FwdHVyZSBzdXBwb3J0IGZvciBMaW51eAogcGNhcC13aW4zMi5jCS0gV2luUGNhcCBjYXB0dXJlIHN1cHBvcnQKLXBjYXAuMwkJLSBtYW51YWwgZW50cnkKK3BjYXAuM3BjYXAJLSBtYW51YWwgZW50cnkgZm9yIHRoZSBsaWJyYXJ5CiBwY2FwLmMJCS0gcGNhcCB1dGlsaXR5IHJvdXRpbmVzCi1wY2FwLmgJCS0gcHVibGljIGxpYnBjYXAgZGVmaW5pdGlvbnMKK3BjYXAuaAkJLSBoZWFkZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitwY2FwXyouM3BjYXAJLSBtYW51YWwgZW50cmllcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMKK3BjYXAtZmlsdGVyLjQJLSBtYW51YWwgZW50cnkgZm9yIGZpbHRlciBzeW50YXgKK3BjYXAtbGlua3R5cGUuNAktIG1hbnVhbCBlbnRyeSBmb3IgbGluay1sYXllciBoZWFkZXIgdHlwZXMKIHBwcC5oCQktIFBvaW50IHRvIFBvaW50IFByb3RvY29sIGRlZmluaXRpb25zCi1yYXdzczcuaAktIGluZm9ybWF0aW9uIG9uIERMVF8gdHlwZXMgZm9yIFNTNworcnVubGV4LnNoCS0gd3JhcHBlciBmb3IgTGV4L0ZsZXgKIHNhdmVmaWxlLmMJLSBvZmZsaW5lIHN1cHBvcnQKIHNjYW5uZXIubAktIGZpbHRlciBzdHJpbmcgc2Nhbm5lcgotc2xsLmgJCS0gZGVmaW5pdGlvbnMgZm9yIExpbnV4IGNvb2tlZCBtb2RlIGZha2UgbGluay1sYXllciBoZWFkZXIKIHN1bmF0bXBvcy5oCS0gZGVmaW5pdGlvbnMgZm9yIFN1bkFUTSBjYXB0dXJpbmcKIFdpbjMyCQktIGhlYWRlcnMgYW5kIHJvdXRpbmVzIGZvciBidWlsZGluZyBvbiBXaW4zMiBzeXN0ZW1zCmRpZmYgLS1naXQgYS9NT0RVTEVfTElDRU5TRV9CU0QgYi9NT0RVTEVfTElDRU5TRV9CU0QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvTU9EVUxFX0xJQ0VOU0VfQlNECisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL01ha2VmaWxlLWRldmVsLWFkZHMgYi9NYWtlZmlsZS1kZXZlbC1hZGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjY0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS1kZXZlbC1hZGRzCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgQXV0by1yZWdlbmVyYXRlIGNvbmZpZ3VyZSBzY3JpcHQgb3IgTWFrZWZpbGUgd2hlbiB0aGluZ3MgY2hhbmdlLgorIyBGcm9tIGF1dG9jb25mLmluZm8gLiAgV29ya3MgYmVzdCB3aXRoIEdOVSBNYWtlLgorIworJHtzcmNkaXJ9L2NvbmZpZ3VyZTogY29uZmlndXJlLmluIGFjbG9jYWwubTQKKwljZCAke3NyY2Rpcn0gJiYgYXV0b2NvbmYKKworIyBhdXRvaGVhZGVyIG1pZ2h0IG5vdCBjaGFuZ2UgY29uZmlnLmguaW4sIHNvIHRvdWNoIGEgc3RhbXAgZmlsZS4KKyR7c3JjZGlyfS9jb25maWcuaC5pbjogJHtzcmNkaXJ9L3N0YW1wLWguaW4KKyR7c3JjZGlyfS9zdGFtcC1oLmluOiBjb25maWd1cmUuaW4gYWNsb2NhbC5tNAorCWNkICR7c3JjZGlyfSAmJiBhdXRvaGVhZGVyCisJZWNobyB0aW1lc3RhbXAgPiAke3NyY2Rpcn0vc3RhbXAtaC5pbgorCitjb25maWcuaDogc3RhbXAtaAorc3RhbXAtaDogJHtzcmNkaXJ9L2NvbmZpZy5oLmluIGNvbmZpZy5zdGF0dXMKKwkuL2NvbmZpZy5zdGF0dXMKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKKwkuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogJHtzcmNkaXJ9L2NvbmZpZ3VyZQorCS4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggOTgzOTZlYy4uZjZmMjZlNSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTE3LDcgKzE3LDcgQEAKICMgIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAjICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogIwotIyBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL01ha2VmaWxlLmluLHYgMS45OS4yLjIgMjAwNy8wNy8yNCAwMjozNToxNSBtY3IgRXhwICQgKExCTCkKKyMgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9NYWtlZmlsZS5pbix2IDEuMTQyIDIwMDgtMTEtMjIgMTc6MzA6MjQgZ3V5IEV4cCAkIChMQkwpCiAKICMKICMgVmFyaW91cyBjb25maWd1cmFibGUgcGF0aHMgKHJlbWVtYmVyIHRvIGVkaXQgTWFrZWZpbGUuaW4sIG5vdCBNYWtlZmlsZSkKQEAgLTI2LDExICsyNiwxNCBAQAogIyBUb3AgbGV2ZWwgaGllcmFyY2h5CiBwcmVmaXggPSBAcHJlZml4QAogZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKKyMgUGF0aG5hbWUgb2YgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGNvbmZpZ3VyZSBwcm9ncmFtCitiaW5kaXIgPSBAYmluZGlyQAogIyBQYXRobmFtZSBvZiBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgaW5jbHVkZSBmaWxlcwogaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAogIyBQYXRobmFtZSBvZiBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbGlicmFyeQogbGliZGlyID0gIEBsaWJkaXJACi0jIFBhdGhuYW1lIG9mIGRpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBtYW4gcGFnZQorIyBQYXRobmFtZSBvZiBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbWFuIHBhZ2VzCiBtYW5kaXIgPSBAbWFuZGlyQAogCiAjIFZQQVRICkBAIC00MSwxNyArNDQsMjYgQEAKICMgWW91IHNob3VsZG4ndCBuZWVkIHRvIGVkaXQgYW55dGhpbmcgYmVsb3cuCiAjCiAKK0xEID0gL3Vzci9iaW4vbGQKIENDID0gQENDQAorQVIgPSBAQVJACitMTl9TID0gQExOX1NACitNS0RFUCA9IEBNS0RFUEAKIENDT1BUID0gQFZfQ0NPUFRACiBJTkNMUyA9IC1JLiBAVl9JTkNMU0AKIERFRlMgPSBAREVGU0AgQFZfREVGU0AKLUxJQlMgPSBAVl9MSUJTQAotREFHTElCUyA9IEBEQUdMSUJTQAorQURETE9CSlMgPSBAQURETE9CSlNACitBRERMQVJDSElWRU9CSlMgPSBAQURETEFSQ0hJVkVPQkpTQAorTElCUyA9IEBMSUJTQAorQ0ZMQUdTID0gQENGTEFHU0AKK0xERkxBR1MgPSBATERGTEFHU0AKIERZRVhUID0gQERZRVhUQAorVl9SUEFUSF9PUFQgPSBAVl9SUEFUSF9PUFRACitERVBFTkRFTkNZX0NGTEFHID0gQERFUEVOREVOQ1lfQ0ZMQUdACiBQUk9HPWxpYnBjYXAKIAogIyBTdGFuZGFyZCBDRkxBR1MKLUNGTEFHUyA9ICQoQ0NPUFQpICQoSU5DTFMpICQoREVGUykKK0ZVTExfQ0ZMQUdTID0gJChDQ09QVCkgJChJTkNMUykgJChERUZTKSAkKENGTEFHUykKIAogSU5TVEFMTCA9IEBJTlNUQUxMQAogSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKQEAgLTcxLDE0ICs4MywxNSBAQAogIyBwcm9ibGVtIGlmIHlvdSBkb24ndCBvd24gdGhlIGZpbGUgYnV0IGNhbiB3cml0ZSB0byB0aGUgZGlyZWN0b3J5LgogLmMubzoKIAlAcm0gLWYgJEAKLQkkKENDKSAkKENGTEFHUykgLWMgJChzcmNkaXIpLyQqLmMKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvJCouYwogCi1QU1JDID0JcGNhcC1AVl9QQ0FQQC5jCitQU1JDID0JcGNhcC1AVl9QQ0FQQC5jIEBVU0JfU1JDQCBAQlRfU1JDQCBAQ0FOX1NSQ0AgQE5FVEZJTFRFUl9TUkNAIEBDQU5VU0JfU1JDQCBAREJVU19TUkNACiBGU1JDID0gIGZhZC1AVl9GSU5EQUxMREVWU0AuYwogU1NSQyA9ICBAU1NSQ0AKLUNTUkMgPQlwY2FwLmMgaW5ldC5jIGdlbmNvZGUuYyBvcHRpbWl6ZS5jIG5hbWV0b2FkZHIuYyBcCi0JZXRoZXJlbnQuYyBzYXZlZmlsZS5jIGJwZl9maWx0ZXIuYyBicGZfaW1hZ2UuYyBicGZfZHVtcC5jCi1HRU5TUkMgPSBzY2FubmVyLmMgZ3JhbW1hci5jIHZlcnNpb24uYworQ1NSQyA9CXBjYXAuYyBpbmV0LmMgZ2VuY29kZS5jIG9wdGltaXplLmMgbmFtZXRvYWRkci5jIGV0aGVyZW50LmMgXAorCXNhdmVmaWxlLmMgc2YtcGNhcC5jIHNmLXBjYXAtbmcuYyBwY2FwLWNvbW1vbi5jIFwKKwlicGZfaW1hZ2UuYyBicGZfZHVtcC5jCitHRU5TUkMgPSBzY2FubmVyLmMgZ3JhbW1hci5jIGJwZl9maWx0ZXIuYyB2ZXJzaW9uLmMKIExJQk9CSlMgPSBATElCT0JKU0AKIAogU1JDID0JJChQU1JDKSAkKEZTUkMpICQoQ1NSQykgJChTU1JDKSAkKEdFTlNSQykKQEAgLTg2LDUwICs5OSwzNTUgQEAKICMgV2Ugd291bGQgbGlrZSB0byBzYXkgIk9CSiA9ICQoU1JDOi5jPS5vKSIgYnV0IFVsdHJpeCdzIG1ha2UgY2Fubm90CiAjIGhhY2sgdGhlIGV4dHJhIGluZGlyZWN0aW9uCiBPQkogPQkkKFBTUkM6LmM9Lm8pICQoRlNSQzouYz0ubykgJChDU1JDOi5jPS5vKSAkKFNTUkM6LmM9Lm8pICQoR0VOU1JDOi5jPS5vKSAkKExJQk9CSlMpCi1IRFIgPQlwY2FwLmggcGNhcC1pbnQuaCBwY2FwLW5hbWVkYi5oIHBjYXAtbml0LmggcGNhcC1wZi5oIFwKLQlldGhlcnR5cGUuaCBnZW5jb2RlLmggZ251Yy5oCi1HRU5IRFIgPSBcCi0JdG9rZGVmcy5oIHZlcnNpb24uaAorUFVCSERSID0gXAorCXBjYXAuaCBcCisJcGNhcC1icGYuaCBcCisJcGNhcC1uYW1lZGIuaCBcCisJcGNhcC9icGYuaCBcCisJcGNhcC9ibHVldG9vdGguaCBcCisJcGNhcC9pcG5ldC5oIFwKKwlwY2FwL25hbWVkYi5oIFwKKwlwY2FwL25mbG9nLmggXAorCXBjYXAvcGNhcC5oIFwKKwlwY2FwL3NsbC5oIFwKKwlwY2FwL3ZsYW4uaCBcCisJcGNhcC91c2IuaAogCi1UQUdIRFIgPSBcCi0JcGNhcC1icGYuaAorSERSID0gJChQVUJIRFIpIFwKKwlhcmNuZXQuaCBcCisJYXRtdW5pMzEuaCBcCisJZXRoZXJ0eXBlLmggXAorCWdlbmNvZGUuaCBcCisJaWVlZTgwMjExLmggXAorCWxsYy5oIFwKKwlubHBpZC5oIFwKKwlwY2FwLWNvbW1vbi5oIFwKKwlwY2FwLWludC5oIFwKKwlwY2FwLXN0ZGluYy5oIFwKKwlwcHAuaCBcCisJc2YtcGNhcC5oIFwKKwlzZi1wY2FwLW5nLmggXAorCXN1bmF0bXBvcy5oCisKK1RFU1RTID0gXAorCWZpbHRlcnRlc3QgXAorCWZpbmRhbGxkZXZzdGVzdCBcCisJbm9uYmxvY2t0ZXN0IFwKKwlvcGVudGVzdCBcCisJc2VscG9sbHRlc3QgXAorCXZhbGdyaW5kdGVzdAorCitURVNUU19TUkMgPSBcCisJdGVzdHMvZmlsdGVydGVzdC5jIFwKKwl0ZXN0cy9maW5kYWxsZGV2c3Rlc3QuYyBcCisJdGVzdHMvbm9uYmxvY2t0ZXN0LmMgXAorCXRlc3RzL29wZW50ZXN0LmMgXAorCXRlc3RzL3JlYWN0aXZhdGV0ZXN0LmMgXAorCXRlc3RzL3NlbHBvbGx0ZXN0LmMgXAorCXRlc3RzL3ZhbGdyaW5kdGVzdC5jCisKK0dFTkhEUiA9IFwKKwlzY2FubmVyLmggdG9rZGVmcy5oIHZlcnNpb24uaAogCiBUQUdGSUxFUyA9IFwKLQkkKFNSQykgJChIRFIpICQoVEFHSERSKQorCSQoU1JDKSAkKEhEUikKIAotQ0xFQU5GSUxFUyA9ICQoT0JKKSBsaWJwY2FwLmEgJChHRU5TUkMpICQoR0VOSERSKSBsZXgueXkuYworQ0xFQU5GSUxFUyA9ICQoT0JKKSBsaWJwY2FwLiogJChURVNUUykgXAorCSQoUFJPRyktYGNhdCAkKHNyY2RpcikvVkVSU0lPTmAudGFyLmd6ICQoR0VOU1JDKSAkKEdFTkhEUikgXAorCWxleC55eS5jIHBjYXAtY29uZmlnCiAKLWFsbDogbGlicGNhcC5hCitNQU4xID0gcGNhcC1jb25maWcuMQorCitNQU4zUENBUF9FWFBBTkQgPSBcCisJcGNhcC4zcGNhcC5pbiBcCisJcGNhcF9jb21waWxlLjNwY2FwLmluIFwKKwlwY2FwX2RhdGFsaW5rLjNwY2FwLmluIFwKKwlwY2FwX2R1bXBfb3Blbi4zcGNhcC5pbiBcCisJcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcC5pbiBcCisJcGNhcF9saXN0X2RhdGFsaW5rcy4zcGNhcC5pbiBcCisJcGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcC5pbiBcCisJcGNhcF9vcGVuX2RlYWQuM3BjYXAuaW4gXAorCXBjYXBfb3Blbl9vZmZsaW5lLjNwY2FwLmluIFwKKwlwY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluIFwKKwlwY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcC5pbgorCitNQU4zUENBUF9OT0VYUEFORCA9IFwKKwlwY2FwX2FjdGl2YXRlLjNwY2FwIFwKKwlwY2FwX2JyZWFrbG9vcC4zcGNhcCBcCisJcGNhcF9jYW5fc2V0X3JmbW9uLjNwY2FwIFwKKwlwY2FwX2Nsb3NlLjNwY2FwIFwKKwlwY2FwX2NyZWF0ZS4zcGNhcCBcCisJcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4zcGNhcCBcCisJcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZS4zcGNhcCBcCisJcGNhcF9kdW1wLjNwY2FwIFwKKwlwY2FwX2R1bXBfY2xvc2UuM3BjYXAgXAorCXBjYXBfZHVtcF9maWxlLjNwY2FwIFwKKwlwY2FwX2R1bXBfZmx1c2guM3BjYXAgXAorCXBjYXBfZHVtcF9mdGVsbC4zcGNhcCBcCisJcGNhcF9maWxlLjNwY2FwIFwKKwlwY2FwX2ZpbGVuby4zcGNhcCBcCisJcGNhcF9maW5kYWxsZGV2cy4zcGNhcCBcCisJcGNhcF9mcmVlY29kZS4zcGNhcCBcCisJcGNhcF9nZXRfc2VsZWN0YWJsZV9mZC4zcGNhcCBcCisJcGNhcF9nZXRlcnIuM3BjYXAgXAorCXBjYXBfaW5qZWN0LjNwY2FwIFwKKwlwY2FwX2lzX3N3YXBwZWQuM3BjYXAgXAorCXBjYXBfbGliX3ZlcnNpb24uM3BjYXAgXAorCXBjYXBfbG9va3VwZGV2LjNwY2FwIFwKKwlwY2FwX2xvb2t1cG5ldC4zcGNhcCBcCisJcGNhcF9sb29wLjNwY2FwIFwKKwlwY2FwX21ham9yX3ZlcnNpb24uM3BjYXAgXAorCXBjYXBfbmV4dF9leC4zcGNhcCBcCisJcGNhcF9vZmZsaW5lX2ZpbHRlci4zcGNhcCBcCisJcGNhcF9vcGVuX2xpdmUuM3BjYXAgXAorCXBjYXBfc2V0X2J1ZmZlcl9zaXplLjNwY2FwIFwKKwlwY2FwX3NldF9kYXRhbGluay4zcGNhcCBcCisJcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUuM3BjYXAgXAorCXBjYXBfc2V0X3Byb21pc2MuM3BjYXAgXAorCXBjYXBfc2V0X3JmbW9uLjNwY2FwIFwKKwlwY2FwX3NldF9zbmFwbGVuLjNwY2FwIFwKKwlwY2FwX3NldF90aW1lb3V0LjNwY2FwIFwKKwlwY2FwX3NldGRpcmVjdGlvbi4zcGNhcCBcCisJcGNhcF9zZXRmaWx0ZXIuM3BjYXAgXAorCXBjYXBfc2V0bm9uYmxvY2suM3BjYXAgXAorCXBjYXBfc25hcHNob3QuM3BjYXAgXAorCXBjYXBfc3RhdHMuM3BjYXAgXAorCXBjYXBfc3RhdHVzdG9zdHIuM3BjYXAgXAorCXBjYXBfc3RyZXJyb3IuM3BjYXAgXAorCXBjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwuM3BjYXAgXAorCXBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUuM3BjYXAKKworTUFOM1BDQVAgPSAkKE1BTjNQQ0FQX05PRVhQQU5EKSAkKE1BTjNQQ0FQX0VYUEFORDouaW49KQorCitNQU5GSUxFID0gXAorCXBjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbgorCitNQU5NSVNDID0gXAorCXBjYXAtZmlsdGVyLm1hbm1pc2MuaW4gXAorCXBjYXAtbGlua3R5cGUubWFubWlzYy5pbiBcCisJcGNhcC10c3RhbXAubWFubWlzYy5pbgorCitFWFRSQV9ESVNUID0gXAorCSQoVEVTVFNfU1JDKSBcCisJQ0hBTkdFUyBcCisJQ2htb2RCUEYvQ2htb2RCUEYgXAorCUNobW9kQlBGL1N0YXJ0dXBQYXJhbWV0ZXJzLnBsaXN0IFwKKwlDUkVESVRTIFwKKwlJTlNUQUxMLnR4dCBcCisJTElDRU5TRSBcCisJTWFrZWZpbGUuaW4gXAorCU1ha2VmaWxlLWRldmVsLWFkZHMgXAorCVJFQURNRSBcCisJUkVBRE1FLmFpeCBcCisJUkVBRE1FLmRhZyBcCisJUkVBRE1FLmhwdXggXAorCVJFQURNRS5saW51eCBcCisJUkVBRE1FLm1hY29zeCBcCisJUkVBRE1FLnNlcHRlbCBcCisJUkVBRE1FLnNpdGEgXAorCVJFQURNRS50cnU2NCBcCisJUkVBRE1FLldpbjMyIFwKKwlTVU5PUzQvbml0X2lmLm8uc3BhcmMgXAorCVNVTk9TNC9uaXRfaWYuby5zdW4zIFwKKwlTVU5PUzQvbml0X2lmLm8uc3VuNGMuNC4wLjNjIFwKKwlUT0RPIFwKKwlWRVJTSU9OIFwKKwlhY2xvY2FsLm00IFwKKwlicGYvbmV0L2JwZl9maWx0ZXIuYyBcCisJY2htb2RfYnBmIFwKKwljb25maWcuZ3Vlc3MgXAorCWNvbmZpZy5oLmluIFwKKwljb25maWcuc3ViIFwKKwljb25maWd1cmUgXAorCWNvbmZpZ3VyZS5pbiBcCisJZGxwaXN1YnMuYyBcCisJZGxwaXN1YnMuaCBcCisJZmFkLWdldGFkLmMgXAorCWZhZC1naWZjLmMgXAorCWZhZC1nbGlmYy5jIFwKKwlmYWQtbnVsbC5jIFwKKwlmYWQtc2l0YS5jIFwKKwlmYWQtd2luMzIuYyBcCisJZ3JhbW1hci55IFwKKwlpbnN0YWxsLXNoIFwKKwlsYmwvb3MtYWl4NC5oIFwKKwlsYmwvb3MtaHB1eDExLmggXAorCWxibC9vcy1vc2Y0LmggXAorCWxibC9vcy1vc2Y1LmggXAorCWxibC9vcy1zb2xhcmlzMi5oIFwKKwlsYmwvb3Mtc3Vub3M0LmggXAorCWxibC9vcy11bHRyaXg0LmggXAorCW1pc3Npbmcvc25wcmludGYuYyBcCisJbWtkZXAgXAorCW1zZG9zL2JpbjJjLmMgXAorCW1zZG9zL2NvbW1vbi5kaiBcCisJbXNkb3MvbWFrZWZpbGUgXAorCW1zZG9zL21ha2VmaWxlLmRqIFwKKwltc2Rvcy9tYWtlZmlsZS53YyBcCisJbXNkb3MvbmRpczIuYyBcCisJbXNkb3MvbmRpczIuaCBcCisJbXNkb3MvbmRpc18wLmFzbSBcCisJbXNkb3MvcGt0X3J4MC5hc20gXAorCW1zZG9zL3BrdF9yeDEucyBcCisJbXNkb3MvcGt0ZHJ2ci5jIFwKKwltc2Rvcy9wa3RkcnZyLmggXAorCW1zZG9zL3JlYWRtZS5kb3MgXAorCW9yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdCBcCisJcGFja2FnaW5nL3BjYXAuc3BlYy5pbiBcCisJcGNhcC1icGYuYyBcCisJcGNhcC1idC1saW51eC5jIFwKKwlwY2FwLWJ0LWxpbnV4LmggXAorCXBjYXAtY2FuLWxpbnV4LmMgXAorCXBjYXAtY2FuLWxpbnV4LmggXAorCXBjYXAtY2FudXNiLWxpbnV4LmMgXAorCXBjYXAtY2FudXNiLWxpbnV4LmggXAorCXBjYXAtY29uZmlnLmluIFwKKwlwY2FwLWRhZy5jIFwKKwlwY2FwLWRhZy5oIFwKKwlwY2FwLWRidXMuYyBcCisJcGNhcC1kYnVzLmggXAorCXBjYXAtZGxwaS5jIFwKKwlwY2FwLWRvcy5jIFwKKwlwY2FwLWRvcy5oIFwKKwlwY2FwLWVuZXQuYyBcCisJcGNhcC1pbnQuaCBcCisJcGNhcC1saWJkbHBpLmMgXAorCXBjYXAtbGludXguYyBcCisJcGNhcC1uYW1lZGIuaCBcCisJcGNhcC1uZXRmaWx0ZXItbGludXguYyBcCisJcGNhcC1uZXRmaWx0ZXItbGludXguaCBcCisJcGNhcC1uaXQuYyBcCisJcGNhcC1udWxsLmMgXAorCXBjYXAtcGYuYyBcCisJcGNhcC1zZXB0ZWwuYyBcCisJcGNhcC1zZXB0ZWwuaCBcCisJcGNhcC1zaXRhLmggXAorCXBjYXAtc2l0YS5jIFwKKwlwY2FwLXNpdGEuaHRtbCBcCisJcGNhcC1zbmYuYyBcCisJcGNhcC1zbmYuaCBcCisJcGNhcC1zbml0LmMgXAorCXBjYXAtc25vb3AuYyBcCisJcGNhcC11c2ItbGludXguYyBcCisJcGNhcC11c2ItbGludXguaCBcCisJcGNhcC13aW4zMi5jIFwKKwlydW5sZXguc2ggXAorCXNjYW5uZXIubCBcCisJV2luMzIvSW5jbHVkZS9HbnVjLmggXAorCVdpbjMyL0luY2x1ZGUvYWRkcmluZm8uaCBcCisJV2luMzIvSW5jbHVkZS9iaXR0eXBlcy5oIFwKKwlXaW4zMi9JbmNsdWRlL2NkZWNsX2V4dC5oIFwKKwlXaW4zMi9JbmNsdWRlL2luZXRwcml2YXRlLmggXAorCVdpbjMyL0luY2x1ZGUvaXA2X21pc2MuaCBcCisJV2luMzIvSW5jbHVkZS9zb2Nrc3RvcmFnZS5oIFwKKwlXaW4zMi9JbmNsdWRlL2FycGEvbmFtZXNlci5oIFwKKwlXaW4zMi9JbmNsdWRlL25ldC9pZi5oIFwKKwlXaW4zMi9JbmNsdWRlL25ldC9uZXRkYi5oIFwKKwlXaW4zMi9JbmNsdWRlL25ldC9wYXRocy5oIFwKKwlXaW4zMi9QcmovbGlicGNhcC5kc3AgXAorCVdpbjMyL1Byai9saWJwY2FwLmRzdyBcCisJV2luMzIvU3JjL2Zmcy5jIFwKKwlXaW4zMi9TcmMvZ2FpX3N0cmVycm9yLmMgXAorCVdpbjMyL1NyYy9nZXRhZGRyaW5mby5jIFwKKwlXaW4zMi9TcmMvZ2V0bmV0YnlubS5jIFwKKwlXaW4zMi9TcmMvZ2V0bmV0ZW50LmMgXAorCVdpbjMyL1NyYy9nZXRvcHQuYyBcCisJV2luMzIvU3JjL2dldHNlcnZlbnQuYyBcCisJV2luMzIvU3JjL2luZXRfYXRvbi5jIFwKKwlXaW4zMi9TcmMvaW5ldF9uZXQuYyBcCisJV2luMzIvU3JjL2luZXRfcHRvbi5jCisKK2FsbDogbGlicGNhcC5hIHNoYXJlZCBwY2FwLWNvbmZpZwogCiBsaWJwY2FwLmE6ICQoT0JKKQogCUBybSAtZiAkQAotCWFyIHJjICRAICQoT0JKKSAkKExJQlMpCisJJChBUikgcmMgJEAgJChPQkopICQoQURETEFSQ0hJVkVPQkpTKQogCSQoUkFOTElCKSAkQAogCiBzaGFyZWQ6IGxpYnBjYXAuJChEWUVYVCkKIAotIwotIyBYWFggLSB0aGlzIHdvcmtzIHdpdGggR05VIGxkLCBidXQgd29uJ3QgbmVjZXNzYXJpbHkgd29yayB3aXRoIG5hdGl2ZQotIyBsZCBvbiwgZm9yIGV4YW1wbGUsIHZhcmlvdXMgU1ZSNC1mbGF2b3JlZCBwbGF0Zm9ybXMsIG9yIERpZ2l0YWwgVU5JWC4KLSMKIGxpYnBjYXAuc286ICQoT0JKKQogCUBybSAtZiAkQAotCSQoQ0MpIC1zaGFyZWQgLW8gJEAuYGNhdCBWRVJTSU9OYCAkKE9CSikgJChEQUdMSUJTKQorCVZFUj1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCU1BSk9SX1ZFUj1gc2VkICdzL1woWzAtOV1bMC05XSpcKVwuLiovXDEvJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlAVl9TSExJQl9DTURAIEBWX1NITElCX09QVEAgQFZfU09OQU1FX09QVEAkQC4kJE1BSk9SX1ZFUiAkKExERkxBR1MpIFwKKwkgICAgLW8gJEAuJCRWRVIgJChPQkopICQoQURETE9CSlMpICQoTElCUykKIAotIyB0aGUgZm9sbG93aW5nIHJ1bGUgc3VjY2VlZHMsIGJ1dCB0aGUgcmVzdWx0IGlzIHVudGVzdGVkLgorIworIyBUaGUgZm9sbG93aW5nIHJ1bGUgc3VjY2VlZHMsIGJ1dCB0aGUgcmVzdWx0IGlzIHVudGVzdGVkLgorIworIyBJbiBNYWMgT1MgWCwgdGhlIGxpYnBjYXAgZHlsaWIgaGFzIHRoZSBuYW1lICJsaWJwY2FwLkEuZHlsaWIiLCB3aXRoCisjIGl0cyBmdWxsIHBhdGggYXMgdGhlIGluc3RhbGxfbmFtZSwgYW5kIHdpdGggdGhlIGNvbXBhdGliaWxpdHkgYW5kCisjIGN1cnJlbnQgdmVyc2lvbiBib3RoIHNldCB0byAxLiAgVGhlIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBpcyBzZXQgdG8KKyMgMSBzbyB0aGF0IHByb2dyYW1zIGJ1aWx0IHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHdpbGwgcnVuCisjIGFnYWluc3Qgb2xkZXIgdmVyc2lvbnM7IG11bHRpLXBsYXRmb3JtIHNvZnR3YXJlIHByb2JhYmx5IHdpbGwgZmFpbCBpZgorIyBpdCB1c2VzIEFQSXMgYWRkZWQgaW4gdGhlIG5ld2VyIHZlcnNpb24sIGJ1dCBNYWMgT1MgWC1zcGVjaWZpYyBzb2Z0d2FyZQorIyB3aWxsIHVzZSB3ZWFrIGxpbmtpbmcgYW5kIGNoZWNrIGF0IHJ1biB0aW1lIHdoZXRoZXIgdGhvc2UgQVBJcyBhcmUKKyMgYXZhaWxhYmxlLgorIworIyBXZSBhbHNvIHVzZSAiQSIgYXMgdGhlIG1ham9yIHZlcnNpb24sIGFuZCAxIGFzIHRoZSBjb21wYXRpYmlsaXR5IHZlcnNpb24sCisjIGJ1dCBzZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiB0byB0aGUgdmFsdWUgaW4gVkVSU0lPTiwgd2l0aCBhbnkgbm9uLW51bWVyaWMKKyMgc3R1ZmYgc3RyaXBwZWQgb2ZmICh0aGUgY29tcGF0aWJpbGl0eSBhbmQgY3VycmVudCB2ZXJzaW9uIG11c3QgYmUgb2YgdGhlCisjIGZvcm0gWFsuWVsuWl1dLCB3aXRoIFkgYW5kIFogcG9zc2libHkgYWJzZW50LCBhbmQgd2l0aCBhbGwgY29tcG9uZW50cworIyBudW1lcmljKS4KKyMKIGxpYnBjYXAuZHlsaWI6ICQoT0JKKQogCXJtIC1mIGxpYnBjYXAqLmR5bGliCi0JJChDQykgLWR5bmFtaWNsaWIgLXVuZGVmaW5lZCBlcnJvciAtbyBsaWJwY2FwLmBjYXQgVkVSU0lPTmAuZHlsaWIgJChPQkopIFwKLQkJLWluc3RhbGxfbmFtZSAkKGxpYmRpcikvbGlicGNhcC4wLmR5bGliIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gYGNhdCBWRVJTSU9OYCBcCi0JCS1jdXJyZW50X3ZlcnNpb24gYGNhdCBWRVJTSU9OYAorCVZFUj1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCU1BSk9SX1ZFUj1BOyBcCisJQ09NUEFUX1ZFUj0xOyBcCisJQ1VSUkVOVF9WRVI9YHNlZCAncy9bXjAtOS5dLiokJC8vJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwkkKENDKSAtZHluYW1pY2xpYiAtdW5kZWZpbmVkIGVycm9yICQoTERGTEFHUykgXAorCSAgICAtbyBsaWJwY2FwLiQkVkVSLmR5bGliICQoT0JKKSAkKEFERExPQkpTKSAkKExJQlMpIFwKKwkgICAgLWluc3RhbGxfbmFtZSAkKGxpYmRpcikvbGlicGNhcC4kJE1BSk9SX1ZFUi5keWxpYiBcCisJICAgIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJCRDT01QQVRfVkVSIFwKKwkgICAgLWN1cnJlbnRfdmVyc2lvbiAkJENVUlJFTlRfVkVSCiAKKyMKKyMgVGhlIEhQLVVYIGxpbmtlciBtYW51YWwgc2F5cyB0aGF0IHRoZSBjb252ZW50aW9uIGZvciBhIHZlcnNpb25lZCBsaWJyYXJ5CisjIGlzIGxpYlhYWC57bnVtYmVyfSwgbm90IGxpYlhYWC5zbC57bnVtYmVyfS4gIFRoYXQgYXBwZWFycyB0byBiZSB0aGUgY2FzZQorIyBvbiBhdCBsZWFzdCBvbmUgSFAtVVggMTEuMDAgc3lzdGVtOyBsaWJYWFguc2wgaXMgYSBzeW1saW5rIHRvCisjIGxpYlhYWC57bnVtYmVyfS4KKyMKKyMgVGhlIG1hbnVhbCBhbHNvIHNheXMgImxpYnJhcnktbGV2ZWwgdmVyc2lvbmluZyIgKHRoaW5rICJzb25hbWVzIikgd2FzCisjIGFkZGVkIGluIEhQLVVYIDEwLjAuCisjCisjIFhYWCAtIHRoaXMgYXNzdW1lcyB3ZSdyZSB1c2luZyB0aGUgSFAgbGlua2VyLCByYXRoZXIgdGhhbiB0aGUgR05VCisjIGxpbmtlciwgZXZlbiB3aXRoIEdDQy4KKyMKK2xpYnBjYXAuc2w6ICQoT0JKKQorCUBNQUpPUl9WRVI9YHNlZCAncy9cKFswLTldWzAtOV0qXClcLi4qL1wxLycgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJcm0gLWYgbGlicGNhcC4kJE1BSk9SX1ZFUgorCU1BSk9SX1ZFUj1gc2VkICdzL1woWzAtOV1bMC05XSpcKVwuLiovXDEvJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlsZCAtYiAkKExERkxBR1MpIC1vIGxpYnBjYXAuJCRNQUpPUl9WRVIgK2ggbGlicGNhcC4kJE1BSk9SX1ZFUiBcCisJICAgICQoT0JKKSAkKEFERExPQkpTKSAkKExJQlMpCisKKyMKKyMgQUlYIGlzIGRpZmZlcmVudCBmcm9tIGV2ZXJ5Ym9keSBlbHNlLiAgQSBzaGFyZWQgbGlicmFyeSBpcyBhbiBhcmNoaXZlCisjIGxpYnJhcnkgd2l0aCBvbmUgb3IgbW9yZSBzaGFyZWQtb2JqZWN0IGNvbXBvbmVudHMuICBXZSBzdGlsbCBidWlsZCBhCisjIG5vcm1hbCBzdGF0aWMgYXJjaGl2ZSBsaWJyYXJ5IG9uIEFJWCwgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSB0cmFkaXRpb25hbAorIyBzY2hlbWUgb2YgYnVpbGRpbmcgbGlicGNhcCBhbmQgdGNwZHVtcCBpbiBzdWJkaXJlY3RvcmllcyBvZiB0aGUKKyMgc2FtZSBkaXJlY3RvcnksIHdpdGggdGNwZHVtcCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIHRoZSBsaWJwY2FwCisjIGluIHF1ZXN0aW9uLCBidXQgd2UgYWxzbyBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGFzICJsaWJwY2FwLnNoYXJlZGEiCisjIGFuZCBpbnN0YWxsICppdCosIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMgbGlicmFyeSwgYXMgImxpYnBjYXAuYSIuCisjCitsaWJwY2FwLnNoYXJlZGE6ICQoT0JKKQorCUBybSAtZiAkQCBzaHIubworCSQoQ0MpIEBWX1NITElCX09QVEAgLW8gc2hyLm8gJChPQkopICQoQURETE9CSlMpICQoTERGTEFHUykgJChMSUJTKQorCSQoQVIpIHJjICRAIHNoci5vCisKKyMKKyMgRm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyAob3Igb24gd2hpY2ggd2UKKyMgZG9uJ3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzKS4KKyMKK2xpYnBjYXAubm9uZToKIAogc2Nhbm5lci5jOiAkKHNyY2Rpcikvc2Nhbm5lci5sCiAJQHJtIC1mICRACi0JJChMRVgpIC10ICQ8ID4gJCQkJC4kQDsgbXYgJCQkJC4kQCAkQAorCSQoc3JjZGlyKS9ydW5sZXguc2ggJChMRVgpIC1vJEAgJDwKIAogc2Nhbm5lci5vOiBzY2FubmVyLmMgdG9rZGVmcy5oCi0JJChDQykgJChDRkxBR1MpIC1jIHNjYW5uZXIuYworCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1jIHNjYW5uZXIuYwogCiBwY2FwLm86IHZlcnNpb24uaAogCkBAIC0xNDIsMTcgKzQ2MCwyMyBAQAogCiBncmFtbWFyLm86IGdyYW1tYXIuYwogCUBybSAtZiAkQAotCSQoQ0MpICQoQ0ZMQUdTKSAtRHl5bHZhbD1wY2FwX2x2YWwgLWMgZ3JhbW1hci5jCisJJChDQykgJChGVUxMX0NGTEFHUykgLUR5eWx2YWw9cGNhcF9sdmFsIC1jIGdyYW1tYXIuYwogCiB2ZXJzaW9uLm86IHZlcnNpb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtYyB2ZXJzaW9uLmMKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtYyB2ZXJzaW9uLmMKIAogc25wcmludGYubzogJChzcmNkaXIpL21pc3Npbmcvc25wcmludGYuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9zbnByaW50Zi5jCisJJChDQykgJChGVUxMX0NGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3Npbmcvc25wcmludGYuYwogCiB2ZXJzaW9uLmM6ICQoc3JjZGlyKS9WRVJTSU9OCiAJQHJtIC1mICRACi0Jc2VkIC1lICdzLy4qL2NoYXIgcGNhcF92ZXJzaW9uW10gPSAiJiI7LycgJChzcmNkaXIpL1ZFUlNJT04gPiAkQAorCWlmIGdyZXAgR0lUICR7c3JjZGlyfS9WRVJTSU9OID4vZGV2L251bGw7IHRoZW4gXAorCQlyZWFkIHZlciA8JHtzcmNkaXJ9L1ZFUlNJT047IFwKKwkJZWNobyAkJHZlciB8IHRyIC1kICdcMDEyJzsgXAorCQlkYXRlICtfJVlfJW1fJWQ7IFwKKwllbHNlIFwKKwkJY2F0ICR7c3JjZGlyfS9WRVJTSU9OOyBcCisJZmkgfCBzZWQgLWUgJ3MvLiovY2hhciBwY2FwX3ZlcnNpb25bXSA9ICImIjsvJyA+ICRACiAKICMKICMgTk9URTogdGhpcyByZWFsbHkgaXMgc3VwcG9zZWQgdG8gYmUgc3RhdGljOyBpbXBvcnRpbmcgYSBzdHJpbmcKQEAgLTE2Myw1MiArNDg3LDI0MiBAQAogIwogdmVyc2lvbi5oOiAkKHNyY2RpcikvVkVSU0lPTgogCUBybSAtZiAkQAotCXNlZCAtZSAncy8uKi9zdGF0aWMgY29uc3QgY2hhciBwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSAibGlicGNhcCB2ZXJzaW9uICYiOy8nICQoc3JjZGlyKS9WRVJTSU9OID4gJEAKKwlpZiBncmVwIEdJVCAke3NyY2Rpcn0vVkVSU0lPTiA+L2Rldi9udWxsOyB0aGVuIFwKKwkJcmVhZCB2ZXIgPCR7c3JjZGlyfS9WRVJTSU9OOyBcCisJCWVjaG8gJCR2ZXIgfCB0ciAtZCAnXDAxMic7IFwKKwkJZGF0ZSArXyVZXyVtXyVkOyBcCisJZWxzZSBcCisJCWNhdCAke3NyY2Rpcn0vVkVSU0lPTjsgXAorCWZpIHwgc2VkIC1lICdzLy4qL3N0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICJsaWJwY2FwIHZlcnNpb24gJiI7LycgPiAkQAogCiBicGZfZmlsdGVyLmM6ICQoc3JjZGlyKS9icGYvbmV0L2JwZl9maWx0ZXIuYwogCXJtIC1mIGJwZl9maWx0ZXIuYwogCWxuIC1zICQoc3JjZGlyKS9icGYvbmV0L2JwZl9maWx0ZXIuYyBicGZfZmlsdGVyLmMKIAogYnBmX2ZpbHRlci5vOiBicGZfZmlsdGVyLmMKLQkkKENDKSAkKENGTEFHUykgLWMgYnBmX2ZpbHRlci5jCisJJChDQykgJChGVUxMX0NGTEFHUykgLWMgYnBmX2ZpbHRlci5jCiAKLWluc3RhbGw6IGxpYnBjYXAuYSAKKyMKKyMgR2VuZXJhdGUgdGhlIHBjYXAtY29uZmlnIHNjcmlwdC4KKyMKKyMgU29tZSBNYWtlcywgZS5nLiBBSVggTWFrZSBhbmQgU29sYXJpcyBNYWtlLCBjYW4ndCBoYW5kbGUgIi0tZmlsZT0kQC50bXA6JDwiOworIyBmb3IgZXhhbXBsZSwgdGhlIFNvbGFyaXMgOSBtYWtlIG1hbiBwYWdlIHNheXMKKyMKKyMJQmVjYXVzZSBtYWtlIGFzc2lnbnMgJDwgYW5kICQqIGFzIGl0IHdvdWxkIGZvciBpbXBsaWNpdCBydWxlcworIwkoYWNjb3JkaW5nIHRvIHRoZSBzdWZmaXhlcyBsaXN0IGFuZCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzKSwKKyMJdGhleSBtYXkgYmUgdW5yZWxpYWJsZSB3aGVuIHVzZWQgd2l0aGluIGV4cGxpY2l0IHRhcmdldCBlbnRyaWVzLgorIworIyBhbmQgdGhpcyBpcyBhbiBleHBsaWNpdCB0YXJnZXQgZW50cnkuCisjCisjIFRoZXJlZm9yZSwgaW5zdGVhZCBvZiB1c2luZyAkPCwgd2UgZXhwbGljaXRseSBwdXQgaW4gJChzcmNkaXIpL3BjYXAtY29uZmlnLmluLgorIworcGNhcC1jb25maWc6ICQoc3JjZGlyKS9wY2FwLWNvbmZpZy5pbiAuL2NvbmZpZy5zdGF0dXMKKwlAcm0gLWYgJEAgJEAudG1wCisJLi9jb25maWcuc3RhdHVzIC0tZmlsZT0kQC50bXA6JChzcmNkaXIpL3BjYXAtY29uZmlnLmluCisJbXYgJEAudG1wICRACisJY2htb2QgYSt4ICRACisKKyMKKyMgVGVzdCBwcm9ncmFtcyAtIG5vdCBidWlsdCBieSBkZWZhdWx0LCBhbmQgbm90IGluc3RhbGxlZC4KKyMKK3Rlc3RzOiAkKFRFU1RTKQorCitmaWx0ZXJ0ZXN0OiB0ZXN0cy9maWx0ZXJ0ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChGVUxMX0NGTEFHUykgLUkuIC1MLiAtbyBmaWx0ZXJ0ZXN0ICQoc3JjZGlyKS90ZXN0cy9maWx0ZXJ0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKworZmluZGFsbGRldnN0ZXN0OiB0ZXN0cy9maW5kYWxsZGV2c3Rlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIGZpbmRhbGxkZXZzdGVzdCAkKHNyY2RpcikvdGVzdHMvZmluZGFsbGRldnN0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKworbm9uYmxvY2t0ZXN0OiB0ZXN0cy9ub25ibG9ja3Rlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIG5vbmJsb2NrdGVzdCAkKHNyY2RpcikvdGVzdHMvbm9uYmxvY2t0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKworb3BlbnRlc3Q6IHRlc3RzL29wZW50ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChGVUxMX0NGTEFHUykgLUkuIC1MLiAtbyBvcGVudGVzdCAkKHNyY2RpcikvdGVzdHMvb3BlbnRlc3QuYyBsaWJwY2FwLmEgJChMSUJTKQorCitzZWxwb2xsdGVzdDogdGVzdHMvc2VscG9sbHRlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIHNlbHBvbGx0ZXN0ICQoc3JjZGlyKS90ZXN0cy9zZWxwb2xsdGVzdC5jIGxpYnBjYXAuYSAkKExJQlMpCisKK3ZhbGdyaW5kdGVzdDogdGVzdHMvdmFsZ3JpbmR0ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChGVUxMX0NGTEFHUykgLUkuIC1MLiAtbyB2YWxncmluZHRlc3QgJChzcmNkaXIpL3Rlc3RzL3ZhbGdyaW5kdGVzdC5jIGxpYnBjYXAuYSAkKExJQlMpCisKK2luc3RhbGw6IGluc3RhbGwtc2hhcmVkIGluc3RhbGwtYXJjaGl2ZSBwY2FwLWNvbmZpZworCVsgLWQgJChERVNURElSKSQobGliZGlyKSBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGxpYmRpcik7IGNobW9kIDc1NSAkKERFU1RESVIpJChsaWJkaXIpKQorCVsgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKGluY2x1ZGVkaXIpKQorCVsgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikvcGNhcCBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXA7IGNobW9kIDc1NSAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9wY2FwKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW4xIF0gfHwgXAorCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobWFuZGlyKS9tYW4xOyBjaG1vZCA3NTUgJChERVNURElSKSQobWFuZGlyKS9tYW4xKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW4zIF0gfHwgXAorCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobWFuZGlyKS9tYW4zOyBjaG1vZCA3NTUgJChERVNURElSKSQobWFuZGlyKS9tYW4zKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW5ATUFOX0ZJTEVfRk9STUFUU0AgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fRklMRV9GT1JNQVRTQDsgY2htb2QgNzU1ICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9GSUxFX0ZPUk1BVFNAKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW5ATUFOX01JU0NfSU5GT0AgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fTUlTQ19JTkZPQDsgY2htb2QgNzU1ICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9NSVNDX0lORk9AKQorCWZvciBpIGluICQoUFVCSERSKTsgZG8gXAorCQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkaSBcCisJCSAgICAkKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGk7IGRvbmUKKwlbIC1kICQoREVTVERJUikkKGJpbmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChiaW5kaXIpOyBjaG1vZCA3NTUgJChERVNURElSKSQoYmluZGlyKSkKKwkkKElOU1RBTExfUFJPR1JBTSkgcGNhcC1jb25maWcgJChERVNURElSKSQoYmluZGlyKS9wY2FwLWNvbmZpZworCWZvciBpIGluICQoTUFOMSk7IGRvIFwKKwkJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGkgXAorCQkgICAgJChERVNURElSKSQobWFuZGlyKS9tYW4xLyQkaTsgZG9uZQorCWZvciBpIGluICQoTUFOM1BDQVBfTk9FWFBBTkQpOyBkbyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRpIFwKKwkJICAgICQoREVTVERJUikkKG1hbmRpcikvbWFuMy8kJGk7IGRvbmUKKwlmb3IgaSBpbiAkKE1BTjNQQ0FQX0VYUEFORDouaW49KTsgZG8gXAorCQkkKElOU1RBTExfREFUQSkgJCRpIFwKKwkJICAgICQoREVTVERJUikkKG1hbmRpcikvbWFuMy8kJGk7IGRvbmUKKwkoY2QgJChERVNURElSKSQobWFuZGlyKS9tYW4zICYmIFwKKwlybSAtZiBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbi4zcGNhcCAmJiBcCisJJChMTl9TKSBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLjNwY2FwIFwKKwkJIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uLjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX2R1bXBfZm9wZW4uM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9kdW1wX29wZW4uM3BjYXAgcGNhcF9kdW1wX2ZvcGVuLjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX2ZyZWVhbGxkZXZzLjNwY2FwICYmIFwKKwkkKExOX1MpIHBjYXBfZmluZGFsbGRldnMuM3BjYXAgcGNhcF9mcmVlYWxsZGV2cy4zcGNhcCAmJiBcCisJcm0gLWYgcGNhcF9wZXJyb3IuM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9nZXRlcnIuM3BjYXAgcGNhcF9wZXJyb3IuM3BjYXAgJiYgXAorCXJtIC1mIHBjYXBfc2VuZHBhY2tldC4zcGNhcCAmJiBcCisJJChMTl9TKSBwY2FwX2luamVjdC4zcGNhcCBwY2FwX3NlbmRwYWNrZXQuM3BjYXAgJiYgXAorCXJtIC1mIHBjYXBfZnJlZV9kYXRhbGlua3MuM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9saXN0X2RhdGFsaW5rcy4zcGNhcCBwY2FwX2ZyZWVfZGF0YWxpbmtzLjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzLjNwY2FwICYmIFwKKwkkKExOX1MpIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAgcGNhcF9mcmVlX3RzdGFtcF90eXBlcy4zcGNhcCAmJiBcCisJcm0gLWYgcGNhcF9kaXNwYXRjaC4zcGNhcCAmJiBcCisJJChMTl9TKSBwY2FwX2xvb3AuM3BjYXAgcGNhcF9kaXNwYXRjaC4zcGNhcCAmJiBcCisJcm0gLWYgcGNhcF9taW5vcl92ZXJzaW9uLjNwY2FwICYmIFwKKwkkKExOX1MpIHBjYXBfbWFqb3JfdmVyc2lvbi4zcGNhcCBwY2FwX21pbm9yX3ZlcnNpb24uM3BjYXAgJiYgXAorCXJtIC1mIHBjYXBfbmV4dC4zcGNhcCAmJiBcCisJJChMTl9TKSBwY2FwX25leHRfZXguM3BjYXAgcGNhcF9uZXh0LjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX29wZW5fZGVhZF93aXRoX3RzdGFtcF9wcmVjaXNpb24uM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9vcGVuX2RlYWQuM3BjYXAgXAorCQkgcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX29wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24uM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAgcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX2ZvcGVuX29mZmxpbmUuM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAgcGNhcF9mb3Blbl9vZmZsaW5lLjNwY2FwICYmIFwKKwlybSAtZiBwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwICYmIFwKKwkkKExOX1MpIHBjYXBfb3Blbl9vZmZsaW5lLjNwY2FwIHBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24uM3BjYXAgJiYgXAorCXJtIC1mIHBjYXBfZ2V0bm9uYmxvY2suM3BjYXAgJiYgXAorCSQoTE5fUykgcGNhcF9zZXRub25ibG9jay4zcGNhcCBwY2FwX2dldG5vbmJsb2NrLjNwY2FwKQorCWZvciBpIGluICQoTUFORklMRSk7IGRvIFwKKwkJJChJTlNUQUxMX0RBVEEpIGBlY2hvICQkaSB8IHNlZCAncy8ubWFuZmlsZS5pbi8ubWFuZmlsZS8nYCBcCisJCSAgICAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fRklMRV9GT1JNQVRTQC9gZWNobyAkJGkgfCBzZWQgJ3MvLm1hbmZpbGUuaW4vLkBNQU5fRklMRV9GT1JNQVRTQC8nYDsgZG9uZQorCWZvciBpIGluICQoTUFOTUlTQyk7IGRvIFwKKwkJJChJTlNUQUxMX0RBVEEpIGBlY2hvICQkaSB8IHNlZCAncy8ubWFubWlzYy5pbi8ubWFubWlzYy8nYCBcCisJCSAgICAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fTUlTQ19JTkZPQC9gZWNobyAkJGkgfCBzZWQgJ3MvLm1hbm1pc2MuaW4vLkBNQU5fTUlTQ19JTkZPQC8nYDsgZG9uZQorCitpbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1zaGFyZWQtJChEWUVYVCkKK2luc3RhbGwtc2hhcmVkLXNvOiBsaWJwY2FwLnNvCisJWyAtZCAkKERFU1RESVIpJChsaWJkaXIpIF0gfHwgXAorCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobGliZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKGxpYmRpcikpCisJVkVSPWBjYXQgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJTUFKT1JfVkVSPWBzZWQgJ3MvXChbMC05XVswLTldKlwpXC4uKi9cMS8nICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCSQoSU5TVEFMTF9QUk9HUkFNKSBsaWJwY2FwLnNvLiQkVkVSICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5zby4kJFZFUjsgXAorCWxuIC1zZiBsaWJwY2FwLnNvLiQkVkVSICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5zby4kJE1BSk9SX1ZFUjsgXAorCWxuIC1zZiBsaWJwY2FwLnNvLiQkTUFKT1JfVkVSICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5zbworaW5zdGFsbC1zaGFyZWQtZHlsaWI6IGxpYnBjYXAuZHlsaWIKKwlbIC1kICQoREVTVERJUikkKGxpYmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChsaWJkaXIpOyBjaG1vZCA3NTUgJChERVNURElSKSQobGliZGlyKSkKKwlWRVI9YGNhdCAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlNQUpPUl9WRVI9QTsgXAorCSQoSU5TVEFMTF9QUk9HUkFNKSBsaWJwY2FwLiQkVkVSLmR5bGliICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC4kJFZFUi5keWxpYjsgXAorCWxuIC1zZiBsaWJwY2FwLiQkVkVSLmR5bGliICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC4kJE1BSk9SX1ZFUi5keWxpYjsgXAorCWxuIC1zZiBsaWJwY2FwLiQkTUFKT1JfVkVSLmR5bGliICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5keWxpYgoraW5zdGFsbC1zaGFyZWQtc2w6IGxpYnBjYXAuc2wKKwlbIC1kICQoREVTVERJUikkKGxpYmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChsaWJkaXIpOyBjaG1vZCA3NTUgJChERVNURElSKSQobGliZGlyKSkKKwlNQUpPUl9WRVI9YHNlZCAncy9cKFswLTldWzAtOV0qXClcLi4qL1wxLycgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYnBjYXAuJCRNQUpPUl9WRVIgJChERVNURElSKSQobGliZGlyKQorCWxuIC1zZiBsaWJwY2FwLiQkTUFKT1JfVkVSICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5zbAoraW5zdGFsbC1zaGFyZWQtc2hhcmVkYTogbGlicGNhcC5zaGFyZWRhCisJIworCSMgQUlYIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHdlaXJkLiAgVGhleSdyZSBhcmNoaXZlIGxpYnJhcmllcworCSMgd2l0aCBvbmUgb3IgbW9yZSBzaGFyZWQgb2JqZWN0IGNvbXBvbmVudHMuCisJIworCVsgLWQgJChERVNURElSKSQobGliZGlyKSBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGxpYmRpcik7IGNobW9kIDc1NSAkKERFU1RESVIpJChsaWJkaXIpKQorCSQoSU5TVEFMTF9QUk9HUkFNKSBsaWJwY2FwLnNoYXJlZGEgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLmEKK2luc3RhbGwtc2hhcmVkLW5vbmU6CisKK2luc3RhbGwtYXJjaGl2ZTogaW5zdGFsbC1hcmNoaXZlLSQoRFlFWFQpCitpbnN0YWxsLWFyY2hpdmUtc28gaW5zdGFsbC1hcmNoaXZlLWR5bGliIGluc3RhbGwtYXJjaGl2ZS1zbCBpbnN0YWxsLWFyY2hpdmUtbm9uZTogbGlicGNhcC5hCisJIworCSMgTW9zdCBwbGF0Zm9ybXMgaGF2ZSBzZXBhcmF0ZSBzdWZmaXhlcyBmb3Igc2hhcmVkIGFuZAorCSMgYXJjaGl2ZSBsaWJyYXJpZXMsIHNvIHdlIGluc3RhbGwgYm90aC4KKwkjCiAJWyAtZCAkKERFU1RESVIpJChsaWJkaXIpIF0gfHwgXAogCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobGliZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKGxpYmRpcikpCiAJJChJTlNUQUxMX0RBVEEpIGxpYnBjYXAuYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuYQogCSQoUkFOTElCKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuYQotCVsgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikgXSB8fCBcCi0JICAgIChta2RpciAtcCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKGluY2x1ZGVkaXIpKQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcGNhcC5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXAuaAotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcGNhcC1icGYuaCBcCi0JICAgICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXAtYnBmLmgKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3BjYXAtbmFtZWRiLmggXAotCSAgICAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9wY2FwLW5hbWVkYi5oCi0JWyAtZCAkKERFU1RESVIpJChtYW5kaXIpL21hbjMgXSB8fCBcCi0JCShta2RpciAtcCAkKERFU1RESVIpJChtYW5kaXIpL21hbjM7IGNobW9kIDc1NSAkKERFU1RESVIpJChtYW5kaXIpL21hbjMpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9wY2FwLjMgXAotCSAgICAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcC4zCitpbnN0YWxsLWFyY2hpdmUtc2hhcmVkYToKKwkjCisJIyBBSVgsIGhvd2V2ZXIsIGRvZXNuJ3QsIHNvIHdlIGRvbid0IGluc3RhbGwgdGhlIGFyY2hpdmUKKwkjIGxpYnJhcnkgb24gQUlYLgorCSMKIAotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtc2hhcmVkLSQoRFlFWFQpCi1pbnN0YWxsLXNoYXJlZC1zbzogbGlicGNhcC5zbwotCSQoSU5TVEFMTF9QUk9HUkFNKSBsaWJwY2FwLnNvLmBjYXQgVkVSU0lPTmAgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLnNvLmBjYXQgVkVSU0lPTmAKLWluc3RhbGwtc2hhcmVkLWR5bGliOiBsaWJwY2FwLmR5bGliCi0JJChJTlNUQUxMX1BST0dSQU0pIGxpYnBjYXAuYGNhdCBWRVJTSU9OYC5keWxpYiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuYGNhdCBWRVJTSU9OYC5keWxpYgotCVZFUj1gY2F0IFZFUlNJT05gOyBjZCAkKERFU1RESVIpJChsaWJkaXIpICYmIGxuIC1zZiBsaWJwY2FwLiQkVkVSLmR5bGliIGxpYnBjYXAuMC5keWxpYjsgIGxuIC1zZiBsaWJwY2FwLjAuZHlsaWIgbGlicGNhcC5keWxpYgotCi11bmluc3RhbGw6Cit1bmluc3RhbGw6IHVuaW5zdGFsbC1zaGFyZWQKIAlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuYQotCXJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXAuaAotCXJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXAtYnBmLmgKLQlybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9wY2FwLW5hbWVkYi5oCi0Jcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXAuMworCWZvciBpIGluICQoUFVCSERSKTsgZG8gXAorCQlybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGk7IGRvbmUKKwktcm1kaXIgJChERVNURElSKSQoaW5jbHVkZWRpcikvcGNhcAorCXJtIC1mICQoREVTVERJUikvJChiaW5kaXIpL3BjYXAtY29uZmlnCisJZm9yIGkgaW4gJChNQU4xKTsgZG8gXAorCQlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvJCRpOyBkb25lCisJZm9yIGkgaW4gJChNQU4zUENBUCk7IGRvIFwKKwkJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zLyQkaTsgZG9uZQorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbi4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2R1bXBfZm9wZW4uM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mcmVlYWxsZGV2cy4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX3BlcnJvci4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX3NlbmRwYWNrZXQuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mcmVlX2RhdGFsaW5rcy4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZyZWVfdHN0YW1wX3R5cGVzLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZGlzcGF0Y2guM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9taW5vcl92ZXJzaW9uLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfbmV4dC4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX29wZW5fZGVhZF93aXRoX3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZm9wZW5fb2ZmbGluZS4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZ2V0bm9uYmxvY2suM3BjYXAKKwlmb3IgaSBpbiAkKE1BTkZJTEUpOyBkbyBcCisJCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9GSUxFX0ZPUk1BVFNAL2BlY2hvICQkaSB8IHNlZCAncy8ubWFuZmlsZS5pbi8uQE1BTl9GSUxFX0ZPUk1BVFNALydgOyBkb25lCisJZm9yIGkgaW4gJChNQU5NSVNDKTsgZG8gXAorCQlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fTUlTQ19JTkZPQC9gZWNobyAkJGkgfCBzZWQgJ3MvLm1hbm1pc2MuaW4vLkBNQU5fTUlTQ19JTkZPQC8nYDsgZG9uZQorCit1bmluc3RhbGwtc2hhcmVkOiB1bmluc3RhbGwtc2hhcmVkLSQoRFlFWFQpCit1bmluc3RhbGwtc2hhcmVkLXNvOgorCVZFUj1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCU1BSk9SX1ZFUj1gc2VkICdzL1woWzAtOV1bMC05XSpcKVwuLiovXDEvJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuc28uJCRWRVI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuc28uJCRNQUpPUl9WRVI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuc28KK3VuaW5zdGFsbC1zaGFyZWQtZHlsaWI6CisJVkVSPWBjYXQgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJTUFKT1JfVkVSPUE7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuJCRWRVIuZHlsaWI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuJCRNQUpPUl9WRVIuZHlsaWI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuZHlsaWIKK3VuaW5zdGFsbC1zaGFyZWQtc2w6CisJTUFKT1JfVkVSPWBzZWQgJ3MvXChbMC05XVswLTldKlwpXC4uKi9cMS8nICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC4kJE1BSk9SX1ZFUjsgXAorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5zbAordW5pbnN0YWxsLXNoYXJlZC1zaGFyZWRhOgorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5hCit1bmluc3RhbGwtc2hhcmVkLW5vbmU6CiAKIGNsZWFuOgotCXJtIC1mICQoQ0xFQU5GSUxFUykgbGlicGNhcCouZHlsaWIgbGlicGNhcC5zbyoKKwlybSAtZiAkKENMRUFORklMRVMpCiAKIGRpc3RjbGVhbjogY2xlYW4KIAlybSAtZiBNYWtlZmlsZSBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBjb25maWcuc3RhdHVzIFwKLQkgICAgY29uZmlnLmggZ251Yy5oIG9zLXByb3RvLmggYnBmX2ZpbHRlci5jIHN0YW1wLWggc3RhbXAtaC5pbgorCSAgICBjb25maWcuaCBnbnVjLmggbmV0IG9zLXByb3RvLmggYnBmX2ZpbHRlci5jIHBjYXAtY29uZmlnIFwKKwkgICAgc3RhbXAtaCBzdGFtcC1oLmluCisJcm0gLWYgJChNQU4zUENBUF9FWFBBTkQ6LmluPSkgJChNQU5GSUxFOi5pbj0pICQoTUFOTUlTQzouaW49KQogCXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQogCiB0YWdzOiAkKFRBR0ZJTEVTKQpAQCAtMjIwLDEzICs3MzQsMTIgQEAKIAogcmVsZWFzZXRhcjoKIAlAY3dkPWBwd2RgIDsgZGlyPWBiYXNlbmFtZSAkJGN3ZGAgOyBuYW1lPSQoUFJPRyktYGNhdCBWRVJTSU9OYCA7IFwKLQkgICBsaXN0PSIiIDsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uOyBta2RpciAtcCBuOyBjZCBuOyBsbiAtcyAuLi8kJGRpciAkJG5hbWU7IFwKLQkgICB0YXIgLWMgLXogLWYgJCRuYW1lLnRhci5neiAkJG5hbWUvLiA7CisJICAgbWtkaXIgJCRuYW1lOyBcCisJICAgdGFyIGNmIC0gJChDU1JDKSAkKEhEUikgJChNQU4xKSAkKE1BTjNQQ0FQX0VYUEFORCkgXAorCSAgICAgICQoTUFOM1BDQVBfTk9FWFBBTkQpICQoTUFORklMRSkgJChNQU5NSVNDKSAkKEVYVFJBX0RJU1QpIHwgXAorCSAgICAgIChjZCAkJG5hbWU7IHRhciB4ZiAtKTsgXAorCSAgIHRhciAtYyAteiAtZiAkJG5hbWUudGFyLmd6ICQkbmFtZTsgXAorCSAgIHJtIC1yZiAkJG5hbWUKIAogZGVwZW5kOgkkKEdFTlNSQykgJChHRU5IRFIpIGJwZl9maWx0ZXIuYwotCS4vbWtkZXAgLWMgJChDQykgJChERUZTKSAkKElOQ0xTKSAkKFNSQykKLQotTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKLQkuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB5b3VyIE1ha2VmaWxlIHdhcyBvdXQgb2YgZGF0ZSwgbm93IHJ1biAkKE1BS0UpIGFnYWluCi0JZXhpdCAxCisJJChNS0RFUCkgLWMgJChDQykgLW0gJChERVBFTkRFTkNZX0NGTEFHKSAkKERFRlMpICQoSU5DTFMpICQoU1JDKQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE1ZjdkLi4wMDAwMDAwCi0tLSBhL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUxpY2Vuc2U6IEJTRAotIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0gIAotICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICAgIGRpc3RyaWJ1dGlvbi4KLSAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0gIAotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLUlNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggOTA1NzFhMS4uMmYxNGFhYyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSwyNCArMSwyNCBAQAotQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9SRUFETUUsdiAxLjMwIDIwMDQvMTAvMTIgMDI6MDI6MjggZ3V5IEV4cCAkIChMQkwpCitAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL1JFQURNRSx2IDEuMzQgMjAwOC0xMi0xNCAxOTo0NDoxNCBndXkgRXhwICQgKExCTCkKIAotTElCUENBUCAwLjkKLU5vdyBtYWludGFpbmVkIGJ5ICJUaGUgVGNwZHVtcCBHcm91cCIKLVNlZSAJCXd3dy50Y3BkdW1wLm9yZworTElCUENBUCAxLngueQogCi1QbGVhc2Ugc2VuZCBpbnF1aXJpZXMvY29tbWVudHMvcmVwb3J0cyB0byAJdGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnCit3d3cudGNwZHVtcC5vcmcKIAotQW5vbnltb3VzIENWUyBpcyBhdmFpbGFibGUgdmlhOgotCWN2cyAtZCA6cHNlcnZlcjp0Y3BkdW1wQGN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgbG9naW4KLQkocGFzc3dvcmQgImFub25jdnMiKQotCWN2cyAtZCA6cHNlcnZlcjp0Y3BkdW1wQGN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgY2hlY2tvdXQgbGlicGNhcAorUGxlYXNlIHNlbmQgaW5xdWlyaWVzL2NvbW1lbnRzL3JlcG9ydHMgdG86CisJdGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnCiAKLVZlcnNpb24gMC45IG9mIExJQlBDQVAgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBDVlMgdGFnICJsaWJwY2FwXzBfOXJlbDEiOgotCWN2cyAtZCA6cHNlcnZlcjp0Y3BkdW1wQGN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgY2hlY2tvdXQgLXIgbGlicGNhcF8wXzlyZWwxIGxpYnBjYXAKK0Fub255bW91cyBHaXQgaXMgYXZhaWxhYmxlIHZpYToKKwlnaXQgY2xvbmUgZ2l0Oi8vYnBmLnRjcGR1bXAub3JnL2xpYnBjYXAKIAotUGxlYXNlIHNlbmQgcGF0Y2hlcyBhZ2FpbnN0IHRoZSBtYXN0ZXIgY29weSB0byBwYXRjaGVzQHRjcGR1bXAub3JnLgorUGxlYXNlIHN1Ym1pdCBwYXRjaGVzIGJ5IGZvcmtpbmcgdGhlIGJyYW5jaCBvbiBHaXRIdWIgYXQKKworCWh0dHA6Ly9naXRodWIuY29tL3RoZS10Y3BkdW1wLWdyb3VwL2xpYnBjYXAvdHJlZS9tYXN0ZXIKKworYW5kIGlzc3VpbmcgYSBwdWxsIHJlcXVlc3QuCiAKIGZvcm1lcmx5IGZyb20gCUxhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYm9yYXRvcnkKIAkJTmV0d29yayBSZXNlYXJjaCBHcm91cCA8bGlicGNhcEBlZS5sYmwuZ292PgotCQlmdHA6Ly9mdHAuZWUubGJsLmdvdi9saWJwY2FwLnRhci5aICgwLjQpCisJCWZ0cDovL2Z0cC5lZS5sYmwuZ292L29sZC9saWJwY2FwLTAuNGE3LnRhci5aCiAKIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciBsaWJwY2FwLCBhIHN5c3RlbS1pbmRlcGVuZGVudAogaW50ZXJmYWNlIGZvciB1c2VyLWxldmVsIHBhY2tldCBjYXB0dXJlLiAgbGlicGNhcCBwcm92aWRlcyBhIHBvcnRhYmxlCkBAIC0zMCw4ICszMCw2IEBACiB0byBlYXNlIGluIHBvcnRpbmcgYW5kIHRvIGFsbGV2aWF0ZSB0aGUgbmVlZCBmb3Igc2V2ZXJhbAogc3lzdGVtLWRlcGVuZGVudCBwYWNrZXQgY2FwdHVyZSBtb2R1bGVzIGluIGVhY2ggYXBwbGljYXRpb24uCiAKLU5vdGUgd2VsbDogdGhpcyBpbnRlcmZhY2UgaXMgbmV3IGFuZCBpcyBsaWtlbHkgdG8gY2hhbmdlLgotCiBGb3Igc29tZSBwbGF0Zm9ybXMgdGhlcmUgYXJlIFJFQURNRS57c3lzdGVtfSBmaWxlcyB0aGF0IGRpc2N1c3MgaXNzdWVzCiB3aXRoIHRoZSBPUydzIGludGVyZmFjZSBmb3IgcGFja2V0IGNhcHR1cmUgb24gdGhvc2UgcGxhdGZvcm1zLCBzdWNoIGFzCiBob3cgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoYXQgaW50ZXJmYWNlIGluIHRoZSBPUywgaWYgaXQncyBub3QgYnVpbHQgaW4KQEAgLTY1LDMwICs2Myw0NiBAQAogd291bGQgdHJhbnNsYXRlIEJQRiBmaWx0ZXJzIGludG8gYSBmaWx0ZXIgcHJvZ3JhbSB0aGF0IGlzIGNvbXBhdGlibGUKIHdpdGggdGhlIHVuZGVybHlpbmcga2VybmVsIHN1YnN5c3RlbSwgYnV0IHRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KIAotQlBGIGlzIHN0YW5kYXJkIGluIDQuNEJTRCwgQlNEL09TLCBOZXRCU0QsIEZyZWVCU0QsIGFuZCBPcGVuQlNELiAgREVDCi1PU0YvMS9EaWdpdGFsIFVOSVgvVHJ1NjQgVU5JWCB1c2VzIHRoZSBwYWNrZXRmaWx0ZXIgaW50ZXJmYWNlIGJ1dCBoYXMKLWJlZW4gZXh0ZW5kZWQgdG8gYWNjZXB0IEJQRiBmaWx0ZXJzICh3aGljaCBsaWJwY2FwIHV0aWxpemVzKS4gIEFsc28sIHlvdQotY2FuIGFkZCBCUEYgZmlsdGVyIHN1cHBvcnQgdG8gVWx0cml4IHVzaW5nIHRoZSBrZXJuZWwgc291cmNlIGFuZC9vcgotb2JqZWN0IHBhdGNoZXMgYXZhaWxhYmxlIGluOgorQlBGIGlzIHN0YW5kYXJkIGluIDQuNEJTRCwgQlNEL09TLCBOZXRCU0QsIEZyZWVCU0QsIE9wZW5CU0QsIERyYWdvbkZseQorQlNELCBhbmQgTWFjIE9TIFg7IGFuIG9sZGVyLCBtb2RpZmllZCBhbmQgdW5kb2N1bWVudGVkIHZlcnNpb24gaXMKK3N0YW5kYXJkIGluIEFJWC4gIHtERUMgT1NGLzEsIERpZ2l0YWwgVU5JWCwgVHJ1NjQgVU5JWH0gdXNlcyB0aGUKK3BhY2tldGZpbHRlciBpbnRlcmZhY2UgYnV0IGhhcyBiZWVuIGV4dGVuZGVkIHRvIGFjY2VwdCBCUEYgZmlsdGVycworKHdoaWNoIGxpYnBjYXAgdXRpbGl6ZXMpLiAgQWxzbywgeW91IGNhbiBhZGQgQlBGIGZpbHRlciBzdXBwb3J0IHRvCitVbHRyaXggdXNpbmcgdGhlIGtlcm5lbCBzb3VyY2UgYW5kL29yIG9iamVjdCBwYXRjaGVzIGF2YWlsYWJsZSBpbjoKIAotCWZ0cDovL2dhdGVrZWVwZXIuZGVjLmNvbS9wdWIvREVDL25ldC9icGZleHQ0Mi50YXIuWi4KKwlodHRwOi8vd3d3LnRjcGR1bXAub3JnL290aGVyL2JwZmV4dDQyLnRhci5aCiAKIExpbnV4LCBpbiB0aGUgMi4yIGtlcm5lbCBhbmQgbGF0ZXIga2VybmVscywgaGFzIGEgIlNvY2tldCBGaWx0ZXIiCiBtZWNoYW5pc20gdGhhdCBhY2NlcHRzIEJQRiBmaWx0ZXJzOyBzZWUgdGhlIFJFQURNRS5saW51eCBmaWxlIGZvcgogaW5mb3JtYXRpb24gb24gY29uZmlndXJpbmcgdGhhdCBvcHRpb24uCiAKLVByb2JsZW1zLCBidWdzLCBxdWVzdGlvbnMsIGRlc2lyYWJsZSBlbmhhbmNlbWVudHMsIGV0Yy4gc2hvdWxkIGJlIHNlbnQKLXRvIHRoZSBhZGRyZXNzICJ0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmciLiAgQnVncywgc3VwcG9ydCByZXF1ZXN0cywKLWFuZCBmZWF0dXJlIHJlcXVlc3RzIG1heSBhbHNvIGJlIHN1Ym1pdHRlZCBvbiB0aGUgU291cmNlRm9yZ2Ugc2l0ZSBmb3IKLWxpYnBjYXAgYXQKK05vdGUgdG8gTGludXggZGlzdHJpYnV0aW9ucyBhbmQgKkJTRCBzeXN0ZW1zIHRoYXQgaW5jbHVkZSBsaWJwY2FwOgogCi0JaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJwY2FwLworVGhlcmUncyBub3cgYSBydWxlIHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSwgd2hpY2ggc2hvdWxkIHdvcmsgb24gTGludXggCithbmQgKkJTRCwgYW1vbmcgb3RoZXIgcGxhdGZvcm1zLgorCitJdCBzZXRzIHRoZSBzb25hbWUgb2YgdGhlIGxpYnJhcnkgdG8gImxpYnBjYXAuc28uMSI7IHRoaXMgaXMgd2hhdCBpdCAKK3Nob3VsZCBiZSwgKk5PVCogbGlicGNhcC5zby4xLnggb3IgbGlicGNhcC5zby4xLngueSBvciBzb21ldGhpbmcgc3VjaCBhcyAKK3RoYXQuCisKK1dlJ3ZlIGJlZW4gbWFpbnRhaW5pbmcgYmluYXJ5IGNvbXBhdGliaWxpdHkgYmV0d2VlbiBsaWJwY2FwIHJlbGVhc2VzIGZvciAKK3F1aXRlIGEgd2hpbGU7IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHRpZSBhIGJpbmFyeSBsaW5rZWQgd2l0aCBsaWJwY2FwIHRvIAorYSBwYXJ0aWN1bGFyIHJlbGVhc2Ugb2YgbGlicGNhcC4KKworUHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiBzaG91bGQgYmUgc2VudAordG8gdGhlIGFkZHJlc3MgInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIuICBCdWdzLCBzdXBwb3J0CityZXF1ZXN0cywgYW5kIGZlYXR1cmUgcmVxdWVzdHMgbWF5IGFsc28gYmUgc3VibWl0dGVkIG9uIHRoZSBHaXRIdWIgaXNzdWUKK3RyYWNrZXIgZm9yIGxpYnBjYXAgYXQKKworCWh0dHBzOi8vZ2l0aHViLmNvbS90aGUtdGNwZHVtcC1ncm91cC9saWJwY2FwL2lzc3VlcwogCiBTb3VyY2UgY29kZSBjb250cmlidXRpb25zLCBldGMuIHNob3VsZCBiZSBzZW50IHRvIHRoZSBlbWFpbCBhZGRyZXNzCi0icGF0Y2hlc0B0Y3BkdW1wLm9yZyIsIG9yIHN1Ym1pdHRlZCBhcyBwYXRjaGVzIG9uIHRoZSBTb3VyY2VGb3JnZSBzaXRlCi1mb3IgbGlicGNhcC4KK2Fib3ZlIG9yIHN1Ym1pdHRlZCBieSBmb3JraW5nIHRoZSBicmFuY2ggb24gR2l0SHViIGF0CiAKLUN1cnJlbnQgdmVyc2lvbnMgY2FuIGJlIGZvdW5kIGF0IHd3dy50Y3BkdW1wLm9yZywgb3IgdGhlIFNvdXJjZUZvcmdlCi1zaXRlIGZvciBsaWJwY2FwLgorCWh0dHA6Ly9naXRodWIuY29tL3RoZS10Y3BkdW1wLWdyb3VwL2xpYnBjYXAvdHJlZS9tYXN0ZXIKKworYW5kIGlzc3VpbmcgYSBwdWxsIHJlcXVlc3QuCisKK0N1cnJlbnQgdmVyc2lvbnMgY2FuIGJlIGZvdW5kIGF0IHd3dy50Y3BkdW1wLm9yZy4KIAogIC0gVGhlIFRDUGR1bXAgdGVhbQpkaWZmIC0tZ2l0IGEvUkVBRE1FLldpbjMyIGIvUkVBRE1FLldpbjMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzgzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuV2luMzIKQEAgLTAsMCArMSw0NiBAQAorVW5kZXIgV2luMzIsIGxpYnBjYXAgaXMgaW50ZWdyYXRlZCBpbiB0aGUgV2luUGNhcCBwYWNrZXQgY2FwdHVyZSBzeXN0ZW0uIAorV2luUGNhcCBwcm92aWRlcyBhIGZyYW1ld29yayB0aGF0IGFsbG93cyBsaWJwY2FwIHRvIGNhcHR1cmUgdGhlIHBhY2tldHMgCit1bmRlciBXaW5kb3dzIDk1LCBXaW5kb3dzIDk4LCBXaW5kb3dzIE1FLCBXaW5kb3dzIE5UIDQsIFdpbmRvd3MgMjAwMCAKK2FuZCBXaW5kb3dzIFhQLgorV2luUGNhcCBiaW5hcmllcyBhbmQgc291cmNlIGNvZGUgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93aW5wY2FwLnBvbGl0by5pdDogCit0aGV5IGluY2x1ZGUgYWxzbyBhIGRldmVsb3BlcidzIHBhY2sgd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSB0byBjb21waWxlIAorbGlicGNhcC1iYXNlZCBhcHBsaWNhdGlvbnMgdW5kZXIgV2luZG93cy4KKworSG93IHRvIGNvbXBpbGUgbGlicGNhcCB3aXRoIFZpc3VhbCBTdHVkaW8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIG9yZGVyIHRvIGNvbXBpbGUgbGlicGNhcCB5b3Ugd2lsbCBuZWVkOgorCistIHZlcnNpb24gNiAob3IgaGlnaGVyKSBvZiBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbworLSBUaGUgTm92ZW1iZXIgMjAwMSAob3IgbGF0ZXIpIGVkaXRpb24gb2YgTWljcm9zb2Z0IFBsYXRmb3JtIAorU29mdHdhcmUgRGV2ZWxvcG1lbnQgS2l0IChTREspLCB0aGF0IGNvbnRhaW5zIHNvbWUgbmVjZXNzYXJ5IGluY2x1ZGVzIAorZm9yIElQdjYgc3VwcG9ydC4gWW91IGNhbiBkb3dubG9hZCBpdCBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9zZGsKKy0gdGhlIGxhdGVzdCBXaW5QY2FwIHNvdXJjZXMgZnJvbSBodHRwOi8vd2lucGNhcC5wb2xpdG8uaXQvaW5zdGFsbCAKKworVGhlIFdpblBjYXAgc291cmNlIGNvZGUgYWxyZWFkeSBjb250YWlucyBhIHJlY2VudCAodXN1YWxseSB0aGUgbGF0ZXN0IAorc3RhYmxlKSB2ZXJzaW9uIG9mIGxpYnBjYXAuIElmIHlvdSBuZWVkIHRvIGNvbXBpbGUgYSBkaWZmZXJlbnQgb25lLCAKK3NpbXBseSBkb3dubG9hZCBpdCBmcm9tIHd3dy50Y3BkdW1wLm9yZyBhbmQgY29weSB0aGUgc291cmNlcyBpbiB0aGUgCit3aW5wY2FwXHdwY2FwXGxpYnBjYXAgZm9sZGVyIG9mIHRoZSBXaW5QY2FwIGRpc3RyaWJ1dGlvbi4gSWYgeW91IHdhbnQgdG8KK2NvbXBpbGUgYSBsaWJwY2FwIHNvdXJjZSByZXRyaWV2ZWQgZnJvbSB0aGUgdGNwZHVtcC5vcmcgR2l0LCB5b3Ugd2lsbCAKK2hhdmUgdG8gY3JlYXRlIHRoZSBzY2FubmVyIGFuZCB0aGUgZ3JhbW1hciBieSBoYW5kICh3aXRoIGxleCBhbmQgeWFjYykgCitvciB3aXRoIHRoZSBjeWdudXMgbWFrZWZpbGUsIHNpbmNlIFRoZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbm90IGFibGUKK3RvIGJ1aWxkIHRoZW0uCisKK09wZW4gdGhlIHByb2plY3QgZmlsZSB3aW5wY2FwXHdwY2FwXHByalx3cGNhcC5kc3cgd2l0aCBWaXN1YWwgU3R1ZGlvIGFuZCAKK2J1aWxkIHdwY2FwLmRsbC4gd3BjYXAubGliLCB0aGUgbGlicmFyeSBmaWxlIHRvIGxpbmsgd2l0aCB0aGUgYXBwbGljYXRpb25zLCAKK3dpbGwgYmUgZ2VuZXJhdGVkIGluIHdpbnBjYXBcd3BjYXBcbGliXC4gd3BjYXAuZGxsIHdpbGwgYmUgZ2VuZXJhdGVkIGluIAord2lucGNhcFx3cGNhcFxwcmpccmVsZWFzZSBvciB3aW5wY2FwXHdwY2FwXHByalxkZWJ1ZyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgCitvZiBiaW5hcnkgdGhhdCBpcyBiZWluZyBjcmVhdGVkLgorCitIb3cgdG8gY29tcGlsZSBsaWJwY2FwIHdpdGggQ3lnbnVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGJ1aWxkIHdwY2FwLmRsbCwgY2QgdG8gdGhlIGRpcmVjdG9yeSBXUENBUC9QUkogb2YgdGhlIFdpblBjYXAgc291cmNlIGNvZGUgCitkaXN0cmlidXRpb24gYW5kIHR5cGUgIm1ha2UiLiBsaWJ3cGNhcC5hLCB0aGUgbGlicmFyeSBmaWxlIHRvIGxpbmsgd2l0aCB0aGUgCithcHBsaWNhdGlvbnMsIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHdpbnBjYXBcd3BjYXBcbGliXC4gd3BjYXAuZGxsIHdpbGwgYmUgCitnZW5lcmF0ZWQgaW4gd2lucGNhcFx3cGNhcFxwcmouCisKK1JlbWVtYmVyLCB5b3UgQ0FOTk9UIHVzZSB0aGUgTVNWQy1nZW5lcmF0ZWQgLmxpYiBmaWxlcyB3aXRoIGdjYywgdXNlIAorbGlid3BjYXAuYSBpbnN0ZWFkLgorCisibWFrZSBpbnN0YWxsIiBpbnN0YWxscyB3cGNhcC5kbGwgaW4gdGhlIFdpbmRvd3Mgc3lzdGVtIGZvbGRlci4KZGlmZiAtLWdpdCBhL1JFQURNRS5haXggYi9SRUFETUUuYWl4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2Q5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuYWl4CkBAIC0wLDAgKzEsODMgQEAKK1VzaW5nIEJQRjoKKworKDEpIEFJWCA0LngncyB2ZXJzaW9uIG9mIEJQRiBpcyB1bmRvY3VtZW50ZWQgYW5kIHNvbWV3aGF0IHVuc3RhbmRhcmQ7IHRoZQorICAgIGN1cnJlbnQgQlBGIHN1cHBvcnQgY29kZSBpbmNsdWRlcyBjaGFuZ2VzIHRoYXQgc2hvdWxkIHdvcmsgYXJvdW5kCisgICAgdGhhdDsgaXQgYXBwZWFycyB0byBjb21waWxlIGFuZCB3b3JrIG9uIGF0IGxlYXN0IG9uZSBBSVggNC4zLjMKKyAgICBtYWNoaW5lLgorCisgICAgTm90ZSB0aGF0IHRoZSBCUEYgZHJpdmVyIGFuZCB0aGUgIi9kZXYvYnBmIiBkZXZpY2VzIG1pZ2h0IG5vdCBleGlzdAorICAgIG9uIHlvdXIgbWFjaGluZTsgQUlYJ3MgdGNwZHVtcCBsb2FkcyB0aGUgZHJpdmVyIGFuZCBjcmVhdGVzIHRoZQorICAgIGRldmljZXMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LiAgT3VyIGxpYnBjYXAgc2hvdWxkIGRvIHRoZQorICAgIHNhbWUsIGFuZCB0aGUgY29uZmlndXJlIHNjcmlwdCBzaG91bGQgZGV0ZWN0IHRoYXQgaXQncyBvbiBhbiBBSVgKKyAgICBzeXN0ZW0gYW5kIGNob29zZSBCUEYgZXZlbiBpZiB0aGUgZGV2aWNlcyBhcmVuJ3QgdGhlcmUuCisKKygyKSBJZiBsaWJwY2FwIGRvZXNuJ3QgY29tcGlsZSBvbiB5b3VyIG1hY2hpbmUgd2hlbiBjb25maWd1cmVkIHRvIHVzZQorICAgIEJQRiwgb3IgaWYgdGhlIHdvcmthcm91bmRzIGZhaWwgdG8gbWFrZSBpdCB3b3JrIGNvcnJlY3RseSwgeW91CisgICAgc2hvdWxkIHNlbmQgdG8gdGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIGEgZGV0YWlsZWQgYnVnCisgICAgcmVwb3J0IChpZiB0aGUgY29tcGlsZSBmYWlscywgc2VuZCB1cyB0aGUgY29tcGlsZSBlcnJvciBtZXNzYWdlczsKKyAgICBpZiBpdCBjb21waWxlcyBidXQgZmFpbHMgdG8gd29yayBjb3JyZWN0bHksIHNlbmQgdXMgYXMgZGV0YWlsZWQgYXMKKyAgICBwb3NzaWJsZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW1wdG9tcywgaW5jbHVkaW5nIGluZGljYXRpb25zIG9mIHRoZQorICAgIG5ldHdvcmsgbGluay1sYXllciB0eXBlIGJlaW5nIHdyb25nIG9yIHRpbWUgc3RhbXBzIGJlaW5nIHdyb25nKS4KKworICAgIElmIHlvdSBmaXggdGhlIHByb2JsZW1zIHlvdXJzZWxmLCBwbGVhc2Ugc3VibWl0IGEgcGF0Y2ggYnkgZm9ya2luZworICAgIHRoZSBicmFuY2ggYXQKKworCWh0dHBzOi8vZ2l0aHViLmNvbS90aGUtdGNwZHVtcC1ncm91cC9saWJwY2FwL2lzc3VlcworCisgICAgYW5kIGlzc3VpbmcgYSBwdWxsIHJlcXVlc3QsIHNvIHdlIGNhbiBpbmNvcnBvcmF0ZSB0aGUgZml4ZXMgaW50byB0aGUKKyAgICBuZXh0IHJlbGVhc2UuCisKKyAgICBJZiB5b3UgZG9uJ3QgZml4IHRoZSBwcm9ibGVtcyB5b3Vyc2VsZiwgeW91IGNhbiwgYXMgYSB3b3JrYXJvdW5kLAorICAgIG1ha2UgbGlicGNhcCB1c2UgRExQSSBpbnN0ZWFkIG9mIEJQRi4KKworICAgIFRoaXMgY2FuIGJlIGRvbmUgYnkgc3BlY2lmeWluZyB0aGUgZmxhZzoKKworICAgICAgIC0td2l0aC1wY2FwPWRscGkKKworICAgIHRvIHRoZSAiY29uZmlndXJlIiBzY3JpcHQgZm9yIGxpYnBjYXAuCisKK0lmIHlvdSB1c2UgRExQSToKKworKDEpIEl0IGlzIGEgZ29vZCBpZGVhIHRvIGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBETFBJIGRyaXZlciBvbgorICAgIHlvdXIgc3lzdGVtLCBzaW5jZSBjZXJ0YWluIHZlcnNpb25zIG1heSBiZSBidWdneSBhbmQgY2F1c2UgeW91ciBBSVgKKyAgICBzeXN0ZW0gdG8gY3Jhc2guICBETFBJIGlzIGluY2x1ZGVkIGluIHRoZSBmaWxlc2V0IGJvcy5ydGUudHR5LiAgSQorICAgIGZvdW5kIHRoYXQgdGhlIERMUEkgZHJpdmVyIHRoYXQgY2FtZSB3aXRoIEFJWCA0LjMuMiB3YXMgYnVnZ3ksIGFuZAorICAgIGhhZCB0byB1cGdyYWRlIHRvIGJvcy5ydGUudHR5IDQuMy4yLjQ6CisKKwkgICAgbHNscHAgLWwgYm9zLnJ0ZS50dHkKKworCSAgICBib3MucnRlLnR0eSAgICAgNC4zLjIuNCAgQ09NTUlUVEVEICBCYXNlIFRUWSBTdXBwb3J0IGFuZCBDb21tYW5kcworCisgICAgVXBkYXRlcyBmb3IgQUlYIGZpbGVzZXRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICAgIGZ0cDovL3NlcnZpY2Uuc29mdHdhcmUuaWJtLmNvbS9haXgvZml4ZXMvCisKKyAgICBUaGVzZSB1cGRhdGVzIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCB0aGUgc21pdCBwcm9ncmFtLgorCisoMikgQWZ0ZXIgY29tcGlsaW5nIGxpYnBjYXAsIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBETFBJIGRyaXZlcgorICAgIGlzIGxvYWRlZC4gIFR5cGU6CisKKwkgICAgc3RybG9hZCAtcSAtZCBkbHBpCisKKyAgICBJZiB0aGUgcmVzdWx0IGlzOgorCisJICAgIGRscGk6IHllcworCisgICAgdGhlbiB0aGUgRExQSSBkcml2ZXIgaXMgbG9hZGVkIGNvcnJlY3RseS4KKworICAgIElmIGl0IGlzOgorCisJICAgIGRscGk6IG5vCisKKyAgICBUaGVuIHlvdSBuZWVkIHRvIHR5cGU6CisKKwkgICAgc3RybG9hZCAtZiAvZXRjL2RscGkuY29uZgorIAorICAgIENoZWNrIGFnYWluIHdpdGggc3RybG9hZCAtcSAtZCBkbHBpIHRoYXQgdGhlIGRscGkgZHJpdmVyIGlzIGxvYWRlZC4gIAorCisgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1bmNvbW1lbnQgdGhlIGxpbmVzIGZvciBETFBJIGluCisgICAgL2V0Yy9wc2UuY29uZiBhbmQgcmVib290IHRoZSBtYWNoaW5lOyB0aGlzIHdheSBETFBJIHdpbGwgYWx3YXlzCisgICAgYmUgbG9hZGVkIHdoZW4geW91IGJvb3QgeW91ciBzeXN0ZW0uCisKKygzKSBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgcHJvYmxlbSBpbiB0aGUgRExQSSBjb2RlIGluIHNvbWUgdmVyc2lvbnMgb2YKKyAgICBBSVgsIGNhdXNpbmcgYSB3YXJuaW5nIGFib3V0IERMX1BST01JU0NfTVVMVEkgZmFpbGluZzsgdGhpcyBtaWdodAorICAgIGJlIHJlc3BvbnNpYmxlIGZvciBETFBJIG5vdCBiZWluZyBhYmxlIHRvIGNhcHR1cmUgb3V0Z29pbmcgcGFja2V0cy4KZGlmZiAtLWdpdCBhL1JFQURNRS5kYWcgYi9SRUFETUUuZGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2FlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuZGFnCkBAIC0wLDAgKzEsMTIyIEBACisKK1RoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGFwcGx5IGlmIHlvdSBoYXZlIGEgTGludXggb3IgRnJlZUJTRCBwbGF0Zm9ybSBhbmQKK3dhbnQgbGlicGNhcCB0byBzdXBwb3J0IHRoZSBEQUcgcmFuZ2Ugb2YgcGFzc2l2ZSBuZXR3b3JrIG1vbml0b3JpbmcgY2FyZHMgZnJvbQorRW5kYWNlIChodHRwOi8vd3d3LmVuZGFjZS5jb20sIHNlZSBiZWxvdyBmb3IgZnVydGhlciBjb250YWN0IGRldGFpbHMpLgorCisxKSBJbnN0YWxsIGFuZCBidWlsZCB0aGUgREFHIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBieSBmb2xsb3dpbmcgdGhlCitpbnN0cnVjdGlvbnMgc3VwcGxpZWQgd2l0aCB0aGF0IHBhY2thZ2UuIEN1cnJlbnQgRW5kYWNlIGN1c3RvbWVycyBjYW4gZG93bmxvYWQKK3RoZSBEQUcgc29mdHdhcmUgZGlzdGlidXRpb24gZnJvbSBodHRwczovL3d3dy5lbmRhY2UuY29tCisKKzIpIENvbmZpZ3VyZSBsaWJjYXAuIFRvIGFsbG93IHRoZSAnY29uZmlndXJlJyBzY3JpcHQgdG8gbG9jYXRlIHRoZSBEQUcKK3NvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1c2UgdGhlICctLXdpdGgtZGFnJyBvcHRpb246CisKKyAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLWRhZz1ESVIKKworV2hlcmUgRElSIGlzIHRoZSByb290IG9mIHRoZSBEQUcgc29mdHdhcmUgZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZQorL3Zhci9zcmMvZGFnLiBJZiB0aGUgREFHIHNvZnR3YXJlIGlzIGNvcnJlY3RseSBkZXRlY3RlZCAnY29uZmlndXJlJyB3aWxsCityZXBvcnQ6CisKKyAgICAgICAgY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIERBRyBBUEkuLi4geWVzCisKK0lmICdjb25maWd1cmUnIHJlcG9ydHMgdGhhdCB0aGVyZSBpcyBubyBEQUcgQVBJLCB0aGUgZGlyZWN0b3J5IG1heSBoYXZlIGJlZW4KK2luY29ycmVjdGx5IHNwZWNpZmllZCBvciB0aGUgREFHIHNvZnR3YXJlIHdhcyBub3QgYnVpbHQgYmVmb3JlIGNvbmZpZ3VyaW5nCitsaWJwY2FwLgorCitTZWUgYWxzbyB0aGUgbGlicGNhcCBJTlNUQUxMLnR4dCBmaWxlIGZvciBmdXJ0aGVyIGxpYnBjYXAgY29uZmlndXJhdGlvbgorb3B0aW9ucy4KKworQnVpbGRpbmcgbGlicGNhcCBhdCB0aGlzIHN0YWdlIHdpbGwgaW5jbHVkZSBzdXBwb3J0IGZvciBib3RoIHRoZSBuYXRpdmUgcGFja2V0CitjYXB0dXJlIHN0cmVhbSAobGludXggb3IgYnBmKSBhbmQgZm9yIGNhcHR1cmluZyBmcm9tIERBRyBjYXJkcy4gVG8gYnVpbGQKK2xpYnBjYXAgd2l0aCBvbmx5IERBRyBzdXBwb3J0IHNwZWNpZnkgdGhlIGNhcHR1cmUgdHlwZSBhcyAnZGFnJyB3aGVuCitjb25maWd1cmluZyBsaWJwY2FwOgorCisgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1kYWc9RElSIC0td2l0aC1wY2FwPWRhZworCitBcHBsaWNhdGlvbnMgYnVpbHQgd2l0aCBsaWJwY2FwIGNvbmZpZ3VyZWQgaW4gdGhpcyB3YXkgd2lsbCBvbmx5IGRldGVjdCBEQUcKK2NhcmRzIGFuZCB3aWxsIG5vdCBjYXB0dXJlIGZyb20gdGhlIG5hdGl2ZSBPUyBwYWNrZXQgc3RyZWFtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpYnBjYXAgd2hlbiBidWlsdCBmb3IgREFHIGNhcmRzIGFnYWluc3QgZGFnLTIuNS4xIG9yIGxhdGVyIHJlbGVhc2VzOgorCitUaW1lb3V0cyBhcmUgc3VwcG9ydGVkLiBwY2FwX2Rpc3BhdGNoKCkgd2lsbCByZXR1cm4gYWZ0ZXIgdG9fbXMgbWlsbGlzZWNvbmRzCityZWdhcmRsZXNzIG9mIGhvdyBtYW55IHBhY2tldHMgYXJlIHJlY2VpdmVkLiBJZiB0b19tcyBpcyB6ZXJvIHBjYXBfZGlzcGF0Y2goKQord2lsbCBibG9jayB3YWl0aW5nIGZvciBkYXRhIGluZGVmaW5pdGVseS4KKworcGNhcF9kaXNwYXRjaCgpIHdpbGwgYmxvY2sgb24gYW5kIHByb2Nlc3MgYSBtaW5pbXVtIG9mIDY0a0Igb2YgZGF0YSAoYmVmb3JlCitmaWx0ZXJpbmcpIGZvciBlZmZpY2llbmN5LiBUaGlzIGNhbiBpbnRyb2R1Y2UgaGlnaCBsYXRlbmNpZXMgb24gcXVpZXQKK2ludGVyZmFjZXMgdW5sZXNzIGEgdGltZW91dCB2YWx1ZSBpcyBzZXQuIFRoZSB0aW1lb3V0IGV4cGlyaW5nIHdpbGwgb3ZlcnJpZGUKK3RoZSA2NGtCIG1pbmltdW0gY2F1c2luZyBwY2FwX2Rpc3BhdGNoKCkgdG8gcHJvY2VzcyBhbnkgYXZhaWxhYmxlIGRhdGEgYW5kCityZXR1cm4uCisKK3BjYXBfc2V0bm9uYmxvY2sgaXMgc3VwcG9ydGVkLiBXaGVuIG5vbmJsb2NrIGlzIHNldCwgcGNhcF9kaXNwYXRjaCgpIHdpbGwKK2NoZWNrIG9uY2UgZm9yIGF2YWlsYWJsZSBkYXRhLCBwcm9jZXNzIGFueSBkYXRhIGF2YWlsYWJsZSB1cCB0byBjb3VudCwgdGhlbgorcmV0dXJuIGltbWVkaWF0ZWx5LgorCitwY2FwX2ZpbmRhbGxkZXZzKCkgaXMgc3VwcG9ydGVkLCBlLmcuIGRhZzAsIGRhZzEuLi4KKworU29tZSBEQUcgY2FyZHMgY2FuIHByb3ZpZGUgbW9yZSB0aGFuIG9uZSAnc3RyZWFtJyBvZiByZWNlaXZlZCBkYXRhLgorVGhpcyBjYW4gYmUgZGF0YSBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbCBwb3J0cywgb3Igc2VwYXJhdGVkIGJ5IGZpbHRlcmluZworb3IgbG9hZCBiYWxhbmNpbmcgbWVjaGFuaXNtcy4gUmVjZWl2ZSBzdHJlYW1zIGhhdmUgZXZlbiBudW1iZXJzLCBlLmcuCitkYWcwOjAsIGRhZzA6MiBldGMuIFNwZWNpZnlpbmcgdHJhbnNtaXQgc3RyZWFtcyBmb3IgY2FwdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgorCitwY2FwX3NldGZpbHRlcigpIGlzIHN1cHBvcnRlZCwgQlBGIHByb2dyYW1zIHJ1biBpbiB1c2Vyc3BhY2UuCisKK3BjYXBfc2V0ZGlyZWN0aW9uKCkgaXMgbm90IHN1cHBvcnRlZC4gT25seSByZWNlaXZlZCB0cmFmZmljIGlzIGNhcHR1cmVkLgorREFHIGNhcmRzIG5vcm1hbGx5IGRvIG5vdCBoYXZlIElQIG9yIGxpbmsgbGF5ZXIgYWRkcmVzc2VzIGFzc2lnbmVkIGFzCit0aGV5IGFyZSB1c2VkIHRvIHBhc3NpdmVseSBtb25pdG9yIGxpbmtzLgorCitwY2FwX2JyZWFrbG9vcCgpIGlzIHN1cHBvcnRlZC4KKworcGNhcF9kYXRhbGluaygpIGFuZCBwY2FwX2xpc3RfZGF0YWxpbmtzKCkgYXJlIHN1cHBvcnRlZC4gVGhlIERBRyBjYXJkIGRvZXMKK25vdCBhdHRlbXB0IHRvIHNldCB0aGUgY29ycmVjdCBkYXRhbGluayB0eXBlIGF1dG9tYXRpY2FsbHkgd2hlcmUgbW9yZSB0aGFuCitvbmUgdHlwZSBpcyBwb3NzaWJsZS4KKworcGNhcF9zdGF0cygpIGlzIHN1cHBvcnRlZC4gcHNfZHJvcCBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8KK1JYIHN0cmVhbSBidWZmZXIgb3ZlcmZsb3csIHRoaXMgY291bnQgaXMgYmVmb3JlIGZpbHRlcnMgYXJlIGFwcGxpZWQgKGl0IHdpbGwKK2luY2x1ZGUgcGFja2V0cyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkcm9wcGVkIGJ5IHRoZSBmaWx0ZXIpLiBUaGUgUlggc3RyZWFtCitidWZmZXIgc2l6ZSBpcyB1c2VyIGNvbmZpZ3VyYWJsZSBvdXRzaWRlIGxpYnBjYXAsIHR5cGljYWxseSAxNi01MTJNQi4KKworcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCgpIGlzIG5vdCBzdXBwb3J0ZWQsIGFzIERBRyBjYXJkcyBkbyBub3Qgc3VwcG9ydAorcG9sbC9zZWxlY3QgbWV0aG9kcy4KKworcGNhcF9pbmplY3QoKSBhbmQgcGNhcF9zZW5kcGFja2V0KCkgYXJlIG5vdCBzdXBwb3J0ZWQuCisKK1NvbWUgREFHIGNhcmRzIG5vdyBzdXBwb3J0IGNhcHR1cmluZyB0byBtdWx0aXBsZSB2aXJ0dWFsIGludGVyZmFjZXMsIGNhbGxlZAorc3RyZWFtcy4gQ2FwdHVyZSBzdHJlYW1zIGhhdmUgZXZlbiBudW1iZXJzLiBUaGVzZSBhcmUgYXZhaWxhYmxlIHZpYSBsaWJwY2FwCithcyBzZXBhcmF0ZSBpbnRlcmZhY2VzLCBlLmcuIGRhZzA6MCwgZGFnMDoyLCBkYWcwOjQgZXRjLiBkYWcwOjAgaXMgdGhlIHNhbWUKK2FzIGRhZzAuIFRoZXNlIGFyZSB2aXNpYmxlIHZpYSBwY2FwX2ZpbmRhbGxkZXZzKCkuCisKK2xpYnBjYXAgbm93IGRvZXMgTk9UIHNldCB0aGUgY2FyZCdzIGhhcmR3YXJlIHNuYXBsZW4gKHNsZW4pLiBUaGlzIG11c3Qgbm93IGJlCitzZXQgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIERBRyBjb25pZ3VyYXRpb24gcHJvZ3JhbSwgZS5nLiBkYWd0aHJlZSwgZGFnZm91ciwKK2RhZ3NpeCwgZGFnY29uZmlnLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNuYXBsZW4gaXMgY3VycmVudGx5IHNoYXJlZCBiZXR3ZWVuCithbGwgb2YgdGhlIHN0cmVhbXMuIEluIGZ1dHVyZSB0aGlzIG1heSBjaGFuZ2UgaWYgcGVyLXN0cmVhbSBzbGVuIGlzCitpbXBsZW1lbnRlZC4KKworREFHIGNhcmRzIGJ5IGRlZmF1bHQgY2FwdHVyZSBlbnRpcmUgcGFja2V0cyBpbmNsdWRpbmcgdGhlIEwyCitDUkMvRkNTLiBJZiB0aGUgY2FyZCBpcyBub3QgY29uZmlndXJlZCB0byBkaXNjYXJkIHRoZSBDUkMvRkNTLCB0aGlzCitjYW4gY29uZnVzZSBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgbGlicGNhcCBpZiB0aGV5J3JlIG5vdCBwcmVwYXJlZCBmb3IKK3BhY2tldHMgdG8gaGF2ZSBhbiBGQ1MuCisKK0xpYnBjYXAgbm93IHJlYWRzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBFUkZfRkNTX0JJVFMgdG8gZGV0ZXJtaW5lCitob3cgbWFueSBiaXRzIG9mIENSQy9GQ1MgdG8gc3RyaXAgZnJvbSB0aGUgZW5kIG9mIHRoZSBjYXB0dXJlZAorZnJhbWUuIFRoaXMgZGVmYXVsdHMgdG8gMzIgZm9yIHVzZSB3aXRoIEV0aGVybmV0LiBJZiB0aGUgY2FyZCBpcworY29uZmlndXJlZCB0byBzdHJpcCB0aGUgQ1JDL0ZDUywgdGhlbiBzZXQgRVJGX0ZDU19CSVRTPTAuIElmIHVzZWQgd2l0aAorYSBIRExDL1BvUy9QUFAvRnJhbWUgUmVsYXkgbGluayB3aXRoIDE2IGJpdCBDUkMvRkNTLCB0aGVuIHNldAorRVJGX0ZDU19CSVRTPTE2LgorCitJZiB5b3Ugd2lzaCB0byBjcmVhdGUgYSBwY2FwIGZpbGUgdGhhdCBET0VTIGNvbnRhaW4gdGhlIEV0aGVybmV0IEZDUywKK3NwZWNpZnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEVSRl9ET05UX1NUUklQX0ZDUy4gVGhpcyB3aWxsIGNhdXNlCit0aGUgZXhpc3RpbmcgRkNTIHRvIGJlIGNhcHR1cmVkIGludG8gdGhlIHBjYXAgZmlsZS4gTm90ZSBzb21lCithcHBsaWNhdGlvbnMgbWF5IGluY29ycmVjdGx5IHJlcG9ydCBjYXB0dXJlIGVycm9ycyBvciBvdmVyc2l6ZSBwYWNrZXRzCit3aGVuIHJlYWRpbmcgdGhlc2UgZmlsZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUGxlYXNlIHN1Ym1pdCBidWcgcmVwb3J0cyB2aWEgPHN1cHBvcnRAZW5kYWNlLmNvbT4uCisKK1BsZWFzZSBhbHNvIHZpc2l0IG91ciBXZWIgc2l0ZSBhdDoKKworICAgICAgICBodHRwOi8vd3d3LmVuZGFjZS5jb20vCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEVuZGFjZSBEQUcgY2FyZHMgY29udGFjdCA8c2FsZXNAZW5kYWNlLmNvbT4uCmRpZmYgLS1naXQgYS9SRUFETUUuaHB1eCBiL1JFQURNRS5ocHV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzI3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuaHB1eApAQCAtMCwwICsxLDI1NCBAQAorRm9yIEhQLVVYIDExaSAoMTEuMTEpIGFuZCBsYXRlciwgdGhlcmUgYXJlIG5vIGtub3duIGlzc3VlcyB3aXRoCitwcm9taXNjdW91cyBtb2RlIHVuZGVyIEhQLVVYLiAgSWYgeW91IGFyZSB1c2luZyBhIGVhcmxpZXIgdmVyc2lvbiBvZgorSFAtVVggYW5kIGNhbm5vdCB1cGdyYWRlLCBwbGVhc2UgY29udGludWUgcmVhZGluZy4KKworSFAtVVggcGF0Y2hlcyB0byBmaXggcGFja2V0IGNhcHR1cmUgcHJvYmxlbXMKKworTm90ZSB0aGF0IHBhY2tldC1jYXB0dXJlIHByb2dyYW1zIHN1Y2ggYXMgdGNwZHVtcCBtYXksIG9uIEhQLVVYLCBub3QgYmUKK2FibGUgdG8gc2VlIHBhY2tldHMgc2VudCBmcm9tIHRoZSBtYWNoaW5lIG9uIHdoaWNoIHRoZXkncmUgcnVubmluZy4gCitTb21lIGFydGljbGVzIG9uIGdyb3Vwcy5nb29nbGUuY29tIGRpc2N1c3NpbmcgdGhpcyBhcmU6CisKKwlodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXBzP3NlbG09ODJsZDN2JTI0ODBpJTI0MSU0MG1hbWVuY2hpLnpyei5UVS1CZXJsaW4uREUKKword2hpY2ggc2F5czoKKworICBOZXdzZ3JvdXBzOiBjb21wLnN5cy5ocC5ocHV4IAorICBTdWJqZWN0OiAgUmU6IERpZCBzb21lb25lIG1hZGUgdGNwZHVtcCB3b3JraW5nIG9uIDEwLjIwID8KKyAgRGF0ZTogMTIvMDgvMTk5OQorICBGcm9tOiBMdXR6IEphZW5pY2tlIDxqYWVuaWNrZUBlbXNlcnYxLmVlLlRVLUJlcmxpbi5ERT4KKworICBJbiBhcnRpY2xlIDw4MmtzNWkkNXZjJDFAbmV3czEuZHRpLm5lLmpwPiwgbXRzYXQgPG10c2F0QGlyaXMuZHRpLm5lLmpwPgorICB3cm90ZToKKyAgID5IZWxsbywKKyAgID4KKyAgID5JIGRvd25sb2FkZWQgYW5kIGNvbXBpbGVkIHRjcGR1bXAzLjQgYSBjb3VwbGUgb2Ygd2VlayBhZ28uIEkgdHJpZWQgdG8gdXNlCisgICA+aXQsIGJ1dCBJIGNhbiBvbmx5IHNlZSBpbmNvbWluZyBkYXRhLCBuZXZlciBvdXRnb2luZy4KKyAgID5Tb21lb25lIChyYWopIGV4cGxhaW5lZCBtZSB0aGF0IGEgcGF0Y2ggd2FzIG1pc3NpbmcsIGFuZCB0aGF0IHRoaXMgcGF0Y2gKKyAgID5tdXN0IG1lICJwYXRjaGVkIiAocG9rZWQpIGluIG9yZGVyIHRvIHNlZSBvdXRib3VuZCBkYXRhIGluIHByb21pc2N1b3VzIG1vZGUuCisgICA+TWFueSB0aGluZ3MgdG8gZG8gLi4uLiBTbyB0aGUgcXVlc3Rpb24gaXMgOiBkaWQgc29tZW9uZSBoYXMgYWxyZWFkeSB0aGlzCisgICA+InJlYWR5IHRvIHVzZSIgUEhORV8qKioqIHBhdGNoID8KKyAgCisgICBUd28gdGhpbmdzOgorICAgMS4gWW91IGRvIG5lZWQgYSBsYXRlICJMQU4gcHJvZHVjdHMgY3VtdWxhdGl2ZSBwYXRjaCIgKGUuZy4gIFBITkVfMTgxNzMKKyAgZm9yICAgczcwMC8xMC4yMCkuCisgICAyLiBZb3UgbXVzdCB1c2UKK2VjaG8gJ2xhbmNfb3V0Ym91bmRfcHJvbWlzY19mbGFnL1cxJyB8IC91c3IvYmluL2FkYiAtdyAvc3RhbmQvdm11bml4IC9kZXYva21lbQorICAgICBZb3UgY2FuIGluc2VydCB0aGlzIGUuZy4gaW50byAvc2Jpbi9pbml0LmQvbGFuCisgIAorICAgQmVzdCByZWdhcmRzLAorICAgTHV0egorCithbmQKKworCWh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cHM/c2VsbT04OGNmNHQlMjRwMDMlMjQxJTQwd2ViMS5jdXAuaHAuY29tCisKK3doaWNoIHNheXM6CisKKyAgTmV3c2dyb3VwczogY29tcC5zeXMuaHAuaHB1eCAKKyAgU3ViamVjdDogUmU6IHRjcGR1bXAgb25seSBzaG93cyBpbmNvbWluZyBwYWNrZXRzCisgIERhdGU6IDAyLzE1LzIwMDAKKyAgRnJvbTogUmljayBKb25lcyA8Zm9vQGJhci5iYXouaW52YWxpZD4KKworICBIYXJhbGQgU2tvdG5lcyA8aGFyYWxkQGNjLnVpdC5ubz4gd3JvdGU6CisgID4gSSBhbSBydW5uaW5nIEhQVVggMTEuMCBvbiBhIEMyMDAgaGFuZ2luZyBvbiBhIDEwME1iIHN3aXRjaC4gSSBoYXZlCisgID4gY29tcGlsZWQgbGlicGNhcC0wLjQgYW4gdGNwZHVtcC0zLjQgYW5kIGl0IHNlZW1zIHRvIHdvcmsuIEJ1dCBhdCBhCisgID4gY2xvc2VyIGxvb2sgSSBvbmx5IGdldCB0byBzZWUgdGhlIGluY29taW5nIHBhY2tldHMgbm90IHRoZQorICA+IG91dGdvaW5nLiBJIGhhdmUgdHJpZWQgdGNwZmxvdy0wLjEyIHdoaWNoIGFsc28gdXNlcyBsaWJwY2FwIGFuZCB0aGUKKyAgPiBzYW1lIHRoaW5nIGhhcHBlbnMuICBDb3VsZCBzb21lb25lIHBsZWFzZSBnaXZlIG1lIGEgaGludCBvbiBob3cgdG8KKyAgPiBnZXQgdGhpcyByaWdodD8KKyAgCisgIFNlYXJjaC9SZWFkIHRoZSBhcmNoaXZlcyA/LSkKKyAgCisgIFdoYXQgeW91IGFyZSBzZWVpbmcgaXMgZXhwZWN0ZWQsIHVuLXBhdGNoZWQsIGJlaGF2aW91ciBmb3IgYW4gSFAtVVgKKyAgc3lzdGVtLiAgT24gMTEuMDAsIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIGxhdGVzdCBsYW5jb21tb24vRExQSQorICBwYXRjaGVzLCBhbmQgdGhlbiB0aGUgbGF0ZXN0IGRyaXZlciBwYXRjaCBmb3IgdGhlIGludGVyZmFjZShzKSBpbiB1c2UuIAorICBBdCB0aGF0IHBvaW50LCBhIG1pcmFjbGUgaGFwcGVucyBhbmQgeW91IHNob3VsZCBzdGFydCBzZWVpbmcgb3V0Ym91bmQKKyAgdHJhZmZpYy4KKworW1RoYXQgYXJ0aWNsZSBhbHNvIG1lbnRpb25zIHRoZSBwYXRjaCB0aGF0IGFwcGVhcnMgYmVsb3cuXQorCithbmQKKworCWh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cHM/c2VsbT0zOEFBOTczRS45NkJFN0RGNyU0MGNjLnVpdC5ubworCit3aGljaCBzYXlzOgorCisgIE5ld3Nncm91cHM6IGNvbXAuc3lzLmhwLmhwdXgKKyAgU3ViamVjdDogUmU6IHRjcGR1bXAgb25seSBzaG93cyBpbmNvbWluZyBwYWNrZXRzCisgIERhdGU6IDAyLzE2LzIwMDAKKyAgRnJvbTogSGFyYWxkIFNrb3RuZXMgPGhhcmFsZEBjYy51aXQubm8+CisKKyAgUmljayBKb25lcyB3cm90ZToKKyAgCisJLi4uCisKKyAgPiBXaGF0IHlvdSBhcmUgc2VlaW5nIGlzIGV4cGVjdGVkLCB1bi1wYXRjaGVkLCBiZWhhdmlvdXIgZm9yIGFuIEhQLVVYCisgID4gc3lzdGVtLiBPbiAxMS4wMCwgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGxhbmNvbW1vbi9ETFBJCisgID4gcGF0Y2hlcywgYW5kIHRoZW4gdGhlIGxhdGVzdCBkcml2ZXIgcGF0Y2ggZm9yIHRoZSBpbnRlcmZhY2UocykgaW4KKyAgPiB1c2UuIEF0IHRoYXQgcG9pbnQsIGEgbWlyYWNsZSBoYXBwZW5zIGFuZCB5b3Ugc2hvdWxkIHN0YXJ0IHNlZWluZworICA+IG91dGJvdW5kIHRyYWZmaWMuCisgIAorICBUaGFua3MgYSBsb3QuICBJIGhhdmUgdGhpcyBwcm9ibGVtIG9uIHNldmVyYWwgbWFjaGluZXMgcnVubmluZyBIUFVYCisgIDEwLjIwIGFuZCAxMS4wMC4gIFRoZSBtYWNoaW5lcyB3aGVyZSBwYXRjaGVkIHVwIGJlZm9yZSB5Mmsgc28gZGlkIG5vdAorICBrbm93IHdoYXQgdG8gdGhpbmsuICBBbnl3YXkgSSBoYXZlIG5vdyBpbnN0YWxsZWQgUEhORV8xOTc2NiwKKyAgUEhORV8xOTgyNiwgUEhORV8yMDAwOCwgUEhORV8yMDczNSBvbiB0aGUgQzIwMCBhbmQgbm93IEkgY2FuIHNlZSB0aGUKKyAgb3V0Ym91bmQgdHJhZmZpYyB0b28uICBUaGFua3MgYWdhaW4uCisKKyhhbHRob3VnaCB0aG9zZSBwYXRjaGVzIG1heSBub3QgYmUgdGhlIG9uZXMgdG8gaW5zdGFsbCAtIHRoZXJlIG1heSBiZQorbGF0ZXIgcGF0Y2hlcykuCisKK0FuZCBhbm90aGVyIG1lc3NhZ2UgdG8gdGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnLCBmcm9tIFJpY2sgSm9uZXM6CisKKyAgRGF0ZTogTW9uLCAyOSBBcHIgMjAwMiAxNTo1OTo1NSAtMDcwMAorICBGcm9tOiBSaWNrIEpvbmVzCisgIFRvOiB0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmcgCisgIFN1YmplY3Q6IFJlOiBbdGNwZHVtcC13b3JrZXJzXSBJIENhbid0IENhcHR1cmUgdGhlIE91dGJvdW5kIFRyYWZmaWMKKworCS4uLgorCisgIGh0dHA6Ly9pdHJjLmhwLmNvbS8gd291bGQgYmUgb25lIHBsYWNlIHRvIHN0YXJ0IGluIGEgc2VhcmNoIGZvciB0aGUgbW9zdAorICB1cC10by1kYXRlIHBhdGNoZXMgZm9yIERMUEkgYW5kIHRoZSBsYW4gZHJpdmVyKHMpIHVzZWQgb24geW91ciBzeXN0ZW0gKEkKKyAgY2Fubm90IGd1ZXNzIGJlY2F1c2UgOTAwMC84MDAgaXMgdG9vIGdlbmVyaWMgLSBvbmUgaHMgdG8gdXNlIHRoZSAibW9kZWwiCisgIGNvbW1hbmQgdGhlc2UgZGF5cyBhbmQvb3IgYW4gaW9zY2FuIGNvbW1hbmQgKHNlZSBtYW5wYWdlKSB0byBndWVzcyB3aGF0CisgIHRoZSBkcml2ZXJzIChidGxhblszNDU2XSwgZ2VsYW4sIGV0YykgbWlnaHQgYmUgaW52b2x2ZWQgaW4gYWRkaXRpb24gdG8KKyAgRExQSS4KKworICBBbm90aGVyIG9wdGlvbiBpcyB0byB1cGdyYWRlIHRvIDExaSBhcyBvdXRib3VuZCBwcm9taXNjdW91cyBtb2RlIHN1cHBvcnQKKyAgaXMgdGhlcmUgaW4gdGhlIGJhc2UgT1MsIG5vIHBhdGNoZXMgcmVxdWlyZWQuCisKK0Fub3RoZXIgcG9zdGluZzoKKworCWh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cHM/c2VsbT03ZDZndm4lMjRiMyUyNDElNDBvY2Vhbi5jdXAuaHAuY29tCisKK2luZGljYXRlcyB0aGF0IHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIG9wdGlvbmFsIFNUUkVBTVMgcHJvZHVjdCB0byBkbworY2FwdHVyZXMgb24gSFAtVVggOS54OgorCisgIE5ld3Nncm91cHM6IGNvbXAuc3lzLmhwLmhwdXgKKyAgU3ViamVjdDogIFJlOiB0Y3BkdW1wIEhQL1VYIDkueAorICBEYXRlOiAwMy8yMi8xOTk5CisgIEZyb206IFJpY2sgSm9uZXMgPGZvb0BiYXIuYmF6PgorCisgIERhdmUgQmFyciAoYmFyckBjaXMub2hpby1zdGF0ZS5lZHUpIHdyb3RlOgorICA6IEhhcyBhbnlvbmUgcG9ydGVkIHRjcGR1bXAgKG9yIHNvbWV0aGluZyBzaW1pbGFyKSB0byBIUC9VWCA5Lng/CisgIAorICBJJ20gcmVhc29uYWJseSBjb25maWRlbnQgdGhhdCBhbnkgcG9ydCBvZiB0Y3BkdW1wIHRvIDkuWCB3b3VsZCByZXF1aXJlCisgIHRoZSAodGhlbiBvcHRpb25hbCkgU1RSRUFNUyBwcm9kdWN0LiAgVGhpcyB3b3VsZCBicmluZyBETFBJLCB3aGljaCBpcworICB3aGF0IG9uZSB1c2VzIHRvIGFjY2VzcyBpbnRlcmZhY2VzIGluIHByb21pc2N1b3VzIG1vZGUuCisgIAorICBJJ20gbm90IHN1cmUgdGhhdCBIUCBldmVuIHNlbGxzIHRoZSA5LlggU1RSRUFNUyBwcm9kdWN0IGFueSBsb25nZXIsCisgIHNpbmNlIEhQLVVYIDkuWCBpcyBvZmYgdGhlIHByaWNlbGlzdCAod2VsbCwgbWF5YmUgOS4xMCBmb3IgdGhlIG9sZCA2OEsKKyAgZGV2aWNlcykuIAorICAKKyAgWW91ciBiZXN0IGJldCBpcyB0byBiZSB1cCBvbiAxMC4yMCBvciBiZXR0ZXIgaWYgdGhhdCBpcyBhdCBhbGwKKyAgcG9zc2libGUuICBJZiB5b3VyIGhhcmR3YXJlIGlzIHN1cHBvcnRlZCBieSBpdCwgSSdkIGdvIHdpdGggSFAtVVggMTEuIAorICBJZiB5b3Ugd2FudCB0byBzZWUgdGhlIHN5c3RlbSdzIG93biBvdXRib3VuZCB0cmFmZmljLCB5b3UnbGwgbmV2ZXIgZ2V0CisgIHRoYXQgZnVuY3Rpb25hbGl0eSBvbiA5LlgsIGJ1dCBpdCBtaWdodCBoYXBwZW4gYXQgc29tZSBwb2ludCBmb3IgMTAuMjAKKyAgYW5kIDExLlguIAorICAKKyAgcmljayBqb25lcworCisoYXMgcGVyIG90aGVyIG1lc3NhZ2VzIGNpdGVkIGhlcmUsIHRoZSBhYmlsaXR5IHRvIHNlZSB0aGUgc3lzdGVtJ3Mgb3duCitvdXRib3VuZCB0cmFmZmljIGRpZCBoYXBwZW4pLgorCitSaWNrIEpvbmVzIHJlcG9ydHMgdGhhdCBIUC1VWCAxMWkgbmVlZHMgbm8gcGF0Y2hlcyBmb3Igb3V0Ym91bmQKK3Byb21pc2N1b3VzIG1vZGUgc3VwcG9ydC4KKworQW4gYWRkaXRpb25hbCBub3RlLCBmcm9tIEpvc3QgTWFydGluLCBmb3IgSFAtVVggMTAuMjA6CisKKwlROiBIb3cgZG8gSSBnZXQgZXRoZXJlcmFsIG9uIEhQVVggdG8gY2FwdHVyZSB0aGUgX291dGdvaW5nXyBwYWNrZXRzCisJICAgb2YgYW4gaW50ZXJmYWNlCisJQTogWW91IG5lZWQgdG8gZ2V0IFBITkVfMjA4OTIsUEhORV8yMDcyNSBhbmQgUEhDT18xMDk0NyAob3IKKwkgICBuZXdlciwgdGhpcyBpcyBhcyBvZiA0LjQuMDApIGFuZCBpdHMgZGVwZW5kZW5jaWVzLiAgVGhlbiB5b3UgY2FuCisJICAgZW5hYmxlIHRoZSBmZWF0dXJlIGFzIGRlc2NpYmVkIGJlbG93OgorCisJUGF0Y2ggTmFtZTogUEhORV8yMDg5MgorCVBhdGNoIERlc2NyaXB0aW9uOiBzNzAwIDEwLjIwIFBDSSAxMDBCYXNlLVQgY3VtdWxhdGl2ZSBwYXRjaAorCQlUbyB0cmFjZSB0aGUgb3V0Ym91bmQgcGFja2V0cywgcGxlYXNlIGRvIHRoZSBmb2xsb3dpbmcKKwkJdG8gdHVybiBvbiBhIGdsb2JhbCBwcm9taXNjdW91cyBzd2l0Y2ggYmVmb3JlIHJ1bm5pbmcKKwkJdGhlIHByb21pc2N1b3VzIGFwcGxpY2F0aW9ucyBsaWtlIHNub29wIG9yIHRjcGR1bXA6CisKKwkJYWRiIC13IC9zdGFuZC92bXVuaXggL2Rldi9tZW0KKwkJbGFuY19vdXRib3VuZF9wcm9taXNjX2ZsYWcvVyAxCisJCShhZGIgd2lsbCBlY2hvIHRoZSByZXN1bHQgc2hvd2luZyB0aGF0IHRoZSBmbGFnIGhhcworCQliZWVuIGNoYW5nZWQpCisJCSRxdWl0CisJKFRoYW5rcyBmb3IgdGhpcyBwYXJ0IHRvIEhQLXN1cHBvcnQsIFJhdGluZ2VuKQorCisJCVRoZSBhdHRhY2hlZCBoYWNrIGRvZXMgdGhpcyBhbmQgc29tZSBzZWN1cml0eS1yZWxhdGVkIHN0dWZmCisJKHRoYW5rcyB0byBoaWxkZWJAd3d3LnN0YWhsLmJhdS50dS1icy5kZSAoUmFsZiBIaWxkZWJyYW5kdCkgd2hvCisJcG9zdGVkIHRoZSBzZWN1cml0eS1wYXJ0IHNvbWUgdGltZSBhZ28pCisKKwkJIDw8aGFja19pcF9zdGFjaz4+IAorCisJCShEb24ndCBzd2l0Y2ggSVAtZm9yd2FyZGluZyBvZmYsIGlmIHlvdSBuZWVkIGl0ICEpCisJCUluc3RhbGwgdGhlIGhhY2sgYXMgL3NiaW4vaW5pdC5kL2hhY2xfaXBfc3RhY2sgKGFkanVzdAorCXBlcm1pc3Npb25zICEpIGFuZCBtYWtlIGEgc2VxdWVuY2luZy1zeW1saW5rCisJL3NiaW4vcmMyLmQvUzM1MGhhY2tfaXBfc3RhY2sgcG9pbnRpbmcgdG8gdGhpcyBzY3JpcHQuIAorCQlOb3cgYWxsIHRoaXMgaXMgZG9uZSBvbiBldmVyeSByZWJvb3QuCisKK0FjY29yZGluZyB0byBSaWNrIEpvbmVzLCB0aGUgZ2xvYmFsIHByb21pc2N1b3VzIHN3aXRjaCBhbHNvIGhhcyB0byBiZQordHVybmVkIG9uIGZvciBIUC1VWCAxMS4wMCwgYnV0IG5vdCBmb3IgMTFpIC0gYW5kLCBpbiBmYWN0LCB0aGUgc3dpdGNoCitkb2Vzbid0IGV2ZW4gZXhpc3Qgb24gMTFpLgorCitIZXJlJ3MgdGhlICJoYWNrX2lwX3N0YWNrIiBzY3JpcHQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQ3V0IEhlcmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIS9zYmluL3NoCisjCisjIG5ldHR1bmU6ICBoYWNrIGtlcm5lbCBwYXJtcyBmb3Igc2FmZXR5CisKK09LQVk9MAorRVJST1I9LTEKKworIyAvdXNyL2NvbnRyaWIvYmluIGZ1ZXIgbmV0dHVuZSBhdWYgUGZhZAorUEFUSD0vc2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3Vzci9jb250cmliL2JpbgorZXhwb3J0IFBBVEgKKworCisjIyMjIyMjIyMjCisjICBtYWluICAjCisjIyMjIyMjIyMjCisKK2Nhc2UgJDEgaW4KKyAgIHN0YXJ0X21zZykKKyAgICAgIHByaW50ICJUdW5lIElQLVN0YWNrIGZvciBzZWN1cml0eSIKKyAgICAgIGV4aXQgJE9LQVkKKyAgICAgIDs7CisKKyAgIHN0b3BfbXNnKQorICAgICAgcHJpbnQgIlRoaXMgYWN0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIgorICAgICAgZXhpdCAkT0tBWQorICAgICAgOzsKKworICAgc3RvcCkKKyAgICAgIGV4aXQgJE9LQVkKKyAgICAgIDs7CisKKyAgIHN0YXJ0KQorICAgICAgOzsgICMgZmFsbCB0aHJvdWdoCisKKyAgICopCisgICAgICBwcmludCAiVVNBR0U6ICQwIHtzdGFydF9tc2cgfCBzdG9wX21zZyB8IHN0YXJ0IHwgc3RvcH0iID4mMgorICAgICAgZXhpdCAkRVJST1IKKyAgICAgIDs7CisgICBlc2FjCisKKyMjIyMjIyMjIyMjCisjICBzdGFydCAgIworIyMjIyMjIyMjIyMKKworIworIyB0Y3AtU2VxdWVuY2UtTnVtYmVycyBuaWNodCBtZWhyIGlua3JlbWVudGllcmVuIHNvbmRlcm4gcmFuZG9tCisjIFN5bi1GbG9vZC1Qcm90ZWN0aW9uIGFuCisjIGlwX2ZvcndhcmRpbmcgYXVzCisjIFNvdXJjZS1Sb3V0aW5nIGF1cworIyBBdXNnZWhlbmRlIFBhY2tldHMgYW4gZXRoZXJlYWwvdGNwZHVtcCBldGMuCisKKy91c3IvY29udHJpYi9iaW4vbmV0dHVuZSAtcyB0Y3BfcmFuZG9tX3NlcSAyIHx8IGV4aXQgJEVSUk9SCisvdXNyL2NvbnRyaWIvYmluL25ldHR1bmUgLXMgaHBfc3luX3Byb3RlY3QgMSB8fCBleGl0ICRFUlJPUgorL3Vzci9jb250cmliL2Jpbi9uZXR0dW5lIC1zIGlwX2ZvcndhcmRpbmcgMCB8fCBleGl0ICRFUlJPUgorZWNobyAnaXBfYmxvY2tfc291cmNlX3JvdXRlZC9XMScgfCAvdXNyL2Jpbi9hZGIgLXcgL3N0YW5kL3ZtdW5peCAvZGV2L2ttZW0gfHwgZXhpdCAkRVJST1IKK2VjaG8gJ2xhbmNfb3V0Ym91bmRfcHJvbWlzY19mbGFnL1cgMScgfCBhZGIgLXcgL3N0YW5kL3ZtdW5peCAvZGV2L21lbSAgfHwgZXhpdCAkRVJST1IKKworZXhpdCAkT0tBWQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DdXQgSGVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL1JFQURNRS5saW51eCBiL1JFQURNRS5saW51eAppbmRleCBkZDk1OTEzLi5mOTJjZDIyIDEwMDY0NAotLS0gYS9SRUFETUUubGludXgKKysrIGIvUkVBRE1FLmxpbnV4CkBAIC02OSw2ICs2OSwyNiBAQAogCSAgZmlsZSBsaW51eC9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK05vdGUgdGhhdCwgYnkgZGVmYXVsdCwgbGlicGNhcCB3aWxsLCBpZiBsaWJubCBpcyBwcmVzZW50LCBidWlsZCB3aXRoIGl0OworaXQgdXNlcyBsaWJubCB0byBzdXBwb3J0IG1vbml0b3IgbW9kZSBvbiBtYWM4MDIxMSBkZXZpY2VzLiAgVGhlcmUgaXMgYQorY29uZmlndXJhdGlvbiBvcHRpb24gdG8gZGlzYWJsZSBidWlsZGluZyB3aXRoIGxpYm5sLCBidXQsIGlmIHRoYXQgb3B0aW9uCitpcyBjaG9zZW4sIHRoZSBtb25pdG9yLW1vZGUgQVBJcyAoYXMgdXNlZCBieSB0Y3BkdW1wJ3MgIi1JIiBmbGFnLCBhbmQgYXMKK3dpbGwgcHJvYmFibHkgYmUgdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnMgaW4gdGhlIGZ1dHVyZSkgd29uJ3Qgd29yaworcHJvcGVybHkgb24gbWFjODAyMTEgZGV2aWNlcy4KKworTGludXgncyBydW4tdGltZSBsaW5rZXIgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgbGlua2VkIHdpdGggb3RoZXIKK3NoYXJlZCBsaWJyYXJpZXMsIHdoaWNoIG1lYW5zIHRoYXQgaWYgYW4gb2xkZXIgdmVyc2lvbiBvZiBhIHNoYXJlZAorbGlicmFyeSBkb2Vzbid0IHJlcXVpcmUgcm91dGluZXMgZnJvbSBzb21lIG90aGVyIHNoYXJlZCBsaWJyYXJ5LCBhbmQgYQorbGF0ZXIgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZG9lcyByZXF1aXJlIHRob3NlIHJvdXRpbmVzLCB0aGUKK2xhdGVyIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBiZSBsaW5rZWQgd2l0aCB0aGF0IG90aGVyIHNoYXJlZAorbGlicmFyeSBhbmQsIGlmIGl0J3Mgb3RoZXJ3aXNlIGJpbmFyeS1jb21wYXRpYmxlIHdpdGggdGhlIG9sZGVyIHZlcnNpb24sCitjYW4gcmVwbGFjZSB0aGF0IG9sZGVyIHZlcnNpb24gd2l0aG91dCBicmVha2luZyBhcHBsaWNhdGlvbnMgYnVpbHQgd2l0aAordGhlIG9sZGVyIHZlcnNpb24sIGFuZCB3aXRob3V0IGJyZWFraW5nIGNvbmZpZ3VyZSBzY3JpcHRzIG9yIHRoZSBidWlsZAorcHJvY2VkdXJlIGZvciBhcHBsaWNhdGlvbnMgd2hvc2UgY29uZmlndXJlIHNjcmlwdCBkb2Vzbid0IHVzZSB0aGUKK3BjYXAtY29uZmlnIHNjcmlwdCBpZiB0aGV5IGJ1aWxkIHdpdGggdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKFRoZSBidWlsZAorcHJvY2VkdXJlIGZvciBhcHBsaWNhdGlvbnMgd2hvc2UgY29uZmlndXJlIHNjcmlwdHMgdXNlIHRoZSBwY2FwLWNvbmZpZworc2NyaXB0IGlmIHByZXNlbnQgd2lsbCBub3QgYnJlYWsgZXZlbiBpZiB0aGV5IGJ1aWxkIHdpdGggdGhlIHN0YXRpYworbGlicmFyeS4pCiAKIFN0YXRpc3RpY3M6CiBTdGF0aXN0aWNzIHJlcG9ydGVkIGJ5IHBjYXAgYXJlIHBsYXRmb3JtIHNwZWNpZmljLiAgVGhlIHN0YXRpc3RpY3MKQEAgLTc3LDEyICs5NywxMiBAQAogMi4yLngKID09PT09CiBwc19yZWN2ICAgTnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBwY2FwIGZpbHRlcgotcHNfZHJvcHMgIEFsd2F5cyAwLCB0aGlzIHN0YXRpc3RpYyBpcyBub3QgZ2F0aGVyZCBvbiB0aGlzIHBsYXRmb3JtCitwc19kcm9wICAgQWx3YXlzIDAsIHRoaXMgc3RhdGlzdGljIGlzIG5vdCBnYXRoZXJkIG9uIHRoaXMgcGxhdGZvcm0KIAogMi40LngKID09PT09Ci1wc19yZWMgICAgTnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBwY2FwIGZpbHRlcgotcHNfZHJvcHMgIE51bWJlciBvZiBwYWNrZXRzIHRoYXQgaGFkIHBhc3NlZCBmaWx0ZXJpbmcgYnV0IHdlcmUgbm90Citwc19yZWN2ICAgTnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBwY2FwIGZpbHRlcgorcHNfZHJvcCAgIE51bWJlciBvZiBwYWNrZXRzIHRoYXQgaGFkIHBhc3NlZCBmaWx0ZXJpbmcgYnV0IHdlcmUgbm90CiAgICAgICAgICAgcGFzc2VkIG9uIHRvIHBjYXAgZHVlIHRvIHRoaW5ncyBsaWtlIGJ1ZmZlciBzaG9ydGFnZSwgZXRjLgotCQkJIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgdGhlc2UgYXJlIHBhY2tldHMgeW91IGFyZSBpbnRlcmVzdGVkIGluCi0JCQkgYnV0IHdvbid0IGJlIHJlcG9ydGVkIGJ5LCBmb3IgZXhhbXBsZSwgdGNwZHVtcCBvdXRwdXQuCisgICAgICAgICAgVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSB0aGVzZSBhcmUgcGFja2V0cyB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyAgICAgICAgICBidXQgd29uJ3QgYmUgcmVwb3J0ZWQgYnksIGZvciBleGFtcGxlLCB0Y3BkdW1wIG91dHB1dC4KZGlmZiAtLWdpdCBhL1JFQURNRS5tYWNvc3ggYi9SRUFETUUubWFjb3N4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzkyMTEKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWFjb3N4CkBAIC0wLDAgKzEsNzQgQEAKK0FzIHdpdGggb3RoZXIgc3lzdGVtcyB1c2luZyBCUEYsIE1hYyBPUyBYIGFsbG93cyB1c2VycyB3aXRoIHJlYWQgYWNjZXNzCit0byB0aGUgQlBGIGRldmljZXMgdG8gY2FwdHVyZSBwYWNrZXRzIHdpdGggbGlicGNhcCBhbmQgYWxsb3dzIHVzZXJzIHdpdGgKK3dyaXRlIGFjY2VzcyB0byB0aGUgQlBGIGRldmljZXMgdG8gc2VuZCBwYWNrZXRzIHdpdGggbGlicGNhcC4KKworT24gc29tZSBzeXN0ZW1zIHRoYXQgdXNlIEJQRiwgdGhlIEJQRiBkZXZpY2VzIGxpdmUgb24gdGhlIHJvb3QgZmlsZQorc3lzdGVtLCBhbmQgdGhlIHBlcm1pc3Npb25zIGFuZC9vciBvd25lcnNoaXAgb24gdGhvc2UgZGV2aWNlcyBjYW4gYmUKK2NoYW5nZWQgdG8gZ2l2ZSB1c2VycyBvdGhlciB0aGFuIHJvb3QgcGVybWlzc2lvbiB0byByZWFkIG9yIHdyaXRlIHRob3NlCitkZXZpY2VzLgorCitPbiBuZXdlciB2ZXJzaW9ucyBvZiBGcmVlQlNELCB0aGUgQlBGIGRldmljZXMgbGl2ZSBvbiBkZXZmcywgYW5kIGRldmZzCitjYW4gYmUgY29uZmlndXJlZCB0byBzZXQgdGhlIHBlcm1pc3Npb25zIGFuZC9vciBvd25lcnNoaXAgb2YgdGhvc2UKK2RldmljZXMgdG8gZ2l2ZSB1c2VycyBvdGhlciB0aGFuIHJvb3QgcGVybWlzc2lvbiB0byByZWFkIG9yIHdyaXRlIHRob3NlCitkZXZpY2VzLgorCitPbiBNYWMgT1MgWCwgdGhlIEJQRiBkZXZpY2VzIGxpdmUgb24gZGV2ZnMsIGJ1dCB0aGUgT1MgWCB2ZXJzaW9uIG9mCitkZXZmcyBpcyBiYXNlZCBvbiBhbiBvbGRlciAobm9uLWRlZmF1bHQpIEZyZWVCU0QgZGV2ZnMsIGFuZCB0aGF0IHZlcnNpb24KK29mIGRldmZzIGNhbm5vdCBiZSBjb25maWd1cmVkIHRvIHNldCB0aGUgcGVybWlzc2lvbnMgYW5kL29yIG93bmVyc2hpcCBvZgordGhvc2UgZGV2aWNlcy4KKworVGhlcmVmb3JlLCB3ZSBzdXBwbHk6CisKKwlhICJzdGFydHVwIGl0ZW0iIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBNYWMgT1MgWDsKKworCWEgbGF1bmNoZCBkYWVtb24gZm9yIFRpZ2VyIGFuZCBsYXRlciB2ZXJzaW9ucyBvZiBNYWMgT1MgWDsKKworQm90aCBvZiB0aGVtIHdpbGwgY2hhbmdlIHRoZSBvd25lcnNoaXAgb2YgdGhlIEJQRiBkZXZpY2VzIHNvIHRoYXQgdGhlCisiYWRtaW4iIGdyb3VwIG93bnMgdGhlbSwgYW5kIHdpbGwgY2hhbmdlIHRoZSBwZXJtaXNzaW9uIG9mIHRoZSBCUEYKK2RldmljZXMgdG8gcnctcnctLS0tLCBzbyB0aGF0IGFsbCB1c2VycyBpbiB0aGUgImFkbWluIiBncm91cCAtIGkuZS4sIGFsbAordXNlcnMgd2l0aCAiQWxsb3cgdXNlciB0byBhZG1pbmlzdGVyIHRoaXMgY29tcHV0ZXIiIHR1cm5lZCBvbiAtIGhhdmUKK2JvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIHRoZW0uCisKK1RoZSBzdGFydHVwIGl0ZW0gaXMgaW4gdGhlIENobW9kQlBGIGRpcmVjdG9yeSBpbiB0aGUgc291cmNlIHRyZWUuICBBCisvTGlicmFyeS9TdGFydHVwSXRlbXMgZGlyZWN0b3J5IHNob3VsZCBiZSBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeQorZXhpc3QsIGFuZCB0aGUgQ2htb2RCUEYgZGlyZWN0b3J5IHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlCisvTGlicmFyeS9TdGFydHVwSXRlbXMgZGlyZWN0b3J5IChjb3B5IHRoZSBlbnRpcmUgZGlyZWN0b3J5LCBzbyB0aGF0Cit0aGVyZSdzIGEgL0xpYnJhcnkvU3RhcnR1cEl0ZW1zL0NobW9kQlBGIGRpcmVjdG9yeSwgY29udGFpbmluZyBhbGwgdGhlCitmaWxlcyBpbiB0aGUgc291cmNlIHRyZWUncyBDaG1vZEJQRiBkaXJlY3Rvcnk7IGRvbid0IGNvcHkgdGhlIGluZGl2aWR1YWwKK2l0ZW1zIGluIHRoYXQgZGlyZWN0b3J5IHRvIC9MaWJyYXJ5L1N0YXJ0dXBJdGVtcykuICBUaGUgQ2htb2RCUEYKK2RpcmVjdG9yeSwgYW5kIGFsbCBmaWxlcyB1bmRlciBpdCwgbXVzdCBiZSBvd25lZCBieSByb290LiAgSW5zdGFsbGluZwordGhlIGZpbGVzIHdvbid0IGltbWVkaWF0ZWx5IGNhdXNlIHRoZSBzdGFydHVwIGl0ZW0gdG8gYmUgZXhlY3V0ZWQ7IGl0Cit3aWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBuZXh0IHJlYm9vdC4gIFRvIGNoYW5nZSB0aGUgcGVybWlzc2lvbnMgYmVmb3JlCit0aGUgcmVib290LCBydW4KKworCXN1ZG8gU3lzdGVtU3RhcnRlciBzdGFydCBDaG1vZEJQRgorCitUaGUgbGF1bmNoZCBkYWVtb24gaXMgdGhlIGNobW9kX2JwZiBzY3JpcHQsIHBsdXMgdGhlCitvcmcudGNwZHVtcC5jaG1vZF9icGYucGxpc3QgbGF1bmNoZCBwbGlzdCBmaWxlLiAgY2htb2RfYnBmIHNob3VsZCBiZQoraW5zdGFsbGVkIGluIC91c3IvbG9jYWwvYmluL2NobW9kX2JwZiwgYW5kIG9yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdAorc2hvdWxkIGJlIGluc3RhbGxlZCBpbiAvTGlicmFyeS9MYXVuY2hEYWVtb25zLiAgY2htb2RfYnBmLCBhbmQKK29yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdCwgbXVzdCBiZSBvd25lZCBieSByb290LiAgSW5zdGFsbGluZyB0aGUKK3NjcmlwdCBhbmQgcGxpc3QgZmlsZSB3b24ndCBpbW1lZGlhdGVseSBjYXVzZSB0aGUgc2NyaXB0IHRvIGJlIGV4ZWN1dGVkOworaXQgd2lsbCBiZSBleGVjdXRlZCBvbiB0aGUgbmV4dCByZWJvb3QuICBUbyBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zCitiZWZvcmUgdGhlIHJlYm9vdCwgcnVuCisKKwlzdWRvIC91c3IvbG9jYWwvYmluL2NobW9kX2JwZgorCitvcgorCisJc3VkbyBsYXVuY2hjdGwgbG9hZCAvTGlicmFyeS9MYXVuY2hEYWVtb25zL29yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdAorCitJZiB5b3Ugd2FudCB0byBnaXZlIGEgcGFydGljdWxhciB1c2VyIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBCUEYKK2RldmljZXMsIHJhdGhlciB0aGFuIGdpdmluZyBhbGwgYWRtaW5pc3RyYXRpdmUgdXNlcnMgcGVybWlzc2lvbiB0bworYWNjZXNzIHRoZW0sIHlvdSBjYW4gaGF2ZSB0aGUgQ2htb2RCUEYvQ2htb2RCUEYgc2NyaXB0IGNoYW5nZSB0aGUKK293bmVyc2hpcCBvZiAvZGV2L2JwZiogd2l0aG91dCBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbnMuICBJZiB5b3Ugd2FudCB0bworZ2l2ZSBhIHBhcnRpY3VsYXIgdXNlciBwZXJtaXNzaW9uIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBCUEYgZGV2aWNlcyBhbmQKK2dpdmUgdGhlIGFkbWluaXN0cmF0aXZlIHVzZXJzIHBlcm1pc3Npb24gdG8gcmVhZCBidXQgbm90IHdyaXRlIHRoZSBCUEYKK2RldmljZXMsIHlvdSBjYW4gaGF2ZSB0aGUgc2NyaXB0IGNoYW5nZSB0aGUgb3duZXIgdG8gdGhhdCB1c2VyLCB0aGUKK2dyb3VwIHRvICJhZG1pbiIsIGFuZCB0aGUgcGVybWlzc2lvbnMgdG8gcnctci0tLS0tLiAgT3RoZXIgcG9zc2liaWxpdGllcworYXJlIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuCisKKyhOT1RFOiBkdWUgdG8gYSBidWcgaW4gU25vdyBMZW9wYXJkLCBpZiB5b3UgY2hhbmdlIHRoZSBwZXJtaXNzaW9ucyBub3QKK3RvIGdyYW50IHdyaXRlIHBlcm1pc3Npb24gdG8gZXZlcnlib2R5IHdobyBzaG91bGQgYmUgYWxsb3dlZCB0byBjYXB0dXJlCit0cmFmZmljLCBub24tcm9vdCB1c2VycyB3aG8gY2Fubm90IG9wZW4gdGhlIEJQRiBkZXZpY2VzIGZvciB3cml0aW5nIHdpbGwKK25vdCBiZSBhYmxlIHRvIGNhcHR1cmUgb3V0Z29pbmcgcGFja2V0cy4pCmRpZmYgLS1naXQgYS9SRUFETUUuc2VwdGVsIGIvUkVBRE1FLnNlcHRlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM4OGRmCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLnNlcHRlbApAQCAtMCwwICsxLDUwIEBACitUaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBhcHBseSBpZiB5b3UgaGF2ZSBhIExpbnV4IHBsYXRmb3JtIGFuZCB3YW50CitsaWJwY2FwIHRvIHN1cHBvcnQgdGhlIFNlcHRlbCByYW5nZSBvZiBwYXNzaXZlIG5ldHdvcmsgbW9uaXRvcmluZyBjYXJkcworZnJvbSBJbnRlbCAoaHR0cDovL3d3dy5pbnRlbC5jb20pCisKKzEpIEluc3RhbGwgYW5kIGJ1aWxkIHRoZSBTZXB0ZWwgc29mdHdhcmUgZGlzdHJpYnV0aW9uIGJ5IGZvbGxvd2luZyB0aGUKK2luc3RydWN0aW9ucyBzdXBwbGllZCB3aXRoIHRoYXQgcGFja2FnZS4KKworMikgQ29uZmlndXJlIGxpYmNhcC4gVG8gYWxsb3cgdGhlICdjb25maWd1cmUnIHNjcmlwdCB0byBsb2NhdGUgdGhlIFNlcHRlbAorc29mdHdhcmUgZGlzdHJpYnV0aW9uIHVzZSB0aGUgJy0td2l0aC1zZXB0ZWwnIG9wdGlvbjoKKworICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtc2VwdGVsPURJUgorCit3aGVyZSBESVIgaXMgdGhlIHJvb3Qgb2YgdGhlIFNlcHRlbCBzb2Z0d2FyZSBkaXN0cmlidXRpb24sIGZvciBleGFtcGxlCisvdmFyL3NyYy9zZXB0ZWwuCisKK0J5IGRlZmF1bHQgKGlmIHlvdSB3cml0ZSBvbmx5IC4vY29uZmlndXJlIC0td2l0aC1zZXB0ZWwpIGl0IHRha2VzCisuLy4uL3NlcHRlbCBhcyBhcmd1bWVudCBmb3IgRElSLiAKKworSWYgdGhlIFNlcHRlbCBzb2Z0d2FyZSBpcyBjb3JyZWN0bHkgZGV0ZWN0ZWQgJ2NvbmZpZ3VyZScgd2lsbAorcmVwb3J0OgorCisgICAgICAgIGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBTZXB0ZWwgQVBJLi4uIHllcworCitJZiAnY29uZmlndXJlJyByZXBvcnRzIHRoYXQgdGhlcmUgaXMgbm8gU2VwdGVsIEFQSSwgdGhlIGRpcmVjdG9yeSBtYXkgaGF2ZSBiZWVuCitpbmNvcnJlY3RseSBzcGVjaWZpZWQgb3IgdGhlIFNlcHRlbCBzb2Z0d2FyZSB3YXMgbm90IGJ1aWx0IGJlZm9yZSBjb25maWd1cmluZworbGlicGNhcC4KKworU2VlIGFsc28gdGhlIGxpYnBjYXAgSU5TVEFMTC50eHQgZmlsZSBmb3IgZnVydGhlciBsaWJwY2FwIGNvbmZpZ3VyYXRpb24KK29wdGlvbnMuCisKK0J1aWxkaW5nIGxpYnBjYXAgYXQgdGhpcyBzdGFnZSB3aWxsIGluY2x1ZGUgc3VwcG9ydCBmb3IgYm90aCB0aGUgbmF0aXZlCitwYWNrZXQgY2FwdHVyZSBzdHJlYW0gYW5kIGZvciBjYXB0dXJpbmcgZnJvbSBTZXB0ZWwgY2FyZHMuICBUbyBidWlsZAorbGlicGNhcCB3aXRoIG9ubHkgU2VwdGVsIHN1cHBvcnQgc3BlY2lmeSB0aGUgY2FwdHVyZSB0eXBlIGFzICdzZXB0ZWwnCit3aGVuIGNvbmZpZ3VyaW5nIGxpYnBjYXA6CisKKyAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNlcHRlbD1ESVIgLS13aXRoLXBjYXA9c2VwdGVsCisKK0FwcGxpY2F0aW9ucyBidWlsdCB3aXRoIGxpYnBjYXAgY29uZmlndXJlZCBpbiB0aGlzIHdheSB3aWxsIG9ubHkgZGV0ZWN0IFNlcHRlbAorY2FyZHMgYW5kIHdpbGwgbm90IGNhcHR1cmUgZnJvbSB0aGUgbmF0aXZlIE9TIHBhY2tldCBzdHJlYW0uCisKK05vdGU6IEFzIG1lbnRpb25lZCBpbiBwY2FwLXNlcHRlbC5jIHdlIHNob3VsZCBmaXJzdCBlZGl0IHRoZSBzeXN0ZW0udHh0CitmaWxlIHRvIGNoYW5nZSB0aGUgdXNlciBwYXJ0IGV4YW1wbGUgKFVQRSkgbW9kdWxlIGlkIHRvIDB4ZGQgaW5zdGVhZCBvZgorMHgyZCBmb3IgdGVjaG5pY2FsIHJlYXNvbi4gIFNvIHRoaXMgY2hhbmdlIGluIHN5c3RlbS50eHQgaXMgY3J1dGlhbCBhbmQKK3RoaW5ncyB3aWxsIGdvIHdyb25nIGlmIGl0J3Mgbm90IGRvbmUuICBTeXN0ZW0udHh0IGFsb25nIHdpdGggY29uZmlnLnR4dAorYXJlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCBhcmUgZWRpdGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBydW5uaW5nIHRoZQorZ2N0bG9hZCBwcm9ncmFtIHRoYXQgdXNlcyB0aGVzZSBmaWxlcyBmb3IgaW5pdGlhbGlzaW5nIG1vZHVsZXMgYW5kCitjb25maWd1cmluZyBwYXJhbWV0ZXJzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgY29udGFjdCBtZSA6IGdpbF9ob3lla0Bob3RtYWlsLmNvbQpkaWZmIC0tZ2l0IGEvUkVBRE1FLnNpdGEgYi9SRUFETUUuc2l0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdhNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLnNpdGEKQEAgLTAsMCArMSw2NCBAQAorVGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgYXBwbHkgaWYgeW91IGhhdmUgYSBMaW51eCBwbGF0Zm9ybSBhbmQgd2FudAorbGlicGNhcCB0byBzdXBwb3J0IHRoZSAnQUNOJyBXQU4vTEFOIHJvdXRlciBwcm9kdWN0IGZyb20gZnJvbSBTSVRBCisoaHR0cDovL3d3dy5zaXRhLmFlcm8pCisKK1RoaXMgbWlnaHQgYWxzbyB3b3JrIG9uIG5vbi1MaW51eCBVbml4LWNvbXBhdGlibGUgcGxhdGZvcm1zLCBidXQgdGhhdAoraGFzIG5vdCBiZWVuIHRlc3RlZC4KKworU2VlIGFsc28gdGhlIGxpYnBjYXAgSU5TVEFMTC50eHQgZmlsZSBmb3IgZnVydGhlciBsaWJwY2FwIGNvbmZpZ3VyYXRpb24KK29wdGlvbnMuCisKK1RoZXNlIGFkZGl0aW9ucy9leHRlbnNpb25zIGhhdmUgYmVlbiBtYWRlIHRvIFBDQVAgdG8gYWxsb3cgaXQgdG8KK2NhcHR1cmUgcGFja2V0cyBmcm9tIGEgU0lUQSBBQ04gZGV2aWNlIChhbmQgcG90ZW50aWFsbHkgb3RoZXJzKS4KKworVG8gZW5hYmxlIGl0cyBzdXBwb3J0IHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkaXN0cmlidXRpb24gaGFzCithIGNvcnJlY3QgY29uZmlndXJlLmluIGZpbGU7IHRoYXQgY2FuIGJlIGNyZWF0ZWQgaWYgbmVjY2Vzc2F5IGJ5Cit1c2luZyB0aGUgbm9ybWFsIGF1dG9jb25mIHByb2NlZHVyZSBvZjoKKworYWNsb2NhbAorYXV0b2NvbmYKK2F1dG9oZWFkZXIKK2F1dG9tYWtlCisKK1RoZW4gcnVuIGNvbmZpZ3VyZSB3aXRoIHRoZSAnc2l0YScgb3B0aW9uOgorCisuL2NvbmZpZ3VyZSAtLXdpdGgtc2l0YQorCitBcHBsaWNhdGlvbnMgYnVpbHQgd2l0aCBsaWJwY2FwIGNvbmZpZ3VyZWQgaW4gdGhpcyB3YXkgd2lsbCBvbmx5IGRldGVjdCBTSVRBCitBQ04gaW50ZXJmYWNlcyBhbmQgd2lsbCBub3QgY2FwdHVyZSBmcm9tIHRoZSBuYXRpdmUgT1MgcGFja2V0IHN0cmVhbS4KKworVGhlIFNJVEEgZXh0ZW5zaW9uIHByb3ZpZGVzIGEgcmVtb3RlIGRhdGFzY29wZSBvcGVyYXRpb24gZm9yIGNhcHR1cmluZworYm90aCBXQU4gYW5kIExBTiBwcm90b2NvbHMuICBJdCBlZmZlY3RpdmVseSBzcGxpdHMgdGhlIG9wZXJhdGlvbiBvZgorUENBUCBpbnRvIHR3byBoYWx2ZXMuICBUaGUgdG9wIGxheWVyIHBlcmZvcm1zIHRoZSBtYWpvcml0eSBvZiB0aGUKK3dvcmssIGJ1dCBpbnRlcmZhY2VzIHZpYSBhIFRDUCBzZXNzaW9uIHRvIHJlbW90ZSBhZ2VudHMgdGhhdAorcHJvdmlkZSB0aGUgbG93ZXIgbGF5ZXIgZnVuY3Rpb25hbGl0eSBvZiBhY3R1YWwgc25pZmZpbmcgYW5kCitmaWx0ZXJpbmcuIE1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBmdW5jdGlvbnMgYW5kCitpbnRlci1kZXZpY2UgcHJvdG9jb2wgYW5kIG5hbWluZyBjb252ZW50aW9ucyBhcmUgZGVzY3JpYmVkIGluIGRldGFpbAoraW4gJ3BjYXAtc2l0YS5odG1sJy4KKworcGNhcF9maW5kYWxsZGV2cygpIHJlYWRzIHRoZSBsb2NhbCBzeXN0ZW0ncyAvZXRjL2hvc3RzIGZpbGUgbG9va2luZworZm9yIGhvc3QgbmFtZXMgdGhhdCBtYXRjaCB0aGUgZm9ybWF0IG9mIElPUCB0eXBlIGRldmljZXMuICBpZS4gIGFhYV9JX3hfeQorYW5kIHRoZW4gcXVlcmllcyBlYWNoIGFzc29jaWF0ZWQgSVAgYWRkcmVzcyBmb3IgYSBsaXN0IG9mIGl0cyBXQU4gYW5kCitMQU4gZGV2aWNlcy4gIFRoZSBsb2NhbCBzeXN0ZW0gdGhlIGFnZ3JlZ2F0ZXMgdGhlIGxpc3RzIG9idGFpbmVkIGZyb20KK2VhY2ggSU9QLCBzb3J0cyBpdCwgYW5kIHByb3ZpZGVzIGl0ICh0byBXaXJlc2hhcmsgZXQuYWwpIGFzIHRoZQorbGlzdCBvZiBtb25pdG9yYWJsZSBpbnRlcmZhY2VzLgorCitPbmNlIGEgdmFsaWQgaW50ZXJmYWNlIGhhcyBiZWVuIHNlbGVjdGVkLCBwY2FwX29wZW4oKSBpcyBjYWxsZWQKK3doaWNoIG9wZW5zIGEgVENQIHNlc3Npb24gKHRvIGEgd2VsbCBrbm93biBwb3J0KSBvbiB0aGUgdGFyZ2V0IElPUAorYW5kIHRlbGxzIGl0IHRvIHN0YXJ0IG1vbml0b3JpbmcuCisKK0FsbCBjYXB0dXJlZCBwYWNrZXRzIGFyZSB0aGVuIGZvcndhcmRlZCBhY3Jvc3MgdGhhdCBUQ1Agc2Vzc2lvbgorYmFjayB0byB0aGUgbG9jYWwgJ3RvcCBsYXllcicgZm9yIGZvcndhcmRpbmcgdG8gdGhlIGFjdHVhbAorc25pZmZpbmcgcHJvZ3JhbSAod2lyZXNoYXJrLi4uKQorCitOb3RlIHRoYXQgdGhlIERMVF9TSVRBIGxpbmstbGF5ZXIgdHlwZSBpbmNsdWRlcyBhIHByb3ByaWV0YXJ5IGhlYWRlcgordGhhdCBpcyBkb2N1bWVudGVkIGFzIHBhcnQgb2YgdGhlIFNJVEEgZGlzc2VjdG9yIG9mIFdpcmVzaGFyayBhbmQgaXMKK2Fsc28gZGVzY3JpYmVkIGluICdwY2FwLXNpdGEuaHRtbCcgZm9yIHBvc3Rlcml0eSBzYWtlLgorCitUaGF0IGhlYWRlciBwcm92aWRlczoKKy0gUGFja2V0IGRpcmVjdGlvbiAoaW4vb3V0KSAoMSBvY3RldCkKKy0gTGluayBsYXllciBoYXJkd2FyZSBzaWduYWwgc3RhdHVzICgxIG9jdGV0KQorLSBUcmFuc21pdC9SZWNlaXZlIGVycm9yIHN0YXR1cyAoMiBvY3RldHMpCistIEVuY2Fwc3VsYXRlZCBXQU4gcHJvdG9jb2wgSUQgKDEgb2N0ZXQpCisKKwpkaWZmIC0tZ2l0IGEvUkVBRE1FLnRydTY0IGIvUkVBRE1FLnRydTY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTFlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUudHJ1NjQKQEAgLTAsMCArMSw0OSBAQAorVGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgYXJlIGFwcGxpY2FibGUgdG8gVHJ1NjQgVU5JWCAKKyhmb3JtZXJseSBEaWdpdGFsIFVOSVggKGZvcm1lcmx5IERFQyBPU0YvMSkpIHZlcnNpb24gNC4wLCBhbmQKK3Byb2JhYmx5IHRvIGxhdGVyIHZlcnNpb25zIGFzIHdlbGw7IGF0IGxlYXN0IHNvbWUgb3B0aW9ucyBhcHBseSB0bworRGlnaXRhbCBVTklYIDMuMiAtIHBlcmhhcHMgYWxsIGRvLgorCitJbiBvcmRlciB0byB1c2Uga2VybmVsIHBhY2tldCBmaWx0ZXJpbmcgb24gdGhpcyBzeXN0ZW0sIHlvdSBoYXZlCit0byBjb25maWd1cmUgaXQgaW4gc3VjaCBhIHdheToKKworS2VybmVsIGNvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBwYWNrZXQgZmlsdGVyaW5nIGtlcm5lbCBvcHRpb24gbXVzdCBiZSBlbmFibGVkIGF0IGtlcm5lbAoraW5zdGFsbGF0aW9uLiAgSWYgaXQgd2FzIG5vdCB0aGUgY2FzZSwgeW91IGNhbiByZWJ1aWxkIHRoZSBrZXJuZWwgd2l0aAorImRvY29uZmlnIC1jIiBhZnRlciBhZGRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBrZXJuZWwKK2NvbmZpZ3VyYXRpb24gZmlsZSAoL3N5cy9jb25mLzxIT1NUTkFNRT4pOgorCisJb3B0aW9uIFBBQ0tFVEZJTFRFUgorCitvciB1c2UgImRvY29uZmlnIiB3aXRob3V0IGFueSBhcmd1bWVudHMgdG8gYWRkIHRoZSBwYWNrZXQgZmlsdGVyIGRyaXZlcgorb3B0aW9uIHZpYSB0aGUga2VybmVsIG9wdGlvbiBtZW51IChzZWUgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdGlvbgorZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGRvIHRoaXMpLgorCitEZXZpY2UgY29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGV2aWNlcyB1c2VkIGZvciBwYWNrZXQgZmlsdGVyaW5nIG11c3QgYmUgY3JlYXRlZCB0aGFua3MgdG8KK3RoZSBmb2xsb3dpbmcgY29tbWFuZCAoZXhlY3V0ZWQgaW4gdGhlIC9kZXYgZGlyZWN0b3J5KToKKworCS4vTUFLRURFViBwZmlsdAorCitJbnRlcmZhY2UgY29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gb3JkZXIgdG8gY2FwdHVyZSBhbGwgcGFja2V0cyBvbiBhIG5ldHdvcmssIHlvdSBtYXkgd2FudCB0byBhbGxvdworYXBwbGljYXRpb25zIHRvIHB1dCB0aGUgaW50ZXJmYWNlIG9uIHRoYXQgbmV0d29yayBpbnRvICJsb2NhbCBjb3B5IgorbW9kZSwgc28gdGhhdCB0Y3BkdW1wIGNhbiBzZWUgcGFja2V0cyBzZW50IGJ5IHRoZSBob3N0IG9uIHdoaWNoIGl0J3MKK3J1bm5pbmcgYXMgd2VsbCBhcyBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoYXQgaG9zdCwgYW5kIHRvIHB1dCB0aGUKK2ludGVyZmFjZSBpbnRvICJwcm9taXNjdW91cyIgbW9kZSwgc28gdGhhdCB0Y3BkdW1wIGNhbiBzZWUgcGFja2V0cyBvbgordGhlIG5ldHdvcmsgc2VnbWVudCBub3Qgc2VudCB0byB0aGUgaG9zdCBvbiB3aGljaCBpdCdzIHJ1bm5pbmcsIGJ5IHVzaW5nCit0aGUgcGZjb25maWcoMSkgY29tbWFuZDoKKworCXBmY29uZmlnICtjICtwIDxuZXR3b3JrX2RldmljZT4KKworb3IgYWxsb3cgYXBwbGljYXRpb24gdG8gcHV0IGFueSBpbnRlcmZhY2UgaW50byAibG9jYWwgY29weSIgb3IKKyJwcm9taXNjdW91cyIgbW9kZSBieSB1c2luZyB0aGUgY29tbWFuZDoKKworCXBmY29uZmlnICtjICtwIC1hCisKK05vdGU6IGFsbCBpbnN0cnVjdGlvbnMgZ2l2ZW4gcmVxdWlyZSByb290IHByaXZpbGVnZXMuCmRpZmYgLS1naXQgYS9TVU5PUzQvbml0X2lmLm8uc3BhcmMgYi9TVU5PUzQvbml0X2lmLm8uc3BhcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1MDczZQotLS0gL2Rldi9udWxsCisrKyBiL1NVTk9TNC9uaXRfaWYuby5zcGFyYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9TVU5PUzQvbml0X2lmLm8uc3VuMyBiL1NVTk9TNC9uaXRfaWYuby5zdW4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTNmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9TVU5PUzQvbml0X2lmLm8uc3VuMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9TVU5PUzQvbml0X2lmLm8uc3VuNGMuNC4wLjNjIGIvU1VOT1M0L25pdF9pZi5vLnN1bjRjLjQuMC4zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAxMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvU1VOT1M0L25pdF9pZi5vLnN1bjRjLjQuMC4zYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9UT0RPIGIvVE9ETwppbmRleCAzZGU0NTMwLi43MzMyNWUxIDEwMDY0NAotLS0gYS9UT0RPCisrKyBiL1RPRE8KQEAgLTYsNyArNiw3IEBACiAKIEdlbmVyYWwKIAotLSBjb25maWd1cmUgc2hvdWxkIG5vdCBiZSBpbiB0aGUgQ1ZTLiBNb3N0IG9wZW4gc291cmNlIHByb2plY3RzIGhhdmUgYW4gCistIGNvbmZpZ3VyZSBzaG91bGQgbm90IGJlIGluIEdpdC4gTW9zdCBvcGVuIHNvdXJjZSBwcm9qZWN0cyBoYXZlIGFuIAogICBhdXRvZ2VuLnNoIHNjcmlwdCB0byBydW4gYXV0b2NvbmYgZXRjLiBhZnRlciBjaGVja291dC4gSSB0aGluayB3ZSAKICAgc2hvdWxkIHN0aWNrIHRvIHRoZSBzdGFuZGFyZC4gCiAKZGlmZiAtLWdpdCBhL1ZFUlNJT04gYi9WRVJTSU9OCmluZGV4IGUzZTE4MDcuLjRjZGE4ZjEgMTAwNjQ0Ci0tLSBhL1ZFUlNJT04KKysrIGIvVkVSU0lPTgpAQCAtMSArMSBAQAotMC45LjgKKzEuNS4yCmRpZmYgLS1naXQgYS9XaW4zMi9JbmNsdWRlL0dudWMuaCBiL1dpbjMyL0luY2x1ZGUvR251Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjRiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9JbmNsdWRlL0dudWMuaApAQCAtMCwwICsxLDQ2IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL1dpbjMyL0luY2x1ZGUvR251Yy5oLHYgMS4xIDIwMDItMDgtMDEgMDg6MzM6MDUgcmlzc28gRXhwICQgKExCTCkgKi8KKworLyogRGVmaW5lIF9fUCgpIG1hY3JvLCBpZiBuZWNlc3NhcnkgKi8KKworI2lmbmRlZiBfX1AKKyNpZiBfX1NURENfXworI2RlZmluZSBfX1AocHJvdG9zKSBwcm90b3MKKyNlbHNlCisjZGVmaW5lIF9fUChwcm90b3MpICgpCisjZW5kaWYKKyNlbmRpZgorCisvKiBpbmxpbmUgZm9vICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2RlZmluZSBpbmxpbmUKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgbmV3IGFuZCBvbGQgImRlYWQiIHJvdXRpbmUgcHJvdG90eXBlcworICoKKyAqIEZvciBleGFtcGxlOgorICoKKyAqCV9fZGVhZCB2b2lkIGZvbyh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh2b2xhdGlsZSkpOworICoKKyAqLworI2lmZGVmIF9fR05VQ19fCisjaWZuZGVmIF9fZGVhZAorI2RlZmluZSBfX2RlYWQgdm9sYXRpbGUKKyNlbmRpZgorI2lmIF9fR05VQ19fIDwgMiAgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA1KQorI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX18oYXJncykKKyNlbmRpZgorI2VuZGlmCisjZWxzZQorI2lmbmRlZiBfX2RlYWQKKyNkZWZpbmUgX19kZWFkCisjZW5kaWYKKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKGFyZ3MpCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9hZGRyaW5mby5oIGIvV2luMzIvSW5jbHVkZS9hZGRyaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjJlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9JbmNsdWRlL2FkZHJpbmZvLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIGFuZCAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogJElkOiBhZGRyaW5mby5oLHYgMS4xIDIwMDItMDgtMDEgMDg6MzM6MDUgcmlzc28gRXhwICQgKi8KKworI2lmbmRlZiBIQVZFX0FERFJJTkZPCisKKy8qCisgKiBFcnJvciByZXR1cm4gY29kZXMgZnJvbSBnZXRhZGRyaW5mbygpCisgKi8KKyNkZWZpbmUJRUFJX0FERFJGQU1JTFkJIDEJLyogYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRUFJX0FHQUlOCSAyCS8qIHRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAqLworI2RlZmluZQlFQUlfQkFERkxBR1MJIDMJLyogaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MgKi8KKyNkZWZpbmUJRUFJX0ZBSUwJIDQJLyogbm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCisjZGVmaW5lCUVBSV9GQU1JTFkJIDUJLyogYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRUFJX01FTU9SWQkgNgkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlICovCisjZGVmaW5lCUVBSV9OT0RBVEEJIDcJLyogbm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUgKi8KKyNkZWZpbmUJRUFJX05PTkFNRQkgOAkvKiBob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biAqLworI2RlZmluZQlFQUlfU0VSVklDRQkgOQkvKiBzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZSAqLworI2RlZmluZQlFQUlfU09DS1RZUEUJMTAJLyogYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUlfU1lTVEVNCTExCS8qIHN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBlcnJubyAqLworI2RlZmluZSBFQUlfQkFESElOVFMJMTIKKyNkZWZpbmUgRUFJX1BST1RPQ09MCTEzCisjZGVmaW5lIEVBSV9NQVgJCTE0CisKKy8qIGludGVybmFsIGVycm9yICovCisjZGVmaW5lCU5FVERCX0lOVEVSTkFMCS0xCS8qIHNlZSBlcnJubyAqLworCisvKgorICogRmxhZyB2YWx1ZXMgZm9yIGdldGFkZHJpbmZvKCkKKyAqLworI2RlZmluZQlBSV9QQVNTSVZFCTB4MDAwMDAwMDEgLyogZ2V0IGFkZHJlc3MgdG8gdXNlIGJpbmQoKSAqLworI2RlZmluZQlBSV9DQU5PTk5BTUUJMHgwMDAwMDAwMiAvKiBmaWxsIGFpX2Nhbm9ubmFtZSAqLworI2RlZmluZQlBSV9OVU1FUklDSE9TVAkweDAwMDAwMDA0IC8qIHByZXZlbnQgbmFtZSByZXNvbHV0aW9uICovCisvKiB2YWxpZCBmbGFncyBmb3IgYWRkcmluZm8gKi8KKyNkZWZpbmUJQUlfTUFTSwkJKEFJX1BBU1NJVkUgfCBBSV9DQU5PTk5BTUUgfCBBSV9OVU1FUklDSE9TVCkKKworI2RlZmluZQlBSV9BTEwJCTB4MDAwMDAxMDAgLyogSVB2NiBhbmQgSVB2NC1tYXBwZWQgKHdpdGggQUlfVjRNQVBQRUQpICovCisjZGVmaW5lCUFJX1Y0TUFQUEVEX0NGRwkweDAwMDAwMjAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBpZiBrZXJuZWwgc3VwcG9ydHMgKi8KKyNkZWZpbmUJQUlfQUREUkNPTkZJRwkweDAwMDAwNDAwIC8qIG9ubHkgaWYgYW55IGFkZHJlc3MgaXMgYXNzaWduZWQgKi8KKyNkZWZpbmUJQUlfVjRNQVBQRUQJMHgwMDAwMDgwMCAvKiBhY2NlcHQgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzICovCisvKiBzcGVjaWFsIHJlY29tbWVuZGVkIGZsYWdzIGZvciBnZXRpcG5vZGVieW5hbWUgKi8KKyNkZWZpbmUJQUlfREVGQVVMVAkoQUlfVjRNQVBQRURfQ0ZHIHwgQUlfQUREUkNPTkZJRykKKworc3RydWN0IGFkZHJpbmZvIHsKKwlpbnQJYWlfZmxhZ3M7CS8qIEFJX1BBU1NJVkUsIEFJX0NBTk9OTkFNRSAqLworCWludAlhaV9mYW1pbHk7CS8qIFBGX3h4eCAqLworCWludAlhaV9zb2NrdHlwZTsJLyogU09DS194eHggKi8KKwlpbnQJYWlfcHJvdG9jb2w7CS8qIDAgb3IgSVBQUk9UT194eHggZm9yIElQdjQgYW5kIElQdjYgKi8KKwlzaXplX3QJYWlfYWRkcmxlbjsJLyogbGVuZ3RoIG9mIGFpX2FkZHIgKi8KKwljaGFyCSphaV9jYW5vbm5hbWU7CS8qIGNhbm9uaWNhbCBuYW1lIGZvciBob3N0bmFtZSAqLworCXN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsJLyogYmluYXJ5IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFpX25leHQ7CS8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCit9OworCitleHRlcm4gdm9pZCBmcmVlYWRkcmluZm8gKHN0cnVjdCBhZGRyaW5mbyAqKTsKK2V4dGVybiB2b2lkIGZyZWVob3N0ZW50IChzdHJ1Y3QgaG9zdGVudCAqKTsKK2V4dGVybiBjaGFyICpnYWlfc3RyZXJyb3IgKGludCk7CitleHRlcm4gaW50IGdldGFkZHJpbmZvIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgc3RydWN0IGFkZHJpbmZvICoqKTsKK2V4dGVybiBpbnQgZ2V0bmFtZWluZm8gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsIGNoYXIgKiwKKwkJCSAgICBzaXplX3QsIGNoYXIgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRpcG5vZGVieWFkZHIgKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQsIGludCAqKTsKK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqZ2V0aXBub2RlYnluYW1lIChjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQgKik7CitleHRlcm4gaW50IGluZXRfcHRvbiAoaW50LCBjb25zdCBjaGFyICosIHZvaWQgKik7CitleHRlcm4gY29uc3QgY2hhciAqaW5ldF9udG9wIChpbnQsIGNvbnN0IHZvaWQgKiwgY2hhciAqLCBzaXplX3QpOworI2Vsc2UKKworI2lmbmRlZiBFQUlfQkFESElOVFMKKyNkZWZpbmUgRUFJX0JBREhJTlRTCTEyCisjZW5kaWYgCisKKyNpZm5kZWYgRUFJX1BST1RPQ09MCQorI2RlZmluZSBFQUlfUFJPVE9DT0wJMTMKKyNlbmRpZgorCisjaWZuZGVmIEVBSV9NQVgJCisjZGVmaW5lIEVBSV9NQVgJCTE0CisjZW5kaWYKKworI2lmbmRlZiBORVREQl9JTlRFUk5BTAorI2RlZmluZQlORVREQl9JTlRFUk5BTAktMQkvKiBzZWUgZXJybm8gKi8KKyNlbmRpZgorCisjaWZuZGVmIEFJX01BU0sKKy8qIHZhbGlkIGZsYWdzIGZvciBhZGRyaW5mbyAqLworI2RlZmluZQlBSV9NQVNLCQkoQUlfUEFTU0lWRSB8IEFJX0NBTk9OTkFNRSB8IEFJX05VTUVSSUNIT1NUKQorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX0FERFJJTkZPICovCisKKy8qCisgKiBDb25zdGFudHMgZm9yIGdldG5hbWVpbmZvKCkKKyAqLworI2lmbmRlZiBOSV9NQVhIT1NUCisjZGVmaW5lCU5JX01BWEhPU1QJMTAyNQorI2VuZGlmCisjaWZuZGVmIE5JX01BWFNFUlYKKyNkZWZpbmUJTklfTUFYU0VSVgkzMgorI2VuZGlmCisKKy8qCisgKiBGbGFnIHZhbHVlcyBmb3IgZ2V0bmFtZWluZm8oKQorICovCisjaWZuZGVmIE5JX05PRlFETgorI2RlZmluZQlOSV9OT0ZRRE4JMHgwMDAwMDAwMQorI2VuZGlmCisjaWZuZGVmIE5JX05VTUVSSUNIT1NUCisjZGVmaW5lCU5JX05VTUVSSUNIT1NUCTB4MDAwMDAwMDIKKyNlbmRpZgorI2lmbmRlZiBOSV9OQU1FUkVRRAorI2RlZmluZQlOSV9OQU1FUkVRRAkweDAwMDAwMDA0CisjZW5kaWYKKyNpZm5kZWYgTklfTlVNRVJJQ1NFUlYKKyNkZWZpbmUJTklfTlVNRVJJQ1NFUlYJMHgwMDAwMDAwOAorI2VuZGlmCisjaWZuZGVmIE5JX0RHUkFNCisjZGVmaW5lCU5JX0RHUkFNCTB4MDAwMDAwMTAKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9XaW4zMi9JbmNsdWRlL2FycGEvbmFtZXNlci5oIGIvV2luMzIvSW5jbHVkZS9hcnBhL25hbWVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYxODVjCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvSW5jbHVkZS9hcnBhL25hbWVzZXIuaApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqICsrQ29weXJpZ2h0KysgMTk4MywgMTk4OSwgMTk5MworICogLQorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5LCAxOTkzCisgKiAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIAlUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIC0KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5MyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdAorICogdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZG9jdW1lbnQgb3Igc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIERJR0lUQUwgRVFVSVBNRU5UIENPUlAuIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gICBJTiBOTyBFVkVOVCBTSEFMTCBESUdJVEFMIEVRVUlQTUVOVAorICogQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworICogQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqIC0KKyAqIC0tQ29weXJpZ2h0LS0KKyAqLworCisvKgorICogICAgICBAKCMpbmFtZXNlci5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICoJbmFtZXNlci5oLHYgMS4yIDE5OTUvMDUvMDYgMTQ6MjM6NTQgaGpsIEV4cAorICovCisKKyNpZm5kZWYgX05BTUVTRVJfSF8KKyNkZWZpbmUJX05BTUVTRVJfSF8KKworI2lmbmRlZiBXSU4zMgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmICghZGVmaW5lZChCU0QpKSB8fCAoQlNEIDwgMTk5MzA2KQorIyBpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNlbHNlIAorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKyNlbmRpZgorCisvKgorICogcmV2aXNpb24gaW5mb3JtYXRpb24uICB0aGlzIGlzIHRoZSByZWxlYXNlIGRhdGUgaW4gWVlZWU1NREQgZm9ybWF0LgorICogaXQgY2FuIGNoYW5nZSBldmVyeSBkYXkgc28gdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIHdpdGggaXQgaXMgdXNlIGl0CisgKiBpbiBwcmVwcm9jZXNzb3IgY29tbWFuZHMgc3VjaCBhcyAiI2lmIChfX0JJTkQgPiAxOTkzMTEwNCkiLiAgZG8gbm90CisgKiBjb21wYXJlIGZvciBlcXVhbGl0eTsgcmF0aGVyLCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciByZXNvbHZlcgorICogaXMgbmV3IGVub3VnaCB0byBjb250YWluIGEgY2VydGFpbiBmZWF0dXJlLgorICovCisKKyNkZWZpbmUJX19CSU5ECQkxOTk0MDQxNwkvKiBpbnRlcmZhY2UgdmVyc2lvbiBzdGFtcCAqLworCisvKgorICogRGVmaW5lIGNvbnN0YW50cyBiYXNlZCBvbiByZmM4ODMKKyAqLworI2RlZmluZSBQQUNLRVRTWgk1MTIJCS8qIG1heGltdW0gcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgTUFYRE5BTUUJMjU2CQkvKiBtYXhpbXVtIGRvbWFpbiBuYW1lICovCisjZGVmaW5lIE1BWENETkFNRQkyNTUJCS8qIG1heGltdW0gY29tcHJlc3NlZCBkb21haW4gbmFtZSAqLworI2RlZmluZSBNQVhMQUJFTAk2MwkJLyogbWF4aW11bSBsZW5ndGggb2YgZG9tYWluIGxhYmVsICovCisjZGVmaW5lCUhGSVhFRFNaCTEyCQkvKiAjL2J5dGVzIG9mIGZpeGVkIGRhdGEgaW4gaGVhZGVyICovCisjZGVmaW5lIFFGSVhFRFNaCTQJCS8qICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiBxdWVyeSAqLworI2RlZmluZSBSUkZJWEVEU1oJMTAJCS8qICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiByIHJlY29yZCAqLworI2RlZmluZQlJTlQzMlNaCQk0CQkvKiBmb3Igc3lzdGVtcyB3aXRob3V0IDMyLWJpdCBpbnRzICovCisjZGVmaW5lCUlOVDE2U1oJCTIJCS8qIGZvciBzeXN0ZW1zIHdpdGhvdXQgMTYtYml0IGludHMgKi8KKyNkZWZpbmUJSU5BRERSU1oJNAkJLyogZm9yIHNpemVvZihzdHJ1Y3QgaW5hZGRyKSAhPSA0ICovCisKKy8qCisgKiBJbnRlcm5ldCBuYW1lc2VydmVyIHBvcnQgbnVtYmVyCisgKi8KKyNkZWZpbmUgTkFNRVNFUlZFUl9QT1JUCTUzCisKKy8qCisgKiBDdXJyZW50bHkgZGVmaW5lZCBvcGNvZGVzCisgKi8KKyNkZWZpbmUgUVVFUlkJCTB4MAkJLyogc3RhbmRhcmQgcXVlcnkgKi8KKyNkZWZpbmUgSVFVRVJZCQkweDEJCS8qIGludmVyc2UgcXVlcnkgKi8KKyNkZWZpbmUgU1RBVFVTCQkweDIJCS8qIG5hbWVzZXJ2ZXIgc3RhdHVzIHF1ZXJ5ICovCisvKiNkZWZpbmUgeHh4CQkweDMJCSovLyogMHgzIHJlc2VydmVkICovCisjZGVmaW5lCU5TX05PVElGWV9PUAkweDQJCS8qIG5vdGlmeSBzZWNvbmRhcnkgb2YgU09BIGNoYW5nZSAqLworI2lmZGVmIEFMTE9XX1VQREFURVMKKwkvKiBub24gc3RhbmRhcmQgLSBzdXBwb3J0cyBBTExPV19VUERBVEVTIHN0dWZmIGZyb20gTWlrZSBTY2h3YXJ0eiAqLworIyBkZWZpbmUgVVBEQVRFQQkweDkJCS8qIGFkZCByZXNvdXJjZSByZWNvcmQgKi8KKyMgZGVmaW5lIFVQREFURUQJMHhhCQkvKiBkZWxldGUgYSBzcGVjaWZpYyByZXNvdXJjZSByZWNvcmQgKi8KKyMgZGVmaW5lIFVQREFURURBCTB4YgkJLyogZGVsZXRlIGFsbCBuYW1lZCByZXNvdXJjZSByZWNvcmQgKi8KKyMgZGVmaW5lIFVQREFURU0JMHhjCQkvKiBtb2RpZnkgYSBzcGVjaWZpYyByZXNvdXJjZSByZWNvcmQgKi8KKyMgZGVmaW5lIFVQREFURU1BCTB4ZAkJLyogbW9kaWZ5IGFsbCBuYW1lZCByZXNvdXJjZSByZWNvcmQgKi8KKyMgZGVmaW5lIFpPTkVJTklUCTB4ZQkJLyogaW5pdGlhbCB6b25lIHRyYW5zZmVyICovCisjIGRlZmluZSBaT05FUkVGCTB4ZgkJLyogaW5jcmVtZW50YWwgem9uZSByZWZlcmVzaCAqLworI2VuZGlmCisKKy8qCisgKiBDdXJyZW50bHkgZGVmaW5lZCByZXNwb25zZSBjb2RlcworICovCisjaWZkZWYgSEFWRV9BRERSSU5GTworI2RlZmluZSBOT0VSUk9SCQkwCQkvKiBubyBlcnJvciAqLworI2VuZGlmIC8qIEhBVkVfQUREUklORk8gKi8KKyNkZWZpbmUgRk9STUVSUgkJMQkJLyogZm9ybWF0IGVycm9yICovCisjZGVmaW5lIFNFUlZGQUlMCTIJCS8qIHNlcnZlciBmYWlsdXJlICovCisjZGVmaW5lIE5YRE9NQUlOCTMJCS8qIG5vbiBleGlzdGVudCBkb21haW4gKi8KKyNkZWZpbmUgTk9USU1QCQk0CQkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUkVGVVNFRAkJNQkJLyogcXVlcnkgcmVmdXNlZCAqLworI2lmZGVmIEFMTE9XX1VQREFURVMKKwkvKiBub24gc3RhbmRhcmQgKi8KKyMgZGVmaW5lIE5PQ0hBTkdFCTB4ZgkJLyogdXBkYXRlIGZhaWxlZCB0byBjaGFuZ2UgZGIgKi8KKyNlbmRpZgorCisvKgorICogVHlwZSB2YWx1ZXMgZm9yIHJlc291cmNlcyBhbmQgcXVlcmllcworICovCisjZGVmaW5lIFRfQQkJMQkJLyogaG9zdCBhZGRyZXNzICovCisjZGVmaW5lIFRfTlMJCTIJCS8qIGF1dGhvcml0YXRpdmUgc2VydmVyICovCisjZGVmaW5lIFRfTUQJCTMJCS8qIG1haWwgZGVzdGluYXRpb24gKi8KKyNkZWZpbmUgVF9NRgkJNAkJLyogbWFpbCBmb3J3YXJkZXIgKi8KKyNkZWZpbmUgVF9DTkFNRQkJNQkJLyogY2Fub25pY2FsIG5hbWUgKi8KKyNkZWZpbmUgVF9TT0EJCTYJCS8qIHN0YXJ0IG9mIGF1dGhvcml0eSB6b25lICovCisjZGVmaW5lIFRfTUIJCTcJCS8qIG1haWxib3ggZG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgVF9NRwkJOAkJLyogbWFpbCBncm91cCBtZW1iZXIgKi8KKyNkZWZpbmUgVF9NUgkJOQkJLyogbWFpbCByZW5hbWUgbmFtZSAqLworI2RlZmluZSBUX05VTEwJCTEwCQkvKiBudWxsIHJlc291cmNlIHJlY29yZCAqLworI2RlZmluZSBUX1dLUwkJMTEJCS8qIHdlbGwga25vd24gc2VydmljZSAqLworI2RlZmluZSBUX1BUUgkJMTIJCS8qIGRvbWFpbiBuYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgVF9ISU5GTwkJMTMJCS8qIGhvc3QgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVF9NSU5GTwkJMTQJCS8qIG1haWxib3ggaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVF9NWAkJMTUJCS8qIG1haWwgcm91dGluZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX1RYVAkJMTYJCS8qIHRleHQgc3RyaW5ncyAqLworI2RlZmluZQlUX1JQCQkxNwkJLyogcmVzcG9uc2libGUgcGVyc29uICovCisjZGVmaW5lIFRfQUZTREIJCTE4CQkvKiBBRlMgY2VsbCBkYXRhYmFzZSAqLworI2RlZmluZSBUX1gyNQkJMTkJCS8qIFhfMjUgY2FsbGluZyBhZGRyZXNzICovCisjZGVmaW5lIFRfSVNETgkJMjAJCS8qIElTRE4gY2FsbGluZyBhZGRyZXNzICovCisjZGVmaW5lIFRfUlQJCTIxCQkvKiByb3V0ZXIgKi8KKyNkZWZpbmUgVF9OU0FQCQkyMgkJLyogTlNBUCBhZGRyZXNzICovCisjZGVmaW5lIFRfTlNBUF9QVFIJMjMJCS8qIHJldmVyc2UgTlNBUCBsb29rdXAgKGRlcHJlY2F0ZWQpICovCisjZGVmaW5lCVRfU0lHCQkyNAkJLyogc2VjdXJpdHkgc2lnbmF0dXJlICovCisjZGVmaW5lCVRfS0VZCQkyNQkJLyogc2VjdXJpdHkga2V5ICovCisjZGVmaW5lCVRfUFgJCTI2CQkvKiBYLjQwMCBtYWlsIG1hcHBpbmcgKi8KKyNkZWZpbmUJVF9HUE9TCQkyNwkJLyogZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uICh3aXRoZHJhd24pICovCisjZGVmaW5lCVRfQUFBQQkJMjgJCS8qIElQNiBBZGRyZXNzICovCisjZGVmaW5lCVRfTE9DCQkyOQkJLyogTG9jYXRpb24gSW5mb3JtYXRpb24gKi8KKwkvKiBub24gc3RhbmRhcmQgKi8KKyNkZWZpbmUgVF9VSU5GTwkJMTAwCQkvKiB1c2VyIChmaW5nZXIpIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFRfVUlECQkxMDEJCS8qIHVzZXIgSUQgKi8KKyNkZWZpbmUgVF9HSUQJCTEwMgkJLyogZ3JvdXAgSUQgKi8KKyNkZWZpbmUgVF9VTlNQRUMJMTAzCQkvKiBVbnNwZWNpZmllZCBmb3JtYXQgKGJpbmFyeSBkYXRhKSAqLworCS8qIFF1ZXJ5IHR5cGUgdmFsdWVzIHdoaWNoIGRvIG5vdCBhcHBlYXIgaW4gcmVzb3VyY2UgcmVjb3JkcyAqLworI2RlZmluZSBUX0FYRlIJCTI1MgkJLyogdHJhbnNmZXIgem9uZSBvZiBhdXRob3JpdHkgKi8KKyNkZWZpbmUgVF9NQUlMQgkJMjUzCQkvKiB0cmFuc2ZlciBtYWlsYm94IHJlY29yZHMgKi8KKyNkZWZpbmUgVF9NQUlMQQkJMjU0CQkvKiB0cmFuc2ZlciBtYWlsIGFnZW50IHJlY29yZHMgKi8KKyNkZWZpbmUgVF9BTlkJCTI1NQkJLyogd2lsZGNhcmQgbWF0Y2ggKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgY2xhc3MgZmllbGQKKyAqLworCisjZGVmaW5lIENfSU4JCTEJCS8qIHRoZSBhcnBhIGludGVybmV0ICovCisjZGVmaW5lIENfQ0hBT1MJCTMJCS8qIGZvciBjaGFvcyBuZXQgKE1JVCkgKi8KKyNkZWZpbmUgQ19IUwkJNAkJLyogZm9yIEhlc2lvZCBuYW1lIHNlcnZlciAoTUlUKSAoWFhYKSAqLworCS8qIFF1ZXJ5IGNsYXNzIHZhbHVlcyB3aGljaCBkbyBub3QgYXBwZWFyIGluIHJlc291cmNlIHJlY29yZHMgKi8KKyNkZWZpbmUgQ19BTlkJCTI1NQkJLyogd2lsZGNhcmQgbWF0Y2ggKi8KKworLyoKKyAqIFN0YXR1cyByZXR1cm4gY29kZXMgZm9yIFRfVU5TUEVDIGNvbnZlcnNpb24gcm91dGluZXMKKyAqLworI2RlZmluZSBDT05WX1NVQ0NFU1MJMAorI2RlZmluZSBDT05WX09WRVJGTE9XCSgtMSkKKyNkZWZpbmUgQ09OVl9CQURGTVQJKC0yKQorI2RlZmluZSBDT05WX0JBRENLU1VNCSgtMykKKyNkZWZpbmUgQ09OVl9CQURCVUZMRU4JKC00KQorCisjaWZuZGVmIF9fQllURV9PUkRFUgorI2lmIChCU0QgPj0gMTk5MTAzKQorIyBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorI2Vsc2UKKyNpZmRlZiBsaW51eAorIyBpbmNsdWRlIDxlbmRpYW4uaD4KKyNlbHNlCisjZGVmaW5lCV9fTElUVExFX0VORElBTgkxMjM0CS8qIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKHZheCwgcGMpICovCisjZGVmaW5lCV9fQklHX0VORElBTgk0MzIxCS8qIG1vc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoSUJNLCBuZXQpICovCisjZGVmaW5lCV9fUERQX0VORElBTgkzNDEyCS8qIExTQiBmaXJzdCBpbiB3b3JkLCBNU1cgZmlyc3QgaW4gbG9uZyAocGRwKSovCisKKyNpZiBkZWZpbmVkKHZheCkgfHwgZGVmaW5lZChuczMyMDAwKSB8fCBkZWZpbmVkKHN1bjM4NikgfHwgZGVmaW5lZChpMzg2KSB8fCBcCisgICAgZGVmaW5lZChNSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChCSVRfWkVST19PTl9SSUdIVCkgfHwgXAorICAgIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fYWxwaGEpCisjZGVmaW5lIF9fQllURV9PUkRFUglfX0xJVFRMRV9FTkRJQU4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChzZWwpIHx8IGRlZmluZWQocHlyKSB8fCBkZWZpbmVkKG1jNjgwMDApIHx8IGRlZmluZWQoc3BhcmMpIHx8IFwKKyAgICBkZWZpbmVkKGlzNjhrKSB8fCBkZWZpbmVkKHRhaG9lKSB8fCBkZWZpbmVkKGlibTAzMikgfHwgZGVmaW5lZChpYm0zNzApIHx8IFwKKyAgICBkZWZpbmVkKE1JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKF9JQk1SMikgfHwgZGVmaW5lZChER1VYKSB8fFwKKyAgICBkZWZpbmVkKGFwb2xsbykgfHwgZGVmaW5lZChfX2NvbnZleF9fKSB8fCBkZWZpbmVkKF9DUkFZKSB8fCBcCisgICAgZGVmaW5lZChfX2hwcGEpIHx8IGRlZmluZWQoX19ocDkwMDApIHx8IFwKKyAgICBkZWZpbmVkKF9faHA5MDAwczMwMCkgfHwgZGVmaW5lZChfX2hwOTAwMHM3MDApIHx8IFwKKyAgICBkZWZpbmVkIChCSVRfWkVST19PTl9MRUZUKSB8fCBkZWZpbmVkKG02OGspCisjZGVmaW5lIF9fQllURV9PUkRFUglfX0JJR19FTkRJQU4KKyNlbmRpZgorI2VuZGlmIC8qIGxpbnV4ICovCisjZW5kaWYgLyogQlNEICovCisjZW5kaWYgLyogX19CWVRFX09SREVSICovCisKKyNpZiAhZGVmaW5lZChfX0JZVEVfT1JERVIpIHx8IFwKKyAgICAoX19CWVRFX09SREVSICE9IF9fQklHX0VORElBTiAmJiBfX0JZVEVfT1JERVIgIT0gX19MSVRUTEVfRU5ESUFOICYmIFwKKyAgICBfX0JZVEVfT1JERVIgIT0gX19QRFBfRU5ESUFOKQorCS8qIHlvdSBtdXN0IGRldGVybWluZSB3aGF0IHRoZSBjb3JyZWN0IGJpdCBvcmRlciBpcyBmb3IKKwkgKiB5b3VyIGNvbXBpbGVyIC0gdGhlIG5leHQgbGluZSBpcyBhbiBpbnRlbnRpb25hbCBlcnJvcgorCSAqIHdoaWNoIHdpbGwgZm9yY2UgeW91ciBjb21waWxlcyB0byBib21iIHVudGlsIHlvdSBmaXgKKwkgKiB0aGUgYWJvdmUgbWFjcm9zLgorCSAqLworICBlcnJvciAiVW5kZWZpbmVkIG9yIGludmFsaWQgX19CWVRFX09SREVSIjsKKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIGZvciBxdWVyeSBoZWFkZXIuICBUaGUgb3JkZXIgb2YgdGhlIGZpZWxkcyBpcyBtYWNoaW5lLSBhbmQKKyAqIGNvbXBpbGVyLWRlcGVuZGVudCwgZGVwZW5kaW5nIG9uIHRoZSBieXRlL2JpdCBvcmRlciBhbmQgdGhlIGxheW91dAorICogb2YgYml0IGZpZWxkcy4gIFdlIHVzZSBiaXQgZmllbGRzIG9ubHkgaW4gaW50IHZhcmlhYmxlcywgYXMgdGhpcworICogaXMgYWxsIEFOU0kgcmVxdWlyZXMuICBUaGlzIHJlcXVpcmVzIGEgc29tZXdoYXQgY29uZnVzaW5nIHJlYXJyYW5nZW1lbnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCWlkIDoxNjsJCS8qIHF1ZXJ5IGlkZW50aWZpY2F0aW9uIG51bWJlciAqLworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwkJCS8qIGZpZWxkcyBpbiB0aGlyZCBieXRlICovCisJdW5zaWduZWQJcXI6IDE7CQkvKiByZXNwb25zZSBmbGFnICovCisJdW5zaWduZWQJb3Bjb2RlOiA0OwkvKiBwdXJwb3NlIG9mIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlhYTogMTsJCS8qIGF1dGhvcml0aXZlIGFuc3dlciAqLworCXVuc2lnbmVkCXRjOiAxOwkJLyogdHJ1bmNhdGVkIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlyZDogMTsJCS8qIHJlY3Vyc2lvbiBkZXNpcmVkICovCisJCQkvKiBmaWVsZHMgaW4gZm91cnRoIGJ5dGUgKi8KKwl1bnNpZ25lZAlyYTogMTsJCS8qIHJlY3Vyc2lvbiBhdmFpbGFibGUgKi8KKwl1bnNpZ25lZAlwcjogMTsJCS8qIHByaW1hcnkgc2VydmVyIHJlcSdkICghc3RhbmRhcmQpICovCisJdW5zaWduZWQJdW51c2VkIDoyOwkvKiB1bnVzZWQgYml0cyAoTUJaIGFzIG9mIDQuOS4zYTMpICovCisJdW5zaWduZWQJcmNvZGUgOjQ7CS8qIHJlc3BvbnNlIGNvZGUgKi8KKyNlbmRpZgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gfHwgX19CWVRFX09SREVSID09IF9fUERQX0VORElBTgorCQkJLyogZmllbGRzIGluIHRoaXJkIGJ5dGUgKi8KKwl1bnNpZ25lZAlyZCA6MTsJCS8qIHJlY3Vyc2lvbiBkZXNpcmVkICovCisJdW5zaWduZWQJdGMgOjE7CQkvKiB0cnVuY2F0ZWQgbWVzc2FnZSAqLworCXVuc2lnbmVkCWFhIDoxOwkJLyogYXV0aG9yaXRpdmUgYW5zd2VyICovCisJdW5zaWduZWQJb3Bjb2RlIDo0OwkvKiBwdXJwb3NlIG9mIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlxciA6MTsJCS8qIHJlc3BvbnNlIGZsYWcgKi8KKwkJCS8qIGZpZWxkcyBpbiBmb3VydGggYnl0ZSAqLworCXVuc2lnbmVkCXJjb2RlIDo0OwkvKiByZXNwb25zZSBjb2RlICovCisJdW5zaWduZWQJdW51c2VkIDoyOwkvKiB1bnVzZWQgYml0cyAoTUJaIGFzIG9mIDQuOS4zYTMpICovCisJdW5zaWduZWQJcHIgOjE7CQkvKiBwcmltYXJ5IHNlcnZlciByZXEnZCAoIXN0YW5kYXJkKSAqLworCXVuc2lnbmVkCXJhIDoxOwkJLyogcmVjdXJzaW9uIGF2YWlsYWJsZSAqLworI2VuZGlmCisJCQkvKiByZW1haW5pbmcgYnl0ZXMgKi8KKwl1bnNpZ25lZAlxZGNvdW50IDoxNjsJLyogbnVtYmVyIG9mIHF1ZXN0aW9uIGVudHJpZXMgKi8KKwl1bnNpZ25lZAlhbmNvdW50IDoxNjsJLyogbnVtYmVyIG9mIGFuc3dlciBlbnRyaWVzICovCisJdW5zaWduZWQJbnNjb3VudCA6MTY7CS8qIG51bWJlciBvZiBhdXRob3JpdHkgZW50cmllcyAqLworCXVuc2lnbmVkCWFyY291bnQgOjE2OwkvKiBudW1iZXIgb2YgcmVzb3VyY2UgZW50cmllcyAqLworfSBIRUFERVI7CisKKy8qCisgKiBEZWZpbmVzIGZvciBoYW5kbGluZyBjb21wcmVzc2VkIGRvbWFpbiBuYW1lcworICovCisjZGVmaW5lIElORElSX01BU0sJMHhjMAorCisvKgorICogU3RydWN0dXJlIGZvciBwYXNzaW5nIHJlc291cmNlIHJlY29yZHMgYXJvdW5kLgorICovCitzdHJ1Y3QgcnJlYyB7CisJaW50MTZfdAkJcl96b25lOwkJCS8qIHpvbmUgbnVtYmVyICovCisJaW50MTZfdAkJcl9jbGFzczsJCS8qIGNsYXNzIG51bWJlciAqLworCWludDE2X3QJCXJfdHlwZTsJCQkvKiB0eXBlIG51bWJlciAqLworCXVfaW50MzJfdAlyX3R0bDsJCQkvKiB0aW1lIHRvIGxpdmUgKi8KKwlpbnQJCXJfc2l6ZTsJCQkvKiBzaXplIG9mIGRhdGEgYXJlYSAqLworCWNoYXIJCSpyX2RhdGE7CQkvKiBwb2ludGVyIHRvIGRhdGEgKi8KK307CisKKy8vZXh0ZXJuCXVfaW50MTZfdAlfZ2V0c2hvcnQgX19QKChjb25zdCB1X2NoYXIgKikpOworLy9leHRlcm4JdV9pbnQzMl90CV9nZXRsb25nIF9fUCgoY29uc3QgdV9jaGFyICopKTsKKworLyoKKyAqIElubGluZSB2ZXJzaW9ucyBvZiBnZXQvcHV0IHNob3J0L2xvbmcuICBQb2ludGVyIGlzIGFkdmFuY2VkLgorICoKKyAqIFRoZXNlIG1hY3JvcyBkZW1vbnN0cmF0ZSB0aGUgcHJvcGVydHkgb2YgQyB3aGVyZWJ5IGl0IGNhbiBiZQorICogcG9ydGFibGUgb3IgaXQgY2FuIGJlIGVsZWdhbnQgYnV0IHJhcmVseSBib3RoLgorICovCisjZGVmaW5lIEdFVFNIT1JUKHMsIGNwKSB7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCShzKSA9ICgodV9pbnQxNl90KXRfY3BbMF0gPDwgOCkgXAorCSAgICB8ICgodV9pbnQxNl90KXRfY3BbMV0pIFwKKwkgICAgOyBcCisJKGNwKSArPSBJTlQxNlNaOyBcCit9CisKKyNkZWZpbmUgR0VUTE9ORyhsLCBjcCkgeyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkobCkgPSAoKHVfaW50MzJfdCl0X2NwWzBdIDw8IDI0KSBcCisJICAgIHwgKCh1X2ludDMyX3QpdF9jcFsxXSA8PCAxNikgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbMl0gPDwgOCkgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbM10pIFwKKwkgICAgOyBcCisJKGNwKSArPSBJTlQzMlNaOyBcCit9CisKKyNkZWZpbmUgUFVUU0hPUlQocywgY3ApIHsgXAorCXJlZ2lzdGVyIHVfaW50MTZfdCB0X3MgPSAodV9pbnQxNl90KShzKTsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKnRfY3ArKyA9IHRfcyA+PiA4OyBcCisJKnRfY3AgICA9IHRfczsgXAorCShjcCkgKz0gSU5UMTZTWjsgXAorfQorCisjZGVmaW5lIFBVVExPTkcobCwgY3ApIHsgXAorCXJlZ2lzdGVyIHVfaW50MzJfdCB0X2wgPSAodV9pbnQzMl90KShsKTsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKnRfY3ArKyA9IHRfbCA+PiAyNDsgXAorCSp0X2NwKysgPSB0X2wgPj4gMTY7IFwKKwkqdF9jcCsrID0gdF9sID4+IDg7IFwKKwkqdF9jcCAgID0gdF9sOyBcCisJKGNwKSArPSBJTlQzMlNaOyBcCit9CisKKyNlbmRpZiAvKiAhX05BTUVTRVJfSF8gKi8KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvYml0dHlwZXMuaCBiL1dpbjMyL0luY2x1ZGUvYml0dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBjYmRlCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvSW5jbHVkZS9iaXR0eXBlcy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfQklUVFlQRVNfSAorI2RlZmluZSBfQklUVFlQRVNfSAorCisjaWZuZGVmIEhBVkVfVV9JTlQ4X1QKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1X2ludDhfdDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgaW50OF90OworI2VuZGlmIC8qIEhBVkVfVV9JTlQ4X1QgKi8KKworI2lmbmRlZiBIQVZFX1VfSU5UMTZfVCAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9pbnQxNl90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50MTZfdDsKKyNlbmRpZiAvKiBIQVZFX1VfSU5UMTZfVCAqLworCisjaWZuZGVmIEhBVkVfVV9JTlQzMl9UCit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDMyX3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKKyNlbmRpZiAvKiBIQVZFX1VfSU5UMzJfVCAqLworCisjaWZuZGVmIEhBVkVfVV9JTlQ2NF9UCisjaWZkZWYgX01TQ19FWFRFTlNJT05TCit0eXBlZGVmIHVuc2lnbmVkIF9pbnQ2NCB1X2ludDY0X3Q7Cit0eXBlZGVmIF9pbnQ2NCBpbnQ2NF90OworI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1X2ludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OworI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2VuZGlmIC8qIEhBVkVfVV9JTlQ2NF9UICovCisKKyNpZm5kZWYgUFJJZDY0CisjaWZkZWYgX01TQ19FWFRFTlNJT05TCisjZGVmaW5lIFBSSWQ2NAkiSTY0ZCIKKyNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2RlZmluZSBQUklkNjQJImxsZCIKKyNlbmRpZiAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNlbmRpZiAvKiBQUklkNjQgKi8KKworI2lmbmRlZiBQUklvNjQKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyNkZWZpbmUgUFJJbzY0CSJJNjRvIgorI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCisjZGVmaW5lIFBSSW82NAkibGxvIgorI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2VuZGlmIC8qIFBSSW82NCAqLworCisjaWZuZGVmIFBSSXg2NAorI2lmZGVmIF9NU0NfRVhURU5TSU9OUworI2RlZmluZSBQUkl4NjQJIkk2NHgiCisjZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNkZWZpbmUgUFJJeDY0CSJsbHgiCisjZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCisjZW5kaWYgLyogUFJJeDY0ICovCisKKyNpZm5kZWYgUFJJdTY0CisjaWZkZWYgX01TQ19FWFRFTlNJT05TCisjZGVmaW5lIFBSSXU2NAkiSTY0dSIKKyNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2RlZmluZSBQUkl1NjQJImxsdSIKKyNlbmRpZiAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNlbmRpZiAvKiBQUkl1NjQgKi8KKworI2VuZGlmIC8qIF9CSVRUWVBFU19IICovCmRpZmYgLS1naXQgYS9XaW4zMi9JbmNsdWRlL2NkZWNsX2V4dC5oIGIvV2luMzIvSW5jbHVkZS9jZGVjbF9leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkxZGIyCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvSW5jbHVkZS9jZGVjbF9leHQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lCV9fUChwcm90b3MpCXByb3RvcwkJLyogZnVsbC1ibG93biBBTlNJIEMgKi8KKyNlbHNlCisjZGVmaW5lCV9fUChwcm90b3MpCSgpCQkvKiB0cmFkaXRpb25hbCBDIHByZXByb2Nlc3NvciAqLworI2VuZGlmCisKKyNlbmRpZiAvKiAhSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUgKi8KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvaW5ldHByaXZhdGUuaCBiL1dpbjMyL0luY2x1ZGUvaW5ldHByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVlZDNkCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvSW5jbHVkZS9pbmV0cHJpdmF0ZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgLSAyMDAzCisgKiBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUG9saXRlY25pY28gZGkgVG9yaW5vIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisKK2V4dGVybiB2b2lkIF9zZXRodGVudChpbnQgZik7CitleHRlcm4gdm9pZCBfZW5kaHRlbnQodm9pZCk7CitleHRlcm4gc3RydWN0IGhvc3RlbnQgKl9nZXRodGVudCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqX2dldGh0YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpfZ2V0aHRieWFkZHIoY29uc3QgY2hhciAqYWRkciwgaW50IGxlbiwKKwkJIGludCB0eXBlKTsKK2V4dGVybiBpbnQgX3ZhbGlkdXNlcihGSUxFICpob3N0ZiwgY29uc3QgY2hhciAqcmhvc3QsCisJCSBjb25zdCBjaGFyICpsdXNlciwgY29uc3QgY2hhciAqcnVzZXIsIGludCBiYXNlbGVuKTsKK2V4dGVybiBpbnQgX2NoZWNraG9zdChjb25zdCBjaGFyICpyaG9zdCwgY29uc3QgY2hhciAqbGhvc3QsIGludCBsZW4pOworI2lmIDAKK2V4dGVybiB2b2lkIHB1dGxvbmcodV9sb25nIGwsIHVfY2hhciAqbXNncCk7CitleHRlcm4gdm9pZCBwdXRzaG9ydCh1X3Nob3J0IGwsIHVfY2hhciAqbXNncCk7CitleHRlcm4gdV9pbnQzMl90IF9nZXRsb25nKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqbXNncCk7CitleHRlcm4gdV9pbnQxNl90IF9nZXRzaG9ydChyZWdpc3RlciBjb25zdCB1X2NoYXIgKm1zZ3ApOworZXh0ZXJuIHZvaWQgcF9xdWVyeShjaGFyICptc2cpOworZXh0ZXJuIHZvaWQgZnBfcXVlcnkoY2hhciAqbXNnLCBGSUxFICpmaWxlKTsKK2V4dGVybiBjaGFyICpwX2NkbmFtZShjaGFyICpjcCwgY2hhciAqbXNnLCBGSUxFICpmaWxlKTsKK2V4dGVybiBjaGFyICpwX3JyKGNoYXIgKmNwLCBjaGFyICptc2csIEZJTEUgKmZpbGUpOworZXh0ZXJuIGNoYXIgKnBfdHlwZShpbnQgdHlwZSk7CitleHRlcm4gY2hhciAqIHBfY2xhc3MoaW50IGNsYXNzKTsKK2V4dGVybiBjaGFyICpwX3RpbWUodV9sb25nIHZhbHVlKTsKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKiBob3N0YWxpYXMoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBzZXRob3N0ZmlsZShjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIF9yZXNfY2xvc2UgKHZvaWQpOworZXh0ZXJuIHZvaWQgcnVzZXJwYXNzKGNvbnN0IGNoYXIgKmhvc3QsIGNoYXIgKiphbmFtZSwgY2hhciAqKmFwYXNzKTsKZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvaXA2X21pc2MuaCBiL1dpbjMyL0luY2x1ZGUvaXA2X21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJmYTYxCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvSW5jbHVkZS9pcDZfbWlzYy5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9XaW4zMi9JbmNsdWRlL2lwNl9taXNjLmgsdiAxLjUgMjAwNi0wMS0yMiAxODowMjoxOCBnaWFubHVjYSBFeHAgJCAoTEJMKQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb2xsYWdlIG9mIGRlY2xhcmF0aW9ucyBmb3IgSVB2NiBmcm9tIEZyZWVCU0Qgbm90IHByZXNlbnQgaW4gV2luZG93cworICovCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKworI2lmbmRlZiBfX01JTkdXMzJfXworI2RlZmluZQlJTl9NVUxUSUNBU1QoYSkJCUlOX0NMQVNTRChhKQorI2VuZGlmCisKKyNkZWZpbmUJSU5fRVhQRVJJTUVOVEFMKGEpCSgoKCh1X2ludDMyX3QpIChhKSkgJiAweGYwMDAwMDAwKSA9PSAweGYwMDAwMDAwKQorCisjZGVmaW5lCUlOX0xPT1BCQUNLTkVUCQkxMjcKKworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoREVGSU5FX0FERElUSU9OQUxfSVBWNl9TVFVGRikKKy8qIElQdjYgYWRkcmVzcyAqLworc3RydWN0IGluNl9hZGRyCisgIHsKKyAgICB1bmlvbgorICAgICAgeworCXVfaW50OF90CQl1Nl9hZGRyOFsxNl07CisJdV9pbnQxNl90CXU2X2FkZHIxNls4XTsKKwl1X2ludDMyX3QJdTZfYWRkcjMyWzRdOworICAgICAgfSBpbjZfdTsKKyNkZWZpbmUgczZfYWRkcgkJCWluNl91LnU2X2FkZHI4CisjZGVmaW5lIHM2X2FkZHIxNgkJaW42X3UudTZfYWRkcjE2CisjZGVmaW5lIHM2X2FkZHIzMgkJaW42X3UudTZfYWRkcjMyCisjZGVmaW5lIHM2X2FkZHI2NAkJaW42X3UudTZfYWRkcjY0CisgIH07CisKKyNkZWZpbmUgSU42QUREUl9BTllfSU5JVCB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQorI2RlZmluZSBJTjZBRERSX0xPT1BCQUNLX0lOSVQgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxIH0KKyNlbmRpZiAvKiBfX01JTkdXMzJfXyAqLworCisKKyNpZiAoZGVmaW5lZCBfTVNDX1ZFUikgfHwgKGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoREVGSU5FX0FERElUSU9OQUxfSVBWNl9TVFVGRikpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CXNhX2ZhbWlseV90OworI2VuZGlmCisKKworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoREVGSU5FX0FERElUSU9OQUxfSVBWNl9TVFVGRikKKworI2RlZmluZQlfX1NPQ0tBRERSX0NPTU1PTihzYV9wcmVmaXgpIFwKKyAgc2FfZmFtaWx5X3Qgc2FfcHJlZml4IyNmYW1pbHkKKworLyogRGl0dG8sIGZvciBJUHY2LiAgKi8KK3N0cnVjdCBzb2NrYWRkcl9pbjYKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzaW42Xyk7CisgICAgdV9pbnQxNl90IHNpbjZfcG9ydDsJCS8qIFRyYW5zcG9ydCBsYXllciBwb3J0ICMgKi8KKyAgICB1X2ludDMyX3Qgc2luNl9mbG93aW5mbzsJLyogSVB2NiBmbG93IGluZm9ybWF0aW9uICovCisgICAgc3RydWN0IGluNl9hZGRyIHNpbjZfYWRkcjsJLyogSVB2NiBhZGRyZXNzICovCisgIH07CisKKyNkZWZpbmUgSU42X0lTX0FERFJfVjRNQVBQRUQoYSkgXAorCSgoKCh1X2ludDMyX3QgKikgKGEpKVswXSA9PSAwKSAmJiAoKCh1X2ludDMyX3QgKikgKGEpKVsxXSA9PSAwKSAmJiBcCisJICgoKHVfaW50MzJfdCAqKSAoYSkpWzJdID09IGh0b25sICgweGZmZmYpKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkgKCgodV9pbnQ4X3QgKikgKGEpKVswXSA9PSAweGZmKQorCisjZGVmaW5lIElONl9JU19BRERSX0xJTktMT0NBTChhKSBcCisJKCgoKHVfaW50MzJfdCAqKSAoYSkpWzBdICYgaHRvbmwgKDB4ZmZjMDAwMDApKSA9PSBodG9ubCAoMHhmZTgwMDAwMCkpCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTE9PUEJBQ0soYSkgXAorCSgoKHVfaW50MzJfdCAqKSAoYSkpWzBdID09IDAgJiYgKCh1X2ludDMyX3QgKikgKGEpKVsxXSA9PSAwICYmIFwKKwkgKCh1X2ludDMyX3QgKikgKGEpKVsyXSA9PSAwICYmICgodV9pbnQzMl90ICopIChhKSlbM10gPT0gaHRvbmwgKDEpKQorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCisKKyNkZWZpbmUgaXA2X3ZmYyAgIGlwNl9jdGx1bi5pcDZfdW4yX3ZmYworI2RlZmluZSBpcDZfZmxvdyAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9mbG93CisjZGVmaW5lIGlwNl9wbGVuICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX3BsZW4KKyNkZWZpbmUgaXA2X254dCAgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfbnh0CisjZGVmaW5lIGlwNl9obGltICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2hsaW0KKyNkZWZpbmUgaXA2X2hvcHMgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfaGxpbQorCisjZGVmaW5lIG5kX3JkX3R5cGUgICAgICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9yZF9jb2RlICAgICAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfcmRfY2tzdW0gICAgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9yZF9yZXNlcnZlZCAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2RhdGEzMlswXQorCisvKgorICoJSVBWNiBleHRlbnNpb24gaGVhZGVycworICovCisjZGVmaW5lIElQUFJPVE9fSE9QT1BUUwkJMAkvKiBJUHY2IGhvcC1ieS1ob3Agb3B0aW9ucwkqLworI2RlZmluZSBJUFBST1RPX0lQVjYJCTQxICAvKiBJUHY2IGhlYWRlci4gICovCisjZGVmaW5lIElQUFJPVE9fUk9VVElORwkJNDMJLyogSVB2NiByb3V0aW5nIGhlYWRlcgkJKi8KKyNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAk0NAkvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyCSovCisjZGVmaW5lIElQUFJPVE9fRVNQCQk1MAkvKiBlbmNhcHN1bGF0aW5nIHNlY3VyaXR5IHBheWxvYWQgKi8KKyNkZWZpbmUgSVBQUk9UT19BSAkJNTEJLyogYXV0aGVudGljYXRpb24gaGVhZGVyCSovCisjZGVmaW5lIElQUFJPVE9fSUNNUFY2CQk1OAkvKiBJQ01QdjYJCQkqLworI2RlZmluZSBJUFBST1RPX05PTkUJCTU5CS8qIElQdjYgbm8gbmV4dCBoZWFkZXIJCSovCisjZGVmaW5lIElQUFJPVE9fRFNUT1BUUwkJNjAJLyogSVB2NiBkZXN0aW5hdGlvbiBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fUElNCQkJMTAzIC8qIFByb3RvY29sIEluZGVwZW5kZW50IE11bHRpY2FzdC4gICovCisKKyNkZWZpbmUJIElQVjZfUlRIRFJfVFlQRV8wIDAKKworLyogT3B0aW9uIHR5cGVzIGFuZCByZWxhdGVkIG1hY3JvcyAqLworI2RlZmluZSBJUDZPUFRfUEFEMQkJMHgwMAkvKiAwMCAwIDAwMDAwICovCisjZGVmaW5lIElQNk9QVF9QQUROCQkweDAxCS8qIDAwIDAgMDAwMDEgKi8KKyNkZWZpbmUgSVA2T1BUX0pVTUJPCQkweEMyCS8qIDExIDAgMDAwMTAgPSAxOTQgKi8KKyNkZWZpbmUgSVA2T1BUX0pVTUJPX0xFTgk2CisjZGVmaW5lIElQNk9QVF9ST1VURVJfQUxFUlQJMHgwNQkvKiAwMCAwIDAwMTAxICovCisKKyNkZWZpbmUgSVA2T1BUX1JUQUxFUlRfTEVOCTQKKyNkZWZpbmUgSVA2T1BUX1JUQUxFUlRfTUxECTAJLyogRGF0YWdyYW0gY29udGFpbnMgYW4gTUxEIG1lc3NhZ2UgKi8KKyNkZWZpbmUgSVA2T1BUX1JUQUxFUlRfUlNWUAkxCS8qIERhdGFncmFtIGNvbnRhaW5zIGFuIFJTVlAgbWVzc2FnZSAqLworI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9BQ1RORVQJMiAJLyogY29udGFpbnMgYW4gQWN0aXZlIE5ldHdvcmtzIG1zZyAqLworI2RlZmluZSBJUDZPUFRfTUlOTEVOCQkyCisKKyNkZWZpbmUgSVA2T1BUX0JJTkRJTkdfVVBEQVRFCTB4YzYJLyogMTEgMCAwMDExMCAqLworI2RlZmluZSBJUDZPUFRfQklORElOR19BQ0sJMHgwNwkvKiAwMCAwIDAwMTExICovCisjZGVmaW5lIElQNk9QVF9CSU5ESU5HX1JFUQkweDA4CS8qIDAwIDAgMDEwMDAgKi8KKyNkZWZpbmUgSVA2T1BUX0hPTUVfQUREUkVTUwkweGM5CS8qIDExIDAgMDEwMDEgKi8KKyNkZWZpbmUgSVA2T1BUX0VJRAkJMHg4YQkvKiAxMCAwIDAxMDEwICovCisKKyNkZWZpbmUgSVA2T1BUX1RZUEUobykJCSgobykgJiAweEMwKQorI2RlZmluZSBJUDZPUFRfVFlQRV9TS0lQCTB4MDAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfRElTQ0FSRAkweDQwCisjZGVmaW5lIElQNk9QVF9UWVBFX0ZPUkNFSUNNUAkweDgwCisjZGVmaW5lIElQNk9QVF9UWVBFX0lDTVAJMHhDMAorCisjZGVmaW5lIElQNk9QVF9NVVRBQkxFCQkweDIwCisKKworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoREVGSU5FX0FERElUSU9OQUxfSVBWNl9TVFVGRikKKyNpZm5kZWYgRUFJX0FERFJGQU1JTFkKK3N0cnVjdCBhZGRyaW5mbyB7CisJaW50CWFpX2ZsYWdzOwkvKiBBSV9QQVNTSVZFLCBBSV9DQU5PTk5BTUUgKi8KKwlpbnQJYWlfZmFtaWx5OwkvKiBQRl94eHggKi8KKwlpbnQJYWlfc29ja3R5cGU7CS8qIFNPQ0tfeHh4ICovCisJaW50CWFpX3Byb3RvY29sOwkvKiAwIG9yIElQUFJPVE9feHh4IGZvciBJUHY0IGFuZCBJUHY2ICovCisJc2l6ZV90CWFpX2FkZHJsZW47CS8qIGxlbmd0aCBvZiBhaV9hZGRyICovCisJY2hhcgkqYWlfY2Fub25uYW1lOwkvKiBjYW5vbmljYWwgbmFtZSBmb3IgaG9zdG5hbWUgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7CS8qIGJpbmFyeSBhZGRyZXNzICovCisJc3RydWN0IGFkZHJpbmZvICphaV9uZXh0OwkvKiBuZXh0IHN0cnVjdHVyZSBpbiBsaW5rZWQgbGlzdCAqLworfTsKKyNlbmRpZgorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCmRpZmYgLS1naXQgYS9XaW4zMi9JbmNsdWRlL25ldC9pZi5oIGIvV2luMzIvSW5jbHVkZS9uZXQvaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjkyNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvSW5jbHVkZS9uZXQvaWYuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaWYuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiAkRnJlZUJTRDogc3JjL3N5cy9uZXQvaWYuaCx2IDEuNDkuMi4xIDE5OTkvMDgvMjkgMTY6Mjg6MTUgcGV0ZXIgRXhwICQKKyAqLworCisjaWZuZGVmIF9ORVRfSUZfSF8KKyNkZWZpbmUJX05FVF9JRl9IXworIAorLyoKKyAqIDxuZXQvaWYuaD4gZG9lcyBub3QgZGVwZW5kIG9uIDxzeXMvdGltZS5oPiBvbiBtb3N0IG90aGVyIHN5c3RlbXMuICBUaGlzCisgKiBoZWxwcyB1c2VybGFuZCBjb21wYXRhYmlsaXR5LiAgKHN0cnVjdCB0aW1ldmFsIGlmaV9sYXN0Y2hhbmdlKQorICovCisjaWZuZGVmIEtFUk5FTAorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZW5kaWYKKworLyoKKyAqIFN0cnVjdHVyZSBkZXNjcmliaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGludGVyZmFjZQorICogd2hpY2ggbWF5IGJlIG9mIGludGVyZXN0IHRvIG1hbmFnZW1lbnQgZW50aXRpZXMuCisgKi8KK3N0cnVjdCBpZl9kYXRhIHsKKwkvKiBnZW5lcmljIGludGVyZmFjZSBpbmZvcm1hdGlvbiAqLworCXVfY2hhcglpZmlfdHlwZTsJCS8qIGV0aGVybmV0LCB0b2tlbnJpbmcsIGV0YyAqLworCXVfY2hhcglpZmlfcGh5c2ljYWw7CQkvKiBlLmcuLCBBVUksIFRoaW5uZXQsIDEwYmFzZS1ULCBldGMgKi8KKwl1X2NoYXIJaWZpX2FkZHJsZW47CQkvKiBtZWRpYSBhZGRyZXNzIGxlbmd0aCAqLworCXVfY2hhcglpZmlfaGRybGVuOwkJLyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCXVfY2hhcglpZmlfcmVjdnF1b3RhOwkJLyogcG9sbGluZyBxdW90YSBmb3IgcmVjZWl2ZSBpbnRycyAqLworCXVfY2hhcglpZmlfeG1pdHF1b3RhOwkJLyogcG9sbGluZyBxdW90YSBmb3IgeG1pdCBpbnRycyAqLworCXVfbG9uZwlpZmlfbXR1OwkJLyogbWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCAqLworCXVfbG9uZwlpZmlfbWV0cmljOwkJLyogcm91dGluZyBtZXRyaWMgKGV4dGVybmFsIG9ubHkpICovCisJdV9sb25nCWlmaV9iYXVkcmF0ZTsJCS8qIGxpbmVzcGVlZCAqLworCS8qIHZvbGF0aWxlIHN0YXRpc3RpY3MgKi8KKwl1X2xvbmcJaWZpX2lwYWNrZXRzOwkJLyogcGFja2V0cyByZWNlaXZlZCBvbiBpbnRlcmZhY2UgKi8KKwl1X2xvbmcJaWZpX2llcnJvcnM7CQkvKiBpbnB1dCBlcnJvcnMgb24gaW50ZXJmYWNlICovCisJdV9sb25nCWlmaV9vcGFja2V0czsJCS8qIHBhY2tldHMgc2VudCBvbiBpbnRlcmZhY2UgKi8KKwl1X2xvbmcJaWZpX29lcnJvcnM7CQkvKiBvdXRwdXQgZXJyb3JzIG9uIGludGVyZmFjZSAqLworCXVfbG9uZwlpZmlfY29sbGlzaW9uczsJCS8qIGNvbGxpc2lvbnMgb24gY3NtYSBpbnRlcmZhY2VzICovCisJdV9sb25nCWlmaV9pYnl0ZXM7CQkvKiB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIHJlY2VpdmVkICovCisJdV9sb25nCWlmaV9vYnl0ZXM7CQkvKiB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIHNlbnQgKi8KKwl1X2xvbmcJaWZpX2ltY2FzdHM7CQkvKiBwYWNrZXRzIHJlY2VpdmVkIHZpYSBtdWx0aWNhc3QgKi8KKwl1X2xvbmcJaWZpX29tY2FzdHM7CQkvKiBwYWNrZXRzIHNlbnQgdmlhIG11bHRpY2FzdCAqLworCXVfbG9uZwlpZmlfaXFkcm9wczsJCS8qIGRyb3BwZWQgb24gaW5wdXQsIHRoaXMgaW50ZXJmYWNlICovCisJdV9sb25nCWlmaV9ub3Byb3RvOwkJLyogZGVzdGluZWQgZm9yIHVuc3VwcG9ydGVkIHByb3RvY29sICovCisJdV9sb25nCWlmaV9yZWN2dGltaW5nOwkJLyogdXNlYyBzcGVudCByZWNlaXZpbmcgd2hlbiB0aW1pbmcgKi8KKwl1X2xvbmcJaWZpX3htaXR0aW1pbmc7CQkvKiB1c2VjIHNwZW50IHhtaXR0aW5nIHdoZW4gdGltaW5nICovCisJc3RydWN0CXRpbWV2YWwgaWZpX2xhc3RjaGFuZ2U7CS8qIHRpbWUgb2YgbGFzdCBhZG1pbmlzdHJhdGl2ZSBjaGFuZ2UgKi8KK307CisKKy8qIHdzMnRjcGlwLmggaGFzIGludGVyZmFjZSBmbGFnczogSUZGXyogKi8KKyNpZiAwCisjZGVmaW5lCUlGRl9VUAkJMHgxCQkvKiBpbnRlcmZhY2UgaXMgdXAgKi8KKyNkZWZpbmUJSUZGX0JST0FEQ0FTVAkweDIJCS8qIGJyb2FkY2FzdCBhZGRyZXNzIHZhbGlkICovCisjZGVmaW5lCUlGRl9ERUJVRwkweDQJCS8qIHR1cm4gb24gZGVidWdnaW5nICovCisjZGVmaW5lCUlGRl9MT09QQkFDSwkweDgJCS8qIGlzIGEgbG9vcGJhY2sgbmV0ICovCisjZGVmaW5lCUlGRl9QT0lOVE9QT0lOVAkweDEwCQkvKiBpbnRlcmZhY2UgaXMgcG9pbnQtdG8tcG9pbnQgbGluayAqLworLyojZGVmaW5lIElGRl9OT1RSQUlMRVJTIDB4MjAJCSAqIG9ic29sZXRlOiBhdm9pZCB1c2Ugb2YgdHJhaWxlcnMgKi8KKyNkZWZpbmUJSUZGX1JVTk5JTkcJMHg0MAkJLyogcmVzb3VyY2VzIGFsbG9jYXRlZCAqLworI2RlZmluZQlJRkZfTk9BUlAJMHg4MAkJLyogbm8gYWRkcmVzcyByZXNvbHV0aW9uIHByb3RvY29sICovCisjZGVmaW5lCUlGRl9QUk9NSVNDCTB4MTAwCQkvKiByZWNlaXZlIGFsbCBwYWNrZXRzICovCisjZGVmaW5lCUlGRl9BTExNVUxUSQkweDIwMAkJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KKyNkZWZpbmUJSUZGX09BQ1RJVkUJMHg0MDAJCS8qIHRyYW5zbWlzc2lvbiBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlJRkZfU0lNUExFWAkweDgwMAkJLyogY2FuJ3QgaGVhciBvd24gdHJhbnNtaXNzaW9ucyAqLworI2RlZmluZQlJRkZfTElOSzAJMHgxMDAwCQkvKiBwZXIgbGluayBsYXllciBkZWZpbmVkIGJpdCAqLworI2RlZmluZQlJRkZfTElOSzEJMHgyMDAwCQkvKiBwZXIgbGluayBsYXllciBkZWZpbmVkIGJpdCAqLworI2RlZmluZQlJRkZfTElOSzIJMHg0MDAwCQkvKiBwZXIgbGluayBsYXllciBkZWZpbmVkIGJpdCAqLworI2RlZmluZQlJRkZfQUxUUEhZUwlJRkZfTElOSzIJLyogdXNlIGFsdGVybmF0ZSBwaHlzaWNhbCBjb25uZWN0aW9uICovCisjZGVmaW5lCUlGRl9NVUxUSUNBU1QJMHg4MDAwCQkvKiBzdXBwb3J0cyBtdWx0aWNhc3QgKi8KKyNlbmRpZiAvKiAwICovCisKKy8qIGZsYWdzIHNldCBpbnRlcm5hbGx5IG9ubHk6ICovCisjZGVmaW5lCUlGRl9DQU5UQ0hBTkdFIFwKKwkoSUZGX0JST0FEQ0FTVHxJRkZfUE9JTlRPUE9JTlR8SUZGX1JVTk5JTkd8SUZGX09BQ1RJVkV8XAorCSAgICBJRkZfU0lNUExFWHxJRkZfTVVMVElDQVNUfElGRl9BTExNVUxUSSkKKworI2RlZmluZQlJRlFfTUFYTEVOCTUwCisjZGVmaW5lCUlGTkVUX1NMT1dIWgkxCQkvKiBncmFudWxhcml0eSBpcyAxIHNlY29uZCAqLworCisvKgorICogTWVzc2FnZSBmb3JtYXQgZm9yIHVzZSBpbiBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJmYWNlcworICogZnJvbSBnZXRrZXJuaW5mbyBhbmQgdGhlIHJvdXRpbmcgc29ja2V0CisgKi8KK3N0cnVjdCBpZl9tc2doZHIgeworCXVfc2hvcnQJaWZtX21zZ2xlbjsJLyogdG8gc2tpcCBvdmVyIG5vbi11bmRlcnN0b29kIG1lc3NhZ2VzICovCisJdV9jaGFyCWlmbV92ZXJzaW9uOwkvKiBmdXR1cmUgYmluYXJ5IGNvbXBhdGFiaWxpdHkgKi8KKwl1X2NoYXIJaWZtX3R5cGU7CS8qIG1lc3NhZ2UgdHlwZSAqLworCWludAlpZm1fYWRkcnM7CS8qIGxpa2UgcnRtX2FkZHJzICovCisJaW50CWlmbV9mbGFnczsJLyogdmFsdWUgb2YgaWZfZmxhZ3MgKi8KKwl1X3Nob3J0CWlmbV9pbmRleDsJLyogaW5kZXggZm9yIGFzc29jaWF0ZWQgaWZwICovCisJc3RydWN0CWlmX2RhdGEgaWZtX2RhdGE7Lyogc3RhdGlzdGljcyBhbmQgb3RoZXIgZGF0YSBhYm91dCBpZiAqLworfTsKKworLyoKKyAqIE1lc3NhZ2UgZm9ybWF0IGZvciB1c2UgaW4gb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGludGVyZmFjZSBhZGRyZXNzZXMKKyAqIGZyb20gZ2V0a2VybmluZm8gYW5kIHRoZSByb3V0aW5nIHNvY2tldAorICovCitzdHJ1Y3QgaWZhX21zZ2hkciB7CisJdV9zaG9ydAlpZmFtX21zZ2xlbjsJLyogdG8gc2tpcCBvdmVyIG5vbi11bmRlcnN0b29kIG1lc3NhZ2VzICovCisJdV9jaGFyCWlmYW1fdmVyc2lvbjsJLyogZnV0dXJlIGJpbmFyeSBjb21wYXRhYmlsaXR5ICovCisJdV9jaGFyCWlmYW1fdHlwZTsJLyogbWVzc2FnZSB0eXBlICovCisJaW50CWlmYW1fYWRkcnM7CS8qIGxpa2UgcnRtX2FkZHJzICovCisJaW50CWlmYW1fZmxhZ3M7CS8qIHZhbHVlIG9mIGlmYV9mbGFncyAqLworCXVfc2hvcnQJaWZhbV9pbmRleDsJLyogaW5kZXggZm9yIGFzc29jaWF0ZWQgaWZwICovCisJaW50CWlmYW1fbWV0cmljOwkvKiB2YWx1ZSBvZiBpZmFfbWV0cmljICovCit9OworCisvKgorICogTWVzc2FnZSBmb3JtYXQgZm9yIHVzZSBpbiBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgbXVsdGljYXN0IGFkZHJlc3NlcworICogZnJvbSB0aGUgcm91dGluZyBzb2NrZXQKKyAqLworc3RydWN0IGlmbWFfbXNnaGRyIHsKKwl1X3Nob3J0CWlmbWFtX21zZ2xlbjsJLyogdG8gc2tpcCBvdmVyIG5vbi11bmRlcnN0b29kIG1lc3NhZ2VzICovCisJdV9jaGFyCWlmbWFtX3ZlcnNpb247CS8qIGZ1dHVyZSBiaW5hcnkgY29tcGF0YWJpbGl0eSAqLworCXVfY2hhcglpZm1hbV90eXBlOwkvKiBtZXNzYWdlIHR5cGUgKi8KKwlpbnQJaWZtYW1fYWRkcnM7CS8qIGxpa2UgcnRtX2FkZHJzICovCisJaW50CWlmbWFtX2ZsYWdzOwkvKiB2YWx1ZSBvZiBpZmFfZmxhZ3MgKi8KKwl1X3Nob3J0CWlmbWFtX2luZGV4OwkvKiBpbmRleCBmb3IgYXNzb2NpYXRlZCBpZnAgKi8KK307CisKKy8qCisgKiBJbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3R1cmUgdXNlZCBmb3Igc29ja2V0CisgKiBpb2N0bCdzLiAgQWxsIGludGVyZmFjZSBpb2N0bCdzIG11c3QgaGF2ZSBwYXJhbWV0ZXIKKyAqIGRlZmluaXRpb25zIHdoaWNoIGJlZ2luIHdpdGggaWZyX25hbWUuICBUaGUKKyAqIHJlbWFpbmRlciBtYXkgYmUgaW50ZXJmYWNlIHNwZWNpZmljLgorICovCitzdHJ1Y3QJaWZyZXEgeworI2RlZmluZQlJRk5BTVNJWgkxNgorCWNoYXIJaWZyX25hbWVbSUZOQU1TSVpdOwkJLyogaWYgbmFtZSwgZS5nLiAiZW4wIiAqLworCXVuaW9uIHsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfYWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfZHN0YWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfYnJvYWRhZGRyOworCQlzaG9ydAlpZnJ1X2ZsYWdzOworCQlpbnQJaWZydV9tZXRyaWM7CisJCWludAlpZnJ1X210dTsKKwkJaW50CWlmcnVfcGh5czsKKwkJaW50CWlmcnVfbWVkaWE7CisJCWNhZGRyX3QJaWZydV9kYXRhOworCX0gaWZyX2lmcnU7CisjZGVmaW5lCWlmcl9hZGRyCWlmcl9pZnJ1LmlmcnVfYWRkcgkvKiBhZGRyZXNzICovCisjZGVmaW5lCWlmcl9kc3RhZGRyCWlmcl9pZnJ1LmlmcnVfZHN0YWRkcgkvKiBvdGhlciBlbmQgb2YgcC10by1wIGxpbmsgKi8KKyNkZWZpbmUJaWZyX2Jyb2FkYWRkcglpZnJfaWZydS5pZnJ1X2Jyb2FkYWRkcgkvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworI2RlZmluZQlpZnJfZmxhZ3MJaWZyX2lmcnUuaWZydV9mbGFncwkvKiBmbGFncyAqLworI2RlZmluZQlpZnJfbWV0cmljCWlmcl9pZnJ1LmlmcnVfbWV0cmljCS8qIG1ldHJpYyAqLworI2RlZmluZQlpZnJfbXR1CQlpZnJfaWZydS5pZnJ1X210dQkvKiBtdHUgKi8KKyNkZWZpbmUgaWZyX3BoeXMJaWZyX2lmcnUuaWZydV9waHlzCS8qIHBoeXNpY2FsIHdpcmUgKi8KKyNkZWZpbmUgaWZyX21lZGlhCWlmcl9pZnJ1LmlmcnVfbWVkaWEJLyogcGh5c2ljYWwgbWVkaWEgKi8KKyNkZWZpbmUJaWZyX2RhdGEJaWZyX2lmcnUuaWZydV9kYXRhCS8qIGZvciB1c2UgYnkgaW50ZXJmYWNlICovCit9OworCisjZGVmaW5lCV9TSVpFT0ZfQUREUl9JRlJFUShpZnIpIFwKKwkoKGlmcikuaWZyX2FkZHIuc2FfbGVuID4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgPyBcCisJIChzaXplb2Yoc3RydWN0IGlmcmVxKSAtIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICsgXAorCSAgKGlmcikuaWZyX2FkZHIuc2FfbGVuKSA6IHNpemVvZihzdHJ1Y3QgaWZyZXEpKQorCitzdHJ1Y3QgaWZhbGlhc3JlcSB7CisJY2hhcglpZnJhX25hbWVbSUZOQU1TSVpdOwkJLyogaWYgbmFtZSwgZS5nLiAiZW4wIiAqLworCXN0cnVjdAlzb2NrYWRkciBpZnJhX2FkZHI7CisJc3RydWN0CXNvY2thZGRyIGlmcmFfYnJvYWRhZGRyOworCXN0cnVjdAlzb2NrYWRkciBpZnJhX21hc2s7Cit9OworCitzdHJ1Y3QgaWZtZWRpYXJlcSB7CisJY2hhcglpZm1fbmFtZVtJRk5BTVNJWl07CS8qIGlmIG5hbWUsIGUuZy4gImVuMCIgKi8KKwlpbnQJaWZtX2N1cnJlbnQ7CQkvKiBjdXJyZW50IG1lZGlhIG9wdGlvbnMgKi8KKwlpbnQJaWZtX21hc2s7CQkvKiBkb24ndCBjYXJlIG1hc2sgKi8KKwlpbnQJaWZtX3N0YXR1czsJCS8qIG1lZGlhIHN0YXR1cyAqLworCWludAlpZm1fYWN0aXZlOwkJLyogYWN0aXZlIG9wdGlvbnMgKi8KKwlpbnQJaWZtX2NvdW50OwkJLyogIyBlbnRyaWVzIGluIGlmbV91bGlzdCBhcnJheSAqLworCWludAkqaWZtX3VsaXN0OwkJLyogbWVkaWEgd29yZHMgKi8KK307CisvKgorICogU3RydWN0dXJlIHVzZWQgaW4gU0lPQ0dJRkNPTkYgcmVxdWVzdC4KKyAqIFVzZWQgdG8gcmV0cmlldmUgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAqIGZvciBtYWNoaW5lICh1c2VmdWwgZm9yIHByb2dyYW1zIHdoaWNoCisgKiBtdXN0IGtub3cgYWxsIG5ldHdvcmtzIGFjY2Vzc2libGUpLgorICovCitzdHJ1Y3QJaWZjb25mIHsKKwlpbnQJaWZjX2xlbjsJCS8qIHNpemUgb2YgYXNzb2NpYXRlZCBidWZmZXIgKi8KKwl1bmlvbiB7CisJCWNhZGRyX3QJaWZjdV9idWY7CisJCXN0cnVjdAlpZnJlcSAqaWZjdV9yZXE7CisJfSBpZmNfaWZjdTsKKyNkZWZpbmUJaWZjX2J1ZglpZmNfaWZjdS5pZmN1X2J1ZgkvKiBidWZmZXIgYWRkcmVzcyAqLworI2RlZmluZQlpZmNfcmVxCWlmY19pZmN1LmlmY3VfcmVxCS8qIGFycmF5IG9mIHN0cnVjdHVyZXMgcmV0dXJuZWQgKi8KK307CisKKyNpZmRlZiBLRVJORUwKKyNpZmRlZiBNQUxMT0NfREVDTEFSRQorTUFMTE9DX0RFQ0xBUkUoTV9JRkFERFIpOworTUFMTE9DX0RFQ0xBUkUoTV9JRk1BRERSKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qIFhYWCAtIHRoaXMgc2hvdWxkIGdvIGF3YXkgc29vbiAqLworI2lmZGVmIEtFUk5FTAorI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogIV9ORVRfSUZfSF8gKi8KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvbmV0L25ldGRiLmggYi9XaW4zMi9JbmNsdWRlL25ldC9uZXRkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDQ1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9JbmNsdWRlL25ldC9uZXRkYi5oCkBAIC0wLDAgKzEsMTY0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MCwgMTk4MywgMTk4OCwgMTk5MworICogICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW5ldGRiLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKiAgICAgIG5ldGRiLmgsdiAxLjQgMTk5NS8wOC8xNCAwNDowNTowNCBoamwgRXhwCisgKiAtCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBkb2N1bWVudCBvciBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBESUdJVEFMIEVRVUlQTUVOVCBDT1JQLiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICAgSU4gTk8gRVZFTlQgU0hBTEwgRElHSVRBTCBFUVVJUE1FTlQKKyAqIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKiAtCisgKiAtLUNvcHlyaWdodC0tCisgKi8KKworI2lmbmRlZiBfTkVUREJfSF8KKyNkZWZpbmUgX05FVERCX0hfCisKKyNpZiBkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpIHx8IGRlZmluZWQoX1JFRU5UUkFOVCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDxuZXQvcGF0aHMuaD4KKworI2RlZmluZSBfUEFUSF9IRVFVSVYJX19QQVRIX0VUQ19JTkVUIi9ob3N0cy5lcXVpdiIKKyNkZWZpbmUgX1BBVEhfSE9TVFMJX19QQVRIX0VUQ19JTkVUIi9ob3N0cyIKKyNkZWZpbmUgX1BBVEhfTkVUV09SS1MJX19QQVRIX0VUQ19JTkVUIi9uZXR3b3JrcyIKKyNkZWZpbmUgX1BBVEhfUFJPVE9DT0xTCV9fUEFUSF9FVENfSU5FVCIvcHJvdG9jb2xzIgorI2RlZmluZSBfUEFUSF9TRVJWSUNFUwlfX1BBVEhfRVRDX0lORVQiL3NlcnZpY2VzIgorI2RlZmluZSBfUEFUSF9SRVNDT05GCV9fUEFUSF9FVENfSU5FVCIvcmVzb2x2LmNvbmYiCisjZGVmaW5lIF9QQVRIX1JQQwlfX1BBVEhfRVRDX0lORVQiL3JwYyIKKworc3RydWN0IHJwY2VudCB7CisJY2hhcgkqcl9uYW1lOwkvKiBuYW1lIG9mIHNlcnZlciBmb3IgdGhpcyBycGMgcHJvZ3JhbSAqLworCWNoYXIJKipyX2FsaWFzZXM7CS8qIGFsaWFzIGxpc3QgKi8KKwlpbnQJcl9udW1iZXI7CS8qIHJwYyBwcm9ncmFtIG51bWJlciAqLworfTsKKworI2lmbmRlZiBXSU4zMgorI2lmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfUkVFTlRSQU5UKQorCisjZGVmaW5lIF9fTkVUREJfTUFYQUxJQVNFUwkzNQorI2RlZmluZSBfX05FVERCX01BWEFERFJTCTM1CisKKy8qCisgKiBFcnJvciByZXR1cm4gY29kZXMgZnJvbSBnZXRob3N0YnluYW1lKCkgYW5kIGdldGhvc3RieWFkZHIoKQorICogKGxlZnQgaW4gZXh0ZXJuIGludCBoX2Vycm5vKS4KKyAqLworI2RlZmluZSBoX2Vycm5vCQkoKl9faF9lcnJub19sb2NhdGlvbiAoKSkKKyNlbHNlCitleHRlcm4gaW50IGhfZXJybm87CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lCU5FVERCX0lOVEVSTkFMIC0xIC8qIHNlZSBlcnJubyAqLworI2RlZmluZQlORVREQl9TVUNDRVNTICAgMCAvKiBubyBwcm9ibGVtICovCisKKy8vI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK3ZvaWQJCWVuZGhvc3RlbnQgKHZvaWQpOwordm9pZAkJZW5kbmV0ZW50ICh2b2lkKTsKK3ZvaWQJCWVuZHByb3RvZW50ICh2b2lkKTsKK3ZvaWQJCWVuZHNlcnZlbnQgKHZvaWQpOwordm9pZAkJZW5kcnBjZW50ICh2b2lkKTsKK3N0cnVjdCBob3N0ZW50CSpnZXRob3N0ZW50ICh2b2lkKTsKK3N0cnVjdCBuZXRlbnQJKmdldG5ldGJ5YWRkciAobG9uZywgaW50KTsgLyogdV9sb25nPyAqLworc3RydWN0IG5ldGVudAkqZ2V0bmV0YnluYW1lIChjb25zdCBjaGFyICopOworc3RydWN0IG5ldGVudAkqZ2V0bmV0ZW50ICh2b2lkKTsKK3N0cnVjdCBwcm90b2VudAkqZ2V0cHJvdG9lbnQgKHZvaWQpOworc3RydWN0IHNlcnZlbnQJKmdldHNlcnZlbnQgKHZvaWQpOworc3RydWN0IHJwY2VudAkqZ2V0cnBjZW50ICh2b2lkKTsKK3N0cnVjdCBycGNlbnQJKmdldHJwY2J5bmFtZSAoY29uc3QgY2hhciAqKTsKK3N0cnVjdCBycGNlbnQJKmdldHJwY2J5bnVtYmVyIChpbnQpOwordm9pZAkJaGVycm9yIChjb25zdCBjaGFyICopOwordm9pZAkJc2V0aG9zdGVudCAoaW50KTsKKy8qIHZvaWQJCXNldGhvc3RmaWxlIChjb25zdCBjaGFyICopOyAqLwordm9pZAkJc2V0bmV0ZW50IChpbnQpOwordm9pZAkJc2V0cHJvdG9lbnQgKGludCk7Cit2b2lkCQlzZXRzZXJ2ZW50IChpbnQpOwordm9pZAkJc2V0cnBjZW50IChpbnQpOworCisjaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKF9SRUVOVFJBTlQpCitzdHJ1Y3QgaG9zdGVudAkqZ2V0aG9zdGJ5YWRkcl9yIChjb25zdCBjaGFyICpfX2FkZHIsCisJCQlpbnQgX19sZW5ndGgsIGludCBfX3R5cGUsCisJCQlzdHJ1Y3QgaG9zdGVudCAqX19yZXN1bHQsCisJCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuLCBpbnQgKl9faF9lcnJub3ApOworc3RydWN0IGhvc3RlbnQJKmdldGhvc3RieW5hbWVfciAoY29uc3QgY2hhciAqIF9fbmFtZSwKKwkJCXN0cnVjdCBob3N0ZW50ICpfX3Jlc3VsdCwgY2hhciAqX19idWZmZXIsCisJCQlpbnQgX19idWZsZW4sIGludCAqX19oX2Vycm5vcCk7CitzdHJ1Y3QgaG9zdGVudAkqZ2V0aG9zdGVudF9yIChzdHJ1Y3QgaG9zdGVudCAqX19yZXN1bHQsCisJCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuLCBpbnQgKl9faF9lcnJub3ApOworc3RydWN0IG5ldGVudAkqZ2V0bmV0YnlhZGRyX3IgKGxvbmcgX19uZXQsIGludCBfX3R5cGUsCisJCQlzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3VsdCwgY2hhciAqX19idWZmZXIsCisJCQlpbnQgX19idWZsZW4pOworc3RydWN0IG5ldGVudAkqZ2V0bmV0YnluYW1lX3IgKGNvbnN0IGNoYXIgKiBfX25hbWUsCisJCQlzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3VsdCwgY2hhciAqX19idWZmZXIsCisJCQlpbnQgX19idWZsZW4pOworc3RydWN0IG5ldGVudAkqZ2V0bmV0ZW50X3IgKHN0cnVjdCBuZXRlbnQgKl9fcmVzdWx0LAorCQkJY2hhciAqX19idWZmZXIsIGludCBfX2J1Zmxlbik7CitzdHJ1Y3QgcHJvdG9lbnQJKmdldHByb3RvYnluYW1lX3IgKGNvbnN0IGNoYXIgKiBfX25hbWUsCisJCQlzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKKwkJCWludCBfX2J1Zmxlbik7CitzdHJ1Y3QgcHJvdG9lbnQJKmdldHByb3RvYnludW1iZXJfciAoaW50IF9fcHJvdG8sCisJCQlzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKKwkJCWludCBfX2J1Zmxlbik7CitzdHJ1Y3QgcHJvdG9lbnQJKmdldHByb3RvZW50X3IgKHN0cnVjdCBwcm90b2VudCAqX19yZXN1bHQsCisJCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKK3N0cnVjdCBzZXJ2ZW50CSpnZXRzZXJ2YnluYW1lX3IgKGNvbnN0IGNoYXIgKiBfX25hbWUsCisJCQljb25zdCBjaGFyICpfX3Byb3RvLCBzdHJ1Y3Qgc2VydmVudCAqX19yZXN1bHQsCisJCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKK3N0cnVjdCBzZXJ2ZW50CSpnZXRzZXJ2Ynlwb3J0X3IgKGludCBfX3BvcnQsCisJCQljb25zdCBjaGFyICpfX3Byb3RvLCBzdHJ1Y3Qgc2VydmVudCAqX19yZXN1bHQsCisJCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKK3N0cnVjdCBzZXJ2ZW50CSpnZXRzZXJ2ZW50X3IgKHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3VsdCwKKwkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4pOworCitpbnQgKl9faF9lcnJub19sb2NhdGlvbiAodm9pZCk7CisKKyNlbmRpZgorCisjZW5kaWYgLyogIV9ORVREQl9IXyAqLwpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9uZXQvcGF0aHMuaCBiL1dpbjMyL0luY2x1ZGUvbmV0L3BhdGhzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL1dpbjMyL0luY2x1ZGUvbmV0L3BhdGhzLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcGF0aHMuaAk1LjE1IChCZXJrZWxleSkgNS8yOS85MQorICovCisKKyNpZm5kZWYgX1BBVEhTX0hfCisjZGVmaW5lCV9QQVRIU19IXworCisjaWYgMAorI2RlZmluZQlfX1BBVEhfRVRDX0lORVQJIi91c3IvZXRjL2luZXQiCisjZWxzZQorI2RlZmluZQlfX1BBVEhfRVRDX0lORVQJIi9ldGMiCisjZW5kaWYKKworLyogRGVmYXVsdCBzZWFyY2ggcGF0aC4gKi8KKyNkZWZpbmUJX1BBVEhfREVGUEFUSAkJIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW46LiIKKyNkZWZpbmUgX1BBVEhfREVGUEFUSF9ST09UCSIvc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiIKKworI2RlZmluZQlfUEFUSF9CU0hFTEwJIi9iaW4vc2giCisjZGVmaW5lCV9QQVRIX0NPTlNPTEUJIi9kZXYvY29uc29sZSIKKyNkZWZpbmUJX1BBVEhfQ1NIRUxMCSIvYmluL2NzaCIKKyNkZWZpbmUJX1BBVEhfREVWREIJIi92YXIvcnVuL2Rldi5kYiIKKyNkZWZpbmUJX1BBVEhfREVWTlVMTAkiL2Rldi9udWxsIgorI2RlZmluZQlfUEFUSF9EUlVNCSIvZGV2L2RydW0iCisjZGVmaW5lCV9QQVRIX0hFUVVJVglfX1BBVEhfRVRDX0lORVQiL2hvc3RzLmVxdWl2IgorI2RlZmluZQlfUEFUSF9LTUVNCSIvZGV2L2ttZW0iCisjZGVmaW5lCV9QQVRIX01BSUxESVIJIi92YXIvc3Bvb2wvbWFpbCIKKyNkZWZpbmUJX1BBVEhfTUFOCSIvdXNyL21hbiIKKyNkZWZpbmUJX1BBVEhfTUVNCSIvZGV2L21lbSIKKyNkZWZpbmUJX1BBVEhfTE9HSU4JIi9iaW4vbG9naW4iCisjZGVmaW5lCV9QQVRIX05PTE9HSU4JIi9ldGMvbm9sb2dpbiIKKyNkZWZpbmUJX1BBVEhfU0VORE1BSUwJIi91c3Ivc2Jpbi9zZW5kbWFpbCIKKyNkZWZpbmUJX1BBVEhfU0hFTExTCSIvZXRjL3NoZWxscyIKKyNkZWZpbmUJX1BBVEhfVFRZCSIvZGV2L3R0eSIKKyNkZWZpbmUJX1BBVEhfVU5JWAkiL3ZtbGludXgiCisjZGVmaW5lCV9QQVRIX1ZJCSIvdXNyL2Jpbi92aSIKKworLyogUHJvdmlkZSB0cmFpbGluZyBzbGFzaCwgc2luY2UgbW9zdGx5IHVzZWQgZm9yIGJ1aWxkaW5nIHBhdGhuYW1lcy4gKi8KKyNkZWZpbmUJX1BBVEhfREVWCSIvZGV2LyIKKyNkZWZpbmUJX1BBVEhfVE1QCSIvdG1wLyIKKyNkZWZpbmUJX1BBVEhfVkFSUlVOCSIvdmFyL3J1bi8iCisjZGVmaW5lCV9QQVRIX1ZBUlRNUAkiL3Zhci90bXAvIgorCisjZGVmaW5lIF9QQVRIX0tMT0cJIi9wcm9jL2ttc2ciCisjZGVmaW5lIF9QQVRIX0xPR0NPTkYJX19QQVRIX0VUQ19JTkVUIi9zeXNsb2cuY29uZiIKKyNpZiAwCisjZGVmaW5lIF9QQVRIX0xPR1BJRAlfX1BBVEhfRVRDX0lORVQiL3N5c2xvZy5waWQiCisjZWxzZQorI2RlZmluZSBfUEFUSF9MT0dQSUQJIi92YXIvcnVuL3N5c2xvZy5waWQiCisjZW5kaWYKKyNkZWZpbmUgX1BBVEhfTE9HCSIvZGV2L2xvZyIKKyNkZWZpbmUgX1BBVEhfQ09OU09MRQkiL2Rldi9jb25zb2xlIgorCisjaWYgMAorI2RlZmluZSBfUEFUSF9VVE1QCSIvdmFyL2FkbS91dG1wIgorI2RlZmluZSBfUEFUSF9XVE1QCSIvdmFyL2FkbS93dG1wIgorI2RlZmluZSBfUEFUSF9MQVNUTE9HCSIvdmFyL2FkbS9sYXN0bG9nIgorI2Vsc2UKKyNkZWZpbmUgX1BBVEhfVVRNUAkiL3Zhci9ydW4vdXRtcCIKKyNkZWZpbmUgX1BBVEhfV1RNUAkiL3Zhci9sb2cvd3RtcCIKKyNkZWZpbmUgX1BBVEhfTEFTVExPRwkiL3Zhci9sb2cvbGFzdGxvZyIKKyNlbmRpZgorCisjZGVmaW5lIF9QQVRIX0xPQ0FMRQkiL3Vzci9saWIvbG9jYWxlIgorCisjZGVmaW5lIF9QQVRIX1JXSE9ESVIJIi92YXIvc3Bvb2wvcndobyIKKworI2lmIF9NSVRfUE9TSVhfVEhSRUFEUworLyogRm9yIHRoZSBNSVQgcHRocmVhZHMgKi8KKyNkZWZpbmUgX1BBVEhfUFRZCSIvZGV2LyIKKyNkZWZpbmUgX1BBVEhfVFpESVIJIi91c3IvbGliL3pvbmVpbmZvIgorI2RlZmluZSBfUEFUSF9UWkZJTEUJIi91c3IvbGliL3pvbmVpbmZvL2xvY2FsdGltZSIKKyNlbmRpZgorCisjZW5kaWYgLyogIV9QQVRIU19IXyAqLwpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9zb2Nrc3RvcmFnZS5oIGIvV2luMzIvSW5jbHVkZS9zb2Nrc3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2ViNGQKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9JbmNsdWRlL3NvY2tzdG9yYWdlLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7CisjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KKwl1X2ludDhfdCBfX3NzX2xlbjsKKwl1X2ludDhfdCBfX3NzX2ZhbWlseTsKKwl1X2ludDhfdCBmaWxsWzEyNl07CisjZWxzZQorCXVfaW50OF90IF9fc3NfZmFtaWx5OworCXVfaW50OF90IGZpbGxbMTI3XTsKKyNlbmRpZiAvKiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLworfTsKZGlmZiAtLWdpdCBhL1dpbjMyL1Byai9saWJwY2FwLmRzcCBiL1dpbjMyL1Byai9saWJwY2FwLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U1YTcwCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvUHJqL2xpYnBjYXAuZHNwCkBAIC0wLDAgKzEsMTY4IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImxpYnBjYXAiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNAorCitDRkc9bGlicGNhcCAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImxpYnBjYXAubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJsaWJwY2FwLm1hayIgQ0ZHPSJsaWJwY2FwIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAibGlicGNhcCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgImxpYnBjYXAgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAibGlicGNhcCAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvSSAiLi4vLi4vIiAvSSAiLi4vLi4vbGJsLyIgL0kgIi4uLy4uL2JwZi8iIC9JICIuLi9pbmNsdWRlLyIgL0kgIi4uLy4uLy4uLy4uL2NvbW1vbiIgL0kgIi4uLy4uLy4uLy4uL2RhZy9pbmNsdWRlIiAvSSAiLi4vLi4vLi4vLi4vZGFnL2Rydi93aW5kb3dzIiAvRCAiTkRFQlVHIiAvRCAiWVlfTkVWRVJfSU5URVJBQ1RJVkUiIC9EIHl5bHZhbD1wY2FwX2x2YWwgL0QgIl9VU1JETEwiIC9EICJMSUJQQ0FQX0VYUE9SVFMiIC9EICJIQVZFX1NUUkVSUk9SIiAvRCAiX19TVERDX18iIC9EICJJTkVUNiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJIQVZFX0FERFJJTkZPIiAvRCAiV0lOMzIiIC9EIF9VXz0gL0QgIkhBVkVfU05QUklOVEYiIC9EICJIQVZFX1ZTTlBSSU5URiIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCisKKyFFTFNFSUYgICIkKENGRykiID09ICJsaWJwY2FwIC0gV2luMzIgRGVidWciCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uLy4uLyIgL0kgIi4uLy4uL2xibC8iIC9JICIuLi8uLi9icGYvIiAvSSAiLi4vaW5jbHVkZS8iIC9JICIuLi8uLi8uLi8uLi9jb21tb24iIC9JICIuLi8uLi8uLi8uLi9kYWcvaW5jbHVkZSIgL0kgIi4uLy4uLy4uLy4uL2RhZy9kcnYvd2luZG93cyIgL0QgIl9ERUJVRyIgL0QgIllZX05FVkVSX0lOVEVSQUNUSVZFIiAvRCB5eWx2YWw9cGNhcF9sdmFsIC9EICJfVVNSRExMIiAvRCAiTElCUENBUF9FWFBPUlRTIiAvRCAiSEFWRV9TVFJFUlJPUiIgL0QgIl9fU1REQ19fIiAvRCAiSU5FVDYiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiSEFWRV9BRERSSU5GTyIgL0QgIldJTjMyIiAvRCBfVV89IC9EICJIQVZFX1NOUFJJTlRGIiAvRCAiSEFWRV9WU05QUklOVEYiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImxpYnBjYXAgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJsaWJwY2FwIC0gV2luMzIgRGVidWciCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxicGZfZHVtcC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cYnBmXG5ldFxicGZfZmlsdGVyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxicGZfaW1hZ2UuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGV0aGVyZW50LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iLi5cLi5cZmFkLXdpbjMyLmMiCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cU3JjXGZmcy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cZ2VuY29kZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cU3JjXGdldG5ldGJ5bm0uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXFNyY1xnZXRuZXRlbnQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXFNyY1xnZXRzZXJ2ZW50LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxncmFtbWFyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxpbmV0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlxTcmNcaW5ldF9hdG9uLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlxTcmNcaW5ldF9uZXQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXFNyY1xpbmV0X3B0b24uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXG5hbWV0b2FkZHIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXG9wdGltaXplLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iLi5cLi5cUGNhcC13aW4zMi5jIgorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHBjYXAuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNhdmVmaWxlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxzY2FubmVyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL1dpbjMyL1Byai9saWJwY2FwLmRzdyBiL1dpbjMyL1Byai9saWJwY2FwLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RmZjJkCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvUHJqL2xpYnBjYXAuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJsaWJwY2FwIj0iLlxsaWJwY2FwLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworR2xvYmFsOgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08Mz4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2Zmcy5jIGIvV2luMzIvU3JjL2Zmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWZmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9TcmMvZmZzLmMKQEAgLTAsMCArMSw1NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWZmcy5jCTguMSAoQmVya2VsZXkpIDYvNC85MyI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qCisgKiBmZnMgLS0gdmF4IGZmcyBpbnN0cnVjdGlvbgorICovCitpbnQKK2ZmcyhtYXNrKQorCXJlZ2lzdGVyIGludCBtYXNrOworeworCXJlZ2lzdGVyIGludCBiaXQ7CisKKwlpZiAobWFzayA9PSAwKQorCQlyZXR1cm4oMCk7CisJZm9yIChiaXQgPSAxOyAhKG1hc2sgJiAxKTsgYml0KyspCisJCW1hc2sgPj49IDE7CisJcmV0dXJuKGJpdCk7Cit9CmRpZmYgLS1naXQgYS9XaW4zMi9TcmMvZ2FpX3N0cmVycm9yLmMgYi9XaW4zMi9TcmMvZ2FpX3N0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkOTcwYgotLS0gL2Rldi9udWxsCisrKyBiL1dpbjMyL1NyYy9nYWlfc3RyZXJyb3IuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IC9yZXBvbWFuL3IvbmN2cy9zcmMvbGliL2xpYmMvbmV0L2dhaV9zdHJlcnJvci5jLHYgMS4xIDIwMDUvMDQvMDYgMTI6NDU6NTEgdW1lIEV4cCAkIik7CisKKyovCisKKyNpZmRlZiBXSU4zMgorCisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKworI2Vsc2UKKworI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNlbmRpZgorCisvKiBFbnRyaWVzIEVBSV9BRERSRkFNSUxZICgxKSBhbmQgRUFJX05PREFUQSAoNykgYXJlIG9ic29sZXRlZCwgYnV0IGxlZnQgKi8KKy8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdXNlcmxhbmQgY29kZSBwcmlvciB0byAyNTUzYmlzLTAyICovCitzdGF0aWMgY2hhciAqYWlfZXJybGlzdFtdID0geworCSJTdWNjZXNzIiwJCQkJCS8qIDAgKi8KKwkiQWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQiLAkvKiAxICovCisJIlRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsCQkvKiBFQUlfQUdBSU4gKi8KKwkiSW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MiLAkJCS8qIEVBSV9CQURGTEFHUyAqLworCSJOb24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24iLAkvKiBFQUlfRkFJTCAqLworCSJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCIsCQkJLyogRUFJX0ZBTUlMWSAqLworCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgCQkJLyogRUFJX01FTU9SWSAqLworCSJObyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBob3N0bmFtZSIsCQkvKiA3ICovCisJImhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duIiwJLyogRUFJX05PTkFNRSAqLworCSJzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZSIsCS8qIEVBSV9TRVJWSUNFICovCisJImFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQiLCAJCQkvKiBFQUlfU09DS1RZUEUgKi8KKwkiU3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vIiwgCQkvKiBFQUlfU1lTVEVNICovCisJIkludmFsaWQgdmFsdWUgZm9yIGhpbnRzIiwJCQkvKiBFQUlfQkFESElOVFMgKi8KKwkiUmVzb2x2ZWQgcHJvdG9jb2wgaXMgdW5rbm93biIJCQkvKiBFQUlfUFJPVE9DT0wgKi8KK307CisKKyNpZm5kZWYgRUFJX01BWAorI2RlZmluZSBFQUlfTUFYIChzaXplb2YoYWlfZXJybGlzdCkvc2l6ZW9mKGFpX2Vycmxpc3RbMF0pKQorI2VuZGlmCisKKy8qIG9uIE1pbmdXLCBnYWlfc3RyZXJyb3IgaXMgYXZhaWxhYmxlLiAKKyAgIFdlIG5lZWQgdG8gY29tcGlsZSBnYWlfc3RyZXJyb3JBIG9ubHkgZm9yIEN5Z3dpbgorICovCisjaWZuZGVmIGdhaV9zdHJlcnJvcgorCitjaGFyICoKK1dTQUFQSSBnYWlfc3RyZXJyb3JBKGludCBlY29kZSkKK3sKKwlpZiAoZWNvZGUgPj0gMCAmJiBlY29kZSA8IEVBSV9NQVgpCisJCXJldHVybiBhaV9lcnJsaXN0W2Vjb2RlXTsKKwlyZXR1cm4gIlVua25vd24gZXJyb3IiOworfQorCisjZW5kaWYgLyogZ2FpX3N0cmVycm9yICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2dldGFkZHJpbmZvLmMgYi9XaW4zMi9TcmMvZ2V0YWRkcmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmZlOGMyCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvU3JjL2dldGFkZHJpbmZvLmMKQEAgLTAsMCArMSwxMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiAiI2lmZGVmIEZBSVRIIiBwYXJ0IGlzIGxvY2FsIGhhY2sgZm9yIHN1cHBvcnRpbmcgSVB2NC12NiB0cmFuc2xhdG9yLgorICoKKyAqIElzc3VlcyB0byBiZSBkaXNjdXNzZWQ6CisgKiAtIFRocmVhZCBzYWZlLW5lc3MgbXVzdCBiZSBjaGVja2VkLgorICogLSBSZXR1cm4gdmFsdWVzLiAgVGhlcmUgYXJlIG5vbnN0YW5kYXJkIHJldHVybiB2YWx1ZXMgZGVmaW5lZCBhbmQgdXNlZAorICogICBpbiB0aGUgc291cmNlIGNvZGUuICBUaGlzIGlzIGJlY2F1c2UgUkZDMjU1MyBpcyBzaWxlbnQgYWJvdXQgd2hpY2ggZXJyb3IKKyAqICAgY29kZSBtdXN0IGJlIHJldHVybmVkIGZvciB3aGljaCBzaXR1YXRpb24uCisgKiBOb3RlOgorICogLSBXZSB1c2UgZ2V0aXBub2RlYnluYW1lKCkganVzdCBmb3IgdGhyZWFkLXNhZmVuZXNzLiAgVGhlcmUncyBubyBpbnRlbnQKKyAqICAgdG8gbGV0IGl0IGRvIFBGX1VOU1BFQyAoYWN0dWFsbHkgd2UgbmV2ZXIgcGFzcyBQRl9VTlNQRUMgdG8KKyAqICAgZ2V0aXBub2RlYnluYW1lKCkuCisgKiAtIFRoZSBjb2RlIGZpbHRlcnMgb3V0IEFGcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwsCisgKiAgIHdoZW4gZ2xvYmJpbmcgTlVMTCBob3N0bmFtZSAodG8gbG9vcGJhY2ssIG9yIHdpbGRjYXJkKS4gIElzIGl0IHRoZSByaWdodAorICogICB0aGluZyB0byBkbz8gIFdoYXQgaXMgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHBvc3QtUkZDMjU1MyBBSV9BRERSQ09ORklHCisgKiAgIGluIGFpX2ZsYWdzPworICovCisKKy8qCisgKiBNaW5ndzY0IGhhcyBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvLCBtaW5ndzMyIG5vCisgKi8KKyNpZm5kZWYgX19NSU5HVzY0X18KKyAKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZiAKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL1dpbjMyL1NyYy9nZXRhZGRyaW5mby5jLHYgMS4zIDIwMDgtMDktMTUgMjM6Mzc6NTEgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNpZiAwCisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2VuZGlmCisjaWZuZGVmIF9fTUlOR1czMl9fCisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBIQVZFX1BPUlRBQkxFX1BST1RPVFlQRQorI2luY2x1ZGUgImNkZWNsX2V4dC5oIgorI2VuZGlmIAorCisjaWZuZGVmIEhBVkVfVV9JTlQzMl9UCisjaW5jbHVkZSAiYml0dHlwZXMuaCIKKyNlbmRpZiAKKworI2lmbmRlZiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UKKyNpZm5kZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlICJzb2Nrc3RvcmFnZS5oIgorI2VuZGlmCisjZW5kaWYgCisKKyNpZmRlZiBORUVEX0FERFJJTkZPX0gKKyNpbmNsdWRlICJhZGRyaW5mby5oIgorI2lmZGVmIFdJTjMyCisjaW5jbHVkZSAiaXA2X21pc2MuaCIKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoX19LQU1FX18pICYmIGRlZmluZWQoSU5FVDYpCisjIGRlZmluZSBGQUlUSAorI2VuZGlmCisKKyNkZWZpbmUgU1VDQ0VTUyAwCisjZGVmaW5lIEFOWSAwCisjZGVmaW5lIFlFUyAxCisjZGVmaW5lIE5PICAwCisKKyNpZmRlZiBGQUlUSAorc3RhdGljIGludCB0cmFuc2xhdGUgPSBOTzsKK3N0YXRpYyBzdHJ1Y3QgaW42X2FkZHIgZmFpdGhfcHJlZml4ID0gSU42QUREUl9BTllfSU5JVDsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBpbl9hZGRyYW55W10gPSB7IDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGluNl9hZGRyYW55W10gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKK3N0YXRpYyBjb25zdCBjaGFyIGluX2xvb3BiYWNrW10gPSB7IDEyNywgMCwgMCwgMSB9OyAKK3N0YXRpYyBjb25zdCBjaGFyIGluNl9sb29wYmFja1tdID0geworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEKK307CisKK3N0cnVjdCBzb2NraW5ldCB7CisJdV9jaGFyCXNpX2xlbjsKKwl1X2NoYXIJc2lfZmFtaWx5OworCXVfc2hvcnQJc2lfcG9ydDsKKwl1X2ludDMyX3Qgc2lfc2NvcGVfaWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmZCB7CisJaW50IGFfYWY7CisJaW50IGFfYWRkcmxlbjsKKwlpbnQgYV9zb2NrbGVuOworCWludCBhX29mZjsKKwljb25zdCBjaGFyICphX2FkZHJhbnk7CisJY29uc3QgY2hhciAqYV9sb29wYmFjazsJCisJaW50IGFfc2NvcGVkOworfSBhZmRsIFtdID0geworI2lmZGVmIElORVQ2CisJe1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKKwkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAorCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpLAorCSBpbjZfYWRkcmFueSwgaW42X2xvb3BiYWNrLCAxfSwKKyNlbmRpZgorCXtQRl9JTkVULCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAorCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwKKwkgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkciksCisJIGluX2FkZHJhbnksIGluX2xvb3BiYWNrLCAwfSwKKwl7MCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgMH0sCit9OworCitzdHJ1Y3QgZXhwbG9yZSB7CisJaW50IGVfYWY7CisJaW50IGVfc29ja3R5cGU7CisJaW50IGVfcHJvdG9jb2w7CisJY29uc3QgY2hhciAqZV9wcm90b3N0cjsKKwlpbnQgZV93aWxkOworI2RlZmluZSBXSUxEX0FGKGV4KQkJKChleCktPmVfd2lsZCAmIDB4MDEpCisjZGVmaW5lIFdJTERfU09DS1RZUEUoZXgpCSgoZXgpLT5lX3dpbGQgJiAweDAyKQorI2RlZmluZSBXSUxEX1BST1RPQ09MKGV4KQkoKGV4KS0+ZV93aWxkICYgMHgwNCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwbG9yZSBleHBsb3JlW10gPSB7CisjaWYgMAorCXsgUEZfTE9DQUwsIDAsIEFOWSwgQU5ZLCBOVUxMLCAweDAxIH0sCisjZW5kaWYKKyNpZmRlZiBJTkVUNgorCXsgUEZfSU5FVDYsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAidWRwIiwgMHgwNyB9LAorCXsgUEZfSU5FVDYsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgInRjcCIsIDB4MDcgfSwKKwl7IFBGX0lORVQ2LCBTT0NLX1JBVywgQU5ZLCBOVUxMLCAweDA1IH0sCisjZW5kaWYKKwl7IFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAidWRwIiwgMHgwNyB9LAorCXsgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAidGNwIiwgMHgwNyB9LAorCXsgUEZfSU5FVCwgU09DS19SQVcsIEFOWSwgTlVMTCwgMHgwNSB9LAorCXsgLTEsIDAsIDAsIE5VTEwsIDAgfSwKK307CisKKyNpZmRlZiBJTkVUNgorI2RlZmluZSBQVE9OX01BWAkxNgorI2Vsc2UKKyNkZWZpbmUgUFRPTl9NQVgJNAorI2VuZGlmCisKKworc3RhdGljIGludCBzdHJfaXNudW1iZXIgX19QKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgZXhwbG9yZV9mcWRuIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKikpOworc3RhdGljIGludCBleHBsb3JlX251bGwgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqLAorCWNvbnN0IGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICoqKSk7CitzdGF0aWMgaW50IGV4cGxvcmVfbnVtZXJpYyBfX1AoKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCisJY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopKTsKK3N0YXRpYyBpbnQgZXhwbG9yZV9udW1lcmljX3Njb3BlIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKikpOworc3RhdGljIGludCBnZXRfbmFtZSBfX1AoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IGFmZCAqLCBzdHJ1Y3QgYWRkcmluZm8gKiosCisJY2hhciAqLCBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IGdldF9jYW5vbm5hbWUgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwKKwlzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgc3RydWN0IGFkZHJpbmZvICpnZXRfYWkgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwKKwljb25zdCBzdHJ1Y3QgYWZkICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGludCBnZXRfcG9ydG1hdGNoIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGludCBnZXRfcG9ydCBfX1AoKHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosIGludCkpOworc3RhdGljIGNvbnN0IHN0cnVjdCBhZmQgKmZpbmRfYWZkIF9fUCgoaW50KSk7CisKK3N0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7CisJIlN1Y2Nlc3MiLAorCSJBZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCIsCS8qIEVBSV9BRERSRkFNSUxZICovCisJIlRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsCQkvKiBFQUlfQUdBSU4gICAgICAqLworCSJJbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyIsCQkgICAgICAgCS8qIEVBSV9CQURGTEFHUyAgICovCisJIk5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsIAkvKiBFQUlfRkFJTCAgICAgICAqLworCSJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCIsCQkJLyogRUFJX0ZBTUlMWSAgICAgKi8KKwkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIsIAkJCS8qIEVBSV9NRU1PUlkgICAgICovCisJIk5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lIiwgCQkvKiBFQUlfTk9EQVRBICAgICAqLworCSJob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biIsCS8qIEVBSV9OT05BTUUgICAgICovCisJInNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlIiwJLyogRUFJX1NFUlZJQ0UgICAgKi8KKwkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCIsIAkJCS8qIEVBSV9TT0NLVFlQRSAgICovCisJIlN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBlcnJubyIsIAkJLyogRUFJX1NZU1RFTSAgICAgKi8KKwkiSW52YWxpZCB2YWx1ZSBmb3IgaGludHMiLAkJCS8qIEVBSV9CQURISU5UUwkgICovCisJIlJlc29sdmVkIHByb3RvY29sIGlzIHVua25vd24iLAkJCS8qIEVBSV9QUk9UT0NPTCAgICovCisJIlVua25vd24gZXJyb3IiLCAJCQkJLyogRUFJX01BWCAgICAgICAgKi8KK307CisKKy8qIFhYWCBtYWNyb3MgdGhhdCBtYWtlIGV4dGVybmFsIHJlZmVyZW5jZSBpcyBCQUQuICovCisKKyNkZWZpbmUgR0VUX0FJKGFpLCBhZmQsIGFkZHIpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogcGFpLCBlcnJvciwgYW5kIGxhYmVsIGZyZWUgKi8gXAorCShhaSkgPSBnZXRfYWkocGFpLCAoYWZkKSwgKGFkZHIpKTsgXAorCWlmICgoYWkpID09IE5VTEwpIHsgXAorCQllcnJvciA9IEVBSV9NRU1PUlk7IFwKKwkJZ290byBmcmVlOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9QT1JUKGFpLCBzZXJ2KSBcCitkbyB7IFwKKwkvKiBleHRlcm5hbCByZWZlcmVuY2U6IGVycm9yIGFuZCBsYWJlbCBmcmVlICovIFwKKwllcnJvciA9IGdldF9wb3J0KChhaSksIChzZXJ2KSwgMCk7IFwKKwlpZiAoZXJyb3IgIT0gMCkgXAorCQlnb3RvIGZyZWU7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX0NBTk9OTkFNRShhaSwgc3RyKSBcCitkbyB7IFwKKwkvKiBleHRlcm5hbCByZWZlcmVuY2U6IHBhaSwgZXJyb3IgYW5kIGxhYmVsIGZyZWUgKi8gXAorCWVycm9yID0gZ2V0X2Nhbm9ubmFtZShwYWksIChhaSksIChzdHIpKTsgXAorCWlmIChlcnJvciAhPSAwKSBcCisJCWdvdG8gZnJlZTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBFUlIoZXJyKSBcCitkbyB7IFwKKwkvKiBleHRlcm5hbCByZWZlcmVuY2U6IGVycm9yLCBhbmQgbGFiZWwgYmFkICovIFwKKwllcnJvciA9IChlcnIpOyBcCisJZ290byBiYWQ7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUFUQ0hfRkFNSUxZKHgsIHksIHcpIFwKKwkoKHgpID09ICh5KSB8fCAoKHcpICYmICgoeCkgPT0gUEZfVU5TUEVDIHx8ICh5KSA9PSBQRl9VTlNQRUMpKSkKKyNkZWZpbmUgTUFUQ0goeCwgeSwgdykgXAorCSgoeCkgPT0gKHkpIHx8ICgodykgJiYgKCh4KSA9PSBBTlkgfHwgKHkpID09IEFOWSkpKQorCisjaWYgIGRlZmluZWQoREVGSU5FX0FERElUSU9OQUxfSVBWNl9TVFVGRikKK2NoYXIgKgorZ2FpX3N0cmVycm9yKGVjb2RlKQorCWludCBlY29kZTsKK3sKKwlpZiAoZWNvZGUgPCAwIHx8IGVjb2RlID4gRUFJX01BWCkKKwkJZWNvZGUgPSBFQUlfTUFYOworCXJldHVybiBhaV9lcnJsaXN0W2Vjb2RlXTsKK30KKyNlbmRpZgorCit2b2lkCitmcmVlYWRkcmluZm8oYWkpCisJc3RydWN0IGFkZHJpbmZvICphaTsKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gKm5leHQ7CisKKwlkbyB7CisJCW5leHQgPSBhaS0+YWlfbmV4dDsKKwkJaWYgKGFpLT5haV9jYW5vbm5hbWUpCisJCQlmcmVlKGFpLT5haV9jYW5vbm5hbWUpOworCQkvKiBubyBuZWVkIHRvIGZyZWUoYWktPmFpX2FkZHIpICovCisJCWZyZWUoYWkpOworCX0gd2hpbGUgKChhaSA9IG5leHQpICE9IE5VTEwpOworfQorCitzdGF0aWMgaW50CitzdHJfaXNudW1iZXIocCkKKwljb25zdCBjaGFyICpwOworeworCWNoYXIgKnEgPSAoY2hhciAqKXA7CisJd2hpbGUgKCpxKSB7CisJCWlmICghIGlzZGlnaXQoKnEpKQorCQkJcmV0dXJuIE5POworCQlxKys7CisJfQorCXJldHVybiBZRVM7Cit9CisKK2ludAorZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHNlcnZuYW1lLCBoaW50cywgcmVzKQorCWNvbnN0IGNoYXIgKmhvc3RuYW1lLCAqc2Vydm5hbWU7CisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50czsKKwlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Cit7CisJc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOworCXN0cnVjdCBhZGRyaW5mbyAqY3VyOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGFkZHJpbmZvIGFpOworCXN0cnVjdCBhZGRyaW5mbyBhaTA7CisJc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCWNvbnN0IHN0cnVjdCBleHBsb3JlICpleDsKKworI2lmZGVmIEZBSVRICisJc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOworCisJaWYgKGZpcnN0dGltZSkgeworCQkvKiB0cmFuc2xhdG9yIGhhY2sgKi8KKwkJY2hhciAqcSA9IGdldGVudigiR0FJIik7CisJCWlmIChxICYmIGluZXRfcHRvbihBRl9JTkVUNiwgcSwgJmZhaXRoX3ByZWZpeCkgPT0gMSkKKwkJCXRyYW5zbGF0ZSA9IFlFUzsKKwkJZmlyc3R0aW1lID0gMDsKKwl9CisjZW5kaWYKKworCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworCWN1ciA9ICZzZW50aW5lbDsKKwlwYWkgPSAmYWk7CisJcGFpLT5haV9mbGFncyA9IDA7CisJcGFpLT5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJcGFpLT5haV9zb2NrdHlwZSA9IEFOWTsKKwlwYWktPmFpX3Byb3RvY29sID0gQU5ZOworCXBhaS0+YWlfYWRkcmxlbiA9IDA7CisJcGFpLT5haV9jYW5vbm5hbWUgPSBOVUxMOworCXBhaS0+YWlfYWRkciA9IE5VTEw7CisJcGFpLT5haV9uZXh0ID0gTlVMTDsKKwkKKwlpZiAoaG9zdG5hbWUgPT0gTlVMTCAmJiBzZXJ2bmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gRUFJX05PTkFNRTsKKwlpZiAoaGludHMpIHsKKwkJLyogZXJyb3IgY2hlY2sgZm9yIGhpbnRzICovCisJCWlmIChoaW50cy0+YWlfYWRkcmxlbiB8fCBoaW50cy0+YWlfY2Fub25uYW1lIHx8CisJCSAgICBoaW50cy0+YWlfYWRkciB8fCBoaW50cy0+YWlfbmV4dCkKKwkJCUVSUihFQUlfQkFESElOVFMpOyAvKiB4eHggKi8KKwkJaWYgKGhpbnRzLT5haV9mbGFncyAmIH5BSV9NQVNLKQorCQkJRVJSKEVBSV9CQURGTEFHUyk7CisJCXN3aXRjaCAoaGludHMtPmFpX2ZhbWlseSkgeworCQljYXNlIFBGX1VOU1BFQzoKKwkJY2FzZSBQRl9JTkVUOgorI2lmZGVmIElORVQ2CisJCWNhc2UgUEZfSU5FVDY6CisjZW5kaWYKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRVJSKEVBSV9GQU1JTFkpOworCQl9CisJCW1lbWNweShwYWksIGhpbnRzLCBzaXplb2YoKnBhaSkpOworCisJCS8qCisJCSAqIGlmIGJvdGggc29ja3R5cGUvcHJvdG9jb2wgYXJlIHNwZWNpZmllZCwgY2hlY2sgaWYgdGhleQorCQkgKiBhcmUgbWVhbmluZ2Z1bCBjb21iaW5hdGlvbi4KKwkJICovCisJCWlmIChwYWktPmFpX3NvY2t0eXBlICE9IEFOWSAmJiBwYWktPmFpX3Byb3RvY29sICE9IEFOWSkgeworCQkJZm9yIChleCA9IGV4cGxvcmU7IGV4LT5lX2FmID49IDA7IGV4KyspIHsKKwkJCQlpZiAocGFpLT5haV9mYW1pbHkgIT0gZXgtPmVfYWYpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleC0+ZV9zb2NrdHlwZSA9PSBBTlkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleC0+ZV9wcm90b2NvbCA9PSBBTlkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IGV4LT5lX3NvY2t0eXBlCisJCQkJICYmIHBhaS0+YWlfcHJvdG9jb2wgIT0gZXgtPmVfcHJvdG9jb2wpIHsKKwkJCQkJRVJSKEVBSV9CQURISU5UUyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBjaGVjayBmb3Igc3BlY2lhbCBjYXNlcy4gICgxKSBudW1lcmljIHNlcnZuYW1lIGlzIGRpc2FsbG93ZWQgaWYKKwkgKiBzb2NrdHlwZS9wcm90b2NvbCBhcmUgbGVmdCB1bnNwZWNpZmllZC4gKDIpIHNlcnZuYW1lIGlzIGRpc2FsbG93ZWQKKwkgKiBmb3IgcmF3IGFuZCBvdGhlciBpbmV0eyw2fSBzb2NrZXRzLgorCSAqLworCWlmIChNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIFBGX0lORVQsIDEpCisjaWZkZWYgUEZfSU5FVDYKKwkgfHwgTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBQRl9JTkVUNiwgMSkKKyNlbmRpZgorCSAgICApIHsKKwkJYWkwID0gKnBhaTsKKworCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKSB7CisjaWZkZWYgUEZfSU5FVDYKKwkJCXBhaS0+YWlfZmFtaWx5ID0gUEZfSU5FVDY7CisjZWxzZQorCQkJcGFpLT5haV9mYW1pbHkgPSBQRl9JTkVUOworI2VuZGlmCisJCX0KKwkJZXJyb3IgPSBnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpOworCQlpZiAoZXJyb3IpCisJCQlFUlIoZXJyb3IpOworCisJCSpwYWkgPSBhaTA7CisJfQorCisJYWkwID0gKnBhaTsKKworCS8qIE5VTEwgaG9zdG5hbWUsIG9yIG51bWVyaWMgaG9zdG5hbWUgKi8KKwlmb3IgKGV4ID0gZXhwbG9yZTsgZXgtPmVfYWYgPj0gMDsgZXgrKykgeworCQkqcGFpID0gYWkwOworCisJCWlmICghTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBleC0+ZV9hZiwgV0lMRF9BRihleCkpKQorCQkJY29udGludWU7CisJCWlmICghTUFUQ0gocGFpLT5haV9zb2NrdHlwZSwgZXgtPmVfc29ja3R5cGUsIFdJTERfU09DS1RZUEUoZXgpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIU1BVENIKHBhaS0+YWlfcHJvdG9jb2wsIGV4LT5lX3Byb3RvY29sLCBXSUxEX1BST1RPQ09MKGV4KSkpCisJCQljb250aW51ZTsKKworCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKQorCQkJcGFpLT5haV9mYW1pbHkgPSBleC0+ZV9hZjsKKwkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gQU5ZICYmIGV4LT5lX3NvY2t0eXBlICE9IEFOWSkKKwkJCXBhaS0+YWlfc29ja3R5cGUgPSBleC0+ZV9zb2NrdHlwZTsKKwkJaWYgKHBhaS0+YWlfcHJvdG9jb2wgPT0gQU5ZICYmIGV4LT5lX3Byb3RvY29sICE9IEFOWSkKKwkJCXBhaS0+YWlfcHJvdG9jb2wgPSBleC0+ZV9wcm90b2NvbDsKKworCQlpZiAoaG9zdG5hbWUgPT0gTlVMTCkKKwkJCWVycm9yID0gZXhwbG9yZV9udWxsKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCAmY3VyLT5haV9uZXh0KTsKKwkJZWxzZQorCQkJZXJyb3IgPSBleHBsb3JlX251bWVyaWNfc2NvcGUocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsICZjdXItPmFpX25leHQpOworCisJCWlmIChlcnJvcikKKwkJCWdvdG8gZnJlZTsKKworCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKKwkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKKwl9CisKKwkvKgorCSAqIFhYWAorCSAqIElmIG51bXJlaWMgcmVwcmVzZW50YXRpb24gb2YgQUYxIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBGUUROCisJICogcmVwcmVzZW50YXRpb24gb2YgQUYyLCB3ZSBuZWVkIHRvIHRoaW5rIGFnYWluIGFib3V0IHRoZSBjb2RlIGJlbG93LgorCSAqLworCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQlnb3RvIGdvb2Q7CisKKwlpZiAocGFpLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKQorCQlFUlIoRUFJX05PTkFNRSk7CisJaWYgKGhvc3RuYW1lID09IE5VTEwpCisJCUVSUihFQUlfTk9OQU1FKTsKKworCS8qCisJICogaG9zdG5hbWUgYXMgYWxwaGFiZXRpY2FsIG5hbWUuCisJICogd2Ugd291bGQgbGlrZSB0byBwcmVmZXIgQUZfSU5FVDYgdGhhbiBBRl9JTkVULCBzbyB3ZSdsbCBtYWtlIGEKKwkgKiBvdXRlciBsb29wIGJ5IEFGcy4KKwkgKi8KKwlmb3IgKGFmZCA9IGFmZGw7IGFmZC0+YV9hZjsgYWZkKyspIHsKKwkJKnBhaSA9IGFpMDsKKworCQlpZiAoIU1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgYWZkLT5hX2FmLCAxKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoZXggPSBleHBsb3JlOyBleC0+ZV9hZiA+PSAwOyBleCsrKSB7CisJCQkqcGFpID0gYWkwOworCisJCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKQorCQkJCXBhaS0+YWlfZmFtaWx5ID0gYWZkLT5hX2FmOworCisJCQlpZiAoIU1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgZXgtPmVfYWYsIFdJTERfQUYoZXgpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghTUFUQ0gocGFpLT5haV9zb2NrdHlwZSwgZXgtPmVfc29ja3R5cGUsCisJCQkJCVdJTERfU09DS1RZUEUoZXgpKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFNQVRDSChwYWktPmFpX3Byb3RvY29sLCBleC0+ZV9wcm90b2NvbCwKKwkJCQkJV0lMRF9QUk9UT0NPTChleCkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpCisJCQkJcGFpLT5haV9mYW1pbHkgPSBleC0+ZV9hZjsKKwkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IEFOWSAmJiBleC0+ZV9zb2NrdHlwZSAhPSBBTlkpCisJCQkJcGFpLT5haV9zb2NrdHlwZSA9IGV4LT5lX3NvY2t0eXBlOworCQkJaWYgKHBhaS0+YWlfcHJvdG9jb2wgPT0gQU5ZICYmIGV4LT5lX3Byb3RvY29sICE9IEFOWSkKKwkJCQlwYWktPmFpX3Byb3RvY29sID0gZXgtPmVfcHJvdG9jb2w7CisKKwkJCWVycm9yID0gZXhwbG9yZV9mcWRuKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLAorCQkJCSZjdXItPmFpX25leHQpOworCisJCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKKwkJCQljdXIgPSBjdXItPmFpX25leHQ7CisJCX0KKwl9CisKKwkvKiBYWFggKi8KKwlpZiAoc2VudGluZWwuYWlfbmV4dCkKKwkJZXJyb3IgPSAwOworCisJaWYgKGVycm9yKQorCQlnb3RvIGZyZWU7CisJaWYgKGVycm9yID09IDApIHsKKwkJaWYgKHNlbnRpbmVsLmFpX25leHQpIHsKKyBnb29kOgorCQkJKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfSBlbHNlCisJCQllcnJvciA9IEVBSV9GQUlMOworCX0KKyBmcmVlOgorIGJhZDoKKwlpZiAoc2VudGluZWwuYWlfbmV4dCkKKwkJZnJlZWFkZHJpbmZvKHNlbnRpbmVsLmFpX25leHQpOworCSpyZXMgPSBOVUxMOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZRRE4gaG9zdG5hbWUsIEROUyBsb29rdXAKKyAqLworc3RhdGljIGludAorZXhwbG9yZV9mcWRuKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworeworCXN0cnVjdCBob3N0ZW50ICpocDsKKwlpbnQgaF9lcnJvcjsKKwlpbnQgYWY7CisJY2hhciAqKmFwbGlzdCA9IE5VTEwsICphcGJ1ZiA9IE5VTEw7CisJY2hhciAqYXA7CisJc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsLCAqY3VyOworCWludCBpOworI2lmbmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlpbnQgbmFkZHJzOworI2VuZGlmCisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCWludCBlcnJvcjsKKworCSpyZXMgPSBOVUxMOworCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworCWN1ciA9ICZzZW50aW5lbDsKKworCS8qCisJICogRG8gbm90IGZpbHRlciB1bnN1cHBvcnRlZCBBRnMgaGVyZS4gIFdlIG5lZWQgdG8gaG9ub3IgY29udGVudCBvZgorCSAqIGRhdGFiYXNlcyAoL2V0Yy9ob3N0cywgRE5TIGFuZCBvdGhlcnMpLiAgT3RoZXJ3aXNlIHdlIGNhbm5vdAorCSAqIHJlcGxhY2UgZ2V0aG9zdGJ5bmFtZSgpIGJ5IGdldGFkZHJpbmZvKCkuCisJICovCisKKwkvKgorCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgorCSAqLworCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCisJCXJldHVybiAwOworCisJYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOworCisJLyoKKwkgKiBwb3N0LVJGQzI1NTM6IHNob3VsZCBsb29rIGF0IChwYWktPmFpX2ZsYWdzICYgQUlfQUREUkNPTkZJRykKKwkgKiByYXRoZXIgdGhhbiBoYXJkY29kaW5nIGl0LiAgd2UgbWF5IG5lZWQgdG8gYWRkIEFJX0FERFJDT05GSUcKKwkgKiBoYW5kbGluZyBjb2RlIGJ5IG91cnNlbHZlcyBpbiBjYXNlIHdlIGRvbid0IGhhdmUgZ2V0aXBub2RlYnluYW1lKCkuCisJICovCisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5LCBBSV9BRERSQ09ORklHLCAmaF9lcnJvcik7CisjZWxzZQorI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRTIKKwlocCA9IGdldGhvc3RieW5hbWUyKGhvc3RuYW1lLCBwYWktPmFpX2ZhbWlseSk7CisjZWxzZQorCWlmIChwYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gMDsKKwlocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworI2lmZGVmIEhBVkVfSF9FUlJOTworCWhfZXJyb3IgPSBoX2Vycm5vOworI2Vsc2UKKwloX2Vycm9yID0gRUlOVkFMOworI2VuZGlmCisjZW5kaWYgLypIQVZFX0dFVEhPU1RCWU5BTUUyKi8KKyNlbmRpZiAvKlVTRV9HRVRJUE5PREVCWSovCisKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlzd2l0Y2ggKGhfZXJyb3IpIHsKKwkJY2FzZSBIT1NUX05PVF9GT1VORDoKKwkJY2FzZSBOT19EQVRBOgorCQkJZXJyb3IgPSBFQUlfTk9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgVFJZX0FHQUlOOgorCQkJZXJyb3IgPSBFQUlfQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSBOT19SRUNPVkVSWToKKwkJY2FzZSBORVREQl9JTlRFUk5BTDoKKwkJZGVmYXVsdDoKKwkJCWVycm9yID0gRUFJX0ZBSUw7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoKGhwLT5oX25hbWUgPT0gTlVMTCkgfHwgKGhwLT5oX25hbWVbMF0gPT0gMCkKKwkJCXx8IChocC0+aF9hZGRyX2xpc3RbMF0gPT0gTlVMTCkpIHsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJCWhwID0gTlVMTDsKKwkJZXJyb3IgPSBFQUlfRkFJTDsKKwl9CisKKwlpZiAoaHAgPT0gTlVMTCkKKwkJZ290byBmcmVlOworCisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJYXBsaXN0ID0gaHAtPmhfYWRkcl9saXN0OworI2Vsc2UKKwkvKgorCSAqIGhwIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgd2UgdXNlIGdldGhvc3RieW5hbWUyKCkuCisJICogYWx3YXlzIGRlZXAgY29weSBmb3Igc2ltcGxpZmljYXRpb24uCisJICovCisJZm9yIChuYWRkcnMgPSAwOyBocC0+aF9hZGRyX2xpc3RbbmFkZHJzXSAhPSBOVUxMOyBuYWRkcnMrKykKKwkJOworCW5hZGRycysrOworCWFwbGlzdCA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoYXBsaXN0WzBdKSAqIG5hZGRycyk7CisJYXBidWYgPSAoY2hhciAqKW1hbGxvYyhocC0+aF9sZW5ndGggKiBuYWRkcnMpOworCWlmIChhcGxpc3QgPT0gTlVMTCB8fCBhcGJ1ZiA9PSBOVUxMKSB7CisJCWVycm9yID0gRUFJX01FTU9SWTsKKwkJZ290byBmcmVlOworCX0KKwltZW1zZXQoYXBsaXN0LCAwLCBzaXplb2YoYXBsaXN0WzBdKSAqIG5hZGRycyk7CisJZm9yIChpID0gMDsgaSA8IG5hZGRyczsgaSsrKSB7CisJCWlmIChocC0+aF9hZGRyX2xpc3RbaV0gPT0gTlVMTCkgeworCQkJYXBsaXN0W2ldID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbWNweSgmYXBidWZbaSAqIGhwLT5oX2xlbmd0aF0sIGhwLT5oX2FkZHJfbGlzdFtpXSwKKwkJCWhwLT5oX2xlbmd0aCk7CisJCWFwbGlzdFtpXSA9ICZhcGJ1ZltpICogaHAtPmhfbGVuZ3RoXTsKKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGFwbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJYWYgPSBocC0+aF9hZGRydHlwZTsKKwkJYXAgPSBhcGxpc3RbaV07CisjaWZkZWYgQUZfSU5FVDYKKwkJaWYgKGFmID09IEFGX0lORVQ2CisJCSAmJiBJTjZfSVNfQUREUl9WNE1BUFBFRCgoc3RydWN0IGluNl9hZGRyICopYXApKSB7CisJCQlhZiA9IEFGX0lORVQ7CisJCQlhcCA9IGFwICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikKKwkJCQktIHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCX0KKyNlbmRpZgorCisJCWlmIChhZiAhPSBwYWktPmFpX2ZhbWlseSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocGFpLT5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkgPT0gMCkgeworCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgYWZkLCBhcCk7CisJCQlHRVRfUE9SVChjdXItPmFpX25leHQsIHNlcnZuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCisJCQkgKiBmYWlsLCByZXR1cm4gYWkgYW55d2F5IHRvIHBhY2lmeQorCQkJICogY2FsbGluZyBhcHBsaWNhdGlvbi4KKwkJCSAqCisJCQkgKiBYWFggZ2V0YWRkcmluZm8oKSBpcyBhIG5hbWUtPmFkZHJlc3MKKwkJCSAqIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3MKKwkJCSAqIHN0cmFuZ2UgdGhhdCB3ZSBkbyBhZGRyLT5uYW1lCisJCQkgKiB0cmFuc2xhdGlvbiBoZXJlLgorCQkJICovCisJCQlnZXRfbmFtZShhcCwgYWZkLCAmY3VyLT5haV9uZXh0LAorCQkJCWFwLCBwYWksIHNlcnZuYW1lKTsKKwkJfQorCisJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQorCQkJY3VyID0gY3VyLT5haV9uZXh0OworCX0KKworCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OworCXJldHVybiAwOworCitmcmVlOgorI2lmZGVmIFVTRV9HRVRJUE5PREVCWQorCWlmIChocCkKKwkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJaWYgKGFwbGlzdCkKKwkJZnJlZShhcGxpc3QpOworCWlmIChhcGJ1ZikKKwkJZnJlZShhcGJ1Zik7CisJaWYgKHNlbnRpbmVsLmFpX25leHQpCisJCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBob3N0bmFtZSA9PSBOVUxMLgorICogcGFzc2l2ZSBzb2NrZXQgLT4gYW55YWRkciAoMC4wLjAuMCBvciA6OikKKyAqIG5vbi1wYXNzaXZlIHNvY2tldCAtPiBsb2NhbGhvc3QgKDEyNy4wLjAuMSBvciA6OjEpCisgKi8KK3N0YXRpYyBpbnQKK2V4cGxvcmVfbnVsbChwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCWNvbnN0IGNoYXIgKnNlcnZuYW1lOworCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKK3sKKwlpbnQgczsKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJc3RydWN0IGFkZHJpbmZvICpjdXI7CisJc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOworCWludCBlcnJvcjsKKworCSpyZXMgPSBOVUxMOworCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworCWN1ciA9ICZzZW50aW5lbDsKKworCS8qCisJICogZmlsdGVyIG91dCBBRnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsCisJICogWFhYIGVycm5vPworCSAqLworCXMgPSBzb2NrZXQocGFpLT5haV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworCWlmIChzIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU1GSUxFKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCWNsb3NlKHMpOworCisJLyoKKwkgKiBpZiB0aGUgc2Vydm5hbWUgZG9lcyBub3QgbWF0Y2ggc29ja3R5cGUvcHJvdG9jb2wsIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAoZ2V0X3BvcnRtYXRjaChwYWksIHNlcnZuYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWFmZCA9IGZpbmRfYWZkKHBhaS0+YWlfZmFtaWx5KTsKKworCWlmIChwYWktPmFpX2ZsYWdzICYgQUlfUEFTU0lWRSkgeworCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIGFmZC0+YV9hZGRyYW55KTsKKwkJLyogeHh4IG1lYW5pbmdsZXNzPworCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImFueWFkZHIiKTsKKwkJICovCisJCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOworCX0gZWxzZSB7CisJCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgYWZkLT5hX2xvb3BiYWNrKTsKKwkJLyogeHh4IG1lYW5pbmdsZXNzPworCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImxvY2FsaG9zdCIpOworCQkgKi8KKwkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7CisJfQorCWN1ciA9IGN1ci0+YWlfbmV4dDsKKworCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OworCXJldHVybiAwOworCitmcmVlOgorCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogbnVtZXJpYyBob3N0bmFtZQorICovCitzdGF0aWMgaW50CitleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcykKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKKwlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Cit7CisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCXN0cnVjdCBhZGRyaW5mbyAqY3VyOworCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKKwlpbnQgZXJyb3I7CisJY2hhciBwdG9uW1BUT05fTUFYXTsKKwlpbnQgZmxhZ3M7CisKKwkqcmVzID0gTlVMTDsKKwlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKKwljdXIgPSAmc2VudGluZWw7CisKKwkvKgorCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgorCSAqLworCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCisJCXJldHVybiAwOworCisJYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOworCWZsYWdzID0gcGFpLT5haV9mbGFnczsKKworCWlmIChpbmV0X3B0b24oYWZkLT5hX2FmLCBob3N0bmFtZSwgcHRvbikgPT0gMSkgeworCQl1X2ludDMyX3QgdjRhOworI2lmZGVmIElORVQ2CisJCXVfY2hhciBwZng7CisjZW5kaWYKKworCQlzd2l0Y2ggKGFmZC0+YV9hZikgeworCQljYXNlIEFGX0lORVQ6CisJCQl2NGEgPSAodV9pbnQzMl90KW50b2hsKCgoc3RydWN0IGluX2FkZHIgKilwdG9uKS0+c19hZGRyKTsKKwkJCWlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKKwkJCQlmbGFncyAmPSB+QUlfQ0FOT05OQU1FOworCQkJdjRhID4+PSBJTl9DTEFTU0FfTlNISUZUOworCQkJaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKKwkJCQlmbGFncyAmPSB+QUlfQ0FOT05OQU1FOworCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCXBmeCA9ICgoc3RydWN0IGluNl9hZGRyICopcHRvbiktPnM2X2FkZHJbMF07CisJCQlpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCisJCQkJZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gYWZkLT5hX2FmIHx8CisJCSAgICBwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMgLyo/Ki8pIHsKKwkJCWlmICgoZmxhZ3MgJiBBSV9DQU5PTk5BTUUpID09IDApIHsKKwkJCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIHB0b24pOworCQkJCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIGlmIEFJX0NBTk9OTkFNRSBhbmQgaWYgcmV2ZXJzZSBsb29rdXAKKwkJCQkgKiBmYWlsLCByZXR1cm4gYWkgYW55d2F5IHRvIHBhY2lmeQorCQkJCSAqIGNhbGxpbmcgYXBwbGljYXRpb24uCisJCQkJICoKKwkJCQkgKiBYWFggZ2V0YWRkcmluZm8oKSBpcyBhIG5hbWUtPmFkZHJlc3MKKwkJCQkgKiB0cmFuc2xhdGlvbiBmdW5jdGlvbiwgYW5kIGl0IGxvb2tzCisJCQkJICogc3RyYW5nZSB0aGF0IHdlIGRvIGFkZHItPm5hbWUKKwkJCQkgKiB0cmFuc2xhdGlvbiBoZXJlLgorCQkJCSAqLworCQkJCWdldF9uYW1lKHB0b24sIGFmZCwgJmN1ci0+YWlfbmV4dCwKKwkJCQkJcHRvbiwgcGFpLCBzZXJ2bmFtZSk7CisJCQl9CisJCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKKwkJCQljdXIgPSBjdXItPmFpX25leHQ7CisJCX0gZWxzZSAKKwkJCUVSUihFQUlfRkFNSUxZKTsJLyp4eHgqLworCX0KKworCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OworCXJldHVybiAwOworCitmcmVlOgorYmFkOgorCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogbnVtZXJpYyBob3N0bmFtZSB3aXRoIHNjb3BlCisgKi8KK3N0YXRpYyBpbnQKK2V4cGxvcmVfbnVtZXJpY19zY29wZShwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCWNvbnN0IGNoYXIgKnNlcnZuYW1lOworCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKK3sKKyNpZm5kZWYgU0NPUEVfREVMSU1JVEVSCisJcmV0dXJuIGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKTsKKyNlbHNlCisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCXN0cnVjdCBhZGRyaW5mbyAqY3VyOworCWludCBlcnJvcjsKKwljaGFyICpjcCwgKmhvc3RuYW1lMiA9IE5VTEw7CisJaW50IHNjb3BlOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisKKwkvKgorCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgorCSAqLworCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCisJCXJldHVybiAwOworCisJYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOworCWlmICghYWZkLT5hX3Njb3BlZCkKKwkJcmV0dXJuIGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKTsKKworCWNwID0gc3RyY2hyKGhvc3RuYW1lLCBTQ09QRV9ERUxJTUlURVIpOworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpOworCisJLyoKKwkgKiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIDxzY29wZWRfYWRkcmVzcz48ZGVsaW1pdGVyPjxzY29wZSBpZD4KKwkgKi8KKwlob3N0bmFtZTIgPSBzdHJkdXAoaG9zdG5hbWUpOworCWlmIChob3N0bmFtZTIgPT0gTlVMTCkKKwkJcmV0dXJuIEVBSV9NRU1PUlk7CisJLyogdGVybWluYXRlIGF0IHRoZSBkZWxpbWl0ZXIgKi8KKwlob3N0bmFtZTJbY3AgLSBob3N0bmFtZV0gPSAnXDAnOworCisJY3ArKzsKKwlzd2l0Y2ggKHBhaS0+YWlfZmFtaWx5KSB7CisjaWZkZWYgSU5FVDYKKwljYXNlIEFGX0lORVQ2OgorCQlzY29wZSA9IGlmX25hbWV0b2luZGV4KGNwKTsKKwkJaWYgKHNjb3BlID09IDApIHsKKwkJCWZyZWUoaG9zdG5hbWUyKTsKKwkJCXJldHVybiAoRUFJX05PTkFNRSk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwllcnJvciA9IGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lMiwgc2Vydm5hbWUsIHJlcyk7CisJaWYgKGVycm9yID09IDApIHsKKwkJZm9yIChjdXIgPSAqcmVzOyBjdXI7IGN1ciA9IGN1ci0+YWlfbmV4dCkgeworCQkJaWYgKGN1ci0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJCWNvbnRpbnVlOworCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopY3VyLT5haV9hZGRyOworCQkJaWYgKElONl9JU19BRERSX0xJTktMT0NBTCgmc2luNi0+c2luNl9hZGRyKSB8fAorCQkJICAgIElONl9JU19BRERSX01DX0xJTktMT0NBTCgmc2luNi0+c2luNl9hZGRyKSkKKwkJCQlzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGU7CisJCX0KKwl9CisKKwlmcmVlKGhvc3RuYW1lMik7CisKKwlyZXR1cm4gZXJyb3I7CisjZW5kaWYKK30KKworc3RhdGljIGludAorZ2V0X25hbWUoYWRkciwgYWZkLCByZXMsIG51bWFkZHIsIHBhaSwgc2Vydm5hbWUpCisJY29uc3QgY2hhciAqYWRkcjsKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworCWNoYXIgKm51bWFkZHI7CisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7Cit7CisJc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKwlzdHJ1Y3QgYWRkcmluZm8gKmN1ciA9IE5VTEw7CisJaW50IGVycm9yID0gMDsKKwljaGFyICphcCA9IE5VTEwsICpjbiA9IE5VTEw7CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJaW50IGhfZXJyb3I7CisKKwlocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBhZmQtPmFfYWRkcmxlbiwgYWZkLT5hX2FmLCAmaF9lcnJvcik7CisjZWxzZQorCWhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBhZmQtPmFfYWRkcmxlbiwgYWZkLT5hX2FmKTsKKyNlbmRpZgorCWlmIChocCAmJiBocC0+aF9uYW1lICYmIGhwLT5oX25hbWVbMF0gJiYgaHAtPmhfYWRkcl9saXN0WzBdKSB7CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJCUdFVF9BSShjdXIsIGFmZCwgaHAtPmhfYWRkcl9saXN0WzBdKTsKKwkJR0VUX1BPUlQoY3VyLCBzZXJ2bmFtZSk7CisJCUdFVF9DQU5PTk5BTUUoY3VyLCBocC0+aF9uYW1lKTsKKyNlbHNlCisJCS8qIGhwIHdpbGwgYmUgZGFtYWdlZCBpZiB3ZSB1c2UgZ2V0aG9zdGJ5YWRkcigpICovCisJCWlmICgoYXAgPSAoY2hhciAqKW1hbGxvYyhocC0+aF9sZW5ndGgpKSA9PSBOVUxMKSB7CisJCQllcnJvciA9IEVBSV9NRU1PUlk7CisJCQlnb3RvIGZyZWU7CisJCX0KKwkJbWVtY3B5KGFwLCBocC0+aF9hZGRyX2xpc3RbMF0sIGhwLT5oX2xlbmd0aCk7CisJCWlmICgoY24gPSBzdHJkdXAoaHAtPmhfbmFtZSkpID09IE5VTEwpIHsKKwkJCWVycm9yID0gRUFJX01FTU9SWTsKKwkJCWdvdG8gZnJlZTsKKwkJfQorCisJCUdFVF9BSShjdXIsIGFmZCwgYXApOworCQlHRVRfUE9SVChjdXIsIHNlcnZuYW1lKTsKKwkJR0VUX0NBTk9OTkFNRShjdXIsIGNuKTsKKwkJZnJlZShhcCk7IGFwID0gTlVMTDsKKwkJZnJlZShjbik7IGNuID0gTlVMTDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUdFVF9BSShjdXIsIGFmZCwgbnVtYWRkcik7CisJCUdFVF9QT1JUKGN1ciwgc2Vydm5hbWUpOworCX0KKwkKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlpZiAoaHApCisJCWZyZWVob3N0ZW50KGhwKTsKKyNlbmRpZgorCSpyZXMgPSBjdXI7CisJcmV0dXJuIFNVQ0NFU1M7CisgZnJlZToKKwlpZiAoY3VyKQorCQlmcmVlYWRkcmluZm8oY3VyKTsKKwlpZiAoYXApCisJCWZyZWUoYXApOworCWlmIChjbikKKwkJZnJlZShjbik7CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJaWYgKGhwKQorCQlmcmVlaG9zdGVudChocCk7CisjZW5kaWYKKwkqcmVzID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9jYW5vbm5hbWUocGFpLCBhaSwgc3RyKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOworCXN0cnVjdCBhZGRyaW5mbyAqYWk7CisJY29uc3QgY2hhciAqc3RyOworeworCWlmICgocGFpLT5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkgIT0gMCkgeworCQlhaS0+YWlfY2Fub25uYW1lID0gc3RyZHVwKHN0cik7CisJCWlmIChhaS0+YWlfY2Fub25uYW1lID09IE5VTEwpCisJCQlyZXR1cm4gRUFJX01FTU9SWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKgorZ2V0X2FpKHBhaSwgYWZkLCBhZGRyKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOworCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKKwljb25zdCBjaGFyICphZGRyOworeworCWNoYXIgKnA7CisJc3RydWN0IGFkZHJpbmZvICphaTsKKworCWFpID0gKHN0cnVjdCBhZGRyaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGFkZHJpbmZvKQorCQkrIChhZmQtPmFfc29ja2xlbikpOworCWlmIChhaSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweShhaSwgcGFpLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7CisJYWktPmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKGFpICsgMSk7CisJbWVtc2V0KGFpLT5haV9hZGRyLCAwLCBhZmQtPmFfc29ja2xlbik7CisjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KKwlhaS0+YWlfYWRkci0+c2FfbGVuID0gYWZkLT5hX3NvY2tsZW47CisjZW5kaWYKKwlhaS0+YWlfYWRkcmxlbiA9IGFmZC0+YV9zb2NrbGVuOworCWFpLT5haV9hZGRyLT5zYV9mYW1pbHkgPSBhaS0+YWlfZmFtaWx5ID0gYWZkLT5hX2FmOworCXAgPSAoY2hhciAqKShhaS0+YWlfYWRkcik7CisJbWVtY3B5KHAgKyBhZmQtPmFfb2ZmLCBhZGRyLCBhZmQtPmFfYWRkcmxlbik7CisJcmV0dXJuIGFpOworfQorCitzdGF0aWMgaW50CitnZXRfcG9ydG1hdGNoKGFpLCBzZXJ2bmFtZSkKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmFpOworCWNvbnN0IGNoYXIgKnNlcnZuYW1lOworeworCisJLyogZ2V0X3BvcnQgZG9lcyBub3QgdG91Y2ggZmlyc3QgYXJndW1lbnQuIHdoZW4gbWF0Y2hvbmx5ID09IDEuICovCisJcmV0dXJuIGdldF9wb3J0KChzdHJ1Y3QgYWRkcmluZm8gKilhaSwgc2Vydm5hbWUsIDEpOworfQorCitzdGF0aWMgaW50CitnZXRfcG9ydChhaSwgc2Vydm5hbWUsIG1hdGNob25seSkKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworCWNvbnN0IGNoYXIgKnNlcnZuYW1lOworCWludCBtYXRjaG9ubHk7Cit7CisJY29uc3QgY2hhciAqcHJvdG87CisJc3RydWN0IHNlcnZlbnQgKnNwOworCWludCBwb3J0OworCWludCBhbGxvd251bWVyaWM7CisKKwlpZiAoc2Vydm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJc3dpdGNoIChhaS0+YWlfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorI2lmZGVmIEFGX0lORVQ2CisJY2FzZSBBRl9JTkVUNjoKKyNlbmRpZgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGFpLT5haV9zb2NrdHlwZSkgeworCWNhc2UgU09DS19SQVc6CisJCXJldHVybiBFQUlfU0VSVklDRTsKKwljYXNlIFNPQ0tfREdSQU06CisJY2FzZSBTT0NLX1NUUkVBTToKKwkJYWxsb3dudW1lcmljID0gMTsKKwkJYnJlYWs7CisJY2FzZSBBTlk6CisJCWFsbG93bnVtZXJpYyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBFQUlfU09DS1RZUEU7CisJfQorCisJaWYgKHN0cl9pc251bWJlcihzZXJ2bmFtZSkpIHsKKwkJaWYgKCFhbGxvd251bWVyaWMpCisJCQlyZXR1cm4gRUFJX1NFUlZJQ0U7CisJCXBvcnQgPSBodG9ucyhhdG9pKHNlcnZuYW1lKSk7CisJCWlmIChwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzUpCisJCQlyZXR1cm4gRUFJX1NFUlZJQ0U7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChhaS0+YWlfc29ja3R5cGUpIHsKKwkJY2FzZSBTT0NLX0RHUkFNOgorCQkJcHJvdG8gPSAidWRwIjsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfU1RSRUFNOgorCQkJcHJvdG8gPSAidGNwIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJvdG8gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgcHJvdG8pKSA9PSBOVUxMKQorCQkJcmV0dXJuIEVBSV9TRVJWSUNFOworCQlwb3J0ID0gc3AtPnNfcG9ydDsKKwl9CisKKwlpZiAoIW1hdGNob25seSkgeworCQlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkciktPnNpbl9wb3J0ID0gcG9ydDsKKwkJCWJyZWFrOworI2lmZGVmIElORVQ2CisJCWNhc2UgQUZfSU5FVDY6CisJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhaS0+YWlfYWRkciktPnNpbjZfcG9ydCA9IHBvcnQ7CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZkICoKK2ZpbmRfYWZkKGFmKQorCWludCBhZjsKK3sKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisKKwlpZiAoYWYgPT0gUEZfVU5TUEVDKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGFmZCA9IGFmZGw7IGFmZC0+YV9hZjsgYWZkKyspIHsKKwkJaWYgKGFmZC0+YV9hZiA9PSBhZikKKwkJCXJldHVybiBhZmQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisKKyNlbmRpZiAvKl9fTUlORzY0X18qLwpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2dldG5ldGJ5bm0uYyBiL1dpbjMyL1NyYy9nZXRuZXRieW5tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0ZDM5OAotLS0gL2Rldi9udWxsCisrKyBiL1dpbjMyL1NyYy9nZXRuZXRieW5tLmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpZ2V0bmV0YnluYW1lLmMJNS41IChCZXJrZWxleSkgNi8yNy84OCI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSAiaW5ldHByaXZhdGUuaCIKKworZXh0ZXJuIGludCBfbmV0X3N0YXlvcGVuOworCitzdHJ1Y3QgbmV0ZW50ICoKK2dldG5ldGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXJlZ2lzdGVyIHN0cnVjdCBuZXRlbnQgKnA7CisJcmVnaXN0ZXIgY2hhciAqKmNwOworCisJc2V0bmV0ZW50KF9uZXRfc3RheW9wZW4pOworCXdoaWxlIChwID0gZ2V0bmV0ZW50KCkpIHsKKwkJaWYgKHN0cmNtcChwLT5uX25hbWUsIG5hbWUpID09IDApCisJCQlicmVhazsKKwkJZm9yIChjcCA9IHAtPm5fYWxpYXNlczsgKmNwICE9IDA7IGNwKyspCisJCQlpZiAoc3RyY21wKCpjcCwgbmFtZSkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCX0KK2ZvdW5kOgorCWlmICghX25ldF9zdGF5b3BlbikKKwkJZW5kbmV0ZW50KCk7CisJcmV0dXJuIChwKTsKK30KZGlmZiAtLWdpdCBhL1dpbjMyL1NyYy9nZXRuZXRlbnQuYyBiL1dpbjMyL1NyYy9nZXRuZXRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGNjZWIzCi0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvU3JjL2dldG5ldGVudC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylnZXRuZXRlbnQuYwk1LjUgKEJlcmtlbGV5KSA2LzI3Lzg4IjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlICJpbmV0cHJpdmF0ZS5oIgorCisjZGVmaW5lCU1BWEFMSUFTRVMJMzUKKworc3RhdGljIGNoYXIgTkVUREJbXSA9IF9QQVRIX05FVFdPUktTOworc3RhdGljIEZJTEUgKm5ldGYgPSBOVUxMOworc3RhdGljIGNoYXIgbGluZVtCVUZTSVorMV07CitzdGF0aWMgc3RydWN0IG5ldGVudCBuZXQ7CitzdGF0aWMgY2hhciAqbmV0X2FsaWFzZXNbTUFYQUxJQVNFU107CitzdGF0aWMgY2hhciAqYW55KGNoYXIgKiwgY2hhciAqKTsKKworaW50IF9uZXRfc3RheW9wZW47CitleHRlcm4gdV9pbnQzMl90IGluZXRfbmV0d29yayhjb25zdCBjaGFyICpjcCk7CisKK3ZvaWQKK3NldG5ldGVudChmKQorCWludCBmOworeworCWlmIChuZXRmID09IE5VTEwpCisJCW5ldGYgPSBmb3BlbihORVREQiwgInIiICk7CisJZWxzZQorCQlyZXdpbmQobmV0Zik7CisJX25ldF9zdGF5b3BlbiB8PSBmOworfQorCit2b2lkCitlbmRuZXRlbnQoKQoreworCWlmIChuZXRmKSB7CisJCWZjbG9zZShuZXRmKTsKKwkJbmV0ZiA9IE5VTEw7CisJfQorCV9uZXRfc3RheW9wZW4gPSAwOworfQorCitzdHJ1Y3QgbmV0ZW50ICoKK2dldG5ldGVudCgpCit7CisJY2hhciAqcDsKKwlyZWdpc3RlciBjaGFyICpjcCwgKipxOworCisJaWYgKG5ldGYgPT0gTlVMTCAmJiAobmV0ZiA9IGZvcGVuKE5FVERCLCAiciIgKSkgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKK2FnYWluOgorCXAgPSBmZ2V0cyhsaW5lLCBCVUZTSVosIG5ldGYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKCpwID09ICcjJykKKwkJZ290byBhZ2FpbjsKKwljcCA9IGFueShwLCAiI1xuIik7CisJaWYgKGNwID09IE5VTEwpCisJCWdvdG8gYWdhaW47CisJKmNwID0gJ1wwJzsKKwluZXQubl9uYW1lID0gcDsKKwljcCA9IGFueShwLCAiIFx0Iik7CisJaWYgKGNwID09IE5VTEwpCisJCWdvdG8gYWdhaW47CisJKmNwKysgPSAnXDAnOworCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKQorCQljcCsrOworCXAgPSBhbnkoY3AsICIgXHQiKTsKKwlpZiAocCAhPSBOVUxMKQorCQkqcCsrID0gJ1wwJzsKKwluZXQubl9uZXQgPSBpbmV0X25ldHdvcmsoY3ApOworCW5ldC5uX2FkZHJ0eXBlID0gQUZfSU5FVDsKKwlxID0gbmV0Lm5fYWxpYXNlcyA9IG5ldF9hbGlhc2VzOworCWlmIChwICE9IE5VTEwpIAorCQljcCA9IHA7CisJd2hpbGUgKGNwICYmICpjcCkgeworCQlpZiAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykgeworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChxIDwgJm5ldF9hbGlhc2VzW01BWEFMSUFTRVMgLSAxXSkKKwkJCSpxKysgPSBjcDsKKwkJY3AgPSBhbnkoY3AsICIgXHQiKTsKKwkJaWYgKGNwICE9IE5VTEwpCisJCQkqY3ArKyA9ICdcMCc7CisJfQorCSpxID0gTlVMTDsKKwlyZXR1cm4gKCZuZXQpOworfQorCitzdGF0aWMgY2hhciAqCithbnkoY3AsIG1hdGNoKQorCXJlZ2lzdGVyIGNoYXIgKmNwOworCWNoYXIgKm1hdGNoOworeworCXJlZ2lzdGVyIGNoYXIgKm1wLCBjOworCisJd2hpbGUgKGMgPSAqY3ApIHsKKwkJZm9yIChtcCA9IG1hdGNoOyAqbXA7IG1wKyspCisJCQlpZiAoKm1wID09IGMpCisJCQkJcmV0dXJuIChjcCk7CisJCWNwKys7CisJfQorCXJldHVybiAoKGNoYXIgKikwKTsKK30KZGlmZiAtLWdpdCBhL1dpbjMyL1NyYy9nZXRvcHQuYyBiL1dpbjMyL1NyYy9nZXRvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2MyMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvV2luMzIvU3JjL2dldG9wdC5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg3LCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylnZXRvcHQuYwk4LjMgKEJlcmtlbGV5KSA0LzI3Lzk1IjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQJb3B0ZXJyID0gMSwJCS8qIGlmIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgKi8KKwlvcHRpbmQgPSAxLAkJLyogaW5kZXggaW50byBwYXJlbnQgYXJndiB2ZWN0b3IgKi8KKwlvcHRvcHQsCQkJLyogY2hhcmFjdGVyIGNoZWNrZWQgZm9yIHZhbGlkaXR5ICovCisJb3B0cmVzZXQ7CQkvKiByZXNldCBnZXRvcHQgKi8KK2NoYXIJKm9wdGFyZzsJCS8qIGFyZ3VtZW50IGFzc29jaWF0ZWQgd2l0aCBvcHRpb24gKi8KKworI2RlZmluZQlCQURDSAkoaW50KSc/JworI2RlZmluZQlCQURBUkcJKGludCknOicKKyNkZWZpbmUJRU1TRwkiIgorCisvKgorICogZ2V0b3B0IC0tCisgKglQYXJzZSBhcmdjL2FyZ3YgYXJndW1lbnQgdmVjdG9yLgorICovCitpbnQKK2dldG9wdChuYXJnYywgbmFyZ3YsIG9zdHIpCisJaW50IG5hcmdjOworCWNoYXIgKiBjb25zdCAqbmFyZ3Y7CisJY29uc3QgY2hhciAqb3N0cjsKK3sKKyNpZmRlZiBXSU4zMgorCWNoYXIgKl9fcHJvZ25hbWU9IndpbmR1bXAiOworI2Vsc2UKKwlleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKKyNlbmRpZgorCXN0YXRpYyBjaGFyICpwbGFjZSA9IEVNU0c7CQkvKiBvcHRpb24gbGV0dGVyIHByb2Nlc3NpbmcgKi8KKwljaGFyICpvbGk7CQkJCS8qIG9wdGlvbiBsZXR0ZXIgbGlzdCBpbmRleCAqLworCisJaWYgKG9wdHJlc2V0IHx8ICEqcGxhY2UpIHsJCS8qIHVwZGF0ZSBzY2FubmluZyBwb2ludGVyICovCisJCW9wdHJlc2V0ID0gMDsKKwkJaWYgKG9wdGluZCA+PSBuYXJnYyB8fCAqKHBsYWNlID0gbmFyZ3Zbb3B0aW5kXSkgIT0gJy0nKSB7CisJCQlwbGFjZSA9IEVNU0c7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAocGxhY2VbMV0gJiYgKisrcGxhY2UgPT0gJy0nKSB7CS8qIGZvdW5kICItLSIgKi8KKwkJCSsrb3B0aW5kOworCQkJcGxhY2UgPSBFTVNHOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CQkJCQkvKiBvcHRpb24gbGV0dGVyIG9rYXk/ICovCisJaWYgKChvcHRvcHQgPSAoaW50KSpwbGFjZSsrKSA9PSAoaW50KSc6JyB8fAorCSAgICAhKG9saSA9IHN0cmNocihvc3RyLCBvcHRvcHQpKSkgeworCQkvKgorCQkgKiBpZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSAnLScgYXMgYW4gb3B0aW9uLAorCQkgKiBhc3N1bWUgaXQgbWVhbnMgLTEuCisJCSAqLworCQlpZiAob3B0b3B0ID09IChpbnQpJy0nKQorCQkJcmV0dXJuICgtMSk7CisJCWlmICghKnBsYWNlKQorCQkJKytvcHRpbmQ7CisJCWlmIChvcHRlcnIgJiYgKm9zdHIgIT0gJzonKQorCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsCisJCQkgICAgIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiwgX19wcm9nbmFtZSwgb3B0b3B0KTsKKwkJcmV0dXJuIChCQURDSCk7CisJfQorCWlmICgqKytvbGkgIT0gJzonKSB7CQkJLyogZG9uJ3QgbmVlZCBhcmd1bWVudCAqLworCQlvcHRhcmcgPSBOVUxMOworCQlpZiAoISpwbGFjZSkKKwkJCSsrb3B0aW5kOworCX0KKwllbHNlIHsJCQkJCS8qIG5lZWQgYW4gYXJndW1lbnQgKi8KKwkJaWYgKCpwbGFjZSkJCQkvKiBubyB3aGl0ZSBzcGFjZSAqLworCQkJb3B0YXJnID0gcGxhY2U7CisJCWVsc2UgaWYgKG5hcmdjIDw9ICsrb3B0aW5kKSB7CS8qIG5vIGFyZyAqLworCQkJcGxhY2UgPSBFTVNHOworCQkJaWYgKCpvc3RyID09ICc6JykKKwkJCQlyZXR1cm4gKEJBREFSRyk7CisJCQlpZiAob3B0ZXJyKQorCQkJCSh2b2lkKWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiwKKwkJCQkgICAgX19wcm9nbmFtZSwgb3B0b3B0KTsKKwkJCXJldHVybiAoQkFEQ0gpOworCQl9CisJIAllbHNlCQkJCS8qIHdoaXRlIHNwYWNlICovCisJCQlvcHRhcmcgPSBuYXJndltvcHRpbmRdOworCQlwbGFjZSA9IEVNU0c7CisJCSsrb3B0aW5kOworCX0KKwlyZXR1cm4gKG9wdG9wdCk7CQkJLyogZHVtcCBiYWNrIG9wdGlvbiBsZXR0ZXIgKi8KK30KZGlmZiAtLWdpdCBhL1dpbjMyL1NyYy9nZXRzZXJ2ZW50LmMgYi9XaW4zMi9TcmMvZ2V0c2VydmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjhjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9TcmMvZ2V0c2VydmVudC5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylnZXRzZXJ2ZW50LmMJOC4xIChCZXJrZWxleSkgNi80LzkzIjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bmV0L25ldGRiLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgorCisjZGVmaW5lCU1BWEFMSUFTRVMJMzUKKworc3RhdGljIGNoYXIgU0VSVkRCW10gPSBfUEFUSF9TRVJWSUNFUzsKK3N0YXRpYyBGSUxFICpzZXJ2ZiA9IE5VTEw7CitzdGF0aWMgY2hhciBsaW5lW0JVRlNJWisxXTsKK3N0YXRpYyBzdHJ1Y3Qgc2VydmVudCBzZXJ2Oworc3RhdGljIGNoYXIgKnNlcnZfYWxpYXNlc1tNQVhBTElBU0VTXTsKK2ludCBfc2Vydl9zdGF5b3BlbjsKKwordm9pZAorc2V0c2VydmVudChmKQorCWludCBmOworeworCWlmIChzZXJ2ZiA9PSBOVUxMKQorCQlzZXJ2ZiA9IGZvcGVuKFNFUlZEQiwgInIiICk7CisJZWxzZQorCQlyZXdpbmQoc2VydmYpOworCV9zZXJ2X3N0YXlvcGVuIHw9IGY7Cit9CisKK3ZvaWQKK2VuZHNlcnZlbnQoKQoreworCWlmIChzZXJ2ZikgeworCQlmY2xvc2Uoc2VydmYpOworCQlzZXJ2ZiA9IE5VTEw7CisJfQorCV9zZXJ2X3N0YXlvcGVuID0gMDsKK30KKworc3RydWN0IHNlcnZlbnQgKgorZ2V0c2VydmVudCgpCit7CisJY2hhciAqcDsKKwlyZWdpc3RlciBjaGFyICpjcCwgKipxOworCisJaWYgKHNlcnZmID09IE5VTEwgJiYgKHNlcnZmID0gZm9wZW4oU0VSVkRCLCAiciIgKSkgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKK2FnYWluOgorCWlmICgocCA9IGZnZXRzKGxpbmUsIEJVRlNJWiwgc2VydmYpKSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCWlmICgqcCA9PSAnIycpCisJCWdvdG8gYWdhaW47CisJY3AgPSBzdHJwYnJrKHAsICIjXG4iKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBhZ2FpbjsKKwkqY3AgPSAnXDAnOworCXNlcnYuc19uYW1lID0gcDsKKwlwID0gc3RycGJyayhwLCAiIFx0Iik7CisJaWYgKHAgPT0gTlVMTCkKKwkJZ290byBhZ2FpbjsKKwkqcCsrID0gJ1wwJzsKKwl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisJCXArKzsKKwljcCA9IHN0cnBicmsocCwgIiwvIik7CisJaWYgKGNwID09IE5VTEwpCisJCWdvdG8gYWdhaW47CisJKmNwKysgPSAnXDAnOworCXNlcnYuc19wb3J0ID0gaHRvbnMoKHVfc2hvcnQpYXRvaShwKSk7CisJc2Vydi5zX3Byb3RvID0gY3A7CisJcSA9IHNlcnYuc19hbGlhc2VzID0gc2Vydl9hbGlhc2VzOworCWNwID0gc3RycGJyayhjcCwgIiBcdCIpOworCWlmIChjcCAhPSBOVUxMKQorCQkqY3ArKyA9ICdcMCc7CisJd2hpbGUgKGNwICYmICpjcCkgeworCQlpZiAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykgeworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChxIDwgJnNlcnZfYWxpYXNlc1tNQVhBTElBU0VTIC0gMV0pCisJCQkqcSsrID0gY3A7CisJCWNwID0gc3RycGJyayhjcCwgIiBcdCIpOworCQlpZiAoY3AgIT0gTlVMTCkKKwkJCSpjcCsrID0gJ1wwJzsKKwl9CisJKnEgPSBOVUxMOworCXJldHVybiAoJnNlcnYpOworfQpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2luZXRfYXRvbi5jIGIvV2luMzIvU3JjL2luZXRfYXRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTY2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9TcmMvaW5ldF9hdG9uLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NyBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgS3VuZ2xpZ2EgVGVrbmlza2EKKyAqICAgICAgSPZnc2tvbGFuIGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAkSWQ6IGluZXRfYXRvbi5jLHYgMS4yIDIwMDMtMTEtMTUgMjM6MjQ6MDYgZ3V5IEV4cCAkICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9XaW4zMi9TcmMvaW5ldF9hdG9uLmMsdiAxLjIgMjAwMy0xMS0xNSAyMzoyNDowNiBndXkgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorCisvKiBNaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIGluZXRfYXRvbi4KKyAqIENhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhaWx1cmUgYW5kIGEgbG9jYWwgYnJvYWRjYXN0IGFkZHJlc3MuICovCisKKyNpZm5kZWYgSU5BRERSX05PTkUKKyNkZWZpbmUgSU5BRERSX05PTkUgMHhmZmZmZmZmZgorI2VuZGlmCisKK2ludAoraW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKyAgYWRkci0+c19hZGRyID0gaW5ldF9hZGRyKGNwKTsKKyAgcmV0dXJuIChhZGRyLT5zX2FkZHIgPT0gSU5BRERSX05PTkUpID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9XaW4zMi9TcmMvaW5ldF9uZXQuYyBiL1dpbjMyL1NyYy9pbmV0X25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmUzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9TcmMvaW5ldF9uZXQuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWluZXRfbmV0d29yay5jCTguMSAoQmVya2VsZXkpIDYvNC85MyI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSAiaW5ldHByaXZhdGUuaCIKKworLyoKKyAqIEludGVybmV0IG5ldHdvcmsgYWRkcmVzcyBpbnRlcnByZXRhdGlvbiByb3V0aW5lLgorICogVGhlIGxpYnJhcnkgcm91dGluZXMgY2FsbCB0aGlzIHJvdXRpbmUgdG8gaW50ZXJwcmV0CisgKiBuZXR3b3JrIG51bWJlcnMuCisgKi8KK3VfaW50MzJfdAoraW5ldF9uZXR3b3JrKGNvbnN0IGNoYXIgKmNwKQoreworCXJlZ2lzdGVyIHVfbG9uZyB2YWwsIGJhc2UsIG47CisJcmVnaXN0ZXIgY2hhciBjOworCXVfbG9uZyBwYXJ0c1s0XSwgKnBwID0gcGFydHM7CisJcmVnaXN0ZXIgaW50IGk7CisKK2FnYWluOgorCS8qCisJICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCisJICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisJICogMHg9aGV4LCAwPW9jdGFsLCBvdGhlcj1kZWNpbWFsLgorCSAqLworCXZhbCA9IDA7IGJhc2UgPSAxMDsKKwkvKgorCSAqIFRoZSA0LjRCU0QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgYWxzbyBhY2NlcHRzICd4X18nIGFzIGEgaGV4YQorCSAqIG51bWJlci4gIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBjb3JyZWN0LiAgLS0gVWxpCisJICovCisJaWYgKCpjcCA9PSAnMCcpIHsKKwkJaWYgKCorK2NwID09ICd4JyB8fCAqY3AgPT0gJ1gnKQorCQkJYmFzZSA9IDE2LCBjcCsrOworCQllbHNlCisJCQliYXNlID0gODsKKwl9CisJd2hpbGUgKChjID0gKmNwKSkgeworCQlpZiAoaXNkaWdpdChjKSkgeworCQkJdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KGMpKSB7CisJCQl2YWwgPSAodmFsIDw8IDQpICsgKGMgKyAxMCAtIChpc2xvd2VyKGMpID8gJ2EnIDogJ0EnKSk7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmICgqY3AgPT0gJy4nKSB7CisJCWlmIChwcCA+PSBwYXJ0cyArIDQpCisJCQlyZXR1cm4gKElOQUREUl9OT05FKTsKKwkJKnBwKysgPSB2YWwsIGNwKys7CisJCWdvdG8gYWdhaW47CisJfQorCWlmICgqY3AgJiYgIWlzc3BhY2UoKmNwKSkKKwkJcmV0dXJuIChJTkFERFJfTk9ORSk7CisJKnBwKysgPSB2YWw7CisJbiA9IHBwIC0gcGFydHM7CisJaWYgKG4gPiA0KQorCQlyZXR1cm4gKElOQUREUl9OT05FKTsKKwlmb3IgKHZhbCA9IDAsIGkgPSAwOyBpIDwgKGludCluOyBpKyspIHsKKwkJdmFsIDw8PSA4OworCQl2YWwgfD0gcGFydHNbaV0gJiAweGZmOworCX0KKwlyZXR1cm4gKHZhbCk7Cit9CmRpZmYgLS1naXQgYS9XaW4zMi9TcmMvaW5ldF9wdG9uLmMgYi9XaW4zMi9TcmMvaW5ldF9wdG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzM2E0ZQotLS0gL2Rldi9udWxsCisrKyBiL1dpbjMyL1NyYy9pbmV0X3B0b24uYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIAorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdW5nbGlnYSBUZWtuaXNrYQorICogICAgICBI9mdza29sYW4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiAKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qICRJZDogaW5ldF9wdG9uLmMsdiAxLjMgMjAwNy0wOS0yNyAxODowMjoyMCBnaWFubHVjYSBFeHAgJCAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvV2luMzIvU3JjL2luZXRfcHRvbi5jLHYgMS4zIDIwMDctMDktMjcgMTg6MDI6MjAgZ2lhbmx1Y2EgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgRUFGTk9TVVBQT1JUCisjZGVmaW5lCUVBRk5PU1VQUE9SVAk5NwkvKiBub3QgcHJlc2VudCBpbiBlcnJuby5oIHByb3ZpZGVkIHdpdGggVkMgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX01JTkdXMzJfXworaW50KiBfZXJybm8oKTsKKyNkZWZpbmUgZXJybm8gKCpfZXJybm8oKSkKKyNlbmRpZiAvKiBfX01JTkdXMzJfXyAqLworCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKworaW50IGluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgc3RydWN0IGluX2FkZHIgKmFkZHIpOworCitpbnQKK2luZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqZHN0KQoreworICAgIGlmIChhZiAhPSBBRl9JTkVUKSB7CisJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaW5ldF9hdG9uIChzcmMsIGRzdCk7Cit9CmRpZmYgLS1naXQgYS9hY2NvbmZpZy5oIGIvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzZjMyMC4uMDAwMDAwMAotLS0gYS9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKiBMb25nIHN0b3J5IHNob3J0OiBhY2xvY2FsLm00IGRlcGVuZHMgb24gYXV0b2NvbmYgMi4xMwotICogaW1wbGVtZW50YXRpb24gZGV0YWlscyB3cnQgImNvbnN0IjsgbmV3ZXIgdmVyc2lvbnMKLSAqIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMgc28gZm9yIG5vdyB3ZQotICogcHV0ICJjb25zdCIgaGVyZS4gIFRoaXMgbWF5IGNhdXNlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucwotICogaW4gY29uZmlnLmggYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCi0gKi8KLSN1bmRlZiBjb25zdApkaWZmIC0tZ2l0IGEvYWNsb2NhbC5tNCBiL2FjbG9jYWwubTQKaW5kZXggMWVmYjQ3NC4uNGI2NDNlZiAxMDA2NDQKLS0tIGEvYWNsb2NhbC5tNAorKysgYi9hY2xvY2FsLm00CkBAIC0xLDQgKzEsNCBAQAotZG5sIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYWNsb2NhbC5tNCx2IDEuODUuMi4xIDIwMDUvMDQvMjEgMDM6NDI6MDkgZ3V5IEV4cCAkIChMQkwpCitkbmwgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9hY2xvY2FsLm00LHYgMS45MyAyMDA4LTExLTE4IDA3OjI5OjQ4IGd1eSBFeHAgJCAoTEJMKQogZG5sCiBkbmwgQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CiBkbmwJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0yMyw0MSArMjMsMzYgQEAKIGRubAogCiBkbmwKLWRubCBEZXRlcm1pbmUgd2hpY2ggY29tcGlsZXIgd2UncmUgdXNpbmcgKGNjIG9yIGdjYykKLWRubCBJZiB1c2luZyBnY2MsIGRldGVybWluZSB0aGUgdmVyc2lvbiBudW1iZXIKLWRubCBJZiB1c2luZyBjYywgcmVxdWlyZSB0aGF0IGl0IHN1cHBvcnQgYW5zaSBwcm90b3R5cGVzCi1kbmwgSWYgdXNpbmcgZ2NjLCB1c2UgLU8yIChvdGhlcndpc2UgdXNlIC1PKQotZG5sIElmIHVzaW5nIGNjLCBleHBsaWNpdGx5IHNwZWNpZnkgL3Vzci9sb2NhbC9pbmNsdWRlCitkbmwgRG8gd2hhdGV2ZXIgQUNfTEJMX0NfSU5JVCB3b3JrIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdXNpbmcgQUNfUFJPR19DQy4KIGRubAotZG5sIHVzYWdlOgorZG5sIEl0IGFwcGVhcnMgdGhhdCBuZXdlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiAoMi42NCBhbmQgbGF0ZXIpIHdpbGwsCitkbmwgaWYgeW91IHVzZSBBQ19UUllfQ09NUElMRSBpbiBhIG1hY3JvLCBzdGljayBBQ19QUk9HX0NDIGF0IHRoZQorZG5sIGJlZ2lubmluZyBvZiB0aGUgbWFjcm8sIGV2ZW4gaWYgdGhlIG1hY3JvIGl0c2VsZiBjYWxscyBBQ19QUk9HX0NDLgorZG5sIFNlZSB0aGUgIlByZXJlcXVpc2l0ZSBNYWNyb3MiIGFuZCAiRXhwYW5kZWQgQmVmb3JlIFJlcXVpcmVkIiBzZWN0aW9ucworZG5sIGluIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uLgogZG5sCi1kbmwJQUNfTEJMX0NfSU5JVChjb3B0LCBpbmNscykKK2RubCBUaGlzIGNhdXNlcyBhIHN0ZWFtaW5nIGhlYXAgb2YgZmFpbCBpbiBvdXIgY2FzZSwgYXMgd2Ugd2VyZSwgaW4KK2RubCBBQ19MQkxfQ19JTklULCBkb2luZyB0aGUgdGVzdHMgd2Ugbm93IGRvIGluIEFDX0xCTF9DX0lOSVRfQkVGT1JFX0NDLAorZG5sIGNhbGxpbmcgQUNfUFJPR19DQywgYW5kIHRoZW4gZG9pbmcgdGhlIHRlc3RzIHdlIG5vdyBkbyBpbgorZG5sIEFDX0xCTF9DX0lOSVQuICBOb3csIHdlIHJ1biBBQ19MQkxfQ19JTklUX0JFRk9SRV9DQywgQUNfUFJPR19DQywKK2RubCBhbmQgQUNfTEJMX0NfSU5JVCBhdCB0aGUgdG9wIGxldmVsLgogZG5sCi1kbmwgcmVzdWx0czoKLWRubAotZG5sCSQxIChjb3B0IHNldCkKLWRubAkkMiAoaW5jbHMgc2V0KQotZG5sCUNDCi1kbmwJTERGTEFHUwotZG5sCWFjX2N2X2xibF9nY2NfdmVycwotZG5sCUxCTF9DRkxBR1MKLWRubAotQUNfREVGVU4oQUNfTEJMX0NfSU5JVCwKLSAgICBbQUNfUFJFUkVRKDIuMTIpCitBQ19ERUZVTihBQ19MQkxfQ19JTklUX0JFRk9SRV9DQywKK1sKKyAgICBBQ19CRUZPUkUoWyQwXSwgW0FDX0xCTF9DX0lOSVRdKQogICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DQ10pCiAgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfRklYSU5DTFVERVNdKQogICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfTEJMX0RFVkVMXSkKICAgICBBQ19BUkdfV0lUSChnY2MsIFsgIC0td2l0aG91dC1nY2MgICAgICAgICAgIGRvbid0IHVzZSBnY2NdKQotICAgICQxPSItTyIKLSAgICAkMj0iIgorICAgICQxPSIiCiAgICAgaWYgdGVzdCAiJHtzcmNkaXJ9IiAhPSAiLiIgOyB0aGVuCi0JICAgICQyPSItSVwkKHNyY2RpcikiCisJICAgICQxPSItSVwkKHNyY2RpcikiCiAgICAgZmkKICAgICBpZiB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldDsgdGhlbgogCSAgICBMQkxfQ0ZMQUdTPSIkQ0ZMQUdTIgogICAgIGZpCiAgICAgaWYgdGVzdCAteiAiJENDIiA7IHRoZW4KLQkgICAgY2FzZSAiJHRhcmdldF9vcyIgaW4KKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCiAKIAkgICAgYnNkaSopCiAJCSAgICBBQ19DSEVDS19QUk9HKFNITElDQzIsIHNobGljYzIsIHllcywgbm8pCkBAIC03Miw3MSArNjcsMTI5IEBACiAJICAgIENDPWNjCiAJICAgIGV4cG9ydCBDQwogICAgIGZpCi0gICAgQUNfUFJPR19DQworXSkKKworZG5sCitkbmwgRGV0ZXJtaW5lIHdoaWNoIGNvbXBpbGVyIHdlJ3JlIHVzaW5nIChjYyBvciBnY2MpCitkbmwgSWYgdXNpbmcgZ2NjLCBkZXRlcm1pbmUgdGhlIHZlcnNpb24gbnVtYmVyCitkbmwgSWYgdXNpbmcgY2M6CitkbmwgICAgIHJlcXVpcmUgdGhhdCBpdCBzdXBwb3J0IGFuc2kgcHJvdG90eXBlcworZG5sICAgICB1c2UgLU8gKEFDX1BST0dfQ0Mgd2lsbCB1c2UgLWcgLU8yIG9uIGdjYywgc28gd2UgZG9uJ3QgbmVlZCB0bworZG5sICAgICBkbyB0aGF0IG91cnNlbHZlcyBmb3IgZ2NjKQorZG5sICAgICBhZGQgLWcgZmxhZ3MsIGFzIGFwcHJvcHJpYXRlCitkbmwgICAgIGV4cGxpY2l0bHkgc3BlY2lmeSAvdXNyL2xvY2FsL2luY2x1ZGUKK2RubAorZG5sIE5PVEUgV0VMTDogd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiwgImdjYyIgbWVhbnMgYW55IGNvbXBpbGVyCitkbmwgdGhhdCBkZWZpbmVzIF9fR05VQ19fLCB3aGljaCBtZWFucyBjbGFuZywgZm9yIGV4YW1wbGUsIGNvdW50cyBhcyAiZ2NjIi4KK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0NfSU5JVChjb3B0LCBpbmNscykKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAkkMSAoY29wdCBzZXQpCitkbmwJJDIgKGluY2xzIHNldCkKK2RubAlDQworZG5sCUxERkxBR1MKK2RubAlMQkxfQ0ZMQUdTCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9DX0lOSVQsCitbCisgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfRklYSU5DTFVERVNdKQorICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfTEJMX0RFVkVMXSkKKyAgICBBQ19CRUZPUkUoWyQwXSwgW0FDX0xCTF9TSExJQlNfSU5JVF0pCiAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRTSExJQ0MyIiA9IHllcyA7IHRoZW4KLQkJICAgIGFjX2N2X2xibF9nY2NfdmVycz0yCi0JCSAgICAkMT0iLU8yIgotCSAgICBlbHNlCi0JCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZ2NjIHZlcnNpb24pCi0JCSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2djY192ZXJzLAotCQkJYWNfY3ZfbGJsX2djY192ZXJzPWAkQ0MgLXYgMj4mMSB8IFwKLQkJCSAgICBzZWQgLWUgJy9eZ2NjIHZlcnNpb24gLyFkJyBcCi0JCQkJLWUgJ3MvXmdjYyB2ZXJzaW9uIC8vJyBcCi0JCQkJLWUgJ3MvIC4qLy8nIC1lICdzL15bW1teMC05XV1dKi8vJyBcCi0JCQkJLWUgJ3MvXC4uKi8vJ2ApCi0JCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfZ2NjX3ZlcnMpCi0JCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZ2NjX3ZlcnMgLWd0IDEgOyB0aGVuCi0JCQkgICAgJDE9Ii1PMiIKLQkJICAgIGZpCi0JICAgIGZpCisJICAgICMKKwkgICAgIyAtV2Vycm9yIGZvcmNlcyB3YXJuaW5ncyB0byBiZSBlcnJvcnMuCisJICAgICMKKwkgICAgYWNfbGJsX2NjX2ZvcmNlX3dhcm5pbmdfZXJyb3JzPS1XZXJyb3IKICAgICBlbHNlCi0JICAgIEFDX01TR19DSEVDS0lORyh0aGF0ICRDQyBoYW5kbGVzIGFuc2kgcHJvdG90eXBlcykKLQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXMsCi0JCUFDX1RSWV9DT01QSUxFKAotCQkgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAotCQkgICAgW2ludCBmcm9iKGludCwgY2hhciAqKV0sCi0JCSAgICBhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzPXllcywKLQkJICAgIGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9bm8pKQotCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzKQotCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzID0gbm8gOyB0aGVuCi0JCSAgICBjYXNlICIkdGFyZ2V0X29zIiBpbgotCi0JCSAgICBocHV4KikKLQkJCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEhQLVVYIGFuc2kgY29tcGlsZXIgKCRDQyAtQWEgLURfSFBVWF9TT1VSQ0UpKQotCQkJICAgIHNhdmVkY2ZsYWdzPSIkQ0ZMQUdTIgotCQkJICAgIENGTEFHUz0iLUFhIC1EX0hQVVhfU09VUkNFICRDRkxBR1MiCi0JCQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19ocHV4X2NjX2FhLAotCQkJCUFDX1RSWV9DT01QSUxFKAotCQkJCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sCi0JCQkJICAgIFtpbnQgZnJvYihpbnQsIGNoYXIgKildLAotCQkJCSAgICBhY19jdl9sYmxfY2NfaHB1eF9jY19hYT15ZXMsCi0JCQkJICAgIGFjX2N2X2xibF9jY19ocHV4X2NjX2FhPW5vKSkKLQkJCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSkKLQkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSA9IG5vIDsgdGhlbgotCQkJCSAgICBBQ19NU0dfRVJST1Ioc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKQotCQkJICAgIGZpCi0JCQkgICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCi0JCQkgICAgVl9DQ09QVD0iLUFhICRWX0NDT1BUIgotCQkJICAgIEFDX0RFRklORShfSFBVWF9TT1VSQ0UsMSxbbmVlZGVkIG9uIEhQLVVYXSkKLQkJCSAgICA7OwotCi0JCSAgICAqKQotCQkJICAgIEFDX01TR19FUlJPUihzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pCi0JCQkgICAgOzsKLQkJICAgIGVzYWMKLQkgICAgZmkKIAkgICAgJDI9IiQkMiAtSS91c3IvbG9jYWwvaW5jbHVkZSIKIAkgICAgTERGTEFHUz0iJExERkxBR1MgLUwvdXNyL2xvY2FsL2xpYiIKIAotCSAgICBjYXNlICIkdGFyZ2V0X29zIiBpbgorCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCSAgICBkYXJ3aW4qKQorCQkgICAgIworCQkgICAgIyBUaGlzIGlzIGFzc3VtZWQgZWl0aGVyIHRvIGJlIEdDQyBvciBjbGFuZywgYm90aAorCQkgICAgIyBvZiB3aGljaCB1c2UgLVdlcnJvciB0byBmb3JjZSB3YXJuaW5ncyB0byBiZSBlcnJvcnMuCisJCSAgICAjCisJCSAgICBhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnM9LVdlcnJvcgorCQkgICAgOzsKKworCSAgICBocHV4KikKKwkJICAgICMKKwkJICAgICMgSFAgQywgd2hpY2ggaXMgd2hhdCB3ZSBwcmVzdW1lIHdlJ3JlIHVzaW5nLCBkb2Vzbid0CisJCSAgICAjIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIHdlIGhhbmQgaXQgYW4KKwkJICAgICMgaW52YWxpZCAtVyBmbGFnLCBjYW4ndCBiZSBmb3JjZWQgdG8gZG8gc28gZXZlbiB3aXRoCisJCSAgICAjICtXZSwgYW5kIGRvZXNuJ3QgaGFuZGxlIEdDQy1zdHlsZSAtVyBmbGFncywgc28gd2UKKwkJICAgICMgZG9uJ3Qgd2FudCB0byB0cnkgdXNpbmcgR0NDLXN0eWxlIC1XIGZsYWdzLgorCQkgICAgIworCQkgICAgYWNfbGJsX2NjX2RvbnRfdHJ5X2djY19kYXNoVz15ZXMKKwkJICAgIDs7CiAKIAkgICAgaXJpeCopCi0JCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAteGFuc2kgLXNpZ25lZCAtZzMiCisJCSAgICAjCisJCSAgICAjIE1JUFMgQywgd2hpY2ggaXMgd2hhdCB3ZSBwcmVzdW1lIHdlJ3JlIHVzaW5nLCBkb2Vzbid0CisJCSAgICAjIG5lY2Vzc2FyaWx5IGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIHdlCisJCSAgICAjIGhhbmQgaXQgYW4gaW52YWxpZCAtVyBmbGFnLCBjYW4ndCBiZSBmb3JjZWQgdG8gZG8KKwkJICAgICMgc28sIGFuZCBkb2Vzbid0IGhhbmRsZSBHQ0Mtc3R5bGUgLVcgZmxhZ3MsIHNvIHdlCisJCSAgICAjIGRvbid0IHdhbnQgdG8gdHJ5IHVzaW5nIEdDQy1zdHlsZSAtVyBmbGFncy4KKwkJICAgICMKKwkJICAgIGFjX2xibF9jY19kb250X3RyeV9nY2NfZGFzaFc9eWVzCisJCSAgICAjCisJCSAgICAjIEl0IGFsc28sIGFwcGFyZW50bHksIGRlZmF1bHRzIHRvICJjaGFyIiBiZWluZworCQkgICAgIyB1bnNpZ25lZCwgdW5saWtlIG1vc3Qgb3RoZXIgQyBpbXBsZW1lbnRhdGlvbnM7CisJCSAgICAjIEkgc3VwcG9zZSB3ZSBjb3VsZCBzYXkgInNpZ25lZCBjaGFyIiB3aGVuZXZlcgorCQkgICAgIyB3ZSB3YW50IHRvIGd1YXJhbnRlZSBhIHNpZ25lZCAiY2hhciIsIGJ1dCBsZXQncworCQkgICAgIyBqdXN0IGZvcmNlIHNpZ25lZCBjaGFycy4KKwkJICAgICMKKwkJICAgICMgLXhhbnNpIGlzIG5vcm1hbGx5IHRoZSBkZWZhdWx0LCBidXQgdGhlCisJCSAgICAjIGNvbmZpZ3VyZSBzY3JpcHQgd2FzIHNldHRpbmcgaXQ7IHBlcmhhcHMgLWNja3IKKwkJICAgICMgd2FzIHRoZSBkZWZhdWx0IGluIHRoZSBPbGQgRGF5cy4gIChUaGVuIGFnYWluLAorCQkgICAgIyB0aGF0IHdvdWxkIHByb2JhYmx5IGJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCQkgICAgIyBpbiB0aGUgZGF5cyB3aGVuIEFOU0kgQyB3YXMgU2hpbnkgYW5kIE5ldywgaS5lLgorCQkgICAgIyAxOTg5IGFuZCB0aGUgZWFybHkgJzkwJ3MsIHNvIG1heWJlIHdlIGNhbiBqdXN0CisJCSAgICAjIGRyb3Agc3VwcG9ydCBmb3IgdGhvc2UgY29tcGlsZXJzLikKKwkJICAgICMKKwkJICAgICMgLWcgaXMgZXF1aXZhbGVudCB0byAtZzIsIHdoaWNoIHR1cm5zIG9mZgorCQkgICAgIyBvcHRpbWl6YXRpb247IHdlIGNob29zZSAtZzMsIHdoaWNoIGdlbmVyYXRlcworCQkgICAgIyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnV0IGRvZXNuJ3QgdHVybiBvZmYKKwkJICAgICMgb3B0aW1pemF0aW9uIChldmVuIGlmIHRoZSBvcHRpbWl6YXRpb24gd291bGQKKwkJICAgICMgY2F1c2UgaW5hY2N1cmFjaWVzIGluIGRlYnVnZ2luZykuCisJCSAgICAjCisJCSAgICAkMT0iJCQxIC14YW5zaSAtc2lnbmVkIC1nMyIKIAkJICAgIDs7CiAKIAkgICAgb3NmKikKLQkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1zdGQxIC1nMyIKKwkJICAgICMKKwkJICAgICMgUHJlc3VtZWQgdG8gYmUgREVDIE9TRi8xLCBEaWdpdGFsIFVOSVgsIG9yCisJCSAgICAjIFRydTY0IFVOSVguCisJCSAgICAjCisJCSAgICAjIFRoZSBERUMgQyBjb21waWxlciwgd2hpY2ggaXMgd2hhdCB3ZSBwcmVzdW1lIHdlJ3JlCisJCSAgICAjIHVzaW5nLCBkb2Vzbid0IGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIHdlCisJCSAgICAjIGhhbmQgaXQgYW4gaW52YWxpZCAtVyBmbGFnLCBjYW4ndCBiZSBmb3JjZWQgdG8gZG8KKwkJICAgICMgc28sIGFuZCBkb2Vzbid0IGhhbmRsZSBHQ0Mtc3R5bGUgLVcgZmxhZ3MsIHNvIHdlCisJCSAgICAjIGRvbid0IHdhbnQgdG8gdHJ5IHVzaW5nIEdDQy1zdHlsZSAtVyBmbGFncy4KKwkJICAgICMKKwkJICAgIGFjX2xibF9jY19kb250X3RyeV9nY2NfZGFzaFc9eWVzCisJCSAgICAjCisJCSAgICAjIC1nIGlzIGVxdWl2YWxlbnQgdG8gLWcyLCB3aGljaCB0dXJucyBvZmYKKwkJICAgICMgb3B0aW1pemF0aW9uOyB3ZSBjaG9vc2UgLWczLCB3aGljaCBnZW5lcmF0ZXMKKwkJICAgICMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJ1dCBkb2Vzbid0IHR1cm4gb2ZmCisJCSAgICAjIG9wdGltaXphdGlvbiAoZXZlbiBpZiB0aGUgb3B0aW1pemF0aW9uIHdvdWxkCisJCSAgICAjIGNhdXNlIGluYWNjdXJhY2llcyBpbiBkZWJ1Z2dpbmcpLgorCQkgICAgIworCQkgICAgJDE9IiQkMSAtZzMiCisJCSAgICA7OworCisJICAgIHNvbGFyaXMqKQorCQkgICAgIworCQkgICAgIyBBc3N1bWVkIHRvIGJlIFN1biBDLCB3aGljaCByZXF1aXJlcyAtZXJyd2FybiB0byBmb3JjZQorCQkgICAgIyB3YXJuaW5ncyB0byBiZSB0cmVhdGVkIGFzIGVycm9ycy4KKwkJICAgICMKKwkJICAgIGFjX2xibF9jY19mb3JjZV93YXJuaW5nX2Vycm9ycz0tZXJyd2FybgogCQkgICAgOzsKIAogCSAgICB1bHRyaXgqKQpAQCAtMTUwLDEwICsyMDMsMzQ0IEBACiAJCQkgICAgYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvPW5vKSkKIAkJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9jY19jb25zdF9wcm90bykKIAkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19jb25zdF9wcm90byA9IG5vIDsgdGhlbgotCQkJICAgIEFDX0RFRklORShjb25zdCwpCisJCQkgICAgQUNfREVGSU5FKGNvbnN0LFtdLAorCQkJICAgICAgICBbdG8gaGFuZGxlIFVsdHJpeCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGNvbnN0IGluIHByb3RvdHlwZXNdKQogCQkgICAgZmkKIAkJICAgIDs7CiAJICAgIGVzYWMKKwkgICAgJDE9IiQkMSAtTyIKKyAgICBmaQorXSkKKworZG5sCitkbmwgQ2hlY2sgd2hldGhlciwgaWYgeW91IHBhc3MgYW4gdW5rbm93biB3YXJuaW5nIG9wdGlvbiB0byB0aGUKK2RubCBjb21waWxlciwgaXQgZmFpbHMgb3IganVzdCBwcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHN1Y2NlZWRzLgorZG5sIFNldCBhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciB0byB0aGUgYXBwcm9wcmlhdGUgZmxhZworZG5sIHRvIGZvcmNlIGFuIGVycm9yIGlmIGl0IHdvdWxkIG90aGVyd2lzZSBqdXN0IHByaW50IGEgd2FybmluZyBtZXNzYWdlCitkbmwgYW5kIHN1Y2NlZWQuCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9DSEVDS19VTktOT1dOX1dBUk5JTkdfT1BUSU9OX0VSUk9SLAorICAgIFsKKwlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIGNvbXBpbGVyIGZhaWxzIHdoZW4gZ2l2ZW4gYW4gdW5rbm93biB3YXJuaW5nIG9wdGlvbl0pCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJQ0ZMQUdTPSIkQ0ZMQUdTIC1XeHl6enktdGhpcy13aWxsLW5ldmVyLXN1Y2NlZWQteHl6enkiCisJQUNfVFJZX0NPTVBJTEUoCisJICAgIFtdLAorCSAgICBbcmV0dXJuIDBdLAorCSAgICBbCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJIworCQkjIFdlJ3JlIGFzc3VtaW5nIHRoaXMgaXMgY2xhbmcsIHdoZXJlCisJCSMgLVdlcnJvcj11bmtub3duLXdhcm5pbmctb3B0aW9uIGlzIHRoZSBhcHByb3ByaWF0ZQorCQkjIG9wdGlvbiB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gZmFpbC4KKwkJIyAKKwkJYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3I9Ii1XZXJyb3I9dW5rbm93bi13YXJuaW5nLW9wdGlvbiIKKwkgICAgXSwKKwkgICAgWworCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCSAgICBdKQorCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgIF0pCisKK2RubAorZG5sIENoZWNrIHdoZXRoZXIgdGhlIGNvbXBpbGVyIG9wdGlvbiBzcGVjaWZpZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudAorZG5sIGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcGlsZXIgYW5kLCBpZiBzbywgYWRkIGl0IHRvIHRoZSBtYWNybworZG5sIHNwZWNpZmllZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKK2RubAorQUNfREVGVU4oQUNfTEJMX0NIRUNLX0NPTVBJTEVSX09QVCwKKyAgICBbCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgJDIgb3B0aW9uXSkKKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yICQyIgorCUFDX1RSWV9DT01QSUxFKAorCSAgICBbXSwKKwkgICAgW3JldHVybiAwXSwKKwkgICAgWworCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwkJJDE9IiQkMSAkMiIKKwkgICAgXSwKKwkgICAgWworCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCSAgICBdKQorICAgIF0pCisKK2RubAorZG5sIENoZWNrIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGFuIG9wdGlvbiB0byBnZW5lcmF0ZQorZG5sIE1ha2VmaWxlLXN0eWxlIGRlcGVuZGVuY3kgbGluZXMKK2RubAorZG5sIEdDQyB1c2VzIC1NIGZvciB0aGlzLiAgTm9uLUdDQyBjb21waWxlcnMgdGhhdCBzdXBwb3J0IHRoaXMKK2RubCB1c2UgYSB2YXJpZXR5IG9mIGZsYWdzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIC1NLgorZG5sCitkbmwgV2UgdGVzdCB3aGV0aGVyIHRoZSBmbGFnIGluIHF1ZXN0aW9uIGlzIHN1cHBvcnRlZCwgYXMgb2xkZXIKK2RubCB2ZXJzaW9ucyBvZiBjb21waWxlcnMgbWlnaHQgbm90IHN1cHBvcnQgaXQuCitkbmwKK2RubCBXZSBkb24ndCB0cnkgYWxsIHRoZSBwb3NzaWJsZSBmbGFncywganVzdCBpbiBjYXNlIHNvbWUgZmxhZyBtZWFucworZG5sICJnZW5lcmF0ZSBkZXBlbmRlbmNpZXMiIG9uIG9uZSBjb21waWxlciBidXQgbWVhbnMgc29tZXRoaW5nIGVsc2UKK2RubCBvbiBhbm90aGVyIGNvbXBpbGVyLgorZG5sCitkbmwgTW9zdCBjb21waWxlcnMgdGhhdCBzdXBwb3J0IHRoaXMgc2VuZCB0aGUgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZAorZG5sIG91dHB1dCBieSBkZWZhdWx0LiAgSUJNJ3MgWExDLCBob3dldmVyLCBzdXBwb3J0cyAtTSBidXQgc2VuZHMKK2RubCB0aGUgb3V0cHV0IHRvIHtzb3VyY2VmaWxlLWJhc2VuYW1lfS51LCBhbmQgQUlYIGhhcyBubyAvZGV2L3N0ZG91dAorZG5sIHRvIHdvcmsgYXJvdW5kIHRoYXQsIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoIFhMQy4KK2RubAorQUNfREVGVU4oQUNfTEJMX0NIRUNLX0RFUEVOREVOQ1lfR0VORVJBVElPTl9PUFQsCisgICAgWworCUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXNdKQorCWlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorCQkjCisJCSMgR0NDLCBvciBhIGNvbXBpbGVyIGRlZW1lZCB0byBiZSBHQ0MgYnkgQUNfUFJPR19DQyAoZXZlbgorCQkjIHRob3VnaCBpdCdzIG5vdCk7IHdlIGFzc3VtZSB0aGF0LCBpbiB0aGlzIGNhc2UsIHRoZSBmbGFnCisJCSMgd291bGQgYmUgLU0uCisJCSMKKwkJYWNfbGJsX2RlcGVuZGVuY3lfZmxhZz0iLU0iCisJZWxzZQorCQkjCisJCSMgTm90IEdDQyBvciBhIGNvbXBpbGVyIGRlZW1lZCB0byBiZSBHQ0M7IHdoYXQgcGxhdGZvcm0gaXMKKwkJIyB0aGlzPyAgKFdlJ3JlIGFzc3VtaW5nIHRoYXQgaWYgdGhlIGNvbXBpbGVyIGlzbid0IEdDQworCQkjIGl0J3MgdGhlIGNvbXBpbGVyIGZyb20gdGhlIHZlbmRvciBvZiB0aGUgT1M7IHRoYXQgd29uJ3QKKwkJIyBuZWNlc3NhcmlseSBiZSB0cnVlIGZvciB4ODYgcGxhdGZvcm1zLCB3aGVyZSBpdCBtaWdodCBiZQorCQkjIHRoZSBJbnRlbCBDIGNvbXBpbGVyLikKKwkJIworCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQlpcml4Knxvc2YqfGRhcndpbiopCisJCQkjCisJCQkjIE1JUFMgQyBmb3IgSVJJWCwgREVDIEMsIGFuZCBjbGFuZyBhbGwgdXNlIC1NLgorCQkJIworCQkJYWNfbGJsX2RlcGVuZGVuY3lfZmxhZz0iLU0iCisJCQk7OworCisJCXNvbGFyaXMqKQorCQkJIworCQkJIyBTdW4gQyB1c2VzIC14TS4KKwkJCSMKKwkJCWFjX2xibF9kZXBlbmRlbmN5X2ZsYWc9Ii14TSIKKwkJCTs7CisKKwkJaHB1eCopCisJCQkjCisJCQkjIEhQJ3Mgb2xkZXIgQyBjb21waWxlcnMgZG9uJ3Qgc3VwcG9ydCB0aGlzLgorCQkJIyBIUCdzIG5ld2VyIEMgY29tcGlsZXJzIHN1cHBvcnQgdGhpcyB3aXRoCisJCQkjIGVpdGhlciArTSBvciArTWFrZTsgdGhlIG9sZGVyIGNvbXBpbGVycworCQkJIyBpbnRlcnByZXQgK00gYXMgc29tZXRoaW5nIGNvbXBsZXRlbHkKKwkJCSMgZGlmZmVyZW50LCBzbyB3ZSB1c2UgK01ha2Ugc28gd2UgZG9uJ3QKKwkJCSMgdGhpbmsgaXQgd29ya3Mgd2l0aCB0aGUgb2xkZXIgY29tcGlsZXJzLgorCQkJIworCQkJYWNfbGJsX2RlcGVuZGVuY3lfZmxhZz0iK01ha2UiCisJCQk7OworCisJCSopCisJCQkjCisJCQkjIE5vdCBvbmUgb2YgdGhlIGFib3ZlOyBhc3N1bWUgbm8gc3VwcG9ydCBmb3IKKwkJCSMgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMuCisJCQkjCisJCQlhY19sYmxfZGVwZW5kZW5jeV9mbGFnPSIiCisJCQk7OworCQllc2FjCisJZmkKKworCSMKKwkjIElzIGFjX2xibF9kZXBlbmRlbmN5X2ZsYWcgZGVmaW5lZCBhbmQsIGlmIHNvLCBkb2VzIHRoZSBjb21waWxlcgorCSMgY29tcGxhaW4gYWJvdXQgaXQ/CisJIworCSMgTm90ZTogY2xhbmcgZG9lc24ndCBzZWVtIHRvIGV4aXQgd2l0aCBhbiBlcnJvciBzdGF0dXMgd2hlbiBoYW5kZWQKKwkjIGFuIHVua25vd24gbm9uLXdhcm5pbmcgZXJyb3IsIGV2ZW4gaWYgeW91IHBhc3MgaXQKKwkjIC1XZXJyb3I9dW5rbm93bi13YXJuaW5nLW9wdGlvbi4gIEhvd2V2ZXIsIGl0IGFsd2F5cyBzdXBwb3J0cworCSMgLU0sIHNvIHRoZSBmYWN0IHRoYXQgdGhpcyB0ZXN0IGFsd2F5cyBzdWNjZWVkcyB3aXRoIGNsYW5nCisJIyBpc24ndCBhbiBpc3N1ZS4KKwkjCisJaWYgdGVzdCAhIC16ICIkYWNfbGJsX2RlcGVuZGVuY3lfZmxhZyI7IHRoZW4KKwkJQUNfTEFOR19DT05GVEVTVCgKKwkJICAgIFtBQ19MQU5HX1NPVVJDRShbW2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH1dXSldKQorCQllY2hvICIkQ0MiICRhY19sYmxfZGVwZW5kZW5jeV9mbGFnIGNvbmZ0ZXN0LmMgPiY1CisJCWlmICIkQ0MiICRhY19sYmxfZGVwZW5kZW5jeV9mbGFnIGNvbmZ0ZXN0LmMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCQlBQ19NU0dfUkVTVUxUKFt5ZXMsIHdpdGggJGFjX2xibF9kZXBlbmRlbmN5X2ZsYWddKQorCQkJREVQRU5ERU5DWV9DRkxBRz0iJGFjX2xibF9kZXBlbmRlbmN5X2ZsYWciCisJCQlNS0RFUD0nJHtzcmNkaXJ9L21rZGVwJworCQllbHNlCisJCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCQkjCisJCQkjIFdlIGNhbid0IHJ1biBta2RlcCwgc28gaGF2ZSAibWFrZSBkZXBlbmQiIGRvCisJCQkjIG5vdGhpbmcuCisJCQkjCisJCQlNS0RFUD06CisJCWZpCisJCXJtIC1yZiBjb25mdGVzdCoKKwllbHNlCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJIworCQkjIFdlIGNhbid0IHJ1biBta2RlcCwgc28gaGF2ZSAibWFrZSBkZXBlbmQiIGRvCisJCSMgbm90aGluZy4KKwkJIworCQlNS0RFUD06CisJZmkKKwlBQ19TVUJTVChERVBFTkRFTkNZX0NGTEFHKQorCUFDX1NVQlNUKE1LREVQKQorICAgIF0pCisKK2RubAorZG5sIERldGVybWluZSB3aGF0IG9wdGlvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5CitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9TSExJQlNfSU5JVAorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCVZfQ0NPUFQgKG1vZGlmaWVkIHRvIGJ1aWxkIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUpCitkbmwJVl9TSExJQl9DTUQKK2RubAlWX1NITElCX09QVAorZG5sCVZfU09OQU1FX09QVAorZG5sCVZfUlBBVEhfT1BUCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9TSExJQlNfSU5JVCwKKyAgICBbQUNfUFJFUkVRKDIuNTApCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgICMKKwkgICAgIyBPbiBwbGF0Zm9ybXMgd2hlcmUgd2UgYnVpbGQgYSBzaGFyZWQgbGlicmFyeToKKwkgICAgIworCSAgICAjCWFkZCBvcHRpb25zIHRvIGdlbmVyYXRlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUsCisJICAgICMJaWYgbmVjZXNzYXJ5IChpdCdzIHRoZSBkZWZhdWx0IGluIEFJWCBhbmQgRGFyd2luL09TIFgpOworCSAgICAjCisJICAgICMJZGVmaW5lIG9wdGlvbiB0byBzZXQgdGhlIHNvbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnksCisJICAgICMJaWYgdGhlIE9TIHN1cHBvcnRzIHRoYXQ7CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBzcGVjaWZ5LCBhdCBsaW5rIHRpbWUsIGEgZGlyZWN0b3J5IHRvCisJICAgICMJYWRkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgaWYgdGhhdCdzIG5lY2Vzc2FyeS4KKwkgICAgIworCSAgICBWX1NITElCX0NNRD0iXCQoQ0MpIgorCSAgICBWX1NITElCX09QVD0iLXNoYXJlZCIKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYWl4KikKKwkJICAgIDs7CisKKwkgICAgZnJlZWJzZCp8bmV0YnNkKnxvcGVuYnNkKnxkcmFnb25mbHkqfGxpbnV4Knxvc2YqKQorCSAgICAJICAgICMKKwkJICAgICMgUGxhdGZvcm1zIHdoZXJlIHRoZSBsaW5rZXIgaXMgdGhlIEdOVSBsaW5rZXIKKwkJICAgICMgb3IgYWNjZXB0cyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGxpa2UKKwkJICAgICMgdGhvc2UgdGhlIEdOVSBsaW5rZXIgYWNjZXB0cy4KKwkJICAgICMKKwkJICAgICMgU29tZSBpbnN0cnVjdGlvbiBzZXRzIHJlcXVpcmUgLWZQSUMgb24gc29tZQorCQkgICAgIyBvcGVyYXRpbmcgc3lzdGVtcy4gIENoZWNrIGZvciB0aGVtLiAgSWYgeW91CisJCSAgICAjIGhhdmUgYSBjb21iaW5hdGlvbiB0aGF0IHJlcXVpcmVzIGl0LCBhZGQgaXQKKwkJICAgICMgaGVyZS4KKwkJICAgICMKKwkJICAgIFBJQ19PUFQ9LWZwaWMKKwkJICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKworCQkgICAgc3BhcmM2NCopCisJCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQkJZnJlZWJzZCp8b3BlbmJzZCopCisJCQkgICAgUElDX09QVD0tZlBJQworCQkJICAgIDs7CisJCQllc2FjCisJCQk7OworCQkgICAgZXNhYworCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgJFBJQ19PUFQiCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwtc29uYW1lLCIKKwkJICAgIFZfUlBBVEhfT1BUPSItV2wsLXJwYXRoLCIKKwkJICAgIDs7CisKKwkgICAgaHB1eCopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtZnBpYyIKKwkgICAgCSAgICAjCisJCSAgICAjIFhYWCAtIHRoaXMgYXNzdW1lcyBHQ0MgaXMgdXNpbmcgdGhlIEhQIGxpbmtlciwKKwkJICAgICMgcmF0aGVyIHRoYW4gdGhlIEdOVSBsaW5rZXIsIGFuZCB0aGF0IHRoZSAiK2giCisJCSAgICAjIG9wdGlvbiBpcyB1c2VkIG9uIGFsbCBIUC1VWCBwbGF0Zm9ybXMsIGJvdGggLnNsCisJCSAgICAjIGFuZCAuc28uCisJCSAgICAjCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwraCwiCisJCSAgICAjCisJCSAgICAjIEJ5IGRlZmF1bHQsIGRpcmVjdG9yaWVzIHNwZWNpZmVkIHdpdGggLUwKKwkJICAgICMgYXJlIGFkZGVkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgc28KKwkJICAgICMgd2UgZG9uJ3QgYWRkIHRoZW0gaW4gcGNhcC1jb25maWcuCisJCSAgICAjCisJCSAgICA7OworCisJICAgIHNvbGFyaXMqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLWZwaWMiCisJCSAgICAjCisJCSAgICAjIFhYWCAtIHRoaXMgYXNzdW1lcyBHQ0MgaXMgdXNpbmcgdGhlIFN1biBsaW5rZXIsCisJCSAgICAjIHJhdGhlciB0aGFuIHRoZSBHTlUgbGlua2VyLgorCQkgICAgIworCQkgICAgVl9TT05BTUVfT1BUPSItV2wsLWgsIgorCQkgICAgVl9SUEFUSF9PUFQ9Ii1XbCwtUiwiCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZWxzZQorCSAgICAjCisJICAgICMgU2V0IHRoZSBhcHByb3ByaWF0ZSBjb21waWxlciBmbGFncyBhbmQsIG9uIHBsYXRmb3JtcworCSAgICAjIHdoZXJlIHdlIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnk6CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBnZW5lcmF0ZSBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlLAorCSAgICAjCWlmIG5lY2Vzc2FyeSAoaXQncyB0aGUgZGVmYXVsdCBpbiBEYXJ3aW4vT1MgWCk7CisJICAgICMKKwkgICAgIwlpZiB3ZSBnZW5lcmF0ZSAiLnNvIiBzaGFyZWQgbGlicmFyaWVzLCBkZWZpbmUgdGhlCisJICAgICMJYXBwcm9wcmlhdGUgb3B0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5OworCSAgICAjCisJICAgICMJYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSwgYXQgbGluayB0aW1lLCBhIGRpcmVjdG9yeSB0bworCSAgICAjCWFkZCB0byB0aGUgcnVuLXRpbWUgc2VhcmNoIHBhdGgsIGlmIHRoYXQncyBuZWNlc3NhcnkuCisJICAgICMKKwkgICAgIyBOb3RlOiBzcGFjZXMgYWZ0ZXIgVl9TT05BTUVfT1BUIGFyZSBzaWduaWZpY2FudDsgb24KKwkgICAgIyBzb21lIHBsYXRmb3JtcyB0aGUgc29uYW1lIGlzIHBhc3NlZCB3aXRoIGEgR0NDLWxpa2UKKwkgICAgIyAiLVdsLC1zb25hbWUse3NvbmFtZX0iIG9wdGlvbiwgd2l0aCB0aGUgc29uYW1lIHBhcnQKKwkgICAgIyBvZiB0aGUgb3B0aW9uLCB3aGlsZSBvbiBvdGhlciBwbGF0Zm9ybXMgdGhlIEMgY29tcGlsZXIKKwkgICAgIyBkcml2ZXIgdGFrZXMgaXQgYXMgYSByZWd1bGFyIG9wdGlvbiB3aXRoIHRoZSBzb25hbWUKKwkgICAgIyBmb2xsb3dpbmcgdGhlIG9wdGlvbi4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gVl9SUEFUSF9PUFQuCisJICAgICMKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYWl4KikKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLUcgLWJub2VudHJ5IC1iZXhwYWxsIgorCQkgICAgOzsKKworCSAgICBmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8bGludXgqKQorCQkgICAgIworCQkgICAgIyAiY2MiIGlzIEdDQy4KKwkJICAgICMKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1mcGljIgorCQkgICAgVl9TSExJQl9DTUQ9IlwkKENDKSIKKwkJICAgIFZfU0hMSUJfT1BUPSItc2hhcmVkIgorCQkgICAgVl9TT05BTUVfT1BUPSItV2wsLXNvbmFtZSwiCisJCSAgICBWX1JQQVRIX09QVD0iLVdsLC1ycGF0aCwiCisJCSAgICA7OworCisJICAgIGhwdXgqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgK3oiCisJCSAgICBWX1NITElCX0NNRD0iXCQoTEQpIgorCQkgICAgVl9TSExJQl9PUFQ9Ii1iIgorCQkgICAgVl9TT05BTUVfT1BUPSIraCAiCisJCSAgICAjCisJCSAgICAjIEJ5IGRlZmF1bHQsIGRpcmVjdG9yaWVzIHNwZWNpZmVkIHdpdGggLUwKKwkJICAgICMgYXJlIGFkZGVkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgc28KKwkJICAgICMgd2UgZG9uJ3QgYWRkIHRoZW0gaW4gcGNhcC1jb25maWcuCisJCSAgICAjCisJCSAgICA7OworCisJICAgIG9zZiopCisJICAgIAkgICAgIworCQkgICAgIyBQcmVzdW1lZCB0byBiZSBERUMgT1NGLzEsIERpZ2l0YWwgVU5JWCwgb3IKKwkJICAgICMgVHJ1NjQgVU5JWC4KKwkJICAgICMKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLXNoYXJlZCIKKwkJICAgIFZfU09OQU1FX09QVD0iLXNvbmFtZSAiCisJCSAgICBWX1JQQVRIX09QVD0iLXJwYXRoICIKKwkJICAgIDs7CisKKwkgICAgc29sYXJpcyopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtS3BpYyIKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLUciCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1oICIKKwkJICAgIFZfUlBBVEhfT1BUPSItUiIKKwkJICAgIDs7CisJICAgIGVzYWMKICAgICBmaQogXSkKIApAQCAtMjA5LDExNCArNTk2LDYgQEAKICAgICBBQ19ERUZJTkVfVU5RVU9URUQoaW5saW5lLCAkYWNfY3ZfbGJsX2lubGluZSwgW0RlZmluZSBhcyB0b2tlbiBmb3IgaW5saW5lIGlmIGlubGluaW5nIHN1cHBvcnRlZF0pXSkKIAogZG5sCi1kbmwgVXNlIHBmb3Blbi5jIGlmIGF2YWlsYWJsZSBhbmQgcGZvcGVuKCkgbm90IGluIHN0YW5kYXJkIGxpYnJhcmllcwotZG5sIFJlcXVpcmUgbGlicGNhcAotZG5sIExvb2sgZm9yIGxpYnBjYXAgaW4gLi4KLWRubCBVc2UgdGhlIGluc3RhbGxlZCBsaWJwY2FwIGlmIHRoZXJlIGlzIG5vIGxvY2FsIHZlcnNpb24KLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX0xJQlBDQVAocGNhcGRlcCwgaW5jbHMpCi1kbmwKLWRubCByZXN1bHRzOgotZG5sCi1kbmwJJDEgKHBjYXBkZXAgc2V0KQotZG5sCSQyIChpbmNscyBhcHBlbmRlZCkKLWRubAlMSUJTCi1kbmwJTEJMX0xJQlMKLWRubAotQUNfREVGVU4oQUNfTEJMX0xJQlBDQVAsCi0gICAgW0FDX1JFUVVJUkUoW0FDX0xCTF9MSUJSQVJZX05FVF0pCi0gICAgZG5sCi0gICAgZG5sIHNhdmUgYSBjb3B5IGJlZm9yZSBsb2NhdGluZyBsaWJwY2FwLmEKLSAgICBkbmwKLSAgICBMQkxfTElCUz0iJExJQlMiCi0gICAgcGZvcGVuPS91c3IvZXhhbXBsZXMvcGFja2V0ZmlsdGVyL3Bmb3Blbi5jCi0gICAgaWYgdGVzdCAtZiAkcGZvcGVuIDsgdGhlbgotCSAgICBBQ19DSEVDS19GVU5DUyhwZm9wZW4pCi0JICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcGZvcGVuID0gIm5vIiA7IHRoZW4KLQkJICAgIEFDX01TR19SRVNVTFQoVXNpbmcgJHBmb3BlbikKLQkJICAgIExJQlM9IiRMSUJTICRwZm9wZW4iCi0JICAgIGZpCi0gICAgZmkKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvY2FsIHBjYXAgbGlicmFyeSkKLSAgICBsaWJwY2FwPUZBSUwKLSAgICBsYXN0ZGlyPUZBSUwKLSAgICBwbGFjZXM9YGxzIC4uIHwgc2VkIC1lICdzLC8kLCwnIC1lICdzLF4sLi4vLCcgfCBcCi0JZWdyZXAgJy9saWJwY2FwLVtbMC05XV0qXC5bWzAtOV1dKihcLltbMC05XV0qKT8oW1thYl1dW1swLTldXSopPyQnYAotICAgIGZvciBkaXIgaW4gJHBsYWNlcyAuLi9saWJwY2FwIGxpYnBjYXAgOyBkbwotCSAgICBiYXNlZGlyPWBlY2hvICRkaXIgfCBzZWQgLWUgJ3MvW1thYl1dW1swLTldXSokLy8nYAotCSAgICBpZiB0ZXN0ICRsYXN0ZGlyID0gJGJhc2VkaXIgOyB0aGVuCi0JCSAgICBkbmwgc2tpcCBhbHBoYXMgd2hlbiBhbiBhY3R1YWwgcmVsZWFzZSBpcyBwcmVzZW50Ci0JCSAgICBjb250aW51ZTsKLQkgICAgZmkKLQkgICAgbGFzdGRpcj0kZGlyCi0JICAgIGlmIHRlc3QgLXIgJGRpci9wY2FwLmMgOyB0aGVuCi0JCSAgICBsaWJwY2FwPSRkaXIvbGlicGNhcC5hCi0JCSAgICBkPSRkaXIKLQkJICAgIGRubCBjb250aW51ZSBhbmQgc2VsZWN0IHRoZSBsYXN0IG9uZSB0aGF0IGV4aXN0cwotCSAgICBmaQotICAgIGRvbmUKLSAgICBpZiB0ZXN0ICRsaWJwY2FwID0gRkFJTCA7IHRoZW4KLQkgICAgQUNfTVNHX1JFU1VMVChub3QgZm91bmQpCi0JICAgIEFDX0NIRUNLX0xJQihwY2FwLCBtYWluLCBsaWJwY2FwPSItbHBjYXAiKQotCSAgICBpZiB0ZXN0ICRsaWJwY2FwID0gRkFJTCA7IHRoZW4KLQkJICAgIEFDX01TR19FUlJPUihzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pCi0JICAgIGZpCi0gICAgZWxzZQotCSAgICAkMT0kbGlicGNhcAotCSAgICAkMj0iLUkkZCAkJDIiCi0JICAgIEFDX01TR19SRVNVTFQoJGxpYnBjYXApCi0gICAgZmkKLSAgICBMSUJTPSIkbGlicGNhcCAkTElCUyIKLSAgICBjYXNlICIkdGFyZ2V0X29zIiBpbgotCi0gICAgYWl4KikKLQkgICAgcHNlZXhlPSIvbGliL3BzZS5leHAiCi0JICAgIEFDX01TR19DSEVDS0lORyhmb3IgJHBzZWV4ZSkKLQkgICAgaWYgdGVzdCAtZiAkcHNlZXhlIDsgdGhlbgotCQkgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0JCSAgICBMSUJTPSIkTElCUyAtSTokcHNlZXhlIgotCSAgICBmaQotCSAgICA7OwotICAgIGVzYWNdKQotCi1kbmwKLWRubCBEZWZpbmUgUkVUU0lHVFlQRSBhbmQgUkVUU0lHVkFMCi1kbmwKLWRubCB1c2FnZToKLWRubAotZG5sCUFDX0xCTF9UWVBFX1NJR05BTAotZG5sCi1kbmwgcmVzdWx0czoKLWRubAotZG5sCVJFVFNJR1RZUEUgKGRlZmluZWQpCi1kbmwJUkVUU0lHVkFMIChkZWZpbmVkKQotZG5sCi1BQ19ERUZVTihBQ19MQkxfVFlQRV9TSUdOQUwsCi0gICAgW0FDX0JFRk9SRShbJDBdLCBbQUNfTEJMX0xJQlBDQVBdKQotICAgIEFDX1RZUEVfU0lHTkFMCi0gICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2lnbmFsIiA9IHZvaWQgOyB0aGVuCi0JICAgIEFDX0RFRklORShSRVRTSUdWQUwsW10sW3JldHVybiB2YWx1ZSBvZiBzaWduYWwgaGFuZGxlcnNdKQotICAgIGVsc2UKLQkgICAgQUNfREVGSU5FKFJFVFNJR1ZBTCwoMCksW3JldHVybiB2YWx1ZSBvZiBzaWduYWwgaGFuZGxlcnNdKQotICAgIGZpCi0gICAgY2FzZSAiJHRhcmdldF9vcyIgaW4KLQotICAgIGlyaXgqKQotCSAgICBBQ19ERUZJTkUoX0JTRF9TSUdOQUxTLDEsW2dldCBCU0Qgc2VtYW50aWNzIG9uIElyaXhdKQotCSAgICA7OwotCi0gICAgKikKLQkgICAgZG5sIHByZWZlciBzaWdzZXQoKSB0byBzaWdhY3Rpb24oKQotCSAgICBBQ19DSEVDS19GVU5DUyhzaWdzZXQpCi0JICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2lnc2V0ID0gbm8gOyB0aGVuCi0JCSAgICBBQ19DSEVDS19GVU5DUyhzaWdhY3Rpb24pCi0JICAgIGZpCi0JICAgIDs7Ci0gICAgZXNhY10pCi0KLWRubAogZG5sIElmIHVzaW5nIGdjYywgbWFrZSBzdXJlIHdlIGhhdmUgQU5TSSBpb2N0bCBkZWZpbml0aW9ucwogZG5sCiBkbmwgdXNhZ2U6CkBAIC0zNTcsNyArNjM2LDIyIEBACiBkbmwgUmVxdWlyZSBmbGV4IDIuNCBvciBoaWdoZXIKIGRubCBDaGVjayBmb3IgYmlzb24sIGRlZmF1bHQgdG8geWFjYwogZG5sIERlZmF1bHQgdG8gbGV4L3lhY2MgaWYgYm90aCBmbGV4IGFuZCBiaXNvbiBhcmUgbm90IGF2YWlsYWJsZQotZG5sIERlZmluZSB0aGUgeXkgcHJlZml4IHN0cmluZyBpZiB1c2luZyBmbGV4IGFuZCBiaXNvbgorZG5sCitkbmwgSWYgd2UncmUgdXNpbmcgZmxleCBhbmQgYmlzb24sIHBhc3MgLVAgdG8gZmxleCBhbmQgLXAgdG8gYmlzb24KK2RubCB0byBkZWZpbmUgYSBwcmVmaXggc3RyaW5nIGZvciB0aGUgbGV4ZXIgYW5kIHBhcnNlcgorZG5sCitkbmwgSWYgd2UncmUgbm90IHVzaW5nIGZsZXggYW5kIGJpc29uLCBkb24ndCBwYXNzIHRob3NlIG9wdGlvbnMKK2RubCAoYXMgdGhleSBtaWdodCBub3Qgd29yayAtIGFsdGhvdWdoIGlmICJsZXgiIGlzIGEgd3JhcHBlciBmb3IKK2RubCBGbGV4IGFuZCAieWFjYyIgaXMgYSB3cmFwcGVyIGZvciBCaXNvbiwgdGhleSB3aWxsIHdvcmspLCBhbmQKK2RubCBkZWZpbmUgTkVFRF9ZWVBBUlNFX1dSQVBQRVIgKHdlICpDQU5OT1QqIHVzZSBZWUJJU09OIHRvIGNoZWNrCitkbmwgd2hldGhlciB0aGUgd3JhcHBlciBpcyBuZWVkZWQsIGFzIHNvbWUgcGVvcGxlIGFwcGFyZW50bHksIGZvcgorZG5sIHNvbWUgdW5rbm93biByZWFzb24sIGNob29zZSB0byB1c2UgLS13aXRob3V0LWZsZXggYW5kCitkbmwgLS13aXRob3V0LWJpc29uIG9uIHN5c3RlbXMgdGhhdCBoYXZlIEZsZXggYW5kIEJpc29uLCB3aGljaAorZG5sIG1lYW5zIHRoYXQgdGhlICJ5YWNjIiB0aGV5IGVuZCB1cCB1c2luZyBpcyBhIHdyYXBwZXIgdGhhdAorZG5sIHJ1bnMgImJpc29uIC15IiwgYW5kIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMgb2YgQmlzb24gZGVmaW5lCitkbmwgWVlCSVNPTiBldmVuIGlmIHJ1biB3aXRoICIteSIsIHNvIHdlIGVuZCB1cCBub3QgY29tcGlsaW5nCitkbmwgdGhlIHl5cGFyc2Ugd3JhcHBlciBhbmQgZW5kIHVwIHdpdGggYSBsaWJwY2FwIHRoYXQgZG9lc24ndAorZG5sIGRlZmluZSBwY2FwX3BhcnNlKCkpCiBkbmwKIGRubCB1c2FnZToKIGRubApAQCAtNDA5LDYgKzcwMyw4IEBACiAgICAgaWYgdGVzdCAiJCQxIiA9IGZsZXggLWEgLW4gIiQzIiA7IHRoZW4KIAkgICAgJDE9IiQkMSAtUCQzIgogCSAgICAkMj0iJCQyIC1wICQzIgorICAgIGVsc2UKKwkgICAgQUNfREVGSU5FKE5FRURfWVlQQVJTRV9XUkFQUEVSLDEsW2lmIHdlIG5lZWQgYSBwY2FwX3BhcnNlIHdyYXBwZXIgYXJvdW5kIHl5cGFyc2VdKQogICAgIGZpXSkKIAogZG5sCkBAIC00NTIsNyArNzQ4LDcgQEAKIGRubAlIQVZFX1NPQ0tBRERSX1NBX0xFTiAoZGVmaW5lZCkKIGRubAogQUNfREVGVU4oQUNfTEJMX1NPQ0tBRERSX1NBX0xFTiwKLSAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgc2FfbGVuIG1lbWJlcikKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgdGhlIHNhX2xlbiBtZW1iZXIpCiAgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuLAogCUFDX1RSWV9DT01QSUxFKFsKICMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC00NjIsNyArNzU4LDcgQEAKIAlhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubykpCiAgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4pCiAgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4gPSB5ZXMgOyB0aGVuCi0JICAgIEFDX0RFRklORShIQVZFX1NPQ0tBRERSX1NBX0xFTiwxLFtpZiBzdHJ1Y3Qgc29ja2FkZHIgaGFzIHNhX2xlbl0pCisJICAgIEFDX0RFRklORShIQVZFX1NPQ0tBRERSX1NBX0xFTiwxLFtpZiBzdHJ1Y3Qgc29ja2FkZHIgaGFzIHRoZSBzYV9sZW4gbWVtYmVyXSkKICAgICBmaV0pCiAKIGRubApAQCAtNTQ1LDQxICs4NDEsMTEgQEAKIAllbHNlCiAJCWFjX2N2X2xibF9oYXZlX3J1bl9wYXRoPW5vCiAJZmkKLQlybSAtZiBjb25mdGVzdCpdKQorCXJtIC1mIC1yIGNvbmZ0ZXN0Kl0pCiAgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGgpCiAgICAgXSkKIAogZG5sCi1kbmwgRHVlIHRvIHRoZSBzdHVwaWQgd2F5IGl0J3MgaW1wbGVtZW50ZWQsIEFDX0NIRUNLX1RZUEUgaXMgbmVhcmx5IHVzZWxlc3MuCi1kbmwKLWRubCB1c2FnZToKLWRubAotZG5sCUFDX0xCTF9DSEVDS19UWVBFCi1kbmwKLWRubCByZXN1bHRzOgotZG5sCi1kbmwJaW50MzJfdCAoZGVmaW5lZCkKLWRubAl1X2ludDMyX3QgKGRlZmluZWQpCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9DSEVDS19UWVBFLAotICAgIFtBQ19NU0dfQ0hFQ0tJTkcoZm9yICQxIHVzaW5nICRDQykKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2hhdmVfJDEsCi0JQUNfVFJZX0NPTVBJTEUoWwotIwlpbmNsdWRlICJjb25mZGVmcy5oIgotIwlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJaWYgU1REQ19IRUFERVJTCi0jCWluY2x1ZGUgPHN0ZGxpYi5oPgotIwlpbmNsdWRlIDxzdGRkZWYuaD4KLSMJZW5kaWZdLAotCVskMSBpXSwKLQlhY19jdl9sYmxfaGF2ZV8kMT15ZXMsCi0JYWNfY3ZfbGJsX2hhdmVfJDE9bm8pKQotICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9oYXZlXyQxKQotICAgIGlmIHRlc3QgJGFjX2N2X2xibF9oYXZlXyQxID0gbm8gOyB0aGVuCi0JICAgIEFDX0RFRklORSgkMSwgJDIsIFtpZiB3ZSBoYXZlICQxXSkKLSAgICBmaV0pCi0KLWRubAogZG5sIENoZWNrcyB0byBzZWUgaWYgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyBmYWlsCiBkbmwKIGRubCB1c2FnZToKQEAgLTYyNyw3ICs4OTMsNyBAQAogCSMga25vdyBpdCBkb2VzIHdvcmssIGFuZCBoYXZlIHRoZSBzY3JpcHQganVzdCBmYWlsIG9uIG90aGVyCiAJIyBjcHUgdHlwZXMgYW5kIHVwZGF0ZSBpdCB3aGVuIHN1Y2ggYSBmYWlsdXJlIG9jY3Vycy4KIAkjCi0JYWxwaGEqfGFybSp8aHAqfG1pcHMqfHNoKnxzcGFyYyp8aWE2NHxudjEpCisJYWxwaGEqfGFybSp8YmZpbip8aHAqfG1pcHMqfHNoKnxzcGFyYyp8aWE2NHxudjEpCiAJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKIAkJOzsKIApAQCAtNjcxLDcgKzkzNyw3IEBACiAJCQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPW5vCiAJCQlmaQogCQlmaQotCQlybSAtZiBjb25mdGVzdCogY29yZSBjb3JlLmNvbmZ0ZXN0CisJCXJtIC1mIC1yIGNvbmZ0ZXN0KiBjb3JlIGNvcmUuY29uZnRlc3QKIAkJOzsKIAllc2FjXSkKICAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwpCkBAIC02ODAsOSArOTQ2LDggQEAKICAgICBmaV0pCiAKIGRubAotZG5sIElmIHVzaW5nIGdjYyBhbmQgdGhlIGZpbGUgLmRldmVsIGV4aXN0czoKLWRubAlDb21waWxlIHdpdGggLWcgKGlmIHN1cHBvcnRlZCkgYW5kIC1XYWxsCi1kbmwJSWYgdXNpbmcgZ2NjIDIsIGRvIGV4dHJhIHByb3RvdHlwZSBjaGVja2luZworZG5sIElmIHRoZSBmaWxlIC5kZXZlbCBleGlzdHM6CitkbmwJQWRkIHNvbWUgd2FybmluZyBmbGFncyBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlbQogZG5sCUlmIGFuIG9zIHByb3RvdHlwZSBpbmNsdWRlIGV4aXN0cywgc3ltbGluayBvcy1wcm90by5oIHRvIGl0CiBkbmwKIGRubCB1c2FnZToKQEAgLTcwMSwzMiArOTY2LDMwIEBACiAJICAgICQxPSIkJDEgJHtMQkxfQ0ZMQUdTfSIKICAgICBmaQogICAgIGlmIHRlc3QgLWYgLmRldmVsIDsgdGhlbgotCSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KLQkJICAgIGlmIHRlc3QgIiR7TEJMX0NGTEFHUytzZXR9IiAhPSBzZXQ7IHRoZW4KLQkJCSAgICBpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19nIiA9IHllcyA7IHRoZW4KLQkJCQkgICAgJDE9Ii1nICQkMSIKLQkJCSAgICBmaQotCQkJICAgICQxPSIkJDEgLVdhbGwiCi0JCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgotCQkJCSAgICAkMT0iJCQxIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMiCi0JCQkgICAgZmkKLQkJICAgIGZpCi0JICAgIGVsc2UKLQkJICAgIGNhc2UgIiR0YXJnZXRfb3MiIGluCi0KLQkJICAgIGlyaXg2KikKLQkJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtbjMyIgotCQkJICAgIDs7Ci0KLQkJICAgICopCi0JCQkgICAgOzsKLQkJICAgIGVzYWMKKwkgICAgIworCSAgICAjIFNraXAgYWxsIHRoZSB3YXJuaW5nIG9wdGlvbiBzdHVmZiBvbiBzb21lIGNvbXBpbGVycy4KKwkgICAgIworCSAgICBpZiB0ZXN0ICIkYWNfbGJsX2NjX2RvbnRfdHJ5X2djY19kYXNoVyIgIT0geWVzOyB0aGVuCisJCSAgICBBQ19MQkxfQ0hFQ0tfVU5LTk9XTl9XQVJOSU5HX09QVElPTl9FUlJPUigpCisJCSAgICBBQ19MQkxfQ0hFQ0tfQ09NUElMRVJfT1BUKCQxLCAtV2FsbCkKKwkJICAgIEFDX0xCTF9DSEVDS19DT01QSUxFUl9PUFQoJDEsIC1XbWlzc2luZy1wcm90b3R5cGVzKQorCQkgICAgQUNfTEJMX0NIRUNLX0NPTVBJTEVSX09QVCgkMSwgLVdzdHJpY3QtcHJvdG90eXBlcykKIAkgICAgZmkKLQkgICAgb3M9YGVjaG8gJHRhcmdldF9vcyB8IHNlZCAtZSAncy9cKFtbMC05XV1bWzAtOV1dKlwpW1teMC05XV0uKiQvXDEvJ2AKKwkgICAgQUNfTEJMX0NIRUNLX0RFUEVOREVOQ1lfR0VORVJBVElPTl9PUFQoKQorCSAgICAjCisJICAgICMgV2UgdXNlZCB0byBzZXQgLW4zMiBmb3IgSVJJWCA2IHdoZW4gbm90IHVzaW5nIEdDQyAocHJlc3VtZWQKKwkgICAgIyB0byBtZWFuIHRoYXQgd2UncmUgdXNpbmcgTUlQUyBDIG9yIE1JUFNwcm8gQyk7IGl0IHNwZWNpZmllZAorCSAgICAjIHRoZSAibmV3IiBmYXN0ZXIgMzItYml0IEFCSSwgaW50cm9kdWNlZCBpbiBJUklYIDYuMi4gIEknbQorCSAgICAjIG5vdCBzdXJlIHdoeSB0aGF0IHdvdWxkIGJlIHNvbWV0aGluZyB0byBkbyAqb25seSogd2l0aCBhCisJICAgICMgLmRldmVsIGZpbGU7IHdoeSBzaG91bGQgdGhlIEFCSSBmb3Igd2hpY2ggd2UgcHJvZHVjZSBjb2RlCisJICAgICMgZGVwZW5kIG9uIC5kZXZlbD8KKwkgICAgIworCSAgICBvcz1gZWNobyAkaG9zdF9vcyB8IHNlZCAtZSAncy9cKFtbMC05XV1bWzAtOV1dKlwpW1teMC05XV0uKiQvXDEvJ2AKIAkgICAgbmFtZT0ibGJsL29zLSRvcy5oIgogCSAgICBpZiB0ZXN0IC1mICRuYW1lIDsgdGhlbgogCQkgICAgbG4gLXMgJG5hbWUgb3MtcHJvdG8uaAotCQkgICAgQUNfREVGSU5FKEhBVkVfT1NfUFJPVE9fSCwxLFtpZiB0aGVyZSdzIGFuIG9zX3Byb3RvLmhdKQorCQkgICAgQUNfREVGSU5FKEhBVkVfT1NfUFJPVE9fSCwgMSwKKwkJCVtpZiB0aGVyZSdzIGFuIG9zX3Byb3RvLmggZm9yIHRoaXMgcGxhdGZvcm0sIHRvIHVzZSBhZGRpdGlvbmFsIHByb3RvdHlwZXNdKQogCSAgICBlbHNlCiAJCSAgICBBQ19NU0dfV0FSTihjYW4ndCBmaW5kICRuYW1lKQogCSAgICBmaQpAQCAtNzQ2LDEzICsxMDA5LDE5IEBACiBkbmwKIGRubAlMSUJTCiBkbmwKK2RubCBYWFggLSAiQUNfTEJMX0xJQlJBUllfTkVUIiB3YXMgcmVkb25lIHRvIHVzZSAiQUNfU0VBUkNIX0xJQlMiCitkbmwgcmF0aGVyIHRoYW4gIkFDX0xCTF9DSEVDS19MSUIiLCBzbyB0aGlzIGlzbid0IHVzZWQgYW55IG1vcmUuCitkbmwgV2Uga2VlcCBpdCBhcm91bmQgZm9yIHJlZmVyZW5jZSBwdXJwb3NlcyBpbiBjYXNlIGl0J3MgZXZlcgorZG5sIHVzZWZ1bCBpbiB0aGUgZnV0dXJlLgorZG5sCiAKIGRlZmluZShBQ19MQkxfQ0hFQ0tfTElCLAogW0FDX01TR19DSEVDS0lORyhbZm9yICQyIGluIC1sJDFdKQotZG5sIFVzZSBhIGNhY2hlIHZhcmlhYmxlIG5hbWUgY29udGFpbmluZyBib3RoIHRoZSBsaWJyYXJ5IGFuZCBmdW5jdGlvbiBuYW1lLAotZG5sIGJlY2F1c2UgdGhlIHRlc3QgcmVhbGx5IGlzIGZvciBsaWJyYXJ5ICQxIGRlZmluaW5nIGZ1bmN0aW9uICQyLCBub3QKLWRubCBqdXN0IGZvciBsaWJyYXJ5ICQxLiAgU2VwYXJhdGUgdGVzdHMgd2l0aCB0aGUgc2FtZSAkMSBhbmQgZGlmZmVyZW50ICQyJ3MKLWRubCBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVzdWx0cy4KK2RubCBVc2UgYSBjYWNoZSB2YXJpYWJsZSBuYW1lIGNvbnRhaW5pbmcgdGhlIGxpYnJhcnksIGZ1bmN0aW9uCitkbmwgbmFtZSwgYW5kIGV4dHJhIGxpYnJhcmllcyB0byBsaW5rIHdpdGgsIGJlY2F1c2UgdGhlIHRlc3QgcmVhbGx5IGlzCitkbmwgZm9yIGxpYnJhcnkgJDEgZGVmaW5pbmcgZnVuY3Rpb24gJDIsIHdoZW4gbGlua2VkIHdpdGggcG90aW5hbAorZG5sIGxpYnJhcnkgJDUsIG5vdCBqdXN0IGZvciBsaWJyYXJ5ICQxLiAgU2VwYXJhdGUgdGVzdHMgd2l0aCB0aGUgc2FtZQorZG5sICQxIGFuZCBkaWZmZXJlbnQgJDIncyBvciAkNSdzIG1heSBoYXZlIGRpZmZlcmVudCByZXN1bHRzLgogYWNfbGliX3Zhcj1gZWNobyAkMVsnXyddJDJbJ18nXSQ1IHwgc2VkICd5JS4vKy0gJV9fcF9fJSdgCiBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2xpYl8kYWNfbGliX3ZhciwKIFthY19zYXZlX0xJQlM9IiRMSUJTIgpAQCAtODUxLDcgKzExMjAsNyBAQAogQUNfREVGVU4oQUNfQ19fX0FUVFJJQlVURV9fLCBbCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIF9fYXR0cmlidXRlX18pCiBBQ19DQUNIRV9WQUwoYWNfY3ZfX19hdHRyaWJ1dGVfXywgWwotQUNfQ09NUElMRV9JRkVMU0UoCitBQ19DT01QSUxFX0lGRUxTRShbCiAgIEFDX0xBTkdfU09VUkNFKFtbCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKQEAgLTg2OCwxNiArMTEzNyw4MyBAQAogewogICBmb28oKTsKIH0KLSAgXV0pLAorICBdXSldLAogYWNfY3ZfX19hdHRyaWJ1dGVfXz15ZXMsCiBhY19jdl9fX2F0dHJpYnV0ZV9fPW5vKV0pCiBpZiB0ZXN0ICIkYWNfY3ZfX19hdHRyaWJ1dGVfXyIgPSAieWVzIjsgdGhlbgogICBBQ19ERUZJTkUoSEFWRV9fX0FUVFJJQlVURV9fLCAxLCBbZGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgaGFzIF9fYXR0cmlidXRlX19dKQorZWxzZQorICAjCisgICMgV2UgY2FuJ3QgdXNlIF9fYXR0cmlidXRlX18sIHNvIHdlIGNhbid0IHVzZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKyAgIyBzbyB3ZSBkZWZpbmUgX1VfIHRvIGFuIGVtcHR5IHN0cmluZy4KKyAgIworICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJcIiIKK2ZpCitBQ19NU0dfUkVTVUxUKCRhY19jdl9fX2F0dHJpYnV0ZV9fKQorXSkKKworZG5sCitkbmwgVGVzdCB3aGV0aGVyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNhbiBiZSB1c2VkIHdpdGhvdXQgd2FybmluZ3MKK2RubAorCitBQ19ERUZVTihBQ19DX19fQVRUUklCVVRFX19fVU5VU0VELCBbCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY2FuIGJlIHVzZWQgd2l0aG91dCB3YXJuaW5nc10pCitBQ19DQUNIRV9WQUwoYWNfY3ZfX19hdHRyaWJ1dGVfX191bnVzZWQsIFsKK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnMiCitBQ19DT01QSUxFX0lGRUxTRShbCisgIEFDX0xBTkdfU09VUkNFKFtbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluKGludCBhcmdjICBfX2F0dHJpYnV0ZSgodW51c2VkKSksIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlKCh1bnVzZWQpKSkKK3sKKyAgcHJpbnRmKCJIZWxsbywgd29ybGQhXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisgIF1dKV0sCithY19jdl9fX2F0dHJpYnV0ZV9fX3VudXNlZD15ZXMsCithY19jdl9fX2F0dHJpYnV0ZV9fX3VudXNlZD1ubyldKQorQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitpZiB0ZXN0ICIkYWNfY3ZfX19hdHRyaWJ1dGVfX191bnVzZWQiID0gInllcyI7IHRoZW4KICAgVl9ERUZTPSIkVl9ERUZTIC1EX1VfPVwiX19hdHRyaWJ1dGVfXygodW51c2VkKSlcIiIKIGVsc2UKICAgVl9ERUZTPSIkVl9ERUZTIC1EX1VfPVwiXCIiCiBmaQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfX19hdHRyaWJ1dGVfXykKK0FDX01TR19SRVNVTFQoJGFjX2N2X19fYXR0cmlidXRlX19fdW51c2VkKQorXSkKKworZG5sCitkbmwgVGVzdCB3aGV0aGVyIF9fYXR0cmlidXRlX18oKGZvcm1hdCkpIGNhbiBiZSB1c2VkIHdpdGhvdXQgd2FybmluZ3MKK2RubAorCitBQ19ERUZVTihBQ19DX19fQVRUUklCVVRFX19fRk9STUFULCBbCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgX19hdHRyaWJ1dGVfXygoZm9ybWF0KSkgY2FuIGJlIHVzZWQgd2l0aG91dCB3YXJuaW5nc10pCitBQ19DQUNIRV9WQUwoYWNfY3ZfX19hdHRyaWJ1dGVfX19mb3JtYXQsIFsKK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnMiCitBQ19DT01QSUxFX0lGRUxTRShbCisgIEFDX0xBTkdfU09VUkNFKFtbCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2V4dGVybiBpbnQgZm9vKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCQkgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgZm9vKCIlcyIsICJ0ZXN0Iik7Cit9CisgIF1dKV0sCithY19jdl9fX2F0dHJpYnV0ZV9fX2Zvcm1hdD15ZXMsCithY19jdl9fX2F0dHJpYnV0ZV9fX2Zvcm1hdD1ubyldKQorQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitpZiB0ZXN0ICIkYWNfY3ZfX19hdHRyaWJ1dGVfX19mb3JtYXQiID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKF9fQVRUUklCVVRFX19fRk9STUFUX09LLCAxLAorICAgIFtkZWZpbmUgaWYgeW91ciBjb21waWxlciBhbGxvd3MgX19hdHRyaWJ1dGVfXygoZm9ybWF0KSkgd2l0aG91dCBhIHdhcm5pbmddKQorZmkKK0FDX01TR19SRVNVTFQoJGFjX2N2X19fYXR0cmlidXRlX19fZm9ybWF0KQogXSkKIAogZG5sCkBAIC04OTgsMyArMTIzNCw2MiBAQAogICAgaWYgdGVzdCAkYWNfY3ZfbGJsX3RwYWNrZXRfc3RhdHMgPSB5ZXM7IHRoZW4KICAgICAgICBBQ19ERUZJTkUoSEFWRV9UUEFDS0VUX1NUQVRTLDEsW2lmIGlmX3BhY2tldC5oIGhhcyB0cGFja2V0X3N0YXRzIGRlZmluZWRdKQogICAgZmldKQorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIHRoZSB0cGFja2V0X2F1eGRhdGEgc3RydWN0IGhhcyBhIHRwX3ZsYW5fdGNpIG1lbWJlci4KK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSQorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCUhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJIChkZWZpbmVkKQorZG5sCitkbmwgTk9URTogYW55IGNvbXBpbGUgZmFpbHVyZSBtZWFucyB3ZSBjb25jbHVkZSB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorZG5sIHRoYXQgbWVtYmVyLCBzbyBpZiB3ZSBkb24ndCBoYXZlIHRwYWNrZXRfYXV4ZGF0YSwgd2UgY29uY2x1ZGUgaXQKK2RubCBkb2Vzbid0IGhhdmUgdGhhdCBtZW1iZXIgKHdoaWNoIGlzIE9LLCBhcyBlaXRoZXIgd2Ugd29uJ3QgYmUgdXNpbmcKK2RubCBjb2RlIHRoYXQgd291bGQgdXNlIHRoYXQgbWVtYmVyLCBvciB3ZSB3b3VsZG4ndCBjb21waWxlIGluIGFueSBjYXNlKS4KK2RubAorQUNfREVGVU4oQUNfTEJMX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHRwYWNrZXRfYXV4ZGF0YSBzdHJ1Y3QgaGFzIHRwX3ZsYW5fdGNpIG1lbWJlcikKKyAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaSwKKwlBQ19UUllfQ09NUElMRShbCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD5dLAorCVt1X2ludCBpID0gc2l6ZW9mKCgoc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSAqKTApLT50cF92bGFuX3RjaSldLAorCWFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2k9eWVzLAorCWFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2k9bm8pKQorICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2kpCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaSA9IHllcyA7IHRoZW4KKwkgICAgSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEE9dHBfdmxhbl90Y2kKKwkgICAgQUNfU1VCU1QoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEEpCisJICAgIEFDX0RFRklORShIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSwxLFtpZiB0cF92bGFuX3RjaSBleGlzdHNdKQorICAgIGZpXSkKKworZG5sCitkbmwgQ2hlY2tzIHRvIHNlZSBpZiBTb2xhcmlzIGhhcyB0aGUgZGxfcGFzc2l2ZV9yZXFfdCBzdHJ1Y3QgZGVmaW5lZAorZG5sIGluIDxzeXMvZGxwaS5oPi4KK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0RMX1BBU1NJVkVfUkVRX1QKK2RubAorZG5sIHJlc3VsdHM6CitkbmwgCitkbmwgCUhBVkVfRExQSV9QQVNTSVZFIChkZWZpbmVkKQorZG5sCitBQ19ERUZVTihBQ19MQkxfRExfUEFTU0lWRV9SRVFfVCwKKyAgICAgICAgW0FDX01TR19DSEVDS0lORyhpZiBkbF9wYXNzaXZlX3JlcV90IHN0cnVjdCBleGlzdHMpCisgICAgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdCwKKyAgICAgICAgICAgICAgICBBQ19UUllfQ09NUElMRShbCisjICAgICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgICAgICBpbmNsdWRlIDxzeXMvZGxwaS5oPl0sCisgICAgICAgIFt1X2ludCBpID0gc2l6ZW9mKGRsX3Bhc3NpdmVfcmVxX3QpXSwKKyAgICAgICAgYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90PXllcywKKyAgICAgICAgYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90PW5vKSkKKyAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfaGFzX2RsX3Bhc3NpdmVfcmVxX3QpCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90ID0geWVzIDsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfRExQSV9QQVNTSVZFLDEsW2lmIHBhc3NpdmVfcmVxX3QgcHJpbWl0aXZlCisJCWV4aXN0c10pCisgICAgZmldKQpkaWZmIC0tZ2l0IGEvYXJjbmV0LmggYi9hcmNuZXQuaAppbmRleCBkY2U3MzM1Li40Zjg2MDQzIDEwMDY0NAotLS0gYS9hcmNuZXQuaAorKysgYi9hcmNuZXQuaApAQCAtMzAsNyArMzAsNyBAQAogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCiAgKgotICogQCgjKSAkSWQ6IGFyY25ldC5oLHYgMS4yIDIwMDEvMDQvMjQgMDI6MTc6NTIgZ3V5IEV4cCAkIChMQkwpCisgKiBAKCMpICRJZDogYXJjbmV0LmgsdiAxLjIgMjAwMS0wNC0yNCAwMjoxNzo1MiBndXkgRXhwICQgKExCTCkKICAqCiAgKiBmcm9tOiBOZXRCU0Q6IGlmX2FyYy5oLHYgMS4xMyAxOTk5LzExLzE5IDIwOjQxOjE5IHRob3JwZWogRXhwCiAgKi8KZGlmZiAtLWdpdCBhL2F0bXVuaTMxLmggYi9hdG11bmkzMS5oCmluZGV4IDg3N2VkNjguLjg4MGNjMWEgMTAwNjQ0Ci0tLSBhL2F0bXVuaTMxLmgKKysrIGIvYXRtdW5pMzEuaApAQCAtMjksMTggKzI5LDE4IEBACiAgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYXRtdW5pMzEuaCx2IDEuMSAyMDAyLzA3LzExIDA5OjA2OjMyIGd1eSBFeHAgJCAoTEJMKQorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9hdG11bmkzMS5oLHYgMS4zIDIwMDctMTAtMjIgMTk6Mjg6NTggZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAogLyogQmFzZWQgb24gVU5JMy4xIHN0YW5kYXJkIGJ5IEFUTSBGb3J1bSAqLwogCiAvKiBBVE0gdHJhZmZpYyB0eXBlcyBiYXNlZCBvbiBWUEk9MCBhbmQgKHRoZSBmb2xsb3dpbmcgVkNJICovCi0jZGVmaW5lIFBQQwkJCTB4MDUJLyogUG9pbnQtdG8tcG9pbnQgc2lnbmFsIG1zZyAqLwotI2RlZmluZSBCQ0MJCQkweDAyCS8qIEJyb2FkY2FzdCBzaWduYWwgbXNnICovCi0jZGVmaW5lIE9BTUY0U0MJCQkweDAzCS8qIFNlZ21lbnQgT0FNIEY0IGZsb3cgY2VsbCAqLwotI2RlZmluZSBPQU1GNEVDCQkJMHgwNAkvKiBFbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKi8KLSNkZWZpbmUgTUVUQUMJCQkweDAxCS8qIE1ldGEgc2lnbmFsIG1zZyAqLwotI2RlZmluZSBJTE1JQwkJCTB4MTAJLyogSUxNSSBtc2cgKi8KKyNkZWZpbmUgVkNJX1BQQwkJCTB4MDUJLyogUG9pbnQtdG8tcG9pbnQgc2lnbmFsIG1zZyAqLworI2RlZmluZSBWQ0lfQkNDCQkJMHgwMgkvKiBCcm9hZGNhc3Qgc2lnbmFsIG1zZyAqLworI2RlZmluZSBWQ0lfT0FNRjRTQwkJMHgwMwkvKiBTZWdtZW50IE9BTSBGNCBmbG93IGNlbGwgKi8KKyNkZWZpbmUgVkNJX09BTUY0RUMJCTB4MDQJLyogRW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsICovCisjZGVmaW5lIFZDSV9NRVRBQwkJMHgwMQkvKiBNZXRhIHNpZ25hbCBtc2cgKi8KKyNkZWZpbmUgVkNJX0lMTUlDCQkweDEwCS8qIElMTUkgbXNnICovCiAKIC8qIFEuMjkzMSBzaWduYWxsaW5nIG1lc3NhZ2VzICovCiAjZGVmaW5lIENBTExfUFJPQ0VFRAkJMHgwMgkvKiBjYWxsIHByb2NlZWRpbmcgKi8KZGlmZiAtLWdpdCBhL2JwZi9uZXQvYnBmX2ZpbHRlci5jIGIvYnBmL25ldC9icGZfZmlsdGVyLmMKaW5kZXggNDBkZjMyYS4uMGM0ZmIwMCAxMDA2NDQKLS0tIGEvYnBmL25ldC9icGZfZmlsdGVyLmMKKysrIGIvYnBmL25ldC9icGZfZmlsdGVyLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogI2lmICEoZGVmaW5lZChsaW50KSB8fCBkZWZpbmVkKEtFUk5FTCkgfHwgZGVmaW5lZChfS0VSTkVMKSkKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9icGYvbmV0L2JwZl9maWx0ZXIuYyx2IDEuNDQgMjAwMy8xMS8xNSAyMzoyNDowNyBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2JwZi9uZXQvYnBmX2ZpbHRlci5jLHYgMS40NiAyMDA4LTAxLTAyIDA0OjE2OjQ2IGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKQEAgLTUzLDYgKzUzLDE1IEBACiAKICNlbHNlIC8qIFdJTjMyICovCiAKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTY1LDEzICs3NCwxMyBAQAogIyBkZWZpbmUJbV9uZXh0CWJfY29udAogIyBkZWZpbmUJTUxFTihtKQkoKG0pLT5iX3dwdHIgLSAobSktPmJfcnB0cikKICMgZGVmaW5lCW10b2QobSx0KQkoKHQpKG0pLT5iX3JwdHIpCi0jZWxzZQorI2Vsc2UgLyogZGVmaW5lZChfX2hwdXgpIHx8IFNPTEFSSVMgKi8KICMgZGVmaW5lCU1MRU4obSkJKChtKS0+bV9sZW4pCi0jZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkKF9faHB1eCkgfHwgU09MQVJJUyAqLwogCiAjZW5kaWYgLyogV0lOMzIgKi8KIAotI2luY2x1ZGUgPHBjYXAtYnBmLmg+CisjaW5jbHVkZSA8cGNhcC9icGYuaD4KIAogI2lmICFkZWZpbmVkKEtFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkKICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTIwMCw4ICsyMDksOCBAQAogICovCiB1X2ludAogYnBmX2ZpbHRlcihwYywgcCwgd2lyZWxlbiwgYnVmbGVuKQotCXJlZ2lzdGVyIHN0cnVjdCBicGZfaW5zbiAqcGM7Ci0JcmVnaXN0ZXIgdV9jaGFyICpwOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqcGM7CisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwOwogCXVfaW50IHdpcmVsZW47CiAJcmVnaXN0ZXIgdV9pbnQgYnVmbGVuOwogewpAQCAtMzk2LDcgKzQwNSwxOCBAQAogCQkJY29udGludWU7CiAKIAkJY2FzZSBCUEZfSk1QfEJQRl9KQToKKyNpZiBkZWZpbmVkKEtFUk5FTCkgfHwgZGVmaW5lZChfS0VSTkVMKQorCQkJLyoKKwkJCSAqIE5vIGJhY2t3YXJkIGp1bXBzIGFsbG93ZWQuCisJCQkgKi8KIAkJCXBjICs9IHBjLT5rOworI2Vsc2UKKwkJCS8qCisJCQkgKiBYWFggLSB3ZSBjdXJyZW50bHkgaW1wbGVtZW50ICJpcDYgcHJvdG9jaGFpbiIKKwkJCSAqIHdpdGggYmFja3dhcmQganVtcHMsIHNvIHNpZ24tZXh0ZW5kIHBjLT5rLgorCQkJICovCisJCQlwYyArPSAoYnBmX2ludDMyKXBjLT5rOworI2VuZGlmCiAJCQljb250aW51ZTsKIAogCQljYXNlIEJQRl9KTVB8QlBGX0pHVHxCUEZfSzoKQEAgLTUxMiw1NCArNTMyLDE1NSBAQAogCX0KIH0KIAotCiAvKgogICogUmV0dXJuIHRydWUgaWYgdGhlICdmY29kZScgaXMgYSB2YWxpZCBmaWx0ZXIgcHJvZ3JhbS4KICAqIFRoZSBjb25zdHJhaW50cyBhcmUgdGhhdCBlYWNoIGp1bXAgYmUgZm9yd2FyZCBhbmQgdG8gYSB2YWxpZAotICogY29kZS4gIFRoZSBjb2RlIG11c3QgdGVybWluYXRlIHdpdGggZWl0aGVyIGFuIGFjY2VwdCBvciByZWplY3QuCi0gKiAndmFsaWQnIGlzIGFuIGFycmF5IGZvciB1c2UgYnkgdGhlIHJvdXRpbmUgKGl0IG11c3QgYmUgYXQgbGVhc3QKLSAqICdsZW4nIGJ5dGVzIGxvbmcpLgorICogY29kZSwgdGhhdCBtZW1vcnkgYWNjZXNzZXMgYXJlIHdpdGhpbiB2YWxpZCByYW5nZXMgKHRvIHRoZQorICogZXh0ZW50IHRoYXQgdGhpcyBjYW4gYmUgY2hlY2tlZCBzdGF0aWNhbGx5OyBsb2FkcyBvZiBwYWNrZXQKKyAqIGRhdGEgaGF2ZSB0byBiZSwgYW5kIGFyZSwgYWxzbyBjaGVja2VkIGF0IHJ1biB0aW1lKSwgYW5kIHRoYXQKKyAqIHRoZSBjb2RlIHRlcm1pbmF0ZXMgd2l0aCBlaXRoZXIgYW4gYWNjZXB0IG9yIHJlamVjdC4KICAqCiAgKiBUaGUga2VybmVsIG5lZWRzIHRvIGJlIGFibGUgdG8gdmVyaWZ5IGFuIGFwcGxpY2F0aW9uJ3MgZmlsdGVyIGNvZGUuCiAgKiBPdGhlcndpc2UsIGEgYm9ndXMgcHJvZ3JhbSBjb3VsZCBlYXNpbHkgY3Jhc2ggdGhlIHN5c3RlbS4KICAqLwogaW50CiBicGZfdmFsaWRhdGUoZiwgbGVuKQotCXN0cnVjdCBicGZfaW5zbiAqZjsKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmY7CiAJaW50IGxlbjsKIHsKLQlyZWdpc3RlciBpbnQgaTsKLQlyZWdpc3RlciBzdHJ1Y3QgYnBmX2luc24gKnA7CisJdV9pbnQgaSwgZnJvbTsKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKnA7CisKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBUaGVyZSdzIG5vIG1heGltdW0gcHJvZ3JhbSBsZW5ndGggaW4gdXNlcmxhbmQuCisJICovCisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwlpZiAobGVuID4gQlBGX01BWElOU05TKQorCQlyZXR1cm4gMDsKKyNlbmRpZgogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCS8qCi0JCSAqIENoZWNrIHRoYXQgdGhhdCBqdW1wcyBhcmUgZm9yd2FyZCwgYW5kIHdpdGhpbgotCQkgKiB0aGUgY29kZSBibG9jay4KLQkJICovCiAJCXAgPSAmZltpXTsKLQkJaWYgKEJQRl9DTEFTUyhwLT5jb2RlKSA9PSBCUEZfSk1QKSB7Ci0JCQlyZWdpc3RlciBpbnQgZnJvbSA9IGkgKyAxOwotCi0JCQlpZiAoQlBGX09QKHAtPmNvZGUpID09IEJQRl9KQSkgewotCQkJCWlmIChmcm9tICsgcC0+ayA+PSAodW5zaWduZWQpbGVuKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYgKGZyb20gKyBwLT5qdCA+PSBsZW4gfHwgZnJvbSArIHAtPmpmID49IGxlbikKLQkJCQlyZXR1cm4gMDsKLQkJfQorCQlzd2l0Y2ggKEJQRl9DTEFTUyhwLT5jb2RlKSkgewogCQkvKgogCQkgKiBDaGVjayB0aGF0IG1lbW9yeSBvcGVyYXRpb25zIHVzZSB2YWxpZCBhZGRyZXNzZXMuCiAJCSAqLwotCQlpZiAoKEJQRl9DTEFTUyhwLT5jb2RlKSA9PSBCUEZfU1QgfHwKLQkJICAgICAoQlBGX0NMQVNTKHAtPmNvZGUpID09IEJQRl9MRCAmJgotCQkgICAgICAocC0+Y29kZSAmIDB4ZTApID09IEJQRl9NRU0pKSAmJgotCQkgICAgKHAtPmsgPj0gQlBGX01FTVdPUkRTIHx8IHAtPmsgPCAwKSkKKwkJY2FzZSBCUEZfTEQ6CisJCWNhc2UgQlBGX0xEWDoKKwkJCXN3aXRjaCAoQlBGX01PREUocC0+Y29kZSkpIHsKKwkJCWNhc2UgQlBGX0lNTToKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0FCUzoKKwkJCWNhc2UgQlBGX0lORDoKKwkJCWNhc2UgQlBGX01TSDoKKwkJCQkvKgorCQkJCSAqIFRoZXJlJ3Mgbm8gbWF4aW11bSBwYWNrZXQgZGF0YSBzaXplCisJCQkJICogaW4gdXNlcmxhbmQuICBUaGUgcnVudGltZSBwYWNrZXQgbGVuZ3RoCisJCQkJICogY2hlY2sgc3VmZmljZXMuCisJCQkJICovCisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCQkvKgorCQkJCSAqIE1vcmUgc3RyaWN0IGNoZWNrIHdpdGggYWN0dWFsIHBhY2tldCBsZW5ndGgKKwkJCQkgKiBpcyBkb25lIHJ1bnRpbWUuCisJCQkJICovCisJCQkJaWYgKHAtPmsgPj0gYnBmX21heGJ1ZnNpemUpCisJCQkJCXJldHVybiAwOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9NRU06CisJCQkJaWYgKHAtPmsgPj0gQlBGX01FTVdPUkRTKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0xFTjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU1Q6CisJCWNhc2UgQlBGX1NUWDoKKwkJCWlmIChwLT5rID49IEJQRl9NRU1XT1JEUykKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9BTFU6CisJCQlzd2l0Y2ggKEJQRl9PUChwLT5jb2RlKSkgeworCQkJY2FzZSBCUEZfQUREOgorCQkJY2FzZSBCUEZfU1VCOgorCQkJY2FzZSBCUEZfTVVMOgorCQkJY2FzZSBCUEZfT1I6CisJCQljYXNlIEJQRl9BTkQ6CisJCQljYXNlIEJQRl9MU0g6CisJCQljYXNlIEJQRl9SU0g6CisJCQljYXNlIEJQRl9ORUc6CisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9ESVY6CisJCQkJLyoKKwkJCQkgKiBDaGVjayBmb3IgY29uc3RhbnQgZGl2aXNpb24gYnkgMC4KKwkJCQkgKi8KKwkJCQlpZiAoQlBGX1NSQyhwLT5jb2RlKSA9PSBCUEZfSyAmJiBwLT5rID09IDApCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJQRl9KTVA6CisJCQkvKgorCQkJICogQ2hlY2sgdGhhdCBqdW1wcyBhcmUgd2l0aGluIHRoZSBjb2RlIGJsb2NrLAorCQkJICogYW5kIHRoYXQgdW5jb25kaXRpb25hbCBicmFuY2hlcyBkb24ndCBnbworCQkJICogYmFja3dhcmRzIGFzIGEgcmVzdWx0IG9mIGFuIG92ZXJmbG93LgorCQkJICogVW5jb25kaXRpb25hbCBicmFuY2hlcyBoYXZlIGEgMzItYml0IG9mZnNldCwKKwkJCSAqIHNvIHRoZXkgY291bGQgb3ZlcmZsb3c7IHdlIGNoZWNrIHRvIG1ha2UKKwkJCSAqIHN1cmUgdGhleSBkb24ndC4gIENvbmRpdGlvbmFsIGJyYW5jaGVzIGhhdmUKKwkJCSAqIGFuIDgtYml0IG9mZnNldCwgYW5kIHRoZSBmcm9tIGFkZHJlc3MgaXMgPD0KKwkJCSAqIEJQRl9NQVhJTlNOUywgYW5kIHdlIGFzc3VtZSB0aGF0IEJQRl9NQVhJTlNOUworCQkJICogaXMgc3VmZmljaWVudGx5IHNtYWxsIHRoYXQgYWRkaW5nIDI1NSB0byBpdAorCQkJICogd29uJ3Qgb3ZlcmZsb3cuCisJCQkgKgorCQkJICogV2Uga25vdyB0aGF0IGxlbiBpcyA8PSBCUEZfTUFYSU5TTlMsIGFuZCB3ZQorCQkJICogYXNzdW1lIHRoYXQgQlBGX01BWElOU05TIGlzIDwgdGhlIG1heGltdW0gc2l6ZQorCQkJICogb2YgYSB1X2ludCwgc28gdGhhdCBpICsgMSBkb2Vzbid0IG92ZXJmbG93LgorCQkJICoKKwkJCSAqIEZvciB1c2VybGFuZCwgd2UgZG9uJ3Qga25vdyB0aGF0IHRoZSBmcm9tCisJCQkgKiBvciBsZW4gYXJlIDw9IEJQRl9NQVhJTlNOUywgYnV0IHdlIGtub3cgdGhhdAorCQkJICogZnJvbSA8PSBsZW4sIGFuZCwgZXhjZXB0IG9uIGEgNjQtYml0IHN5c3RlbSwKKwkJCSAqIGl0J3MgdW5saWtlbHkgdGhhdCBsZW4sIGlmIGl0IHRydWx5IHJlZmxlY3RzCisJCQkgKiB0aGUgc2l6ZSBvZiB0aGUgcHJvZ3JhbSB3ZSd2ZSBiZWVuIGhhbmRlZCwKKwkJCSAqIHdpbGwgYmUgYW55d2hlcmUgbmVhciB0aGUgbWF4aW11bSBzaXplIG9mCisJCQkgKiBhIHVfaW50LiAgV2UgYWxzbyBkb24ndCBjaGVjayBmb3IgYmFja3dhcmQKKwkJCSAqIGJyYW5jaGVzLCBhcyB3ZSBjdXJyZW50bHkgc3VwcG9ydCB0aGVtIGluCisJCQkgKiB1c2VybGFuZCBmb3IgdGhlIHByb3RvY2hhaW4gb3BlcmF0aW9uLgorCQkJICovCisJCQlmcm9tID0gaSArIDE7CisJCQlzd2l0Y2ggKEJQRl9PUChwLT5jb2RlKSkgeworCQkJY2FzZSBCUEZfSkE6CisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCQlpZiAoZnJvbSArIHAtPmsgPCBmcm9tIHx8IGZyb20gKyBwLT5rID49IGxlbikKKyNlbHNlCisJCQkJaWYgKGZyb20gKyBwLT5rID49IGxlbikKKyNlbmRpZgorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0pFUToKKwkJCWNhc2UgQlBGX0pHVDoKKwkJCWNhc2UgQlBGX0pHRToKKwkJCWNhc2UgQlBGX0pTRVQ6CisJCQkJaWYgKGZyb20gKyBwLT5qdCA+PSBsZW4gfHwgZnJvbSArIHAtPmpmID49IGxlbikKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQlBGX1JFVDoKKwkJCWJyZWFrOworCQljYXNlIEJQRl9NSVNDOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gMDsKLQkJLyoKLQkJICogQ2hlY2sgZm9yIGNvbnN0YW50IGRpdmlzaW9uIGJ5IDAuCi0JCSAqLwotCQlpZiAocC0+Y29kZSA9PSAoQlBGX0FMVXxCUEZfRElWfEJQRl9LKSAmJiBwLT5rID09IDApCi0JCQlyZXR1cm4gMDsKKwkJfQogCX0KIAlyZXR1cm4gQlBGX0NMQVNTKGZbbGVuIC0gMV0uY29kZSkgPT0gQlBGX1JFVDsKIH0KZGlmZiAtLWdpdCBhL2JwZl9kdW1wLmMgYi9icGZfZHVtcC5jCmluZGV4IDMwMzYwMmUuLmU0ZmY0YTIgMTAwNjQ0Ci0tLSBhL2JwZl9kdW1wLmMKKysrIGIvYnBmX2R1bXAuYwpAQCAtMjAsNyArMjAsNyBAQAogICovCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9icGZfZHVtcC5jLHYgMS4xNCAyMDAzLzExLzE1IDIzOjIzOjU3IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYnBmX2R1bXAuYyx2IDEuMTUgMjAwOC0wMS0wMiAwNDoxNjo0NiBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC0zMSw5ICszMSw5IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogdm9pZAotYnBmX2R1bXAoc3RydWN0IGJwZl9wcm9ncmFtICpwLCBpbnQgb3B0aW9uKQorYnBmX2R1bXAoY29uc3Qgc3RydWN0IGJwZl9wcm9ncmFtICpwLCBpbnQgb3B0aW9uKQogewotCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc247CiAJaW50IGk7CiAJaW50IG4gPSBwLT5iZl9sZW47CiAKZGlmZiAtLWdpdCBhL2JwZl9maWx0ZXIuYyBiL2JwZl9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wNjA1NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvYnBmX2ZpbHRlci5jCkBAIC0wLDAgKzEgQEAKKy4vYnBmL25ldC9icGZfZmlsdGVyLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icGZfaW1hZ2UuYyBiL2JwZl9pbWFnZS5jCmluZGV4IDJlNzYxMjguLmU2YzBmNjIgMTAwNjQ0Ci0tLSBhL2JwZl9pbWFnZS5jCisrKyBiL2JwZl9pbWFnZS5jCkBAIC0yMSwxMyArMjEsMjcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYnBmX2ltYWdlLmMsdiAxLjI2LjIuMSAyMDA3LzA2LzExIDA5OjUyOjA0IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYnBmX2ltYWdlLmMsdiAxLjI4IDIwMDgtMDEtMDIgMDQ6MTY6NDYgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTM5LDcgKzUzLDcgQEAKIAogY2hhciAqCiBicGZfaW1hZ2UocCwgbikKLQlzdHJ1Y3QgYnBmX2luc24gKnA7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICpwOwogCWludCBuOwogewogCWludCB2OwpAQCAtMjc4LDExICsyOTIsMTQgQEAKIAkJYnJlYWs7CiAJfQogCSh2b2lkKXNucHJpbnRmKG9wZXJhbmQsIHNpemVvZiBvcGVyYW5kLCBmbXQsIHYpOwotCSh2b2lkKXNucHJpbnRmKGltYWdlLCBzaXplb2YgaW1hZ2UsCi0JCSAgICAgIChCUEZfQ0xBU1MocC0+Y29kZSkgPT0gQlBGX0pNUCAmJgotCQkgICAgICAgQlBGX09QKHAtPmNvZGUpICE9IEJQRl9KQSkgPwotCQkgICAgICAiKCUwM2QpICUtOHMgJS0xNnMganQgJWRcdGpmICVkIgotCQkgICAgICA6ICIoJTAzZCkgJS04cyAlcyIsCi0JCSAgICAgIG4sIG9wLCBvcGVyYW5kLCBuICsgMSArIHAtPmp0LCBuICsgMSArIHAtPmpmKTsKKwlpZiAoQlBGX0NMQVNTKHAtPmNvZGUpID09IEJQRl9KTVAgJiYgQlBGX09QKHAtPmNvZGUpICE9IEJQRl9KQSkgeworCQkodm9pZClzbnByaW50ZihpbWFnZSwgc2l6ZW9mIGltYWdlLAorCQkJICAgICAgIiglMDNkKSAlLThzICUtMTZzIGp0ICVkXHRqZiAlZCIsCisJCQkgICAgICBuLCBvcCwgb3BlcmFuZCwgbiArIDEgKyBwLT5qdCwgbiArIDEgKyBwLT5qZik7CisJfSBlbHNlIHsKKwkJKHZvaWQpc25wcmludGYoaW1hZ2UsIHNpemVvZiBpbWFnZSwKKwkJCSAgICAgICIoJTAzZCkgJS04cyAlcyIsCisJCQkgICAgICBuLCBvcCwgb3BlcmFuZCk7CisJfQogCXJldHVybiBpbWFnZTsKIH0KZGlmZiAtLWdpdCBhL2NobW9kX2JwZiBiL2NobW9kX2JwZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTMwZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvY2htb2RfYnBmCkBAIC0wLDAgKzEsMTkgQEAKKyMhIC9iaW4vc2gKKworIworIyBVbmZvcnR1bmF0ZWx5LCBNYWMgT1MgWCdzIGRldmZzIGlzIGJhc2VkIG9uIHRoZSBvbGQgRnJlZUJTRAorIyBvbmUsIG5vdCB0aGUgY3VycmVudCBvbmUsIHNvIHRoZXJlJ3Mgbm8gd2F5IHRvIGNvbmZpZ3VyZSBpdAorIyB0byBjcmVhdGUgQlBGIGRldmljZXMgd2l0aCBwYXJ0aWN1bGFyIG93bmVycyBvciBncm91cHMuCisjIFRoaXMgc3RhcnR1cCBpdGVtIHdpbGwgbWFrZSBpdCBvd25lZCBieSB0aGUgYWRtaW4gZ3JvdXAsCisjIHdpdGggcGVybWlzc2lvbnMgcnctcnctLS0tLCBzbyB0aGF0IGFueWJvZHkgaW4gdGhlIGFkbWluCisjIGdyb3VwIGNhbiB1c2UgcHJvZ3JhbXMgdGhhdCBjYXB0dXJlIG9yIHNlbmQgcmF3IHBhY2tldHMuCisjCisjIENoYW5nZSB0aGlzIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIHNpdGUsIGUuZy4gdG8gbWFrZQorIyBpdCBvd25lZCBieSBhIHBhcnRpY3VsYXIgdXNlciB3aXRob3V0IGNoYW5naW5nIHRoZSBwZXJtaXNzaW9ucywKKyMgc28gb25seSB0aGF0IHVzZXIgYW5kIHRoZSBzdXBlci11c2VyIGNhbiBjYXB0dXJlIG9yIHNlbmQgcmF3CisjIHBhY2tldHMsIG9yIGdpdmUgaXQgdGhlIHBlcm1pc3Npb25zIHJ3LXItLS0tLSwgc28gdGhhdAorIyBvbmx5IHRoZSBzdXBlci11c2VyIGNhbiBzZW5kIHJhdyBwYWNrZXRzIGJ1dCBhbnlib2R5IGluIHRoZQorIyBhZG1pbiBncm91cCBjYW4gY2FwdHVyZSBwYWNrZXRzLgorIworY2hncnAgYWRtaW4gL2Rldi9icGYqCitjaG1vZCBnK3J3IC9kZXYvYnBmKgpkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCmluZGV4IDRjNWJkZTguLmMyMjQ2YTQgMTAwNzU1Ci0tLSBhL2NvbmZpZy5ndWVzcworKysgYi9jb25maWcuZ3Vlc3MKQEAgLTEsOSArMSwxMCBAQAogIyEgL2Jpbi9zaAogIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgogIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotdGltZXN0YW1wPScyMDAzLTEwLTE2JwordGltZXN0YW1wPScyMDA5LTEyLTMwJwogCiAjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNywyMyArMTgsMjUgQEAKICMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgogIwogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CiAjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQogIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgogIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCiAKLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gIFBsZWFzZSBzZW5kIHBhdGNoZXMgKGNvbnRleHQKKyMgZGlmZiBmb3JtYXQpIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBhbmQgaW5jbHVkZSBhIENoYW5nZUxvZworIyBlbnRyeS4KICMKICMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwogIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKICMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCiAjCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgorIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECiAKIG1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAogCkBAIC01Myw4ICs1Niw5IEBACiBHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQogCiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCiB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCkBAIC02NiwxMSArNzAsMTEgQEAKIHdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwogICBjYXNlICQxIGluCiAgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OworICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OwogICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CiAgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CiAgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCiAgICAgICAgc2hpZnQ7IGJyZWFrIDs7CiAgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgpAQCAtMTA0LDcgKzEwOCw3IEBACiB0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKIHRyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7CiA6ICR7VE1QRElSPS90bXB9IDsKLSB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgLXEgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAogIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CiAgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CiAgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOwpAQCAtMTIzLDcgKzEyNyw3IEBACiAJOzsKICAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OwogICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKLWVzYWMgOycKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JwogCiAjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgogIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCkBAIC0xNTgsNiArMTYyLDcgQEAKIAkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OwogCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OwogCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKIAkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwogCWVzYWMKIAkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKQEAgLTE2Niw3ICsxNzEsNyBAQAogCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKIAkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAogCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQkJfCBncmVwIC1xIF9fRUxGX18KIAkJdGhlbgogCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgogCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CkBAIC0xOTYsNTMgKzIwMSwzMiBAQAogCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgogCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KIAllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKLQlleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWNwcGM6T3BlbkJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTg4azpPcGVuQlNEOio6KikKLQllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWVwcGM6T3BlbkJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwZWdhc29zOk9wZW5CU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2ViLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKKwllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpTb2xpZEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpNaXJCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CiAgICAgYWxwaGE6T1NGMToqOiopCi0JaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQogCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAotCWZpCisJCTs7CisJKjUuKikKKwkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYwogCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCiAJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKIAkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCkBAIC0yODAsNDUgKzI2NCw0OSBAQAogCSAgICAiRVY3LjkgKDIxMzY0QSkiKQogCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CiAJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCiAJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCiAJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KIAkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KIAkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCWV4aXQgMCA7OwotICAgIEFscGhhKjpPcGVuVk1TOio6KikKLQllY2hvIGFscGhhLWhwLXZtcwotCWV4aXQgMCA7OworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgOzsKICAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQogCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KIAkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKIAkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KIAllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQogCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQogCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0Ci0JZXhpdCAwOzsKKwlleGl0IDs7CiAgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOk9TLzM5MDoqOiopCiAJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CiAgICAgKjpPUzQwMDoqOiopCiAgICAgICAgIGVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQogCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OworCWV4aXQgOzsKKyAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKKwllY2hvIGFybS11bmtub3duLXJpc2NvcworCWV4aXQgOzsKICAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQogCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDA7OworCWV4aXQgOzsKICAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKIAkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgogCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KQEAgLTMyNiwzMiArMzE0LDUxIEBACiAJZWxzZQogCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKIAlmaQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBOSUxFKjoqOio6ZGNvc3gpCiAJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKIAllY2hvIHNwYXJjLWljbC1ueDYKLQlleGl0IDAgOzsKLSAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyopCisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKIAljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KLQkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NyAmJiBleGl0IDAgOzsKKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OwogCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKICAgICBzdW40SDpTdW5PUzo1Lio6KikKIAllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQogCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCVNVTl9BUkNIPSJpMzg2IgorCSMgSWYgdGhlcmUgaXMgYSBjb21waWxlciwgc2VlIGlmIGl0IGlzIGNvbmZpZ3VyZWQgZm9yIDY0LWJpdCBvYmplY3RzLgorCSMgTm90ZSB0aGF0IHRoZSBTdW4gY2MgZG9lcyBub3QgdHVybiBfX0xQNjRfXyBpbnRvIDEgbGlrZSBnY2MgZG9lcy4KKwkjIFRoaXMgdGVzdCB3b3JrcyBmb3IgYm90aCBjb21waWxlcnMuCisJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJICAgIGlmIChlY2hvICcjaWZkZWYgX19hbWQ2NCc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCWdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJU1VOX0FSQ0g9Ing4Nl82NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtTVU5fQVJDSH0tcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CiAgICAgc3VuNCo6U3VuT1M6Nio6KikKIAkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQogCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CiAJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KIAllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBzdW40KjpTdW5PUzoqOiopCiAJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgogCSAgICBTZXJpZXMqfFM0KikKQEAgLTM2MCwxMCArMzY3LDEwIEBACiAJZXNhYwogCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KIAllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBzdW4zKjpTdW5PUzoqOiopCiAJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgc3VuKjoqOjQuMkJTRDoqKQogCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCiAJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwpAQCAtMzc1LDEwICszODIsMTAgQEAKIAkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CiAJCTs7CiAJZXNhYwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBhdXNocDpTdW5PUzoqOiopCiAJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCiAgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CiAgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgpAQCAtMzg5LDM3ICszOTYsNDAgQEAKICAgICAjIGJlIG5vIHByb2JsZW0uCiAgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCiAgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCiAJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCiAgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCiAgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OwogICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKICAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCiAgICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CiAgICAgcG93ZXJwYzptYWNodGVuOio6KikKIAllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgUklTQyo6TWFjaDoqOiopCiAJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBSSVNDKjpVTFRSSVg6KjoqKQogCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBWQVgqOlVMVFJJWCo6KjoqKQogCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQogCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQogCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKIAlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwpAQCAtNDQzLDMyICs0NTMsMzMgQEAKIAkgIGV4aXQgKC0xKTsKIAl9CiBFT0YKLQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyBcCi0JICAmJiAkZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAotCSAgJiYgZXhpdCAwCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CiAJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCiAJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQogCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKIAllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCiAJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgbTg4azpDWC9VWDo3KjoqKQogCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgbTg4azoqOjQqOlI0KikKIAllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgbTg4azoqOjMqOlIzKikKIAllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgQVZpaU9OOmRndXg6KjoqKQogICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwogICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYApAQCAtNDg0LDI5ICs0OTUsMjkgQEAKIAllbHNlCiAJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQogCWZpCi0gCWV4aXQgMCA7OworIAlleGl0IDs7CiAgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKIAllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBNODgqOio6UjMqOiopCiAJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMwogCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKIAllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCiAJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpJUklYKjoqOiopCiAJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKICAgICBpKjg2OkFJWDoqOiopCiAJZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgaWE2NDpBSVg6KjoqKQogCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgogCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYApAQCAtNTE0LDcgKzUyNSw3IEBACiAJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CiAJZmkKIAllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpBSVg6MjozKQogCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgogCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCkBAIC01MjksMTUgKzU0MCwxOSBAQAogCQkJZXhpdCgwKTsKIAkJCX0KIEVPRgotCQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQogCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAogCWVsc2UKIAkJZWNobyByczYwMDAtaWJtLWFpeDMuMgogCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOls0NTZdKQogCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAogCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgogCQlJQk1fQVJDSD1yczYwMDAKQEAgLTU1MCwyOCArNTY1LDI4IEBACiAJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CiAJZmkKIAllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo6QUlYOio6KikKIAllY2hvIHJzNjAwMC1pYm0tYWl4Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQogCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCiAJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bwotCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKICAgICAqOkJPU1g6KjoqKQogCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQogCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKIAllY2hvIG02OGstaHAtYnNkCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCiAJZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCiAJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCiAJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KQEAgLTYzMyw5ICs2NDgsMTkgQEAKIAllc2FjCiAJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCiAJdGhlbgotCSAgICAjIGF2b2lkIGRvdWJsZSBldmFsdWF0aW9uIG9mICRzZXRfY2NfZm9yX2J1aWxkCi0JICAgIHRlc3QgLW4gIiRDQ19GT1JfQlVJTEQiIHx8IGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSkgfCBncmVwIF9fTFA2NF9fID4vZGV2L251bGwKKwkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCisJICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCisJICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgorCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgorCSAgICAjCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKKwkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKKwkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCisKKwkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAorCQlncmVwIC1xIF9fTFA2NF9fCiAJICAgIHRoZW4KIAkJSFBfQVJDSD0iaHBwYTIuMHciCiAJICAgIGVsc2UKQEAgLTY0MywxMSArNjY4LDExIEBACiAJICAgIGZpCiAJZmkKIAllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGlhNjQ6SFAtVVg6KjoqKQogCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAogCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgMzA1MCo6SEktVVg6KjoqKQogCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKIAlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwpAQCAtNjc1LDIwNyArNzAwLDE2NCBAQAogCSAgZXhpdCAoMCk7CiAJfQogRU9GCi0JJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgJGR1bW15ICYmIGV4aXQgMAorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQogCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQogCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgOTAwMC84Pz86NC4zYnNkOio6KikKIAllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKIAllY2hvIGhwcGExLjAtaHAtbXBlaXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCiAJZWNobyBocHBhMS4xLWhwLW9zZgotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBocDg/PzpPU0YxOio6KikKIAllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGkqODY6T1NGMToqOiopCiAJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgogCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKIAllbHNlCiAJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKIAlmaQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBwYXJpc2MqOkxpdGVzKjoqOiopCiAJZWNobyBocHBhMS4xLWhwLWxpdGVzCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCiAJZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKIAlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKIAl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKIAllbHNlIGVjaG8gYzItY29udmV4LWJzZAogCWZpCi0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQogCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7CisgICAgICAgIGV4aXQgOzsKICAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCiAJZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OwogICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCiAJZWNobyBjNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgQ1JBWSpZLU1QOio6KjoqKQogCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIENSQVkqW0EtWl05MDoqOio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKIAl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKIAkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCiAJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBDUkFZKlRTOio6KjoqKQogCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIENSQVkqVDNFOio6KjoqKQogCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBDUkFZKlNWMToqOio6KikKIAllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOlVOSUNPUy9tcDoqOiopCi0JZWNobyBudjEtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OworCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CiAgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCiAJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKICAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAogICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAogICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OwogICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKICAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAogICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAogICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBzcGFyYyo6QlNEL09TOio6KikKIAllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpCU0QvT1M6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo6RnJlZUJTRDoqOiopCi0JIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciB1c2VzIGdsaWJjLgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCSNpZiBfX0dMSUJDX18gPj0gMgotCUxJQkM9Z251Ci0JI2Vsc2UKLQlMSUJDPQotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAotCSMgR05VL0tGcmVlQlNEIHN5c3RlbXMgaGF2ZSBhICJrIiBwcmVmaXggdG8gaW5kaWNhdGUgd2UgYXJlIHVzaW5nCi0JIyBGcmVlQlNEJ3Mga2VybmVsLCBidXQgbm90IHRoZSBjb21wbGV0ZSBPUy4KLQljYXNlICR7TElCQ30gaW4gZ251KSBrZXJuZWxfb25seT0naycgOzsgZXNhYwotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLSR7a2VybmVsX29ubHl9ZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2Ake0xJQkM6Ky0kTElCQ30KLQlleGl0IDAgOzsKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OwogICAgIGkqOkNZR1dJTio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCi0JZXhpdCAwIDs7Ci0gICAgaSo6TUlOR1cqOiopCisJZXhpdCA7OworICAgICo6TUlOR1cqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorICAgIAkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCWV4aXQgOzsKICAgICBpKjpQVyo6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgotCWV4aXQgMCA7OwotICAgIHg4NjpJbnRlcml4KjpbMzRdKikKLQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1wuLiovLycKLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorICAgIAljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgeDg2KQorCQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwgfCBFTTY0VCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIElBNjQpCisJCWVjaG8gaWE2NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwllc2FjIDs7CiAgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQogCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCi0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIDg2NjQ6V2luZG93c19OVDoqKQorCWVjaG8geDg2XzY0LXBjLW1rcworCWV4aXQgOzsKICAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKIAkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CiAJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKIAkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CiAJZWNobyBpNTg2LXBjLWludGVyaXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgaSo6VVdJTio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKICAgICBwKjpDWUdXSU4qOiopCiAJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgcHJlcCo6U3VuT1M6NS4qOiopCiAJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOkdOVToqOiopCiAJIyB0aGUgR05VIHN5c3RlbQogCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOkdOVS8qOio6KikKIAkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBpKjg2Ok1pbml4Oio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKLQlleGl0IDAgOzsKLSAgICBhcm0qOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBjcmlzOkxpbnV4Oio6KikKLQllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBpYTY0OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBtaXBzOkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHMKLQkjdW5kZWYgbWlwc2VsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKLQlDUFU9bWlwc2VsCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQotCUNQVT1taXBzCi0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCi0JOzsKLSAgICBtaXBzNjQ6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgbWlwczY0Ci0JI3VuZGVmIG1pcHM2NGVsCi0JI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKLQlDUFU9bWlwczY0ZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPW1pcHM2NAotCSNlbHNlCi0JQ1BVPQotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCi0JdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiICYmIGV4aXQgMAotCTs7Ci0gICAgcHBjOkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgYWxwaGE6TGludXg6KjoqKQogCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCiAJICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OwpAQCAtODg2LDEwICs4NjgsODAgQEAKIAkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OwogCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CiAgICAgICAgIGVzYWMKLQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQogCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCisJdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmkKKwlmaQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3Jpc3YzMjpMaW51eDoqOiopCisJZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisgICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCUxJQkM9Z251CisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCisJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPSR7VU5BTUVfTUFDSElORX0KKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyBvcjMyLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CiAgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQogCSMgTG9vayBmb3IgQ1BVIGxldmVsCiAJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KQEAgLTg5Nyw4NyArOTQ5LDQwIEBACiAJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKIAkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OwogCWVzYWMKLQlleGl0IDAgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKICAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIHNoNjQqOkxpbnV4Oio6KikKICAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIHNoKjpMaW51eDoqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251CisJZXhpdCA7OwogICAgIHg4Nl82NDpMaW51eDoqOiopCiAJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBpKjg2OkxpbnV4Oio6KikKLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKLQkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCi0JIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KLQlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgotCSAgZWxmMzItaTM4NikKLQkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKLQkJOzsKLQkgIGEub3V0LWkzODYtbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKLQkJZXhpdCAwIDs7Ci0JICBjb2ZmLWkzODYpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKLQkJZXhpdCAwIDs7Ci0JICAiIikKLQkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCi0JCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgotCQlleGl0IDAgOzsKLQllc2FjCi0JIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQkjaWZkZWYgX19FTEZfXwotCSMgaWZkZWYgX19HTElCQ19fCi0JIyAgaWYgX19HTElCQ19fID49IDIKLQlMSUJDPWdudQotCSMgIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyAgZW5kaWYKLQkjIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyBlbmRpZgotCSNlbHNlCi0JI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKLQlMSUJDPWdudQotCSNlbHNlCi0JTElCQz1nbnVhb3V0Ci0JI2VuZGlmCi0JI2VuZGlmCi0JI2lmZGVmIF9fZGlldGxpYmNfXwotCUxJQkM9ZGlldGxpYmMKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKLQl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iICYmIGV4aXQgMAotCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKLQk7OworCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OwogICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCiAJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KIAkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCiAJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KIAllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQogICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCiAgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KQEAgLTk4NSwyNCArOTkwLDI3IEBACiAJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgogICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBpKjg2Ok9TLzI6KjoqKQogCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CiAJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGkqODY6YXRoZW9zOio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC5bMDJdKjoqKQogCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgaSo4NjoqRE9TOio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQogCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAogCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgpAQCAtMTAxMCwxNSArMTAxOCwxNiBAQAogCWVsc2UKIAkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KIAlmaQotCWV4aXQgMCA7OwotICAgIGkqODY6Kjo1Ols3OF0qKQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisgICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgogCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCiAJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwogCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKIAkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKIAllc2FjCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGkqODY6KjozLjI6KikKIAlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCiAJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKQEAgLTEwMzYsNzMgKzEwNDUsODYgQEAKIAllbHNlCiAJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKIAlmaQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBwYzoqOio6KikKIAkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKICAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTU4Ni4KKwkjIE5vdGU6IHdoYXRldmVyIHRoaXMgaXMsIGl0IE1VU1QgYmUgdGhlIHNhbWUgYXMgd2hhdCBjb25maWcuc3ViCisJIyBwcmludHMgZm9yIHRoZSAiZGpncHAiIGhvc3QsIG9yIGVsc2UgR0RCIGNvbmZpZ3VyeSB3aWxsIGRlY2lkZSB0aGF0CisJIyB0aGlzIGlzIGEgY3Jvc3MtYnVpbGQuCisJZWNobyBpNTg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OwogICAgIEludGVsOk1hY2g6Myo6KikKIAllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgcGFyYWdvbjoqOio6KikKIAllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CiAJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KIAkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKIAllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCiAJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAogCWZpCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKIAkjICJtaW5pZnJhbWUiCiAJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKIAllY2hvIG02OGstY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIE02ODA/MDpELU5JWDo1LjM6KikKIAllY2hvIG02OGstZGlhYi1kbml4Ci0JZXhpdCAwIDs7Ci0gICAgTTY4KjoqOlIzVls1NjddKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OwotICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjApCisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQogCU9TX1JFTD0nJwogCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAogCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCiAJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQogCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OworCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKICAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKICAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKKyAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwogICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQogCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQogCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKIAllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICByczYwMDA6THlueE9TOjIuKjoqKQogCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKIAllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCiAJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCiAJZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBSTSo6U0lOSVgtKjoqOiopCiAJZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOlNJTklYLSo6KjoqKQogCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCiAJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCkBAIC0xMTEwLDY4ICsxMTMyLDk0IEBACiAJZWxzZQogCQllY2hvIG5zMzJrLXNuaS1zeXN2CiAJZmkKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CiAgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCAwIDs7CisgICAgICAgIGV4aXQgOzsKICAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKIAkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCiAJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCiAJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjoqOio6RlRYKikKIAkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KIAllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICBpKjg2OlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCisJZXhpdCA7OwogICAgICo6Vk9TOio6KikKIAkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KIAllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgbWM2OCo6QS9VWDoqOiopCiAJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgbmV3cyo6TkVXUy1PUzo2KjoqKQogCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCiAJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCiAJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CiAJZWxzZQogCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KIAlmaQotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OwogICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KIAllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCiAJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KIAllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OwogICAgIFNYLTQ6U1VQRVItVVg6KjoqKQogCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBTWC01OlNVUEVSLVVYOio6KikKIAllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgU1gtNjpTVVBFUi1VWDoqOiopCiAJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CiAgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKIAllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo6UmhhcHNvZHk6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpEYXJ3aW46KjoqKQotCWNhc2UgYHVuYW1lIC1wYCBpbgotCSAgICAqODYpIFVOQU1FX1BST0NFU1NPUj1pNjg2IDs7Ci0JICAgIHBvd2VycGMpIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7CisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KKwljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkgICAgaTM4NikKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkJICBpZiAoZWNobyAnI2lmZGVmIF9fTFA2NF9fJzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJICAgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJICAgICAgZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkJICB0aGVuCisJCSAgICAgIFVOQU1FX1BST0NFU1NPUj0ieDg2XzY0IgorCQkgIGZpCisJCWZpIDs7CisJICAgIHVua25vd24pIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7CiAJZXNhYwogCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCiAJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKIAlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCkBAIC0xMTc5LDIyICsxMjI3LDI1IEBACiAJCVVOQU1FX01BQ0hJTkU9cGMKIAlmaQogCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpRTlg6Kjo0KikKIAllY2hvIGkzODYtcGMtcW54Ci0JZXhpdCAwIDs7Ci0gICAgTlNSLVtER0tMTlBUVldZXTpOT05TVE9QX0tFUk5FTDoqOiopCisJZXhpdCA7OworICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCiAJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpOb25TdG9wLVVYOio6KikKIAllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBCUzIwMDA6UE9TSVgqOio6KikKIAllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKIAllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpQbGFuOToqOiopCiAJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CiAJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKQEAgLTEyMDUsMzEgKzEyNTYsNTAgQEAKIAkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCiAJZmkKIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOlRPUFMtMTA6KjoqKQogCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpURU5FWDoqOiopCiAJZWNobyBwZHAxMC11bmtub3duLXRlbmV4Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCiAJZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCiAJZWNobyBwZHAxMC14a2wtdG9wczIwCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo6VE9QUy0yMDoqOiopCiAJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOklUUzoqOiopCiAJZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBTRUk6KjoqOlNFSVVYKQogICAgICAgICBlY2hvIG1pcHMtc2VpLXNlaXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6RFJBR09ORkxZOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCA7OworICAgIGkqODY6c2t5b3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKKwlleGl0IDs7CisgICAgaSo4NjpyZG9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcworCWV4aXQgOzsKKyAgICBpKjg2OkFST1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1hcm9zCisJZXhpdCA7OwogZXNhYwogCiAjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKQEAgLTEyNjEsNyArMTMzMSw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCi0gIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7CisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQpAQCAtMTM1MCwxMSArMTQyMCwxMiBAQAogfQogRU9GCiAKLSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmICRkdW1teSAmJiBleGl0IDAKKyRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CiAKICMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KIAotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQogCiAjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCiAKQEAgLTEzNjMsMjIgKzE0MzQsMjIgQEAKICAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgogICAgIGMxKikKIAllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgYzIqKQogCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwogCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAogCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCiAJZmkKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgYzM0KikKIAllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGMzOCopCiAJZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBjNCopCiAJZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGVzYWMKIGZpCiAKQEAgLTEzODksNyArMTQ2MCw5IEBACiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91CiBkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KIAotICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLworICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKK2FuZAorICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECiAKIElmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQogc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKaW5kZXggMTZlYmExZi4uZmU5YjhmOCAxMDA2NDQKLS0tIGEvY29uZmlnLmgKKysrIGIvY29uZmlnLmgKQEAgLTEsMTIgKzEsNSBAQAogLyogY29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBieSBjb25maWd1cmUuICAqLwogLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiBMb25nIHN0b3J5IHNob3J0OiBhY2xvY2FsLm00IGRlcGVuZHMgb24gYXV0b2NvbmYgMi4xMwotICogaW1wbGVtZW50YXRpb24gZGV0YWlscyB3cnQgImNvbnN0IjsgbmV3ZXIgdmVyc2lvbnMKLSAqIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMgc28gZm9yIG5vdyB3ZQotICogcHV0ICJjb25zdCIgaGVyZS4gIFRoaXMgbWF5IGNhdXNlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucwotICogaW4gY29uZmlnLmggYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCi0gKi8KLS8qICN1bmRlZiBjb25zdCAqLwogCiAvKiBFbmFibGUgb3B0aW1pemVyIGRlYnVnZ2luZyAqLwogLyogI3VuZGVmIEJERUJVRyAqLwpAQCAtMjAsMTkgKzEzLDMxIEBACiAvKiBkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9lcmZfdHlwZXMoKSAqLwogLyogI3VuZGVmIEhBVkVfREFHX0dFVF9FUkZfVFlQRVMgKi8KIAorLyogZGVmaW5lIGlmIHlvdSBoYXZlIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcygpICovCisvKiAjdW5kZWYgSEFWRV9EQUdfR0VUX1NUUkVBTV9FUkZfVFlQRVMgKi8KKwogLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cmVhbXMgY2FwYWJsZSBEQUcgQVBJICovCiAvKiAjdW5kZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KIAorLyogZGVmaW5lIGlmIHlvdSBoYXZlIHZkYWdfc2V0X2RldmljZV9pbmZvKCkgKi8KKy8qICN1bmRlZiBIQVZFX0RBR19WREFHICovCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfaG9zdHRvbicsIGFuZCB0byAwIGlmIHlvdQogICAgZG9uJ3QuICovCi0jZGVmaW5lIEhBVkVfREVDTF9FVEhFUl9IT1NUVE9OIDAKKy8qICN1bmRlZiBIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTiAqLwogCiAvKiBkZWZpbmUgaWYgeW91IGhhdmUgYSAvZGV2L2RscGkgKi8KIC8qICN1bmRlZiBIQVZFX0RFVl9ETFBJICovCiAKKy8qIGlmIHBhc3NpdmVfcmVxX3QgcHJpbWl0aXZlIGV4aXN0cyAqLworLyogI3VuZGVmIEhBVkVfRExQSV9QQVNTSVZFICovCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXRoZXJfaG9zdHRvbicgZnVuY3Rpb24uICovCiAvKiAjdW5kZWYgSEFWRV9FVEhFUl9IT1NUVE9OICovCiAKKy8qIERlZmluZSB0byAxIGlmIGZzZWVrbyAoYW5kIHByZXN1bWFibHkgZnRlbGxvKSBleGlzdHMgYW5kIGlzIGRlY2xhcmVkLiAqLworI2RlZmluZSBIQVZFX0ZTRUVLTyAxCisKIC8qIG9uIEhQLVVYIDEwLjIwIG9yIGxhdGVyICovCiAvKiAjdW5kZWYgSEFWRV9IUFVYMTBfMjBfT1JfTEFURVIgKi8KIApAQCAtNDUsOSArNTAsNTEgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCiAKKy8qIGlmIGxpYmRscGkgZXhpc3RzICovCisvKiAjdW5kZWYgSEFWRV9MSUJETFBJICovCisKKy8qIGlmIGxpYm5sIGV4aXN0cyAqLworLyogI3VuZGVmIEhBVkVfTElCTkwgKi8KKworLyogaWYgbGlibmwgZXhpc3RzIGFuZCBpcyB2ZXJzaW9uIDIueCAqLworLyogI3VuZGVmIEhBVkVfTElCTkxfMl94ICovCisKKy8qIGlmIGxpYm5sIGV4aXN0cyBhbmQgaXMgdmVyc2lvbiAzLnggKi8KKy8qICN1bmRlZiBIQVZFX0xJQk5MXzNfeCAqLworCisvKiBsaWJubCBoYXMgTkxFX0ZBSUxVUkUgKi8KKy8qICN1bmRlZiBIQVZFX0xJQk5MX05MRSAqLworCisvKiBsaWJubCBoYXMgbmV3LXN0eWxlIHNvY2tldCBhcGkgKi8KKy8qICN1bmRlZiBIQVZFX0xJQk5MX1NPQ0tFVFMgKi8KKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfTElNSVRTX0ggMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2NvbXBpbGVyLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfTElOVVhfQ09NUElMRVJfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2V0aHRvb2wuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElOVVhfRVRIVE9PTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9pZl9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElOVVhfSUZfUEFDS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L25ldF90c3RhbXAuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElOVVhfTkVUX1RTVEFNUF9IIDEKKworLyogaWYgdHBfdmxhbl90Y2kgZXhpc3RzICovCisjZGVmaW5lIEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSU5VWF9UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3dpcmVsZXNzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0xJTlVYX1dJUkVMRVNTX0ggMQorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCiAKQEAgLTU3LDMwICsxMDQsNDUgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pZl9ldGhlci5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0ggMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldHBhY2tldC9pZl9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9ORVRQQUNLRVRfSUZfUEFDS0VUX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRwYWNrZXQvcGFja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0L2lmX21lZGlhLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfTkVUX0lGX01FRElBX0ggKi8KKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXQvcGZ2YXIuaD4gaGVhZGVyIGZpbGUuICovCiAvKiAjdW5kZWYgSEFWRV9ORVRfUEZWQVJfSCAqLwogCi0vKiBpZiB0aGVyZSdzIGFuIG9zX3Byb3RvLmggKi8KKy8qIGlmIHRoZXJlJ3MgYW4gb3NfcHJvdG8uaCBmb3IgdGhpcyBwbGF0Zm9ybSwgdG8gdXNlIGFkZGl0aW9uYWwgcHJvdG90eXBlcyAqLwogLyogI3VuZGVmIEhBVkVfT1NfUFJPVE9fSCAqLwogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBhdGhzLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1BBVEhTX0ggMQogCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgYSAvcHJvYy9uZXQvZGV2ICovCi0jZGVmaW5lIEhBVkVfUFJPQ19ORVRfREVWIDEKKy8qIGRlZmluZSBpZiBuZXQvcGZ2YXIuaCBkZWZpbmVzIFBGX05BVCB0aHJvdWdoIFBGX05PUkRSICovCisvKiAjdW5kZWYgSEFWRV9QRl9OQVRfVEhST1VHSF9QRl9OT1JEUiAqLwogCiAvKiBkZWZpbmUgaWYgeW91IGhhdmUgYSBTZXB0ZWwgQVBJICovCiAvKiAjdW5kZWYgSEFWRV9TRVBURUxfQVBJICovCiAKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBNeXJpY29tIFNORiBBUEkgKi8KKy8qICN1bmRlZiBIQVZFX1NORl9BUEkgKi8KKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCiAjZGVmaW5lIEhBVkVfU05QUklOVEYgMQogCi0vKiBpZiBzdHJ1Y3Qgc29ja2FkZHIgaGFzIHNhX2xlbiAqLworLyogaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLwogLyogI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOICovCiAKIC8qIGlmIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGV4aXN0cyAqLwogI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMQogCisvKiBkZWZpbmUgaWYgc29ja2xlbl90IGlzIGRlZmluZWQgKi8KKyNkZWZpbmUgSEFWRV9TT0NLTEVOX1QgMQorCiAvKiBPbiBzb2xhcmlzICovCiAvKiAjdW5kZWYgSEFWRV9TT0xBUklTICovCiAKQEAgLTEwMiw5ICsxNjQsMTUgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNweScgZnVuY3Rpb24uICovCiAvKiAjdW5kZWYgSEFWRV9TVFJMQ1BZICovCiAKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgQlBGX1RJTUVWQUwnLiAqLworLyogI3VuZGVmIEhBVkVfU1RSVUNUX0JQRl9USU1FVkFMICovCisKIC8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgZXRoZXJfYWRkcicuICovCiAvKiAjdW5kZWYgSEFWRV9TVFJVQ1RfRVRIRVJfQUREUiAqLwogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9iaXR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX0JJVFlQRVNfSCAqLworCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9idWZtb2QuaD4gaGVhZGVyIGZpbGUuICovCiAvKiAjdW5kZWYgSEFWRV9TWVNfQlVGTU9EX0ggKi8KIApAQCAtMTI5LDI3ICsxOTcsMzggQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKIAorLyogaWYgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciBoYXMgYlJlcXVlc3RUeXBlICovCisjZGVmaW5lIEhBVkVfVVNCREVWRlNfQ1RSTFRSQU5TRkVSX0JSRVFVRVNUVFlQRSAxCisKIC8qIGRlZmluZSBpZiB2ZXJzaW9uLmggaXMgZ2VuZXJhdGVkIGluIHRoZSBidWlsZCBwcm9jZWR1cmUgKi8KICNkZWZpbmUgSEFWRV9WRVJTSU9OX0ggMQogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCiAjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKIAorLyogZGVmaW5lIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgemVyb2NvcHkgQlBGICovCisvKiAjdW5kZWYgSEFWRV9aRVJPQ09QWV9CUEYgKi8KKwogLyogZGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgaGFzIF9fYXR0cmlidXRlX18gKi8KICNkZWZpbmUgSEFWRV9fX0FUVFJJQlVURV9fIDEKIAogLyogSVB2NiAqLwotI2RlZmluZSBJTkVUNgorI2RlZmluZSBJTkVUNiAxCiAKIC8qIGlmIHVuYWxpZ25lZCBhY2Nlc3MgZmFpbHMgKi8KIC8qICN1bmRlZiBMQkxfQUxJR04gKi8KIAorLyogcGF0aCBmb3IgZGV2aWNlIGZvciBVU0Igc25pZmZpbmcgKi8KKyNkZWZpbmUgTElOVVhfVVNCX01PTl9ERVYgIi9kZXYvdXNibW9uIgorCisvKiBpZiB3ZSBuZWVkIGEgcGNhcF9wYXJzZSB3cmFwcGVyIGFyb3VuZCB5eXBhcnNlICovCisvKiAjdW5kZWYgTkVFRF9ZWVBBUlNFX1dSQVBQRVIgKi8KKwogLyogRGVmaW5lIHRvIDEgaWYgbmV0aW5ldC9ldGhlci5oIGRlY2xhcmVzIGBldGhlcl9ob3N0dG9uJyAqLwogLyogI3VuZGVmIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OICovCiAKIC8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvaWZfZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfaG9zdHRvbicgKi8KIC8qICN1bmRlZiBORVRJTkVUX0lGX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTiAqLwotI2RlZmluZSBORVRJTkVUX0lGX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTiAxCiAKIC8qIGRvIG5vdCB1c2UgcHJvdG9jaGFpbiAqLwogLyogI3VuZGVmIE5PX1BST1RPQ0hBSU4gKi8KQEAgLTE2NiwzNSArMjQ1LDk0IEBACiAvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCiAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiIgogCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1VSTCAiIgorCiAvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwogI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiIKIAogLyogL2Rldi9kbHBpIGRpcmVjdG9yeSAqLwogLyogI3VuZGVmIFBDQVBfREVWX1BSRUZJWCAqLwogCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBCbHVldG9vdGggc25pZmZpbmcgKi8KKy8qICN1bmRlZiBQQ0FQX1NVUFBPUlRfQlQgKi8KKworLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgQ0FOIHNuaWZmaW5nICovCisjZGVmaW5lIFBDQVBfU1VQUE9SVF9DQU4gMQorCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBjYW51c2IgKi8KKy8qICN1bmRlZiBQQ0FQX1NVUFBPUlRfQ0FOVVNCICovCisKKy8qIHN1cHBvcnQgRC1CdXMgc25pZmZpbmcgKi8KKy8qICN1bmRlZiBQQ0FQX1NVUFBPUlRfREJVUyAqLworCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBuZXRmaWx0ZXIgc25pZmZpbmcgKi8KKyNkZWZpbmUgUENBUF9TVVBQT1JUX05FVEZJTFRFUiAxCisKKy8qIHRhcmdldCBob3N0IHN1cHBvcnRzIFVTQiBzbmlmZmluZyAqLworI2RlZmluZSBQQ0FQX1NVUFBPUlRfVVNCIDEKKworLyogaW5jbHVkZSBBQ04gc3VwcG9ydCAqLworLyogI3VuZGVmIFNJVEEgKi8KKworLyogaWYgc3RydWN0IHNvY2thZGRyX2hjaSBoYXMgaGNpX2NoYW5uZWwgbWVtYmVyICovCisvKiAjdW5kZWYgU09DS0FERFJfSENJX0hBU19IQ0lfQ0hBTk5FTCAqLworCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KICNkZWZpbmUgU1REQ19IRUFERVJTIDEKIAogLyogRW5hYmxlIHBhcnNlciBkZWJ1Z2dpbmcgKi8KIC8qICN1bmRlZiBZWURFQlVHICovCiAKLS8qIG5lZWRlZCBvbiBIUC1VWCAqLwotLyogI3VuZGVmIF9IUFVYX1NPVVJDRSAqLworLyogRW5hYmxlIGxhcmdlIGlub2RlIG51bWJlcnMgb24gTWFjIE9TIFggMTAuNS4gICovCisjaWZuZGVmIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERQorIyBkZWZpbmUgX0RBUldJTl9VU0VfNjRfQklUX0lOT0RFIDEKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGZpbGUgb2Zmc2V0LCBvbiBob3N0cyB3aGVyZSB0aGlzIGlzIHNldHRhYmxlLiAqLworLyogI3VuZGVmIF9GSUxFX09GRlNFVF9CSVRTICovCisKKy8qIERlZmluZSB0byAxIHRvIG1ha2UgZnNlZWtvIHZpc2libGUgb24gc29tZSBob3N0cyAoZS5nLiBnbGliYyAyLjIpLiAqLworLyogI3VuZGVmIF9MQVJHRUZJTEVfU09VUkNFICovCisKKy8qIERlZmluZSBmb3IgbGFyZ2UgZmlsZXMsIG9uIEFJWC1zdHlsZSBob3N0cy4gKi8KKy8qICN1bmRlZiBfTEFSR0VfRklMRVMgKi8KIAogLyogZGVmaW5lIG9uIEFJWCB0byBnZXQgY2VydGFpbiBmdW5jdGlvbnMgKi8KIC8qICN1bmRlZiBfU1VOICovCiAKKy8qIGRlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGFsbG93cyBfX2F0dHJpYnV0ZV9fKChmb3JtYXQpKSB3aXRob3V0IGEgd2FybmluZyAqLworI2RlZmluZSBfX0FUVFJJQlVURV9fX0ZPUk1BVF9PSyAxCisKKy8qIHRvIGhhbmRsZSBVbHRyaXggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBjb25zdCBpbiBwcm90b3R5cGVzICovCisvKiAjdW5kZWYgY29uc3QgKi8KKwogLyogRGVmaW5lIGFzIHRva2VuIGZvciBpbmxpbmUgaWYgaW5saW5pbmcgc3VwcG9ydGVkICovCiAjZGVmaW5lIGlubGluZSBpbmxpbmUKIAorLyogRGVmaW5lIHRvIGBzaG9ydCcgaWYgaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KKy8qICN1bmRlZiBpbnQxNl90ICovCisKKy8qIERlZmluZSB0byBgaW50JyBpZiBpbnQzMl90IG5vdCBkZWZpbmVkLiAqLworLyogI3VuZGVmIGludDMyX3QgKi8KKworLyogRGVmaW5lIHRvIGBsb25nIGxvbmcnIGlmIGludDY0X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgaW50NjRfdCAqLworCisvKiBEZWZpbmUgdG8gYHNpZ25lZCBjaGFyJyBpZiBpbnQ4X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgaW50OF90ICovCisKIC8qIG9uIHNpbml4ICovCiAvKiAjdW5kZWYgc2luaXggKi8KIAotLyogaWYgd2UgaGF2ZSB1X2ludDE2X3QgKi8KKy8qIERlZmluZSB0byBgdW5zaWduZWQgc2hvcnQnIGlmIHVfaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KIC8qICN1bmRlZiB1X2ludDE2X3QgKi8KIAotLyogaWYgd2UgaGF2ZSB1X2ludDMyX3QgKi8KKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiB1X2ludDMyX3Qgbm90IGRlZmluZWQuICovCiAvKiAjdW5kZWYgdV9pbnQzMl90ICovCiAKLS8qIGlmIHdlIGhhdmUgdV9pbnQ4X3QgKi8KKy8qIERlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgdV9pbnQ2NF90ICovCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgY2hhcicgaWYgdV9pbnQ4X3Qgbm90IGRlZmluZWQuICovCiAvKiAjdW5kZWYgdV9pbnQ4X3QgKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy5oLmluIGIvY29uZmlnLmguaW4KaW5kZXggOGFhODc5Yy4uYzZiYzY4ZSAxMDA2NDQKLS0tIGEvY29uZmlnLmguaW4KKysrIGIvY29uZmlnLmguaW4KQEAgLTEsMTEgKzEsNCBAQAogLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiBMb25nIHN0b3J5IHNob3J0OiBhY2xvY2FsLm00IGRlcGVuZHMgb24gYXV0b2NvbmYgMi4xMwotICogaW1wbGVtZW50YXRpb24gZGV0YWlscyB3cnQgImNvbnN0IjsgbmV3ZXIgdmVyc2lvbnMKLSAqIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMgc28gZm9yIG5vdyB3ZQotICogcHV0ICJjb25zdCIgaGVyZS4gIFRoaXMgbWF5IGNhdXNlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucwotICogaW4gY29uZmlnLmggYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCi0gKi8KLSN1bmRlZiBjb25zdAogCiAvKiBFbmFibGUgb3B0aW1pemVyIGRlYnVnZ2luZyAqLwogI3VuZGVmIEJERUJVRwpAQCAtMTksOSArMTIsMTUgQEAKIC8qIGRlZmluZSBpZiB5b3UgaGF2ZSBkYWdfZ2V0X2VyZl90eXBlcygpICovCiAjdW5kZWYgSEFWRV9EQUdfR0VUX0VSRl9UWVBFUwogCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzKCkgKi8KKyN1bmRlZiBIQVZFX0RBR19HRVRfU1RSRUFNX0VSRl9UWVBFUworCiAvKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RyZWFtcyBjYXBhYmxlIERBRyBBUEkgKi8KICN1bmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQogCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdmRhZ19zZXRfZGV2aWNlX2luZm8oKSAqLworI3VuZGVmIEhBVkVfREFHX1ZEQUcKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBldGhlcl9ob3N0dG9uJywgYW5kIHRvIDAgaWYgeW91CiAgICBkb24ndC4gKi8KICN1bmRlZiBIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTgpAQCAtMjksOSArMjgsMTUgQEAKIC8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIC9kZXYvZGxwaSAqLwogI3VuZGVmIEhBVkVfREVWX0RMUEkKIAorLyogaWYgcGFzc2l2ZV9yZXFfdCBwcmltaXRpdmUgZXhpc3RzICovCisjdW5kZWYgSEFWRV9ETFBJX1BBU1NJVkUKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBldGhlcl9ob3N0dG9uJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX0VUSEVSX0hPU1RUT04KIAorLyogRGVmaW5lIHRvIDEgaWYgZnNlZWtvIChhbmQgcHJlc3VtYWJseSBmdGVsbG8pIGV4aXN0cyBhbmQgaXMgZGVjbGFyZWQuICovCisjdW5kZWYgSEFWRV9GU0VFS08KKwogLyogb24gSFAtVVggMTAuMjAgb3IgbGF0ZXIgKi8KICN1bmRlZiBIQVZFX0hQVVgxMF8yMF9PUl9MQVRFUgogCkBAIC00NCw5ICs0OSw1MSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKIAorLyogaWYgbGliZGxwaSBleGlzdHMgKi8KKyN1bmRlZiBIQVZFX0xJQkRMUEkKKworLyogaWYgbGlibmwgZXhpc3RzICovCisjdW5kZWYgSEFWRV9MSUJOTAorCisvKiBpZiBsaWJubCBleGlzdHMgYW5kIGlzIHZlcnNpb24gMi54ICovCisjdW5kZWYgSEFWRV9MSUJOTF8yX3gKKworLyogaWYgbGlibmwgZXhpc3RzIGFuZCBpcyB2ZXJzaW9uIDMueCAqLworI3VuZGVmIEhBVkVfTElCTkxfM194CisKKy8qIGxpYm5sIGhhcyBOTEVfRkFJTFVSRSAqLworI3VuZGVmIEhBVkVfTElCTkxfTkxFCisKKy8qIGxpYm5sIGhhcyBuZXctc3R5bGUgc29ja2V0IGFwaSAqLworI3VuZGVmIEhBVkVfTElCTkxfU09DS0VUUworCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0xJTUlUU19ICiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvY29tcGlsZXIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU5VWF9DT01QSUxFUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvZXRodG9vbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX0VUSFRPT0xfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2lmX3BhY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX0lGX1BBQ0tFVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvbmV0X3RzdGFtcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX05FVF9UU1RBTVBfSAorCisvKiBpZiB0cF92bGFuX3RjaSBleGlzdHMgKi8KKyN1bmRlZiBIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3VzYmRldmljZV9mcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX1VTQkRFVklDRV9GU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvd2lyZWxlc3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU5VWF9XSVJFTEVTU19ICisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfTUVNT1JZX0gKIApAQCAtNTYsMzAgKzEwMyw0NSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2lmX2V0aGVyLmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0cGFja2V0L2lmX3BhY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVFBBQ0tFVF9JRl9QQUNLRVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldHBhY2tldC9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRQQUNLRVRfUEFDS0VUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXQvaWZfbWVkaWEuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRfSUZfTUVESUFfSAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9wZnZhci5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX05FVF9QRlZBUl9ICiAKLS8qIGlmIHRoZXJlJ3MgYW4gb3NfcHJvdG8uaCAqLworLyogaWYgdGhlcmUncyBhbiBvc19wcm90by5oIGZvciB0aGlzIHBsYXRmb3JtLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzICovCiAjdW5kZWYgSEFWRV9PU19QUk9UT19ICiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGF0aHMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9QQVRIU19ICiAKLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIC9wcm9jL25ldC9kZXYgKi8KLSN1bmRlZiBIQVZFX1BST0NfTkVUX0RFVgorLyogZGVmaW5lIGlmIG5ldC9wZnZhci5oIGRlZmluZXMgUEZfTkFUIHRocm91Z2ggUEZfTk9SRFIgKi8KKyN1bmRlZiBIQVZFX1BGX05BVF9USFJPVUdIX1BGX05PUkRSCiAKIC8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIFNlcHRlbCBBUEkgKi8KICN1bmRlZiBIQVZFX1NFUFRFTF9BUEkKIAorLyogZGVmaW5lIGlmIHlvdSBoYXZlIE15cmljb20gU05GIEFQSSAqLworI3VuZGVmIEhBVkVfU05GX0FQSQorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1NOUFJJTlRGCiAKLS8qIGlmIHN0cnVjdCBzb2NrYWRkciBoYXMgc2FfbGVuICovCisvKiBpZiBzdHJ1Y3Qgc29ja2FkZHIgaGFzIHRoZSBzYV9sZW4gbWVtYmVyICovCiAjdW5kZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KIAogLyogaWYgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZXhpc3RzICovCiAjdW5kZWYgSEFWRV9TT0NLQUREUl9TVE9SQUdFCiAKKy8qIGRlZmluZSBpZiBzb2NrbGVuX3QgaXMgZGVmaW5lZCAqLworI3VuZGVmIEhBVkVfU09DS0xFTl9UCisKIC8qIE9uIHNvbGFyaXMgKi8KICN1bmRlZiBIQVZFX1NPTEFSSVMKIApAQCAtMTAxLDkgKzE2MywxNSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJsY3B5JyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1NUUkxDUFkKIAorLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCBCUEZfVElNRVZBTCcuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfQlBGX1RJTUVWQUwKKwogLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCBldGhlcl9hZGRyJy4gKi8KICN1bmRlZiBIQVZFX1NUUlVDVF9FVEhFUl9BRERSCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2JpdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQklUWVBFU19ICisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2J1Zm1vZC5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX1NZU19CVUZNT0RfSAogCkBAIC0xMjgsMTIgKzE5NiwxOCBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9VTklTVERfSAogCisvKiBpZiBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyIGhhcyBiUmVxdWVzdFR5cGUgKi8KKyN1bmRlZiBIQVZFX1VTQkRFVkZTX0NUUkxUUkFOU0ZFUl9CUkVRVUVTVFRZUEUKKwogLyogZGVmaW5lIGlmIHZlcnNpb24uaCBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJ1aWxkIHByb2NlZHVyZSAqLwogI3VuZGVmIEhBVkVfVkVSU0lPTl9ICiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1ZTTlBSSU5URgogCisvKiBkZWZpbmUgaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyB6ZXJvY29weSBCUEYgKi8KKyN1bmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCiAvKiBkZWZpbmUgaWYgeW91ciBjb21waWxlciBoYXMgX19hdHRyaWJ1dGVfXyAqLwogI3VuZGVmIEhBVkVfX19BVFRSSUJVVEVfXwogCkBAIC0xNDMsNiArMjE3LDEyIEBACiAvKiBpZiB1bmFsaWduZWQgYWNjZXNzIGZhaWxzICovCiAjdW5kZWYgTEJMX0FMSUdOCiAKKy8qIHBhdGggZm9yIGRldmljZSBmb3IgVVNCIHNuaWZmaW5nICovCisjdW5kZWYgTElOVVhfVVNCX01PTl9ERVYKKworLyogaWYgd2UgbmVlZCBhIHBjYXBfcGFyc2Ugd3JhcHBlciBhcm91bmQgeXlwYXJzZSAqLworI3VuZGVmIE5FRURfWVlQQVJTRV9XUkFQUEVSCisKIC8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfaG9zdHRvbicgKi8KICN1bmRlZiBORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTgogCkBAIC0xNjQsMzUgKzI0NCw5NCBAQAogLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwogI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQogCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKIC8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCiAjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCiAKIC8qIC9kZXYvZGxwaSBkaXJlY3RvcnkgKi8KICN1bmRlZiBQQ0FQX0RFVl9QUkVGSVgKIAorLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgQmx1ZXRvb3RoIHNuaWZmaW5nICovCisjdW5kZWYgUENBUF9TVVBQT1JUX0JUCisKKy8qIHRhcmdldCBob3N0IHN1cHBvcnRzIENBTiBzbmlmZmluZyAqLworI3VuZGVmIFBDQVBfU1VQUE9SVF9DQU4KKworLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgY2FudXNiICovCisjdW5kZWYgUENBUF9TVVBQT1JUX0NBTlVTQgorCisvKiBzdXBwb3J0IEQtQnVzIHNuaWZmaW5nICovCisjdW5kZWYgUENBUF9TVVBQT1JUX0RCVVMKKworLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgbmV0ZmlsdGVyIHNuaWZmaW5nICovCisjdW5kZWYgUENBUF9TVVBQT1JUX05FVEZJTFRFUgorCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBVU0Igc25pZmZpbmcgKi8KKyN1bmRlZiBQQ0FQX1NVUFBPUlRfVVNCCisKKy8qIGluY2x1ZGUgQUNOIHN1cHBvcnQgKi8KKyN1bmRlZiBTSVRBCisKKy8qIGlmIHN0cnVjdCBzb2NrYWRkcl9oY2kgaGFzIGhjaV9jaGFubmVsIG1lbWJlciAqLworI3VuZGVmIFNPQ0tBRERSX0hDSV9IQVNfSENJX0NIQU5ORUwKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCiAjdW5kZWYgU1REQ19IRUFERVJTCiAKIC8qIEVuYWJsZSBwYXJzZXIgZGVidWdnaW5nICovCiAjdW5kZWYgWVlERUJVRwogCi0vKiBuZWVkZWQgb24gSFAtVVggKi8KLSN1bmRlZiBfSFBVWF9TT1VSQ0UKKy8qIEVuYWJsZSBsYXJnZSBpbm9kZSBudW1iZXJzIG9uIE1hYyBPUyBYIDEwLjUuICAqLworI2lmbmRlZiBfREFSV0lOX1VTRV82NF9CSVRfSU5PREUKKyMgZGVmaW5lIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAxCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBmaWxlIG9mZnNldCwgb24gaG9zdHMgd2hlcmUgdGhpcyBpcyBzZXR0YWJsZS4gKi8KKyN1bmRlZiBfRklMRV9PRkZTRVRfQklUUworCisvKiBEZWZpbmUgdG8gMSB0byBtYWtlIGZzZWVrbyB2aXNpYmxlIG9uIHNvbWUgaG9zdHMgKGUuZy4gZ2xpYmMgMi4yKS4gKi8KKyN1bmRlZiBfTEFSR0VGSUxFX1NPVVJDRQorCisvKiBEZWZpbmUgZm9yIGxhcmdlIGZpbGVzLCBvbiBBSVgtc3R5bGUgaG9zdHMuICovCisjdW5kZWYgX0xBUkdFX0ZJTEVTCiAKIC8qIGRlZmluZSBvbiBBSVggdG8gZ2V0IGNlcnRhaW4gZnVuY3Rpb25zICovCiAjdW5kZWYgX1NVTgogCisvKiBkZWZpbmUgaWYgeW91ciBjb21waWxlciBhbGxvd3MgX19hdHRyaWJ1dGVfXygoZm9ybWF0KSkgd2l0aG91dCBhIHdhcm5pbmcgKi8KKyN1bmRlZiBfX0FUVFJJQlVURV9fX0ZPUk1BVF9PSworCisvKiB0byBoYW5kbGUgVWx0cml4IGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgY29uc3QgaW4gcHJvdG90eXBlcyAqLworI3VuZGVmIGNvbnN0CisKIC8qIERlZmluZSBhcyB0b2tlbiBmb3IgaW5saW5lIGlmIGlubGluaW5nIHN1cHBvcnRlZCAqLwogI3VuZGVmIGlubGluZQogCisvKiBEZWZpbmUgdG8gYHNob3J0JyBpZiBpbnQxNl90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIGludDE2X3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIGludDMyX3Qgbm90IGRlZmluZWQuICovCisjdW5kZWYgaW50MzJfdAorCisvKiBEZWZpbmUgdG8gYGxvbmcgbG9uZycgaWYgaW50NjRfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiBpbnQ2NF90CisKKy8qIERlZmluZSB0byBgc2lnbmVkIGNoYXInIGlmIGludDhfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiBpbnQ4X3QKKwogLyogb24gc2luaXggKi8KICN1bmRlZiBzaW5peAogCi0vKiBpZiB3ZSBoYXZlIHVfaW50MTZfdCAqLworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBzaG9ydCcgaWYgdV9pbnQxNl90IG5vdCBkZWZpbmVkLiAqLwogI3VuZGVmIHVfaW50MTZfdAogCi0vKiBpZiB3ZSBoYXZlIHVfaW50MzJfdCAqLworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIHVfaW50MzJfdCBub3QgZGVmaW5lZC4gKi8KICN1bmRlZiB1X2ludDMyX3QKIAotLyogaWYgd2UgaGF2ZSB1X2ludDhfdCAqLworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBsb25nIGxvbmcnIGlmIHVfaW50NjRfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiB1X2ludDY0X3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBjaGFyJyBpZiB1X2ludDhfdCBub3QgZGVmaW5lZC4gKi8KICN1bmRlZiB1X2ludDhfdApkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKaW5kZXggNTY5ODE3NC4uODUxODYwOSAxMDA3NTUKLS0tIGEvY29uZmlnLnN1YgorKysgYi9jb25maWcuc3ViCkBAIC0xLDkgKzEsMTAgQEAKICMhIC9iaW4vc2gKICMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgogIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotdGltZXN0YW1wPScyMDAzLTExLTAzJwordGltZXN0YW1wPScyMDA5LTEyLTMxJwogCiAjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KICMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQpAQCAtMjEsMjIgKzIyLDI2IEBACiAjCiAjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIwogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CiAjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQogIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgogIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCiAKKwogIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKLSMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBHTlUgQ2hhbmdlTG9nIGVudHJ5LgogIwogIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KICMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgogIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KICMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KIAorIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCiAjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwogIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKICMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KQEAgLTcwLDggKzc1LDkgQEAKIHZlcnNpb249IlwKIEdOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQogCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCiB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCkBAIC04MywxMSArODksMTEgQEAKIHdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwogICBjYXNlICQxIGluCiAgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OworICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OwogICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CiAgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CiAgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCiAgICAgICAgc2hpZnQ7IGJyZWFrIDs7CiAgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgpAQCAtOTksNyArMTA1LDcgQEAKICAgICAqbG9jYWwqKQogICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgogICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDA7OworICAgICAgIGV4aXQgOzsKIAogICAgICogKQogICAgICAgIGJyZWFrIDs7CkBAIC0xMTgsOCArMTI0LDEwIEBACiAjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgogbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCiBjYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBcCi0gIGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKKyAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKICAgICBvcz0tJG1heWJlX29zCiAgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKICAgICA7OwpAQCAtMTQ1LDEwICsxNTMsMTMgQEAKIAktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAogCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCiAJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlIHwgLWF4aXMpCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKQogCQlvcz0KIAkJYmFzaWNfbWFjaGluZT0kMQogCQk7OworICAgICAgICAtYmx1ZWdlbmUqKQorCSAgICAgICAgb3M9LWNuaworCQk7OwogCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQogCQlvcz0KIAkJYmFzaWNfbWFjaGluZT0kMQpAQCAtMTcwLDYgKzE4MSwxMCBAQAogCS1oaXV4KikKIAkJb3M9LWhpdXh3ZTIKIAkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CiAJLXNjbzUpCiAJCW9zPS1zY28zLjJ2NQogCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCkBAIC0xODYsNiArMjAxLDEwIEBACiAJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCiAJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKIAkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OwogCS1zY28qKQogCQlvcz0tc2NvMy4ydjIKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYApAQCAtMjMwLDIyICsyNDksMjggQEAKIAl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCiAJfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKIAl8IGFtMzNfMi4wIFwKLQl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKIAl8IGM0eCB8IGNsaXBwZXIgXAogCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKLQl8IGZyMzAgfCBmcnYgXAorCXwgZmlkbyB8IGZyMzAgfCBmcnYgXAogCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKIAl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAogCXwgaXAyayB8IGlxMjAwMCBcCi0JfCBtMzJyIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgfCBtY29yZSBcCisJfCBsbTMyIFwKKwl8IG0zMmMgfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgXAorCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAogCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCiAJfCBtaXBzMTYgXAogCXwgbWlwczY0IHwgbWlwczY0ZWwgXAotCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKIAl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKIAl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKIAl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKIAl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKIAl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKIAl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCiAJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCkBAIC0yNTQsMzAgKzI3OSw0MCBAQAogCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKIAl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCiAJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCiAJfCBtc3A0MzAgXAorCXwgbmlvcyB8IG5pb3MyIFwKIAl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3BlbnJpc2MgfCBvcjMyIFwKKwl8IG9yMzIgXAogCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKIAl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKIAl8IHB5cmFtaWQgXAotCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoYmUgfCBzaGxlIHwgc2hbMTIzNF1sZSB8IHNoM2VsZSBcCisJfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAogCXwgc2g2NCB8IHNoNjRsZSBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmN2OSB8IHNwYXJjdjliIFwKLQl8IHN0cm9uZ2FybSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKIAl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB1Ymljb20zMiBcCiAJfCB2ODUwIHwgdjg1MGUgXAogCXwgd2UzMmsgXAotCXwgeDg2IHwgeHNjYWxlIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKLQl8IHo4aykKKwl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQogCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KIAkJOzsKLQltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgcGljb2NoaXApCiAJCSMgTW90b3JvbGEgNjhIQzExLzEyLgogCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KIAkJb3M9LW5vbmUKIAkJOzsKIAltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKIAkJOzsKKwltczEpCisJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgorCQk7OwogCiAJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKIAkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKQEAgLTI5NywyOCArMzMyLDMyIEBACiAJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAogCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCiAJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKLQl8IGF2ci0qIFwKLQl8IGJzMjAwMC0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZmluLSogfCBiczIwMDAtKiBcCiAJfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKLQl8IGNsaXBwZXItKiB8IGN5ZHJhLSogXAorCXwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKIAl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKIAl8IGVseHNpLSogXAotCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZmlkby0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAogCXwgaDgzMDAtKiB8IGg4NTAwLSogXAogCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKIAl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCiAJfCBpcDJrLSogfCBpcTIwMDAtKiBcCi0JfCBtMzJyLSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKIAl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCi0JfCBtODgxMTAtKiB8IG04OGstKiB8IG1jb3JlLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtYXhxLSogfCBtY29yZS0qIHwgbWV0YWctKiB8IG1pY3JvYmxhemUtKiBcCiAJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCiAJfCBtaXBzMTYtKiBcCiAJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAotCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAogCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAogCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKIAl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCiAJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKIAl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCiAJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKIAl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCkBAIC0zMjYsMjYgKzM2NSwzNSBAQAogCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKIAl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAogCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCiAJfCBtc3A0MzAtKiBcCi0JfCBub25lLSogfCBucDEtKiB8IG52MS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgbmlvcy0qIHwgbmlvczItKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKIAl8IG9yaW9uLSogXAogCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCiAJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAogCXwgcHlyYW1pZC0qIFwKLQl8IHJvbXAtKiB8IHJzNjAwMC0qIFwKLQl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiBcCisJfCByb21wLSogfCByczYwMDAtKiB8IHJ4LSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyNF1hZWItKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAogCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKKwl8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKIAl8IHRhaG9lLSogfCB0aHVtYi0qIFwKLQl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIHwgdGlsZS0qIFwKIAl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKIAl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCiAJfCB3ZTMyay0qIFwKLQl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHN0b3JteTE2LSogXAotCXwgeHRlbnNhLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCiAJfCB5bXAtKiBcCi0JfCB6OGstKikKKwl8IHo4ay0qIHwgejgwLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZSwgd2l0aCBnbG9iIG1hdGNoLgorCXh0ZW5zYSopCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgogCQk7OwogCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKIAkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgpAQCAtMzYzLDYgKzQxMSw5IEBACiAJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKIAkJb3M9LXVkaQogCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKIAlhZG9iZTY4aykKIAkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKIAkJb3M9LXNjb3V0CkBAIC0zODAsNiArNDMxLDkgQEAKIAlhbWQ2NCkKIAkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKIAkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OwogCWFtZGFobCkKIAkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCiAJCW9zPS1zeXN2CkBAIC00MDMsNiArNDU3LDEwIEBACiAJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KIAkJb3M9LWJzZAogCQk7OworCWFyb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tYXJvcworCQk7OwogCWF1eCkKIAkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCiAJCW9zPS1hdXgKQEAgLTQxMSwxMCArNDY5LDI2IEBACiAJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAogCQlvcz0tZHluaXgKIAkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CiAJYzkwKQogCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CiAJCW9zPS11bmljb3MKIAkJOzsKKyAgICAgICAgY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CiAJY29udmV4LWMxKQogCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAogCQlvcz0tYnNkCkBAIC00MzksMTIgKzUxMywyNyBAQAogCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CiAJCW9zPS11bmljb3MKIAkJOzsKKwljcmF5bnYpCisJCWJhc2ljX21hY2hpbmU9Y3JheW52LWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJY3IxNikKKwkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KKwkJb3M9LWVsZgorCQk7OwogCWNyZHMgfCB1bm9zKQogCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwogCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKIAljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQogCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcwogCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CiAJZGEzMCB8IGRhMzAtKikKIAkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKIAkJOzsKQEAgLTQ2Nyw2ICs1NTYsMTQgQEAKIAkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCiAJCW9zPS1zeXN2MwogCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OwogCWRweDIwIHwgZHB4MjAtKikKIAkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAogCQlvcz0tYm9zeApAQCAtNjE3LDYgKzcxNCwxNCBAQAogCQliYXNpY19tYWNoaW5lPW02OGstaXNpCiAJCW9zPS1zeXN2CiAJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OwogCW04OGstb21yb24qKQogCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KIAkJOzsKQEAgLTYyOCwxMCArNzMzLDE3IEBACiAJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawogCQlvcz0tc3lzdgogCQk7OworICAgICAgICBtaWNyb2JsYXplKQorCQliYXNpY19tYWNoaW5lPW1pY3JvYmxhemUteGlsaW54CisJCTs7CiAJbWluZ3czMikKIAkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCiAJCW9zPS1taW5ndzMyCiAJCTs7CisJbWluZ3czMmNlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1taW5ndzMyY2UKKwkJOzsKIAltaW5pZnJhbWUpCiAJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKIAkJOzsKQEAgLTY0NSwxMCArNzU3LDYgQEAKIAltaXBzMyopCiAJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KIAkJOzsKLQltbWl4KikKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCW9zPS1tbWl4d2FyZQotCQk7OwogCW1vbml0b3IpCiAJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKIAkJb3M9LWNvZmYKQEAgLTY2MSw2ICs3NjksOSBAQAogCQliYXNpY19tYWNoaW5lPWkzODYtcGMKIAkJb3M9LW1zZG9zCiAJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKIAltdnMpCiAJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KIAkJb3M9LW12cwpAQCAtNzI5LDEwICs4NDAsNiBAQAogCW5wMSkKIAkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKIAkJOzsKLQludjEpCi0JCWJhc2ljX21hY2hpbmU9bnYxLWNyYXkKLQkJb3M9LXVuaWNvc21wCi0JCTs7CiAJbnNyLXRhbmRlbSkKIAkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCiAJCTs7CkBAIC03NDAsOSArODQ3LDggQEAKIAkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQogCQlvcz0tcHJvZWxmCiAJCTs7Ci0Jb3IzMiB8IG9yMzItKikKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCiAJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCi0JCW9zPS1jb2ZmCiAJCTs7CiAJb3M0MDApCiAJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KQEAgLTc2NCw2ICs4NzAsMTQgQEAKIAkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCiAJCW9zPS1vc2YKIAkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CiAJcGJkKQogCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQogCQk7OwpAQCAtNzczLDYgKzg4NywxMiBAQAogCXBjNTMyIHwgcGM1MzItKikKIAkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgogCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CiAJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQogCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKIAkJOzsKQEAgLTgyOSw2ICs5NDksMTAgQEAKIAkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KIAkJb3M9LXB3MzIKIAkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKIAlyb202OGspCiAJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKIAkJb3M9LWNvZmYKQEAgLTg1NSw2ICs5NzksMTAgQEAKIAlzYjFlbCkKIAkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCiAJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OwogCXNlaSkKIAkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQogCQlvcz0tc2VpdXgKQEAgLTg2Niw2ICs5OTQsOSBAQAogCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKIAkJb3M9LWhtcwogCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKIAlzaDY0KQogCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgogCQk7OwpAQCAtOTU1LDYgKzEwODYsMTAgQEAKIAkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCiAJCW9zPS1jb2ZmCiAJCTs7CisJdGlsZSopCisJCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKIAl0eDM5KQogCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KIAkJOzsKQEAgLTEwMTUsNiArMTE1MCwxMCBAQAogCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAogCQlvcz0tcHJvZWxmCiAJCTs7CisJeGJveCkKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CiAJeHBzIHwgeHBzMTAwKQogCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKIAkJOzsKQEAgLTEwMjYsNiArMTE2NSwxMCBAQAogCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCiAJCW9zPS1zaW0KIAkJOzsKKwl6ODAtKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4MC11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKIAlub25lKQogCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQogCQlvcz0tbm9uZQpAQCAtMTA0NSw2ICsxMTg4LDkgQEAKIAlyb21wKQogCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCiAJCTs7CisJbW1peCkKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCTs7CiAJcnM2MDAwKQogCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KIAkJOzsKQEAgLTEwNjEsMTMgKzEyMDcsMTAgQEAKIAl3ZTMyaykKIAkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKIAkJOzsKLQlzaDMgfCBzaDQgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQogCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KIAkJOzsKLQlzaDY0KQotCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgotCQk7OwotCXNwYXJjIHwgc3BhcmN2OSB8IHNwYXJjdjliKQorCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQogCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgogCQk7OwogCWN5ZHJhKQpAQCAtMTExNCw2ICsxMjU3LDkgQEAKICAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKICAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KIAkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKyAgICAgICAgLWF1cm9yYXV4KQorCSAgICAgICAgb3M9LWF1cm9yYXV4CisJCTs7CiAJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCiAJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKIAkJOzsKQEAgLTExMzQsMjUgKzEyODAsMzAgQEAKIAkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgogCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KIAktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCisJICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIFwKIAkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKIAkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAogCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLW9wZW5ic2QqIHwgLXNvbGlkYnNkKiBcCisJICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCisJICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAogCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKIAkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKLQkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKIAkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC11Y2xpYmMqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAogCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCiAJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCiAJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCiAJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAogCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAotCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KikKKwkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAorCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyogfCAtZHJvcHMqIHwgLWVzKikKIAkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCiAJCTs7CiAJLXFueCopCkBAIC0xMTcwLDcgKzEzMjEsNyBAQAogCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKIAkJOzsKIAktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCi0JICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiB8IC1oYWlrdSogXAogCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCiAJCTs7CiAJLW1hYyopCkBAIC0xMjE1LDYgKzEzNjYsOSBAQAogCS1hdGhlb3MqKQogCQlvcz0tYXRoZW9zCiAJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CiAJLTM4NmJzZCkKIAkJb3M9LWJzZAogCQk7OwpAQCAtMTI3Niw2ICsxNDMwLDE0IEBACiAJLWthb3MqKQogCQlvcz0ta2FvcwogCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLWRpY29zKikKKwkJb3M9LWRpY29zCisJCTs7CisgICAgICAgIC1uYWNsKikKKwkgICAgICAgIDs7CiAJLW5vbmUpCiAJCTs7CiAJKikKQEAgLTEyOTgsNiArMTQ2MCwxMiBAQAogIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KIAogY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorICAgICAgICBzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisgICAgICAgIHNwdS0qKQorCQlvcz0tZWxmCisJCTs7CiAJKi1hY29ybikKIAkJb3M9LXJpc2NpeDEuMgogCQk7OwpAQCAtMTMwNyw5ICsxNDc1LDkgQEAKIAlhcm0qLXNlbWkpCiAJCW9zPS1hb3V0CiAJCTs7Ci0gICAgYzR4LSogfCB0aWM0eC0qKQotICAgICAgICBvcz0tY29mZgotICAgICAgICA7OworICAgICAgICBjNHgtKiB8IHRpYzR4LSopCisgICAgICAgIAlvcz0tY29mZgorCQk7OwogCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KIAlwZHAxMC0qKQogCQlvcz0tdG9wczIwCkBAIC0xMzM1LDYgKzE1MDMsOSBAQAogCW02OCotY2lzY28pCiAJCW9zPS1hb3V0CiAJCTs7CisgICAgICAgIG1lcC0qKQorCQlvcz0tZWxmCisJCTs7CiAJbWlwcyotY2lzY28pCiAJCW9zPS1lbGYKIAkJOzsKQEAgLTEzNTMsOSArMTUyNCwxNSBAQAogCSotYmUpCiAJCW9zPS1iZW9zCiAJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CiAJKi1pYm0pCiAJCW9zPS1haXgKIAkJOzsKKyAgICAJKi1rbnV0aCkKKwkJb3M9LW1taXh3YXJlCisJCTs7CiAJKi13ZWMpCiAJCW9zPS1wcm9lbGYKIAkJOzsKQEAgLTE0NTgsNyArMTYzNSw3IEBACiAJCQktc3Vub3MqKQogCQkJCXZlbmRvcj1zdW4KIAkJCQk7OwotCQkJLWFpeCopCisJCQktY25rKnwtYWl4KikKIAkJCQl2ZW5kb3I9aWJtCiAJCQkJOzsKIAkJCS1iZW9zKikKQEAgLTE1MjEsNyArMTY5OCw3IEBACiBlc2FjCiAKIGVjaG8gJGJhc2ljX21hY2hpbmUkb3MKLWV4aXQgMAorZXhpdAogCiAjIExvY2FsIHZhcmlhYmxlczoKICMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDM4ZTAzNWUuLjA3YzJkMzMgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEsNjEgKzEsODEgQEAKICMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDEuMTIwLjIuMTMgLgogIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4KICMKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgMTk5OC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIwogIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAKICMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQogRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgogICBlbXVsYXRlIHNoCiAgIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAogICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgogICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKIGVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7CiBlc2FjCi0KIGZpCiAKIAotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCiAKICMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgogaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQogZmkKIAogCkBAIC02NCwyMCArODQsMTkgQEAKICMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgogIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCiAjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1hc19ubD0nCi0nCiBJRlM9IiAiIgkkYXNfbmwiCiAKICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1jYXNlICQwIGluCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAogICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CiAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKLWRvbmUKKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKICAgICAgOzsKQEAgLTg4LDMyICsxMDcsMzE1IEBACiAgIGFzX215c2VsZj0kMAogZmkKIGlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSAgZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgotICB7IChleGl0IDEpOyBleGl0IDE7IH0KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCiBmaQogCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6CiBkb25lCiBQUzE9JyQgJwogUFMyPSc+ICcKIFBTND0nKyAnCiAKICMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCiAKLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgorIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKyMgVXNlIGEgcHJvcGVyIGludGVybmFsIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGVuc3VyZSB3ZSBkb24ndCBmYWxsCisgICMgaW50byBhbiBpbmZpbml0ZSBsb29wLCBjb250aW51b3VzbHkgcmUtZXhlY3V0aW5nIG91cnNlbHZlcy4KKyAgaWYgdGVzdCB4IiR7X2FzX2Nhbl9yZWV4ZWN9IiAhPSB4bm8gJiYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4KKyAgICBfYXNfY2FuX3JlZXhlYz1ubzsgZXhwb3J0IF9hc19jYW5fcmVleGVjOworICAgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKyMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KK0JBU0hfRU5WPS9kZXYvbnVsbAorRU5WPS9kZXYvbnVsbAorKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCitjYXNlICQtIGluICMgKCgoKAorICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKyAgKnYqICkgYXNfb3B0cz0tdiA7OworICAqeCogKSBhc19vcHRzPS14IDs7CisgICogKSBhc19vcHRzPSA7OworZXNhYworZXhlYyAkQ09ORklHX1NIRUxMICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KKyMgQWRtaXR0ZWRseSwgdGhpcyBpcyBxdWl0ZSBwYXJhbm9pZCwgc2luY2UgYWxsIHRoZSBrbm93biBzaGVsbHMgYmFpbAorIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgorJGFzX2VjaG8gIiQwOiBjb3VsZCBub3QgcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwiID4mMgorYXNfZm5fZXhpdCAyNTUKKyAgZmkKKyAgIyBXZSBkb24ndCB3YW50IHRoaXMgdG8gcHJvcGFnYXRlIHRvIG90aGVyIHN1YnByb2Nlc3Nlcy4KKyAgICAgICAgICB7IF9hc19jYW5fcmVleGVjPTsgdW5zZXQgX2FzX2Nhbl9yZWV4ZWM7fQoraWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgorICBhc19ib3VybmVfY29tcGF0aWJsZT0iaWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKyIKKyAgYXNfcmVxdWlyZWQ9ImFzX2ZuX3JldHVybiAoKSB7IChleGl0IFwkMSk7IH0KK2FzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQorYXNfZm5fZmFpbHVyZSAoKSB7IGFzX2ZuX3JldHVybiAxOyB9Cithc19mbl9yZXRfc3VjY2VzcyAoKSB7IHJldHVybiAwOyB9Cithc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9CisKK2V4aXRjb2RlPTAKK2FzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fZmFpbHVyZSBzdWNjZWVkZWQuOyB9Cithc19mbl9yZXRfc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2lmICggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuIDoKKworZWxzZQorICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCit0ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxCit0ZXN0IC14IC8gfHwgZXhpdCAxIgorICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTworICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCisgIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCisgIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKK3Rlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxIgorICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBhc19oYXZlX3JlcXVpcmVkPXllcworZWxzZQorICBhc19oYXZlX3JlcXVpcmVkPW5vCitmaQorICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorYXNfZm91bmQ9ZmFsc2UKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgYXNfZm91bmQ9OgorICBjYXNlICRhc19kaXIgaW4gIygKKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCisJCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYnJlYWsgMgorZmkKK2ZpCisJICAgZG9uZTs7CisgICAgICAgZXNhYworICBhc19mb3VuZD1mYWxzZQorZG9uZQorJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCisJICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitmaTsgfQorSUZTPSRhc19zYXZlX0lGUworCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgICAgICAgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKyMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KK0JBU0hfRU5WPS9kZXYvbnVsbAorRU5WPS9kZXYvbnVsbAorKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCitjYXNlICQtIGluICMgKCgoKAorICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKyAgKnYqICkgYXNfb3B0cz0tdiA7OworICAqeCogKSBhc19vcHRzPS14IDs7CisgICogKSBhc19vcHRzPSA7OworZXNhYworZXhlYyAkQ09ORklHX1NIRUxMICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KKyMgQWRtaXR0ZWRseSwgdGhpcyBpcyBxdWl0ZSBwYXJhbm9pZCwgc2luY2UgYWxsIHRoZSBrbm93biBzaGVsbHMgYmFpbAorIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgorJGFzX2VjaG8gIiQwOiBjb3VsZCBub3QgcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwiID4mMgorZXhpdCAyNTUKK2ZpCisKKyAgICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHhubzsgdGhlbiA6CisgICRhc19lY2hvICIkMDogVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCIKKyAgJGFzX2VjaG8gIiQwOiB0aGUgc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4iCisgIGlmIHRlc3QgeCR7WlNIX1ZFUlNJT04rc2V0fSA9IHhzZXQgOyB0aGVuCisgICAgJGFzX2VjaG8gIiQwOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiCisgICAgJGFzX2VjaG8gIiQwOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIgorICBlbHNlCisgICAgJGFzX2VjaG8gIiQwOiBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKyQwOiBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcworJDA6IG1lc3NhZ2UuIFRoZW4gaW5zdGFsbCBhIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuCiskMDogdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEgc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLiIKKyAgZmkKKyAgZXhpdCAxCitmaQorZmkKK2ZpCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorZXhwb3J0IFNIRUxMCisjIFVuc2V0IG1vcmUgdmFyaWFibGVzIGtub3duIHRvIGludGVyZmVyZSB3aXRoIGJlaGF2aW9yIG9mIGNvbW1vbiB0b29scy4KK0NMSUNPTE9SX0ZPUkNFPSBHUkVQX09QVElPTlM9Cit1bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIFNoZWxsIEZ1bmN0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisKKyMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gIyBhc19mbl9zZXRfc3RhdHVzCisKKyMgYXNfZm5fZXhpdCBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9ICMgYXNfZm5fZXhpdAorCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKKworIyBhc19mbl9leGVjdXRhYmxlX3AgRklMRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0IGlmIEZJTEUgaXMgYW4gZXhlY3V0YWJsZSByZWd1bGFyIGZpbGUuCithc19mbl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXggIiQxIgorfSAjIGFzX2ZuX2V4ZWN1dGFibGVfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCiBpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgogICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KICAgYXNfZXhwcj1leHByCkBAIC0xMjcsMTMgKzQyOSwxNyBAQAogICBhc19iYXNlbmFtZT1mYWxzZQogZmkKIAoraWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQogCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCiBhc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKICRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCiAJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCiAJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAorJGFzX2VjaG8gWC8iJDAiIHwKICAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKIAkgICAgcy8vXDEvCiAJICAgIHEKQEAgLTE0OCwyOTQgKzQ1NCwxOSBAQAogCSAgfQogCSAgcy8uKi8uLzsgcSdgCiAKLSMgQ0RQQVRILgotJGFzX3Vuc2V0IENEUEFUSAorIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCiAKIAotaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgotICBpZiAoZXZhbCAiOiIpIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi1lbHNlCi0gIGFzX2hhdmVfcmVxdWlyZWQ9bm8KLWZpCi0KLSAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IHllcyAmJiAJIChldmFsICI6Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9XCRMSU5FTk8KLSAgYXNfbGluZW5vXzI9XCRMSU5FTk8KLSAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCi0gIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzJcIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0iKSAyPiAvZGV2L251bGw7IHRoZW4KLSAgOgotZWxzZQotICBhc19jYW5kaWRhdGVfc2hlbGxzPQotICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgY2FzZSAkYXNfZGlyIGluCi0JIC8qKQotCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KLQkgICAgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9IiRhc19jYW5kaWRhdGVfc2hlbGxzICRhc19kaXIvJGFzX2Jhc2UiCi0JICAgZG9uZTs7Ci0gICAgICAgZXNhYwotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0KLSAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCi0JICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KLQkgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0JCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLV9BU0VPRgotfTsgdGhlbgotICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsCi0JICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0JICAgICAgIGlmIHsgIiRhc19zaGVsbCIgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGVtdWxhdGUgc2gKLSAgTlVMTENNRD06Ci0gICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0gIHNldG9wdCBOT19HTE9CX1NVQlNUCi1lbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLWVzYWMKLQotZmkKLQotCi06Ci0oYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCAkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9ICIkMSIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotCi0oCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLV9BU0VPRgotfTsgdGhlbgotICBicmVhawotZmkKLQotZmkKLQotICAgICAgZG9uZQotCi0gICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgotICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgotICAgICAgICBkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICAgICAgICBkb25lCi0gICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQotZmkKLQotCi0gICAgaWYgdGVzdCAkYXNfaGF2ZV9yZXF1aXJlZCA9IG5vOyB0aGVuCi0gIGVjaG8gVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCB0aGUKLSAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKLSAgICAgIGVjaG8gbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4gdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEKLSAgICAgIGVjaG8gc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLgotICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0KLWZpCi0KLWZpCi0KLQotCi0oZXZhbCAiYXNfZnVuY19yZXR1cm4gKCkgewotICAoZXhpdCBcJDEpCi19Ci1hc19mdW5jX3N1Y2Nlc3MgKCkgewotICBhc19mdW5jX3JldHVybiAwCi19Ci1hc19mdW5jX2ZhaWx1cmUgKCkgewotICBhc19mdW5jX3JldHVybiAxCi19Ci1hc19mdW5jX3JldF9zdWNjZXNzICgpIHsKLSAgcmV0dXJuIDAKLX0KLWFzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgewotICByZXR1cm4gMQotfQotCi1leGl0Y29kZT0wCi1pZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KLWZpCi0KLWlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KLSAgOgotZWxzZQotICBleGl0Y29kZT0xCi0gIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgotZmkKLQotdGVzdCBcJGV4aXRjb2RlID0gMCIpIHx8IHsKLSAgZWNobyBObyBzaGVsbCBmb3VuZCB0aGF0IHN1cHBvcnRzIHNoZWxsIGZ1bmN0aW9ucy4KLSAgZWNobyBQbGVhc2UgdGVsbCBhdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAotICBlY2hvIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCi0gIGVjaG8gbWVzc2FnZQotfQotCi0KLQotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgewotCi0gICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KLSAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQotICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKLSAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcwotICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0gICMgY2FzZSBhdCBsaW5lIGVuZC4KLSAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCi0gICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KKyAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKKyAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCiAgIHNlZCAtbiAnCiAgICAgcAogICAgIC9bJF1MSU5FTk8vPQpAQCAtNDUyLDkgKzQ4MywxMiBAQAogICAgICAgcy8tXG4uKi8vCiAgICAgJyA+JGFzX21lLmxpbmVubyAmJgogICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7IGFzX2ZuX2V4aXQgMTsgfQogCisgICMgSWYgd2UgaGFkIHRvIHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMLCB3ZSdyZSBlbnN1cmVkIHRvIGhhdmUKKyAgIyBhbHJlYWR5IGRvbmUgdGhhdCwgc28gZW5zdXJlIHdlIGRvbid0IHRyeSB0byBkbyBzbyBhZ2FpbiBhbmQgZmFsbAorICAjIGluIGFuIGluZmluaXRlIGxvb3AuICBUaGlzIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGluIHByYWN0aWNlLgorICBfYXNfY2FuX3JlZXhlYz1ubzsgZXhwb3J0IF9hc19jYW5fcmVleGVjCiAgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCiAgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQogICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgpAQCAtNDYzLDg0ICs0OTcsNTUgQEAKICAgZXhpdAogfQogCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQogRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCiAtbiopCi0gIGNhc2UgYGVjaG8gJ3hcYydgIGluCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgogICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSAgKikgICBFQ0hPX0M9J1xjJzs7CisgIHh5KSAgRUNIT19DPSdcYyc7OworICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCisgICAgICAgRUNIT19UPScJJzs7CiAgIGVzYWM7OwogKikKICAgRUNIT19OPSctbic7OwogZXNhYwogCi1pZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KLSAgYXNfZXhwcj1leHByCi1lbHNlCi0gIGFzX2V4cHI9ZmFsc2UKLWZpCi0KIHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCiBpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KICAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQogZWxzZQogICBybSAtZiBjb25mJCQuZGlyCi0gIG1rZGlyIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAogZmkKLWVjaG8gPmNvbmYkJC5maWxlCi1pZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfbG5fcz0nbG4gLXMnCi0gICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Ci0gICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCi0gICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgotICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8Ci0gICAgYXNfbG5fcz0nY3AgLXAnCi1lbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPWxuCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcFInCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXBSJworICBmaQogZWxzZQotICBhc19sbl9zPSdjcCAtcCcKKyAgYXNfbG5fcz0nY3AgLXBSJwogZmkKIHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKIHJtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKIAogaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19ta2Rpcl9wPToKKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJwogZWxzZQogICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAogICBhc19ta2Rpcl9wPWZhbHNlCiBmaQogCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Cithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCiAKICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KIGFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCkBAIC01NDksMTEgKzU1NCwxMSBAQAogYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKIAogCi0KLWV4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKK3Rlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKK2V4ZWMgNj4mMQogCiAjIE5hbWUgb2YgdGhlIGhvc3QuCi0jIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgb2xkIEdOVS9MaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAogIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCiBhY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKIApAQCAtNTY4LDcgKzU3Myw2IEBACiBzdWJkaXJzPQogTUZMQUdTPQogTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KIAogIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCiBQQUNLQUdFX05BTUU9CkBAIC01NzYsNiArNTgwLDcgQEAKIFBBQ0tBR0VfVkVSU0lPTj0KIFBBQ0tBR0VfU1RSSU5HPQogUEFDS0FHRV9CVUdSRVBPUlQ9CitQQUNLQUdFX1VSTD0KIAogYWNfdW5pcXVlX2ZpbGU9InBjYXAuYyIKICMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KQEAgLTYxNCw4NSArNjE5LDEzNiBAQAogIyBpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZiIKIAotYWNfc3Vic3RfdmFycz0nU0hFTEwKLVBBVEhfU0VQQVJBVE9SCi1QQUNLQUdFX05BTUUKLVBBQ0tBR0VfVEFSTkFNRQotUEFDS0FHRV9WRVJTSU9OCi1QQUNLQUdFX1NUUklORwotUEFDS0FHRV9CVUdSRVBPUlQKLWV4ZWNfcHJlZml4Ci1wcmVmaXgKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUKLWJpbmRpcgotc2JpbmRpcgotbGliZXhlY2RpcgotZGF0YXJvb3RkaXIKLWRhdGFkaXIKLXN5c2NvbmZkaXIKLXNoYXJlZHN0YXRlZGlyCi1sb2NhbHN0YXRlZGlyCi1pbmNsdWRlZGlyCi1vbGRpbmNsdWRlZGlyCi1kb2NkaXIKLWluZm9kaXIKLWh0bWxkaXIKLWR2aWRpcgotcGRmZGlyCi1wc2RpcgotbGliZGlyCi1sb2NhbGVkaXIKLW1hbmRpcgotREVGUwotRUNIT19DCi1FQ0hPX04KLUVDSE9fVAotTElCUwotYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotYnVpbGQKLWJ1aWxkX2NwdQotYnVpbGRfdmVuZG9yCi1idWlsZF9vcwotaG9zdAotaG9zdF9jcHUKLWhvc3RfdmVuZG9yCi1ob3N0X29zCi10YXJnZXQKLXRhcmdldF9jcHUKLXRhcmdldF92ZW5kb3IKLXRhcmdldF9vcwotU0hMSUNDMgotQ0MKLUNGTEFHUwotTERGTEFHUwotQ1BQRkxBR1MKLWFjX2N0X0NDCi1FWEVFWFQKLU9CSkVYVAotQ1BQCi1HUkVQCi1FR1JFUAotTElCT0JKUwotVl9MRVgKLVZfWUFDQwotUkFOTElCCi1WX0NDT1BUCi1WX0RFRlMKLVZfSU5DTFMKLVZfTElCUwotVl9QQ0FQCi1WX0ZJTkRBTExERVZTCi1WX1JBTkxJQgotU1NSQwotRFlFWFQKLURBR0xJQlMKLUlOU1RBTExfUFJPR1JBTQotSU5TVEFMTF9TQ1JJUFQKK2FjX3N1YnN0X3ZhcnM9J0xUTElCT0JKUwogSU5TVEFMTF9EQVRBCi1MVExJQk9CSlMnCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCitEQlVTX1NSQworUENBUF9TVVBQT1JUX0RCVVMKK1BLR0NPTkZJRworQ0FOX1NSQworUENBUF9TVVBQT1JUX0NBTgorQ0FOVVNCX1NSQworUENBUF9TVVBQT1JUX0NBTlVTQgorQlRfU1JDCitQQ0FQX1NVUFBPUlRfQlQKK05FVEZJTFRFUl9TUkMKK1BDQVBfU1VQUE9SVF9ORVRGSUxURVIKK1VTQl9TUkMKK1BDQVBfU1VQUE9SVF9VU0IKK01BTl9NSVNDX0lORk8KK01BTl9GSUxFX0ZPUk1BVFMKK0RZRVhUCitTU1JDCitBRERMQVJDSElWRU9CSlMKK0FERExPQkpTCitWX1JQQVRIX09QVAorVl9TT05BTUVfT1BUCitWX1NITElCX09QVAorVl9TSExJQl9DTUQKK1ZfUENBUAorVl9JTkNMUworVl9GSU5EQUxMREVWUworVl9ERUZTCitWX0NDT1BUCitNS0RFUAorREVQRU5ERU5DWV9DRkxBRworTE5fUworQVIKK1JBTkxJQgorVl9ZQUNDCitWX0xFWAorSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEEKK0xJQk9CSlMKK0VHUkVQCitHUkVQCitDUFAKK09CSkVYVAorRVhFRVhUCithY19jdF9DQworQ1BQRkxBR1MKK0xERkxBR1MKK0NGTEFHUworQ0MKK1NITElDQzIKK3RhcmdldF9vcwordGFyZ2V0X3ZlbmRvcgordGFyZ2V0X2NwdQordGFyZ2V0Citob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK3RhcmdldF9hbGlhcworaG9zdF9hbGlhcworYnVpbGRfYWxpYXMKK0xJQlMKK0VDSE9fVAorRUNIT19OCitFQ0hPX0MKK0RFRlMKK21hbmRpcgorbG9jYWxlZGlyCitsaWJkaXIKK3BzZGlyCitwZGZkaXIKK2R2aWRpcgoraHRtbGRpcgoraW5mb2RpcgorZG9jZGlyCitvbGRpbmNsdWRlZGlyCitpbmNsdWRlZGlyCitsb2NhbHN0YXRlZGlyCitzaGFyZWRzdGF0ZWRpcgorc3lzY29uZmRpcgorZGF0YWRpcgorZGF0YXJvb3RkaXIKK2xpYmV4ZWNkaXIKK3NiaW5kaXIKK2JpbmRpcgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorcHJlZml4CitleGVjX3ByZWZpeAorUEFDS0FHRV9VUkwKK1BBQ0tBR0VfQlVHUkVQT1JUCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1RBUk5BTUUKK1BBQ0tBR0VfTkFNRQorUEFUSF9TRVBBUkFUT1IKK1NIRUxMJwogYWNfc3Vic3RfZmlsZXM9JycKK2FjX3VzZXJfb3B0cz0nCitlbmFibGVfb3B0aW9uX2NoZWNraW5nCit3aXRoX2djYworZW5hYmxlX2xhcmdlZmlsZQorZW5hYmxlX3Byb3RvY2hhaW4KK3dpdGhfc2l0YQord2l0aF9wY2FwCit3aXRoX2xpYm5sCitlbmFibGVfaXB2NgorZW5hYmxlX29wdGltaXplcl9kYmcKK2VuYWJsZV95eWRlYnVnCit3aXRoX2RhZword2l0aF9kYWdfaW5jbHVkZXMKK3dpdGhfZGFnX2xpYnJhcmllcword2l0aF9zZXB0ZWwKK3dpdGhfc25mCit3aXRoX3NuZl9pbmNsdWRlcword2l0aF9zbmZfbGlicmFyaWVzCit3aXRoX2ZsZXgKK3dpdGhfYmlzb24KK2VuYWJsZV91bml2ZXJzYWwKK2VuYWJsZV9zaGFyZWQKK2VuYWJsZV9ibHVldG9vdGgKK2VuYWJsZV9jYW51c2IKK2VuYWJsZV9jYW4KK2VuYWJsZV9kYnVzCisnCiAgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcwogaG9zdF9hbGlhcwogdGFyZ2V0X2FsaWFzCkBAIC03MDcsNiArNzYzLDggQEAKICMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KIGFjX2luaXRfaGVscD0KIGFjX2luaXRfdmVyc2lvbj1mYWxzZQorYWNfdW5yZWNvZ25pemVkX29wdHM9CithY191bnJlY29nbml6ZWRfc2VwPQogIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKICMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KIGNhY2hlX2ZpbGU9L2Rldi9udWxsCkBAIC03NjIsOCArODIwLDkgQEAKICAgZmkKIAogICBjYXNlICRhY19vcHRpb24gaW4KLSAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OwotICAqKQlhY19vcHRhcmc9eWVzIDs7CisgICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisgICo9KSAgIGFjX29wdGFyZz0gOzsKKyAgKikgICAgYWNfb3B0YXJnPXllcyA7OwogICBlc2FjCiAKICAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KQEAgLTgwNSwxMyArODY0LDIwIEBACiAgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OwogCiAgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCiAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPW5vIDs7CisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZGlzYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1ubyA7OwogCiAgIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCiAgICAgYWNfcHJldj1kb2NkaXIgOzsKQEAgLTgyNCwxMyArODkwLDIwIEBACiAgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKIAogICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCiAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPVwkYWNfb3B0YXJnIDs7CisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJlbmFibGVfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZW5hYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CiAKICAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAogICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCkBAIC0xMDIxLDIyICsxMDk0LDM2IEBACiAgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKIAogICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9XCRhY19vcHRhcmcgOzsKKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKIAogICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9bm8gOzsKKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKIAogICAtLXgpCiAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgpAQCAtMTA1NiwyNiArMTE0MywyNiBAQAogICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKICAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CiAKLSAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKICAgICA7OwogCiAgICo9KikKICAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCiAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCiAgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCiAgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKIAogICAqKQogICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgogICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCi0gICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgorICAgIDogIiR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259IgogICAgIDs7CiAKICAgZXNhYwpAQCAtMTA4MywyMyArMTE3MCwzNiBAQAogCiBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KICAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKIGZpCiAKLSMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorICAgIG5vKSA7OworICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgogZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCiAJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAogCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCiAJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCiBkbwogICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgKi8gKQorICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworICBlc2FjCisgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KICAgY2FzZSAkYWNfdmFsIGluCiAgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKICAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CiAgIGVzYWMKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBhc19mbl9lcnJvciAkPyAiZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIKIGRvbmUKIAogIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwpAQCAtMTExMyw4ICsxMjEzLDYgQEAKIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgogICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KICAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCi0gICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKICAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgogICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKICAgZmkKQEAgLTExMjksMjMgKzEyMjcsMjEgQEAKIGFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgogYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgogYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogV29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKIHRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgYXNfZm5fZXJyb3IgJD8gInB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIKIAogCiAjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCiBpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgogICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwogICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiQwIiB8CisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX215c2VsZiIgfAogICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CiAJICAgIHMvL1wxLwogCSAgICBxCkBAIC0xMTcyLDEzICsxMjY4LDExIEBACiBmaQogaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KICAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIgogZmkKIGFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKIGFjX2Fic19jb25mZGlyPWAoCi0JY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCB7IGVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19tc2ciID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCBhc19mbl9lcnJvciAkPyAiJGFjX21zZyIKIAlwd2QpYAogIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KIGlmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KQEAgLTEyMTgsNyArMTMxMiw3IEBACiAgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKICAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCiAgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcgLi4uJyBtZXNzYWdlcwogICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCiAgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCiAgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCkBAIC0xMjI2LDkgKzEzMjAsOSBAQAogCiBJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CiAgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQogICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotCQkJICBbUFJFRklYXQorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYXQogCiBCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KIFxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CkBAIC0xMjM4LDI1ICsxMzMyLDI1IEBACiBGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KIAogRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKLSAgLS1iaW5kaXI9RElSICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KLSAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCi0gIC0tbG9jYWxlZGlyPURJUiAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KLSAgLS1kb2NkaXI9RElSICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9QQUNLQUdFXQotICAtLWh0bWxkaXI9RElSICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLWR2aWRpcj1ESVIgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcGRmZGlyPURJUiAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1wc2Rpcj1ESVIgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQorICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKyAgLS1kb2NkaXI9RElSICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvUEFDS0FHRV0KKyAgLS1odG1sZGlyPURJUiAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcGRmZGlyPURJUiAgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcHNkaXI9RElSICAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KIF9BQ0VPRgogCiAgIGNhdCA8PFxfQUNFT0YKQEAgLTEyNzMsMjIgKzEzNjcsNDcgQEAKICAgY2F0IDw8XF9BQ0VPRgogCiBPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwogICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCiAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1kaXNhYmxlLWxhcmdlZmlsZSAgICAgb21pdCBzdXBwb3J0IGZvciBsYXJnZSBmaWxlcwogICAtLWRpc2FibGUtcHJvdG9jaGFpbiAgICBkaXNhYmxlIFwicHJvdG9jaGFpblwiIGluc24KLSAgLS1lbmFibGUtaXB2NiAgICAgICAgICAgYnVpbGQgSVB2Ni1jYXBhYmxlIHZlcnNpb24KKyAgLS1lbmFibGUtaXB2NiAgICAgICAgICAgYnVpbGQgSVB2Ni1jYXBhYmxlIHZlcnNpb24gW2RlZmF1bHQ9eWVzLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhZGRyaW5mbyBhdmFpbGFibGVdCiAgIC0tZW5hYmxlLW9wdGltaXplci1kYmcgIGJ1aWxkIG9wdGltaXplciBkZWJ1Z2dpbmcgY29kZQogICAtLWVuYWJsZS15eWRlYnVnICAgICAgICBidWlsZCBwYXJzZXIgZGVidWdnaW5nIGNvZGUKKyAgLS1kaXNhYmxlLXVuaXZlcnNhbCAgICAgZG9uJ3QgYnVpbGQgdW5pdmVyc2FsIG9uIE9TIFgKKyAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlXQorICAtLWVuYWJsZS1ibHVldG9vdGggICAgICBlbmFibGUgQmx1ZXRvb3RoIHN1cHBvcnQgW2RlZmF1bHQ9eWVzLCBpZiBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV0KKyAgLS1lbmFibGUtY2FudXNiICAgICAgICAgZW5hYmxlIGNhbnVzYiBzdXBwb3J0IFtkZWZhdWx0PXllcywgaWYgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVdCisgIC0tZW5hYmxlLWNhbiAgICAgICAgICAgIGVuYWJsZSBDQU4gc3VwcG9ydCBbZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlXQorICAtLWVuYWJsZS1kYnVzICAgICAgICAgICBlbmFibGUgRC1CdXMgY2FwdHVyZSBzdXBwb3J0IFtkZWZhdWx0PXllcywgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBhdmFpbGFibGVdCiAKIE9wdGlvbmFsIFBhY2thZ2VzOgogICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQogICAtLXdpdGhvdXQtZ2NjICAgICAgICAgICBkb24ndCB1c2UgZ2NjCisgIC0td2l0aC1zaXRhICAgICAgICAgICAgIGluY2x1ZGUgU0lUQSBzdXBwb3J0CiAgIC0td2l0aC1wY2FwPVRZUEUgICAgICAgIHVzZSBwYWNrZXQgY2FwdHVyZSBUWVBFCi0gIC0td2l0aC1kYWdbPURJUl0gICAgICAgIGluY2x1ZGUgRW5kYWNlIERBRyBzdXBwb3J0ICgieWVzIiwgIm5vIiBvciBESVI7IGRlZmF1bHQ9InllcyIgb24gQlNEIGFuZCBMaW51eCBpZiBwcmVzZW50KQotICAtLXdpdGgtZGFnLWluY2x1ZGVzPURJUiAgIEVuZGFjZSBEQUcgaW5jbHVkZSBkaXJlY3RvcnkKLSAgLS13aXRoLWRhZy1saWJyYXJpZXM9RElSICBFbmRhY2UgREFHIGxpYnJhcnkgZGlyZWN0b3J5Ci0gIC0td2l0aC1zZXB0ZWxbPURJUl0gICAgIGluY2x1ZGUgU2VwdGVsIHN1cHBvcnQgKGxvY2F0ZWQgaW4gZGlyZWN0b3J5IERJUiwgaWYgc3VwcGxpZWQpLiAgZGVmYXVsdD15ZXMsIG9uIExpbnV4LCBpZiBwcmVzZW50CisgIC0td2l0aG91dC1saWJubCAgICAgICAgIGRpc2FibGUgbGlibmwgc3VwcG9ydCBbZGVmYXVsdD15ZXMsIG9uIExpbnV4LCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50XQorICAtLXdpdGgtZGFnWz1ESVJdICAgICAgICBpbmNsdWRlIEVuZGFjZSBEQUcgc3VwcG9ydCBbInllcyIsICJubyIgb3IgRElSOworICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudF0KKyAgLS13aXRoLWRhZy1pbmNsdWRlcz1ESVIgRW5kYWNlIERBRyBpbmNsdWRlIGRpcmVjdG9yeQorICAtLXdpdGgtZGFnLWxpYnJhcmllcz1ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kYWNlIERBRyBsaWJyYXJ5IGRpcmVjdG9yeQorICAtLXdpdGgtc2VwdGVsWz1ESVJdICAgICBpbmNsdWRlIFNlcHRlbCBzdXBwb3J0IChsb2NhdGVkIGluIGRpcmVjdG9yeSBESVIsIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkKS4gW2RlZmF1bHQ9eWVzLCBvbiBMaW51eCwgaWYgcHJlc2VudF0KKyAgLS13aXRoLXNuZls9RElSXSAgICAgICAgaW5jbHVkZSBNeXJpY29tIFNORiBzdXBwb3J0IFsieWVzIiwgIm5vIiBvciBESVI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InllcyIgb24gQlNEIGFuZCBMaW51eCBpZiBwcmVzZW50XQorICAtLXdpdGgtc25mLWluY2x1ZGVzPURJUiBNeXJpY29tIFNORiBpbmNsdWRlIGRpcmVjdG9yeQorICAtLXdpdGgtc25mLWxpYnJhcmllcz1ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTXlyaWNvbSBTTkYgbGlicmFyeSBkaXJlY3RvcnkKICAgLS13aXRob3V0LWZsZXggICAgICAgICAgZG9uJ3QgdXNlIGZsZXgKICAgLS13aXRob3V0LWJpc29uICAgICAgICAgZG9uJ3QgdXNlIGJpc29uCiAKQEAgLTEyOTgsMTMgKzE0MTcsMTQgQEAKICAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCiAgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KICAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKICAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CiAgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCiAKIFVzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCiBpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCiAKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLgogX0FDRU9GCiBhY19zdGF0dXM9JD8KIGZpCkBAIC0xMzEyLDE1ICsxNDMyLDE3IEBACiBpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCiAgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCiAgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCi0gICAgdGVzdCAtZCAiJGFjX2RpciIgfHwgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQogICAgIGFjX2J1aWxkZGlyPS4KIAogY2FzZSAiJGFjX2RpciIgaW4KIC4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwogKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAogICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAogICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCiAgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKICAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CkBAIC0xMzU2LDcgKzE0NzgsNyBAQAogICAgICAgZWNobyAmJgogICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQogICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfZGlyIiA+JjIKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCiAgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CiAgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQogICBkb25lCkBAIC0xMzY2LDIxICsxNDg4LDQ3MiBAQAogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCiBjb25maWd1cmUKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MQorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5CiAKLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgogX0FDRU9GCiAgIGV4aXQKIGZpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQXV0b2NvbmYgaW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jb21waWxlCisKKyMgYWNfZm5fY190cnlfY3BwIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgIGFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jcHAKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgdXNhYmlsaXR5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgJDIgcHJlc2VuY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKKyAgeWVzOm5vOiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbAorCisjIGFjX2ZuX2NfdHJ5X3J1biBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuIEFzc3VtZXMKKyMgdGhhdCBleGVjdXRhYmxlcyAqY2FuKiBiZSBydW4uCithY19mbl9jX3RyeV9ydW4gKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorICAgICAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgICAgYWNfcmV0dmFsPSRhY19zdGF0dXMKK2ZpCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfcnVuCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluCisjIElOQ0xVREVTLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKKyNpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKKworIyBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKKyMgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja190eXBlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCQyKSkKKwkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoKCQyKSkpCisJICAgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgZXZhbCAiJDM9eWVzIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfdHlwZQorCisjIGFjX2ZuX2NfdHJ5X2xpbmsgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisJIHRlc3QgLXggY29uZnRlc3QkYWNfZXhlZXh0CisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KKyAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAorICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcworICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfbGluaworCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICQyIGlubm9jdW91c18kMgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkMgorCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICQyICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgorY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKKyMgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CisjaWZuZGVmICRhc19kZWNsX25hbWUKKyNpZmRlZiBfX2NwbHVzcGx1cworICAodm9pZCkgJGFzX2RlY2xfdXNlOworI2Vsc2UKKyAgKHZvaWQpICRhc19kZWNsX25hbWU7CisjZW5kaWYKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2RlY2wKIGNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgogVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKIEl0IHdhcyBjcmVhdGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKIApAQCAtMTQxNiw4ICsxOTg5LDggQEAKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKKyAgICAkYXNfZWNobyAiUEFUSDogJGFzX2RpciIKKyAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCiB9ID4mNQpAQCAtMTQ1MSwxMiArMjAyNCwxMiBAQAogICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQogICAgICAgY29udGludWUgOzsKICAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKICAgICBlc2FjCiAgICAgY2FzZSAkYWNfcGFzcyBpbgotICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7CisgICAgMSkgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzMCAiICckYWNfYXJnJyIgOzsKICAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCiAgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KIAlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCiAgICAgICBlbHNlCkBAIC0xNDcyLDEzICsyMDQ1LDEzIEBACiAJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKIAllc2FjCiAgICAgICBmaQotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciCiAgICAgICA7OwogICAgIGVzYWMKICAgZG9uZQogZG9uZQotJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9Ci0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KIAogIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQogIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKQEAgLTE0OTAsMTEgKzIwNjMsOSBAQAogICB7CiAgICAgZWNobwogCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBDYWNoZSB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMiCiAgICAgZWNobwogICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCiAoCkBAIC0xNTAzLDEyICsyMDc0LDEzIEBACiAgICAgY2FzZSAkYWNfdmFsIGluICMoCiAgICAgKiR7YXNfbmx9KikKICAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mMjt9IDs7CisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CiAgICAgICBlc2FjCiAgICAgICBjYXNlICRhY192YXIgaW4gIygKICAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKLSAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7CisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKICAgICAgIGVzYWMgOzsKICAgICBlc2FjCiAgIGRvbmUKQEAgLTE1MjcsMTI4ICsyMDk5LDEzNiBAQAogKQogICAgIGVjaG8KIAotICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLV9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCiAgICAgZWNobwogICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKICAgICBkbwogICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworICAgICAgKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwogICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCiAgICAgZG9uZSB8IHNvcnQKICAgICBlY2hvCiAKICAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgogICAgICAgZWNobwogICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKICAgICAgIGRvCiAJZXZhbCBhY192YWw9XCQkYWNfdmFyCiAJY2FzZSAkYWNfdmFsIGluCi0JKlwnXCcnKikgYWNfdmFsPWBlY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwogCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCiAgICAgICBkb25lIHwgc29ydAogICAgICAgZWNobwogICAgIGZpCiAKICAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KLSAgICAgIGNhdCA8PFxfQVNCT1gKLSMjIC0tLS0tLS0tLS0tICMjCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKICMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIyIKICAgICAgIGVjaG8KICAgICAgIGNhdCBjb25mZGVmcy5oCiAgICAgICBlY2hvCiAgICAgZmkKICAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCi0gICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSAgICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorICAgICAgJGFzX2VjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorICAgICRhc19lY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgogICB9ID4mNQogICBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogJiYKICAgICBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCiAgICAgZXhpdCAkZXhpdF9zdGF0dXMKICcgMAogZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCi0gIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAorICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKIGRvbmUKIGFjX3NpZ25hbD0wCiAKICMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCiBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAogCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKICMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKIF9BQ0VPRgogCi0KIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgogX0FDRU9GCiAKLQogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCiBfQUNFT0YKIAotCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCiBfQUNFT0YKIAotCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCiBfQUNFT0YKIAorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1VSTCAiJFBBQ0tBR0VfVVJMIgorX0FDRU9GCisKIAogIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCiBpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIHNldCB4ICIkQ09ORklHX1NJVEUiCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYwogZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKIGVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBhY19zaXRlX2ZpbGUxPSRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUKIGZpCi1zaGlmdAotZm9yIGFjX3NpdGVfZmlsZQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKIGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQorICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CiAgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1Ci0gICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICBmaQogZG9uZQogCiBpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbCBmaWxlcworICAjIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4gIERKR1BQIGVtdWxhdGVzIGl0IGFzIGEgcmVndWxhciBmaWxlLgorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQogICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KICAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKICAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKICAgICBlc2FjCiAgIGZpCiBlbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CiAgID4kY2FjaGVfZmlsZQogZmkKIApAQCAtMTY2Miw2MCArMjI0Miw1NiBAQAogICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCiAgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KICAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQogICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKICAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KICAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CiAgICAgLCk7OwogICAgICopCiAgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjUKLWVjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiYyO30KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjUKLWVjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiYyO30KLQlhY19jYWNoZV9jb3JydXB0ZWQ9OgorCSMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBkbyBub3QgbGVhZCB0byBmYWlsdXJlLgorCWFjX29sZF92YWxfdz1gZWNobyB4ICRhY19vbGRfdmFsYAorCWFjX25ld192YWxfdz1gZWNobyB4ICRhY19uZXdfdmFsYAorCWlmIHRlc3QgIiRhY19vbGRfdmFsX3ciICE9ICIkYWNfbmV3X3ZhbF93IjsgdGhlbgorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwkgIGFjX2NhY2hlX2NvcnJ1cHRlZD06CisJZWxzZQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwkgIGV2YWwgJGFjX3Zhcj1cJGFjX29sZF92YWwKKwlmaQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjI7fQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjI7fQogICAgICAgZmk7OwogICBlc2FjCiAgICMgUGFzcyBwcmVjaW91cyB2YXJpYWJsZXMgdG8gY29uZmlnLnN0YXR1cy4KICAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCiAgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgotICAgICpcJyopIGFjX2FyZz0kYWNfdmFyPWBlY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwogICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CiAgICAgZXNhYwogICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgogICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCi0gICAgICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgICAgICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIgOzsKICAgICBlc2FjCiAgIGZpCiBkb25lCiBpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CiBmaQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAKIGFjX2V4dD1jCiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJwpAQCAtMTc0Miw5ICsyMzE4LDcgQEAKICAgZmkKIGRvbmUKIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBpbnN0YWxsLXNoLCBpbnN0YWxsLnNoLCBvciBzaHRvb2wgaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiICIkTElORU5PIiA1CiBmaQogCiAjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKQEAgLTE3NTgsMzUgKzIzMzIsMjcgQEAKIAogIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgogJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CiAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCiB0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKICAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKIHRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CiBhY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKIAogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQogY2FzZSAkYWNfY3ZfYnVpbGQgaW4KICotKi0qKSA7OwotKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNTs7CiBlc2FjCiBidWlsZD0kYWNfY3ZfYnVpbGQKIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKQEAgLTE4MDIsMjggKzIzNjgsMjQgQEAKIGNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCiAKIAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hvc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgogICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAogZWxzZQogICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAotICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQogZmkKIAogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hvc3QiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CiBjYXNlICRhY19jdl9ob3N0IGluCiAqLSotKikgOzsKLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OwogZXNhYwogaG9zdD0kYWNfY3ZfaG9zdAogYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwpAQCAtMTgzOSwyOCArMjQwMSwyNCBAQAogY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKIAogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3RhcmdldCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3RhcmdldCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIngkdGFyZ2V0X2FsaWFzIiA9IHg7IHRoZW4KICAgYWNfY3ZfdGFyZ2V0PSRhY19jdl9ob3N0CiBlbHNlCiAgIGFjX2N2X3RhcmdldD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkdGFyZ2V0X2FsaWFzYCB8fAotICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICR0YXJnZXRfYWxpYXMgZmFpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICR0YXJnZXRfYWxpYXMgZmFpbGVkIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICR0YXJnZXRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQogZmkKIAogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3RhcmdldCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdGFyZ2V0IiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdGFyZ2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdGFyZ2V0IiA+JjY7IH0KIGNhc2UgJGFjX2N2X3RhcmdldCBpbgogKi0qLSopIDs7Ci0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgdGFyZ2V0IiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiICIkTElORU5PIiA1OzsKIGVzYWMKIHRhcmdldD0kYWNfY3ZfdGFyZ2V0CiBhY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCkBAIC0xODg4LDI5ICsyNDQ2LDMwIEBACiAKIAogCisKKwogIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nY2Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2djYytzZXR9IiA9IHNldDsgdGhlbgoraWYgdGVzdCAiJHt3aXRoX2djYytzZXR9IiA9IHNldDsgdGhlbiA6CiAgIHdpdGh2YWw9JHdpdGhfZ2NjOwogZmkKIAotICAgIFZfQ0NPUFQ9Ii1PIgotICAgIFZfSU5DTFM9IiIKKyAgICBWX0NDT1BUPSIiCiAgICAgaWYgdGVzdCAiJHtzcmNkaXJ9IiAhPSAiLiIgOyB0aGVuCi0JICAgIFZfSU5DTFM9Ii1JXCQoc3JjZGlyKSIKKwkgICAgVl9DQ09QVD0iLUlcJChzcmNkaXIpIgogICAgIGZpCiAgICAgaWYgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQ7IHRoZW4KIAkgICAgTEJMX0NGTEFHUz0iJENGTEFHUyIKICAgICBmaQogICAgIGlmIHRlc3QgLXogIiRDQyIgOyB0aGVuCi0JICAgIGNhc2UgIiR0YXJnZXRfb3MiIGluCisJICAgIGNhc2UgIiRob3N0X29zIiBpbgogCiAJICAgIGJzZGkqKQogCQkgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzaGxpY2MyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBzaGxpY2MyOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfU0hMSUNDMitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfU0hMSUNDMis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRTSExJQ0MyIjsgdGhlbgogICBhY19jdl9wcm9nX1NITElDQzI9IiRTSExJQ0MyIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KQEAgLTE5MjAsMTQgKzI0NzksMTQgQEAKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfU0hMSUNDMj0ieWVzIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCi1kb25lCisgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAogICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TSExJQ0MyIiAmJiBhY19jdl9wcm9nX1NITElDQzI9Im5vIgpAQCAtMTkzNSwxMSArMjQ5NCwxMSBAQAogZmkKIFNITElDQzI9JGFjX2N2X3Byb2dfU0hMSUNDMgogaWYgdGVzdCAtbiAiJFNITElDQzIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFNITElDQzIiID4mNQotZWNobyAiJHtFQ0hPX1R9JFNITElDQzIiID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNITElDQzIiID4mNQorJGFzX2VjaG8gIiRTSExJQ0MyIiA+JjY7IH0KIGVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCkBAIC0xOTU0LDcgKzI1MTMsOCBAQAogCSAgICBDQz1jYwogCSAgICBleHBvcnQgQ0MKICAgICBmaQotICAgIGFjX2V4dD1jCisKK2FjX2V4dD1jCiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJwogYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwogYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKQEAgLTE5NjIsMTAgKzI1MjIsMTAgQEAKIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCiAgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCkBAIC0xOTc1LDI1ICsyNTM1LDI1IEBACiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQotZG9uZQorICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogQ0M9JGFjX2N2X3Byb2dfQ0MKIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KIGVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCkBAIC0yMDAyLDEwICsyNTYyLDEwIEBACiAgIGFjX2N0X0NDPSRDQwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgogICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgpAQCAtMjAxNSwyNSArMjU3NSwyNSBAQAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCi1kb25lCisgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAogZmkKIGZpCiBhY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwogaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQogZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgpAQCAtMjA0MSwxMiArMjYwMSw4IEBACiAgIGVsc2UKICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCiB5ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CiBhY190b29sX3dhcm5lZD15ZXMgOzsKIGVzYWMKICAgICBDQz0kYWNfY3RfQ0MKQEAgLTIwNTksMTAgKzI2MTUsMTAgQEAKICAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgogICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgpAQCAtMjA3MiwyNSArMjYyOCwyNSBAQAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQotZG9uZQorICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogQ0M9JGFjX2N2X3Byb2dfQ0MKIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KIGVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCkBAIC0yMDk5LDEwICsyNjU1LDEwIEBACiBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgogICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgpAQCAtMjExMywxOCArMjY2OSwxOCBAQAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCiAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKICAgICAgICBjb250aW51ZQogICAgICBmaQogICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCi1kb25lCisgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAogaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgpAQCAtMjE0MywxMSArMjY5OSwxMSBAQAogZmkKIENDPSRhY19jdl9wcm9nX0NDCiBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CiBlbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIApAQCAtMjE1OCwxMCArMjcxNCwxMCBAQAogICBkbwogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgogICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgpAQCAtMjE3MSwyNSArMjcyNywyNSBAQAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKIGRvbmUKLWRvbmUKKyAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKIENDPSRhY19jdl9wcm9nX0NDCiBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CiBlbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIApAQCAtMjIwMiwxMCArMjc1OCwxMCBAQAogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCiAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCkBAIC0yMjE1LDI1ICsyNzcxLDI1IEBACiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQotZG9uZQorICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KIGVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCkBAIC0yMjQ1LDEyICsyODAxLDggQEAKICAgZWxzZQogICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KIHllczopCi17IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KIGFjX3Rvb2xfd2FybmVkPXllcyA7OwogZXNhYwogICAgIENDPSRhY19jdF9DQwpAQCAtMjI2MCw1MSArMjgxMiwzNyBAQAogZmkKIAogCi10ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cit0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAKICMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKLWFjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKLXsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCiBjYXNlICIoKCRhY190cnkiIGluCiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwogICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKIGVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCiAgIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCiAKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCiBpbnQKQEAgLTIzMTYsNDIgKzI4NTQsMzggQEAKIH0KIF9BQ0VPRgogYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQiCiAjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCiAjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCiAjIG9mIGV4ZWV4dC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLSMKLSMgTGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgZmlsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LgotIyBUaGUgYWxnb3JpdGhtIGlzIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKQotIyBvbmx5IGFzIGEgbGFzdCByZXNvcnQuICBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgotYWNfZmlsZXM9J2Ffb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQnCi0jCi0jIFRoZSBJUklYIDYgbGlua2VyIHdyaXRlcyBpbnRvIGV4aXN0aW5nIGZpbGVzIHdoaWNoIG1heSBub3QgYmUKLSMgZXhlY3V0YWJsZSwgcmV0YWluaW5nIHRoZWlyIHBlcm1pc3Npb25zLiAgUmVtb3ZlIHRoZW0gZmlyc3Qgc28gYQotIyBzdWJzZXF1ZW50IGV4ZWN1dGlvbiB0ZXN0IHdvcmtzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKIGFjX3JtZmlsZXM9CiBmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKIGRvCiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OwogICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OwogICBlc2FjCiBkb25lCiBybSAtZiAkYWNfcm1maWxlcwogCi1pZiB7IChhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgogY2FzZSAiKCgkYWNfdHJ5IiBpbgogICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CiBlc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQogICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKICAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgogICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KICMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCiAjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLApAQCAtMjM2MSwxNCArMjg5NSwxNCBAQAogZG8KICAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQogCTs7CiAgICAgW2FiXS5vdXQgKQogCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CiAJIyBjZXJ0YWlubHkgcmlnaHQuCiAJYnJlYWs7OwogICAgICouKiApCi0gICAgICAgIGlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOworCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOwogCXRoZW4gOjsgZWxzZQogCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAogCWZpCkBAIC0yMzg3LDc4ICsyOTIxLDQxIEBACiBlbHNlCiAgIGFjX2ZpbGU9JycKIGZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNjsgfQotaWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQoreyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQogZmkKLQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KIGFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CiAKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KLSMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKLSMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBmaQotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0KLXJtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKIGFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgotIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNjsgfQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNjsgfQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCiBjYXNlICIoKCRhY190cnkiIGluCiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwogICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKIGVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CiAgIChldmFsICIkYWNfbGluayIpIDI+JjUKICAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgogICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKICMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAogIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKQEAgLTI0NjYsMzcgKzI5NjMsOTAgQEAKIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwogICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKICAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CiAgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCiAJICBicmVhazs7CiAgICAgKiApIGJyZWFrOzsKICAgZXNhYwogZG9uZQogZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogZmkKLQotcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2V4ZWV4dCIgPiY2OyB9CitybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KIAogcm0gLWYgY29uZnRlc3QuJGFjX2V4dAogRVhFRVhUPSRhY19jdl9leGVleHQKIGFjX2V4ZWV4dD0kRVhFRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQogX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgY29uZnRlc3Qub3V0IgorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICAgZmkKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1CiskYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfb2JqZXh0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCiBpbnQKQEAgLTI1MDgsNTEgKzMwNTgsNDYgQEAKIH0KIF9BQ0VPRgogcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKIGNhc2UgIigoJGFjX3RyeSIgaW4KICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwogZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKICAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQogICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CiAgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCiAgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKICAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7CisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKICAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKICAgICAgICBicmVhazs7CiAgIGVzYWMKIGRvbmUKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogZmkKLQogcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9vYmpleHQiID4mNjsgfQogT0JKRVhUPSRhY19jdl9vYmpleHQKIGFjX29iamV4dD0kT0JKRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCiBpbnQKQEAgLTI1NjYsNTQgKzMxMTEsMzQgQEAKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY29tcGlsZXJfZ251PXllcwogZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY29tcGlsZXJfZ251PW5vCisgIGFjX2NvbXBpbGVyX2dudT1ubwogZmkKLQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBhY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CiAKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQotR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQoraWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKIGFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KIGFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwogICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKICAgIGFjX2N2X3Byb2dfY2NfZz1ubwogICAgQ0ZMQUdTPSItZyIKLSAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCiBpbnQKQEAgLTI2MjQsMzQgKzMxNDksMTEgQEAKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfcHJvZ19jY19nPXllcwogZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JQ0ZMQUdTPSIiCi0gICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIGludApAQCAtMjY2MiwzNSArMzE2NCwxMiBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CiAKLQlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKK2Vsc2UKKyAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCiAJIENGTEFHUz0iLWciCi0JIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIGludApAQCAtMjcwMSw0MiArMzE4MCwxOCBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgogICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQogZmkKLQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQogaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgogICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCiBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgpAQCAtMjc1MiwyMyArMzIwNywxOCBAQAogICAgIENGTEFHUz0KICAgZmkKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCiBhY19zYXZlX0NDPSRDQwotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgorc3RydWN0IHN0YXQ7CiAvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCiBzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CiBGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwpAQCAtMjgyMCwzMSArMzI3MCw5IEBACiAJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKIGRvCiAgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKICAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKIGRvbmUKQEAgLTI4NTUsMTcgKzMyODMsMTkgQEAKICMgQUNfQ0FDSEVfVkFMCiBjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgogICB4KQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNjsgfSA7OworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OwogICB4bm8pCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH11bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CiAgICopCiAgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwogZXNhYworaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKIAorZmkKIAogYWNfZXh0PWMKIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCkBAIC0yODczLDE4MiArMzMwMywxMTEgQEAKIGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CiAKKworCisKKwogICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotCSAgICBpZiB0ZXN0ICIkU0hMSUNDMiIgPSB5ZXMgOyB0aGVuCi0JCSAgICBhY19jdl9sYmxfZ2NjX3ZlcnM9MgotCQkgICAgVl9DQ09QVD0iLU8yIgotCSAgICBlbHNlCi0JCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBnY2MgdmVyc2lvbiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGdjYyB2ZXJzaW9uLi4uICRFQ0hPX0MiID4mNjsgfQotCQkgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfZ2NjX3ZlcnMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfbGJsX2djY192ZXJzPWAkQ0MgLXYgMj4mMSB8IFwKLQkJCSAgICBzZWQgLWUgJy9eZ2NjIHZlcnNpb24gLyFkJyBcCi0JCQkJLWUgJ3MvXmdjYyB2ZXJzaW9uIC8vJyBcCi0JCQkJLWUgJ3MvIC4qLy8nIC1lICdzL15bXjAtOV0qLy8nIFwKLQkJCQktZSAncy9cLi4qLy8nYAotZmkKLQotCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2djY192ZXJzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfZ2NjX3ZlcnMiID4mNjsgfQotCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgotCQkJICAgIFZfQ0NPUFQ9Ii1PMiIKLQkJICAgIGZpCi0JICAgIGZpCisJICAgICMKKwkgICAgIyAtV2Vycm9yIGZvcmNlcyB3YXJuaW5ncyB0byBiZSBlcnJvcnMuCisJICAgICMKKwkgICAgYWNfbGJsX2NjX2ZvcmNlX3dhcm5pbmdfZXJyb3JzPS1XZXJyb3IKICAgICBlbHNlCi0JICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRoYXQgJENDIGhhbmRsZXMgYW5zaSBwcm90b3R5cGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhhdCAkQ0MgaGFuZGxlcyBhbnNpIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotaW50IGZyb2IoaW50LCBjaGFyICopCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjY7IH0KLQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcyA9IG5vIDsgdGhlbgotCQkgICAgY2FzZSAiJHRhcmdldF9vcyIgaW4KLQotCQkgICAgaHB1eCopCi0JCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEhQLVVYIGFuc2kgY29tcGlsZXIgKCRDQyAtQWEgLURfSFBVWF9TT1VSQ0UpIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEhQLVVYIGFuc2kgY29tcGlsZXIgKCRDQyAtQWEgLURfSFBVWF9TT1VSQ0UpLi4uICRFQ0hPX0MiID4mNjsgfQotCQkJICAgIHNhdmVkY2ZsYWdzPSIkQ0ZMQUdTIgotCQkJICAgIENGTEFHUz0iLUFhIC1EX0hQVVhfU09VUkNFICRDRkxBR1MiCi0JCQkgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfY2NfaHB1eF9jY19hYStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotaW50IGZyb2IoaW50LCBjaGFyICopCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWE9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9sYmxfY2NfaHB1eF9jY19hYT1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0JCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9jY19ocHV4X2NjX2FhIiA+JjY7IH0KLQkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSA9IG5vIDsgdGhlbgotCQkJCSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JCQkgICAgZmkKLQkJCSAgICBDRkxBR1M9IiRzYXZlZGNmbGFncyIKLQkJCSAgICBWX0NDT1BUPSItQWEgJFZfQ0NPUFQiCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIF9IUFVYX1NPVVJDRSAxCi1fQUNFT0YKLQotCQkJICAgIDs7Ci0KLQkJICAgICopCi0JCQkgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCQkJICAgIDs7Ci0JCSAgICBlc2FjCi0JICAgIGZpCiAJICAgIFZfSU5DTFM9IiRWX0lOQ0xTIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgogCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgogCi0JICAgIGNhc2UgIiR0YXJnZXRfb3MiIGluCisJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJICAgIGRhcndpbiopCisJCSAgICAjCisJCSAgICAjIFRoaXMgaXMgYXNzdW1lZCBlaXRoZXIgdG8gYmUgR0NDIG9yIGNsYW5nLCBib3RoCisJCSAgICAjIG9mIHdoaWNoIHVzZSAtV2Vycm9yIHRvIGZvcmNlIHdhcm5pbmdzIHRvIGJlIGVycm9ycy4KKwkJICAgICMKKwkJICAgIGFjX2xibF9jY19mb3JjZV93YXJuaW5nX2Vycm9ycz0tV2Vycm9yCisJCSAgICA7OworCisJICAgIGhwdXgqKQorCQkgICAgIworCQkgICAgIyBIUCBDLCB3aGljaCBpcyB3aGF0IHdlIHByZXN1bWUgd2UncmUgdXNpbmcsIGRvZXNuJ3QKKwkJICAgICMgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMgaWYgd2UgaGFuZCBpdCBhbgorCQkgICAgIyBpbnZhbGlkIC1XIGZsYWcsIGNhbid0IGJlIGZvcmNlZCB0byBkbyBzbyBldmVuIHdpdGgKKwkJICAgICMgK1dlLCBhbmQgZG9lc24ndCBoYW5kbGUgR0NDLXN0eWxlIC1XIGZsYWdzLCBzbyB3ZQorCQkgICAgIyBkb24ndCB3YW50IHRvIHRyeSB1c2luZyBHQ0Mtc3R5bGUgLVcgZmxhZ3MuCisJCSAgICAjCisJCSAgICBhY19sYmxfY2NfZG9udF90cnlfZ2NjX2Rhc2hXPXllcworCQkgICAgOzsKIAogCSAgICBpcml4KikKKwkJICAgICMKKwkJICAgICMgTUlQUyBDLCB3aGljaCBpcyB3aGF0IHdlIHByZXN1bWUgd2UncmUgdXNpbmcsIGRvZXNuJ3QKKwkJICAgICMgbmVjZXNzYXJpbHkgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMgaWYgd2UKKwkJICAgICMgaGFuZCBpdCBhbiBpbnZhbGlkIC1XIGZsYWcsIGNhbid0IGJlIGZvcmNlZCB0byBkbworCQkgICAgIyBzbywgYW5kIGRvZXNuJ3QgaGFuZGxlIEdDQy1zdHlsZSAtVyBmbGFncywgc28gd2UKKwkJICAgICMgZG9uJ3Qgd2FudCB0byB0cnkgdXNpbmcgR0NDLXN0eWxlIC1XIGZsYWdzLgorCQkgICAgIworCQkgICAgYWNfbGJsX2NjX2RvbnRfdHJ5X2djY19kYXNoVz15ZXMKKwkJICAgICMKKwkJICAgICMgSXQgYWxzbywgYXBwYXJlbnRseSwgZGVmYXVsdHMgdG8gImNoYXIiIGJlaW5nCisJCSAgICAjIHVuc2lnbmVkLCB1bmxpa2UgbW9zdCBvdGhlciBDIGltcGxlbWVudGF0aW9uczsKKwkJICAgICMgSSBzdXBwb3NlIHdlIGNvdWxkIHNheSAic2lnbmVkIGNoYXIiIHdoZW5ldmVyCisJCSAgICAjIHdlIHdhbnQgdG8gZ3VhcmFudGVlIGEgc2lnbmVkICJjaGFyIiwgYnV0IGxldCdzCisJCSAgICAjIGp1c3QgZm9yY2Ugc2lnbmVkIGNoYXJzLgorCQkgICAgIworCQkgICAgIyAteGFuc2kgaXMgbm9ybWFsbHkgdGhlIGRlZmF1bHQsIGJ1dCB0aGUKKwkJICAgICMgY29uZmlndXJlIHNjcmlwdCB3YXMgc2V0dGluZyBpdDsgcGVyaGFwcyAtY2NrcgorCQkgICAgIyB3YXMgdGhlIGRlZmF1bHQgaW4gdGhlIE9sZCBEYXlzLiAgKFRoZW4gYWdhaW4sCisJCSAgICAjIHRoYXQgd291bGQgcHJvYmFibHkgYmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCSAgICAjIGluIHRoZSBkYXlzIHdoZW4gQU5TSSBDIHdhcyBTaGlueSBhbmQgTmV3LCBpLmUuCisJCSAgICAjIDE5ODkgYW5kIHRoZSBlYXJseSAnOTAncywgc28gbWF5YmUgd2UgY2FuIGp1c3QKKwkJICAgICMgZHJvcCBzdXBwb3J0IGZvciB0aG9zZSBjb21waWxlcnMuKQorCQkgICAgIworCQkgICAgIyAtZyBpcyBlcXVpdmFsZW50IHRvIC1nMiwgd2hpY2ggdHVybnMgb2ZmCisJCSAgICAjIG9wdGltaXphdGlvbjsgd2UgY2hvb3NlIC1nMywgd2hpY2ggZ2VuZXJhdGVzCisJCSAgICAjIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBidXQgZG9lc24ndCB0dXJuIG9mZgorCQkgICAgIyBvcHRpbWl6YXRpb24gKGV2ZW4gaWYgdGhlIG9wdGltaXphdGlvbiB3b3VsZAorCQkgICAgIyBjYXVzZSBpbmFjY3VyYWNpZXMgaW4gZGVidWdnaW5nKS4KKwkJICAgICMKIAkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC14YW5zaSAtc2lnbmVkIC1nMyIKIAkJICAgIDs7CiAKIAkgICAgb3NmKikKLQkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1zdGQxIC1nMyIKKwkJICAgICMKKwkJICAgICMgUHJlc3VtZWQgdG8gYmUgREVDIE9TRi8xLCBEaWdpdGFsIFVOSVgsIG9yCisJCSAgICAjIFRydTY0IFVOSVguCisJCSAgICAjCisJCSAgICAjIFRoZSBERUMgQyBjb21waWxlciwgd2hpY2ggaXMgd2hhdCB3ZSBwcmVzdW1lIHdlJ3JlCisJCSAgICAjIHVzaW5nLCBkb2Vzbid0IGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIHdlCisJCSAgICAjIGhhbmQgaXQgYW4gaW52YWxpZCAtVyBmbGFnLCBjYW4ndCBiZSBmb3JjZWQgdG8gZG8KKwkJICAgICMgc28sIGFuZCBkb2Vzbid0IGhhbmRsZSBHQ0Mtc3R5bGUgLVcgZmxhZ3MsIHNvIHdlCisJCSAgICAjIGRvbid0IHdhbnQgdG8gdHJ5IHVzaW5nIEdDQy1zdHlsZSAtVyBmbGFncy4KKwkJICAgICMKKwkJICAgIGFjX2xibF9jY19kb250X3RyeV9nY2NfZGFzaFc9eWVzCisJCSAgICAjCisJCSAgICAjIC1nIGlzIGVxdWl2YWxlbnQgdG8gLWcyLCB3aGljaCB0dXJucyBvZmYKKwkJICAgICMgb3B0aW1pemF0aW9uOyB3ZSBjaG9vc2UgLWczLCB3aGljaCBnZW5lcmF0ZXMKKwkJICAgICMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJ1dCBkb2Vzbid0IHR1cm4gb2ZmCisJCSAgICAjIG9wdGltaXphdGlvbiAoZXZlbiBpZiB0aGUgb3B0aW1pemF0aW9uIHdvdWxkCisJCSAgICAjIGNhdXNlIGluYWNjdXJhY2llcyBpbiBkZWJ1Z2dpbmcpLgorCQkgICAgIworCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLWczIgorCQkgICAgOzsKKworCSAgICBzb2xhcmlzKikKKwkJICAgICMKKwkJICAgICMgQXNzdW1lZCB0byBiZSBTdW4gQywgd2hpY2ggcmVxdWlyZXMgLWVycndhcm4gdG8gZm9yY2UKKwkJICAgICMgd2FybmluZ3MgdG8gYmUgdHJlYXRlZCBhcyBlcnJvcnMuCisJCSAgICAjCisJCSAgICBhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnM9LWVycndhcm4KIAkJICAgIDs7CiAKIAkgICAgdWx0cml4KikKLQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRoYXQgVWx0cml4ICRDQyBoYWNrcyBjb25zdCBpbiBwcm90b3R5cGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhhdCBVbHRyaXggJENDIGhhY2tzIGNvbnN0IGluIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JCSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9jY19jb25zdF9wcm90bytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGF0IFVsdHJpeCAkQ0MgaGFja3MgY29uc3QgaW4gcHJvdG90eXBlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0aGF0IFVsdHJpeCAkQ0MgaGFja3MgY29uc3QgaW4gcHJvdG90eXBlcy4uLiAiID4mNjsgfQorCQkgICAgaWYgJHthY19jdl9sYmxfY2NfY29uc3RfcHJvdG8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogaW50CkBAIC0zMDYwLDYzICszNDE5LDE4NiBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgogICBhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89eWVzCiBlbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89bm8KKyAgYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvPW5vCiBmaQotCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9jY19jb25zdF9wcm90byIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjY7IH0KKwkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjY7IH0KIAkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19jb25zdF9wcm90byA9IG5vIDsgdGhlbgotCQkJICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIGNvbnN0Ci1fQUNFT0YKKworJGFzX2VjaG8gIiNkZWZpbmUgY29uc3QgLyoqLyIgPj5jb25mZGVmcy5oCiAKIAkJICAgIGZpCiAJCSAgICA7OwogCSAgICBlc2FjCisJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1PIgogICAgIGZpCiAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5saW5lLi4uICRFQ0hPX0MiID4mNjsgfQorCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgICMKKwkgICAgIyBPbiBwbGF0Zm9ybXMgd2hlcmUgd2UgYnVpbGQgYSBzaGFyZWQgbGlicmFyeToKKwkgICAgIworCSAgICAjCWFkZCBvcHRpb25zIHRvIGdlbmVyYXRlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUsCisJICAgICMJaWYgbmVjZXNzYXJ5IChpdCdzIHRoZSBkZWZhdWx0IGluIEFJWCBhbmQgRGFyd2luL09TIFgpOworCSAgICAjCisJICAgICMJZGVmaW5lIG9wdGlvbiB0byBzZXQgdGhlIHNvbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnksCisJICAgICMJaWYgdGhlIE9TIHN1cHBvcnRzIHRoYXQ7CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBzcGVjaWZ5LCBhdCBsaW5rIHRpbWUsIGEgZGlyZWN0b3J5IHRvCisJICAgICMJYWRkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgaWYgdGhhdCdzIG5lY2Vzc2FyeS4KKwkgICAgIworCSAgICBWX1NITElCX0NNRD0iXCQoQ0MpIgorCSAgICBWX1NITElCX09QVD0iLXNoYXJlZCIKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYWl4KikKKwkJICAgIDs7CisKKwkgICAgZnJlZWJzZCp8bmV0YnNkKnxvcGVuYnNkKnxkcmFnb25mbHkqfGxpbnV4Knxvc2YqKQorCSAgICAJICAgICMKKwkJICAgICMgUGxhdGZvcm1zIHdoZXJlIHRoZSBsaW5rZXIgaXMgdGhlIEdOVSBsaW5rZXIKKwkJICAgICMgb3IgYWNjZXB0cyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGxpa2UKKwkJICAgICMgdGhvc2UgdGhlIEdOVSBsaW5rZXIgYWNjZXB0cy4KKwkJICAgICMKKwkJICAgICMgU29tZSBpbnN0cnVjdGlvbiBzZXRzIHJlcXVpcmUgLWZQSUMgb24gc29tZQorCQkgICAgIyBvcGVyYXRpbmcgc3lzdGVtcy4gIENoZWNrIGZvciB0aGVtLiAgSWYgeW91CisJCSAgICAjIGhhdmUgYSBjb21iaW5hdGlvbiB0aGF0IHJlcXVpcmVzIGl0LCBhZGQgaXQKKwkJICAgICMgaGVyZS4KKwkJICAgICMKKwkJICAgIFBJQ19PUFQ9LWZwaWMKKwkJICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKworCQkgICAgc3BhcmM2NCopCisJCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQkJZnJlZWJzZCp8b3BlbmJzZCopCisJCQkgICAgUElDX09QVD0tZlBJQworCQkJICAgIDs7CisJCQllc2FjCisJCQk7OworCQkgICAgZXNhYworCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgJFBJQ19PUFQiCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwtc29uYW1lLCIKKwkJICAgIFZfUlBBVEhfT1BUPSItV2wsLXJwYXRoLCIKKwkJICAgIDs7CisKKwkgICAgaHB1eCopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtZnBpYyIKKwkgICAgCSAgICAjCisJCSAgICAjIFhYWCAtIHRoaXMgYXNzdW1lcyBHQ0MgaXMgdXNpbmcgdGhlIEhQIGxpbmtlciwKKwkJICAgICMgcmF0aGVyIHRoYW4gdGhlIEdOVSBsaW5rZXIsIGFuZCB0aGF0IHRoZSAiK2giCisJCSAgICAjIG9wdGlvbiBpcyB1c2VkIG9uIGFsbCBIUC1VWCBwbGF0Zm9ybXMsIGJvdGggLnNsCisJCSAgICAjIGFuZCAuc28uCisJCSAgICAjCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwraCwiCisJCSAgICAjCisJCSAgICAjIEJ5IGRlZmF1bHQsIGRpcmVjdG9yaWVzIHNwZWNpZmVkIHdpdGggLUwKKwkJICAgICMgYXJlIGFkZGVkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgc28KKwkJICAgICMgd2UgZG9uJ3QgYWRkIHRoZW0gaW4gcGNhcC1jb25maWcuCisJCSAgICAjCisJCSAgICA7OworCisJICAgIHNvbGFyaXMqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLWZwaWMiCisJCSAgICAjCisJCSAgICAjIFhYWCAtIHRoaXMgYXNzdW1lcyBHQ0MgaXMgdXNpbmcgdGhlIFN1biBsaW5rZXIsCisJCSAgICAjIHJhdGhlciB0aGFuIHRoZSBHTlUgbGlua2VyLgorCQkgICAgIworCQkgICAgVl9TT05BTUVfT1BUPSItV2wsLWgsIgorCQkgICAgVl9SUEFUSF9PUFQ9Ii1XbCwtUiwiCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZWxzZQorCSAgICAjCisJICAgICMgU2V0IHRoZSBhcHByb3ByaWF0ZSBjb21waWxlciBmbGFncyBhbmQsIG9uIHBsYXRmb3JtcworCSAgICAjIHdoZXJlIHdlIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnk6CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBnZW5lcmF0ZSBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlLAorCSAgICAjCWlmIG5lY2Vzc2FyeSAoaXQncyB0aGUgZGVmYXVsdCBpbiBEYXJ3aW4vT1MgWCk7CisJICAgICMKKwkgICAgIwlpZiB3ZSBnZW5lcmF0ZSAiLnNvIiBzaGFyZWQgbGlicmFyaWVzLCBkZWZpbmUgdGhlCisJICAgICMJYXBwcm9wcmlhdGUgb3B0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5OworCSAgICAjCisJICAgICMJYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSwgYXQgbGluayB0aW1lLCBhIGRpcmVjdG9yeSB0bworCSAgICAjCWFkZCB0byB0aGUgcnVuLXRpbWUgc2VhcmNoIHBhdGgsIGlmIHRoYXQncyBuZWNlc3NhcnkuCisJICAgICMKKwkgICAgIyBOb3RlOiBzcGFjZXMgYWZ0ZXIgVl9TT05BTUVfT1BUIGFyZSBzaWduaWZpY2FudDsgb24KKwkgICAgIyBzb21lIHBsYXRmb3JtcyB0aGUgc29uYW1lIGlzIHBhc3NlZCB3aXRoIGEgR0NDLWxpa2UKKwkgICAgIyAiLVdsLC1zb25hbWUse3NvbmFtZX0iIG9wdGlvbiwgd2l0aCB0aGUgc29uYW1lIHBhcnQKKwkgICAgIyBvZiB0aGUgb3B0aW9uLCB3aGlsZSBvbiBvdGhlciBwbGF0Zm9ybXMgdGhlIEMgY29tcGlsZXIKKwkgICAgIyBkcml2ZXIgdGFrZXMgaXQgYXMgYSByZWd1bGFyIG9wdGlvbiB3aXRoIHRoZSBzb25hbWUKKwkgICAgIyBmb2xsb3dpbmcgdGhlIG9wdGlvbi4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gVl9SUEFUSF9PUFQuCisJICAgICMKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYWl4KikKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLUcgLWJub2VudHJ5IC1iZXhwYWxsIgorCQkgICAgOzsKKworCSAgICBmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8bGludXgqKQorCQkgICAgIworCQkgICAgIyAiY2MiIGlzIEdDQy4KKwkJICAgICMKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1mcGljIgorCQkgICAgVl9TSExJQl9DTUQ9IlwkKENDKSIKKwkJICAgIFZfU0hMSUJfT1BUPSItc2hhcmVkIgorCQkgICAgVl9TT05BTUVfT1BUPSItV2wsLXNvbmFtZSwiCisJCSAgICBWX1JQQVRIX09QVD0iLVdsLC1ycGF0aCwiCisJCSAgICA7OworCisJICAgIGhwdXgqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgK3oiCisJCSAgICBWX1NITElCX0NNRD0iXCQoTEQpIgorCQkgICAgVl9TSExJQl9PUFQ9Ii1iIgorCQkgICAgVl9TT05BTUVfT1BUPSIraCAiCisJCSAgICAjCisJCSAgICAjIEJ5IGRlZmF1bHQsIGRpcmVjdG9yaWVzIHNwZWNpZmVkIHdpdGggLUwKKwkJICAgICMgYXJlIGFkZGVkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgc28KKwkJICAgICMgd2UgZG9uJ3QgYWRkIHRoZW0gaW4gcGNhcC1jb25maWcuCisJCSAgICAjCisJCSAgICA7OworCisJICAgIG9zZiopCisJICAgIAkgICAgIworCQkgICAgIyBQcmVzdW1lZCB0byBiZSBERUMgT1NGLzEsIERpZ2l0YWwgVU5JWCwgb3IKKwkJICAgICMgVHJ1NjQgVU5JWC4KKwkJICAgICMKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLXNoYXJlZCIKKwkJICAgIFZfU09OQU1FX09QVD0iLXNvbmFtZSAiCisJCSAgICBWX1JQQVRIX09QVD0iLXJwYXRoICIKKwkJICAgIDs7CisKKwkgICAgc29sYXJpcyopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtS3BpYyIKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLUciCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1oICIKKwkJICAgIFZfUlBBVEhfT1BUPSItUiIKKwkJICAgIDs7CisJICAgIGVzYWMKKyAgICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlubGluZS4uLiAiID4mNjsgfQogICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogICAgIENGTEFHUz0iJFZfQ0NPUFQiCi0gICAgaWYgdGVzdCAiJHthY19jdl9sYmxfaW5saW5lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CisgICAgaWYgJHthY19jdl9sYmxfaW5saW5lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKIAogCWFjX2N2X2xibF9pbmxpbmU9IiIKIAlhY19sYmxfY2NfaW5saW5lPW5vCiAJZm9yIGFjX2xibF9pbmxpbmUgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmUKIAlkbwotCSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwkgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2RlZmluZSBpbmxpbmUgJGFjX2xibF9pbmxpbmUKIAkJc3RhdGljIGlubGluZSBzdHJ1Y3QgaWx0ZXN0ICpmb28odm9pZCk7CkBAIC0zMTQwLDMxICszNjIyLDkgQEAKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfbGJsX2NjX2lubGluZT15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCiBmaQotCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAkgICAgaWYgdGVzdCAiJGFjX2xibF9jY19pbmxpbmUiID0geWVzIDsgdGhlbgogCQlicmVhazsKQEAgLTMxNzcsMTEgKzM2MzcsMTEgQEAKIAogICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgogICAgIGlmIHRlc3QgISAteiAiJGFjX2N2X2xibF9pbmxpbmUiIDsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9pbmxpbmUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9pbmxpbmUiID4mNjsgfQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2lubGluZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9pbmxpbmUiID4mNjsgfQogICAgIGVsc2UKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KICAgICBmaQogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCkBAIC0zMTg5LDE5ICszNjQ5LDE2IEBACiBfQUNFT0YKIAogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9fX2F0dHJpYnV0ZV9fK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X19fYXR0cmlidXRlX18rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKIHN0YXRpYyB2b2lkIGZvbyh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKQEAgLTMyMTksMjUyICszNjc2LDEyOCBAQAogfQogCiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfX19hdHRyaWJ1dGVfXz15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X19fYXR0cmlidXRlX189bm8KKyAgYWNfY3ZfX19hdHRyaWJ1dGVfXz1ubwogZmkKLQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCiBpZiB0ZXN0ICIkYWNfY3ZfX19hdHRyaWJ1dGVfXyIgPSAieWVzIjsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX19fQVRUUklCVVRFX18gMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX19fQVRUUklCVVRFX18gMSIgPj5jb25mZGVmcy5oCiAKK2Vsc2UKKyAgIworICAjIFdlIGNhbid0IHVzZSBfX2F0dHJpYnV0ZV9fLCBzbyB3ZSBjYW4ndCB1c2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisgICMgc28gd2UgZGVmaW5lIF9VXyB0byBhbiBlbXB0eSBzdHJpbmcuCisgICMKKyAgVl9ERUZTPSIkVl9ERUZTIC1EX1VfPVwiXCIiCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfX19hdHRyaWJ1dGVfXyIgPiY2OyB9CisKK2lmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA9ICJ5ZXMiOyB0aGVuCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBjYW4gYmUgdXNlZCB3aXRob3V0IHdhcm5pbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY2FuIGJlIHVzZWQgd2l0aG91dCB3YXJuaW5ncy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9fX2F0dHJpYnV0ZV9fX3VudXNlZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludAorbWFpbihpbnQgYXJnYyAgX19hdHRyaWJ1dGUoKHVudXNlZCkpLCBjaGFyICoqYXJndiBfX2F0dHJpYnV0ZSgodW51c2VkKSkpCit7CisgIHByaW50ZigiSGVsbG8sIHdvcmxkIVxuIik7CisgIHJldHVybiAwOworfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfX19hdHRyaWJ1dGVfX191bnVzZWQ9eWVzCitlbHNlCisgIGFjX2N2X19fYXR0cmlidXRlX19fdW51c2VkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2lmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fX3VudXNlZCIgPSAieWVzIjsgdGhlbgogICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKVwiIgogZWxzZQogICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJcIiIKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfX19hdHRyaWJ1dGVfX191bnVzZWQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9fX2F0dHJpYnV0ZV9fX3VudXNlZCIgPiY2OyB9CiAKIAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVfaW50OF90IHVzaW5nICRDQyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1X2ludDhfdCB1c2luZyAkQ0MuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gICAgaWYgdGVzdCAiJHthY19jdl9sYmxfaGF2ZV91X2ludDhfdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIF9fYXR0cmlidXRlX18oKGZvcm1hdCkpIGNhbiBiZSB1c2VkIHdpdGhvdXQgd2FybmluZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBfX2F0dHJpYnV0ZV9fKChmb3JtYXQpKSBjYW4gYmUgdXNlZCB3aXRob3V0IHdhcm5pbmdzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X19fYXR0cmlidXRlX19fZm9ybWF0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisKK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLSMJaW5jbHVkZSAiY29uZmRlZnMuaCIKLSMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCWlmIFNURENfSEVBREVSUwotIwlpbmNsdWRlIDxzdGRsaWIuaD4KLSMJaW5jbHVkZSA8c3RkZGVmLmg+Ci0jCWVuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworZXh0ZXJuIGludCBmb28oY29uc3QgY2hhciAqZm10LCAuLi4pCisJCSAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworCiBpbnQKLW1haW4gKCkKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotdV9pbnQ4X3QgaQotICA7Ci0gIHJldHVybiAwOworICBmb28oIiVzIiwgInRlc3QiKTsKIH0KKwogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2xibF9oYXZlX3VfaW50OF90PXllcworaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9fX2F0dHJpYnV0ZV9fX2Zvcm1hdD15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9oYXZlX3VfaW50OF90PW5vCisgIGFjX2N2X19fYXR0cmlidXRlX19fZm9ybWF0PW5vCiBmaQotCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfaGF2ZV91X2ludDhfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2hhdmVfdV9pbnQ4X3QiID4mNjsgfQotICAgIGlmIHRlc3QgJGFjX2N2X2xibF9oYXZlX3VfaW50OF90ID0gbm8gOyB0aGVuCitDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2lmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fX2Zvcm1hdCIgPSAieWVzIjsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSB1X2ludDhfdCB1X2NoYXIKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgX19BVFRSSUJVVEVfX19GT1JNQVRfT0sgMSIgPj5jb25mZGVmcy5oCiAKLSAgICBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVfaW50MTZfdCB1c2luZyAkQ0MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdV9pbnQxNl90IHVzaW5nICRDQy4uLiAkRUNIT19DIiA+JjY7IH0KLSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9oYXZlX3VfaW50MTZfdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwlpbmNsdWRlICJjb25mZGVmcy5oIgotIwlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJaWYgU1REQ19IRUFERVJTCi0jCWluY2x1ZGUgPHN0ZGxpYi5oPgotIwlpbmNsdWRlIDxzdGRkZWYuaD4KLSMJZW5kaWYKLWludAotbWFpbiAoKQotewotdV9pbnQxNl90IGkKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9sYmxfaGF2ZV91X2ludDE2X3Q9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9sYmxfaGF2ZV91X2ludDE2X3Q9bm8KIGZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X19fYXR0cmlidXRlX19fZm9ybWF0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfX19hdHRyaWJ1dGVfX19mb3JtYXQiID4mNjsgfQogCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfaGF2ZV91X2ludDE2X3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9oYXZlX3VfaW50MTZfdCIgPiY2OyB9Ci0gICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2hhdmVfdV9pbnQxNl90ID0gbm8gOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIHVfaW50MTZfdCB1X3Nob3J0Ci1fQUNFT0YKLQotICAgIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQzMl90IHVzaW5nICRDQyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1X2ludDMyX3QgdXNpbmcgJENDLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2hhdmVfdV9pbnQzMl90K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jCWluY2x1ZGUgImNvbmZkZWZzLmgiCi0jCWluY2x1ZGUgPHN5cy90eXBlcy5oPgotIwlpZiBTVERDX0hFQURFUlMKLSMJaW5jbHVkZSA8c3RkbGliLmg+Ci0jCWluY2x1ZGUgPHN0ZGRlZi5oPgotIwllbmRpZgotaW50Ci1tYWluICgpCi17Ci11X2ludDMyX3QgaQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2xibF9oYXZlX3VfaW50MzJfdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9oYXZlX3VfaW50MzJfdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2hhdmVfdV9pbnQzMl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfaGF2ZV91X2ludDMyX3QiID4mNjsgfQotICAgIGlmIHRlc3QgJGFjX2N2X2xibF9oYXZlX3VfaW50MzJfdCA9IG5vIDsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSB1X2ludDMyX3QgdV9pbnQKLV9BQ0VPRgotCi0gICAgZmkKLQogYWNfZXh0PWMKIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCiBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwogYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KICMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCiBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogICBDUFA9CiBmaQogaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAogICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCkBAIC0zNDc4LDExICszODExLDcgQEAKICAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCiAgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCiAgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2lmZGVmIF9fU1REQ19fCiAjIGluY2x1ZGUgPGxpbWl0cy5oPgpAQCAtMzQ5MSw3NiArMzgyMCwzNCBAQAogI2VuZGlmCiAJCSAgICAgU3ludGF4IGVycm9yCiBfQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKIAorZWxzZQogICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCiBjb250aW51ZQogZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKIAogICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwogICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CiBfQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CiAgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCiBjb250aW51ZQogZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCiAgICMgUGFzc2VzIGJvdGggdGVzdHMuCiBhY19wcmVwcm9jX29rPToKIGJyZWFrCiBmaQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAogCiBkb25lCiAjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgogICBicmVhawogZmkKIApAQCAtMzU3Miw4ICszODU5LDggQEAKIGVsc2UKICAgYWNfY3ZfcHJvZ19DUFA9JENQUAogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ1BQIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KIGFjX3ByZXByb2Nfb2s9ZmFsc2UKIGZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwogZG8KQEAgLTM1ODMsMTEgKzM4NzAsNyBAQAogICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KICAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaWZkZWYgX19TVERDX18KICMgaW5jbHVkZSA8bGltaXRzLmg+CkBAIC0zNTk2LDgzICszODc5LDQwIEBACiAjZW5kaWYKIAkJICAgICBTeW50YXggZXJyb3IKIF9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgogCitlbHNlCiAgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KIGNvbnRpbnVlCiBmaQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAogCiAgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCiAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KIF9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKICAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KIGNvbnRpbnVlCiBlbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KICAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KIGFjX3ByZXByb2Nfb2s9OgogYnJlYWsKIGZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CiAKIGRvbmUKICMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuCi0gIDoKK3JtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKwogZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogZmkKIAogYWNfZXh0PWMKQEAgLTM2ODIsNDUgKzM5MjIsNDAgQEAKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKIAogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ3JlcCBnZ3JlcCIgdG8gdXNlIGluIG1zZyBvdXRwdXQKLWlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotc2V0IGR1bW15IGdyZXAgZ2dyZXA7IGFjX3Byb2dfbmFtZT0kMgotaWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCiAgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKLSAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfR1JFUCIgfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KICAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKIGNhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KICpHTlUqKQogICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKICopCiAgIGFjX2NvdW50PTAKLSAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCiAgIHdoaWxlIDoKICAgZG8KICAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgogICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKICAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICBlY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKICAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawogICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAorICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAogICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KICAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQogICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgpAQCAtMzczMiw3NyArMzk2Nyw2MSBAQAogICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKIGVzYWMKIAotCi0gICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCiAgIGRvbmUKLWRvbmUKLQotZG9uZQorICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLQotR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLWlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKIGVsc2UKICAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCiBmaQogCi0KIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CiAgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKIAogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKICAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCiAgICBlbHNlCi0gICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZWdyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0Ci1pZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi1zZXQgZHVtbXkgZWdyZXA7IGFjX3Byb2dfbmFtZT0kMgotaWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KICAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQotIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCi0gICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIiB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KICAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCiBjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgogKkdOVSopCiAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwogKikKICAgYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKICAgd2hpbGUgOgogICBkbwogICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCiAgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgogICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgotICAgIGVjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCiAgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCiAgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCiAgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KICAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQogICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCkBAIC0zODE0LDQ2ICs0MDMzLDMxIEBACiAgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwogZXNhYwogCi0KLSAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQogICBkb25lCi1kb25lCi0KLWRvbmUKKyAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwotCi0KLWZpCi0KLUVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLWlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0VHUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGVncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKIGVsc2UKICAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKIGZpCiAKLQogICAgZmkKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQogIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKIAogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0zODY4LDQ3ICs0MDcyLDIzIEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X2hlYWRlcl9zdGRjPXllcwogZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKIF9BQ0VPRgogaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKIGVsc2UKICAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KIGZpCkBAIC0zOTE4LDE4ICs0MDk4LDE0IEBACiAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KIAogX0FDRU9GCiBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCiBlbHNlCiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCiBmaQpAQCAtMzkzOSwxNCArNDExNSwxMCBAQAogCiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKICAgOgogZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0zOTczLDExMyArNDE0NSwzNSBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgOgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWFjX2N2X2hlYWRlcl9zdGRjPW5vCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi0KIGZpCiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCiAKIGZpCiAKICMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi0KLQotCi0KLQotCi0KLQotCiBmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKIAkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKIF9BQ0VPRgogCiBmaQpAQCAtNDA4NywyNjIgKzQxODEsNDkxIEBACiBkb25lCiAKIAorZm9yIGFjX2hlYWRlciBpbiBzeXMvYml0eXBlcy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvYml0eXBlcy5oIiAiYWNfY3ZfaGVhZGVyX3N5c19iaXR5cGVzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c19iaXR5cGVzX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfQklUWVBFU19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCiAKIAorYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50OF90IiAiYWNfY3ZfdHlwZV9pbnQ4X3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQ4X3QiID0geHllczsgdGhlbiA6CisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgaW50OF90IHNpZ25lZCBjaGFyIiA+PmNvbmZkZWZzLmgKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidV9pbnQ4X3QiICJhY19jdl90eXBlX3VfaW50OF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdV9pbnQ4X3QiID0geHllczsgdGhlbiA6CisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgdV9pbnQ4X3QgdW5zaWduZWQgY2hhciIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludDE2X3QiICJhY19jdl90eXBlX2ludDE2X3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQxNl90IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIGludDE2X3Qgc2hvcnQiID4+Y29uZmRlZnMuaAorCisJJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1X2ludDE2X3QiICJhY19jdl90eXBlX3VfaW50MTZfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50MTZfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSB1X2ludDE2X3QgdW5zaWduZWQgc2hvcnQiID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnQzMl90IiAiYWNfY3ZfdHlwZV9pbnQzMl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSBpbnQzMl90IGludCIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50MzJfdCIgImFjX2N2X3R5cGVfdV9pbnQzMl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdV9pbnQzMl90IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIHVfaW50MzJfdCB1bnNpZ25lZCBpbnQiID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnQ2NF90IiAiYWNfY3ZfdHlwZV9pbnQ2NF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50NjRfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSBpbnQ2NF90IGxvbmcgbG9uZyIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50NjRfdCIgImFjX2N2X3R5cGVfdV9pbnQ2NF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdV9pbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIHVfaW50NjRfdCB1bnNpZ25lZCBsb25nIGxvbmciID4+Y29uZmRlZnMuaAorCitmaQorCisKKyMKKyMgVHJ5IHRvIGFycmFuZ2UgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydC4KKyMKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYXJnZWZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGFyZ2VmaWxlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGFyZ2VmaWxlOworZmkKKworaWYgdGVzdCAiJGVuYWJsZV9sYXJnZWZpbGUiICE9IG5vOyB0aGVuCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3BlY2lhbCBDIGNvbXBpbGVyIG9wdGlvbnMgbmVlZGVkIGZvciBsYXJnZSBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3BlY2lhbCBDIGNvbXBpbGVyIG9wdGlvbnMgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zeXNfbGFyZ2VmaWxlX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQz1ubworICAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgICBhY19zYXZlX0NDPSRDQworICAgICAgIHdoaWxlIDo7IGRvCisJICMgSVJJWCA2LjIgYW5kIGxhdGVyIGRvIG5vdCBzdXBwb3J0IGxhcmdlIGZpbGVzIGJ5IGRlZmF1bHQsCisJICMgc28gdXNlIHRoZSBDIGNvbXBpbGVyJ3MgLW4zMiBvcHRpb24gaWYgdGhhdCBoZWxwcy4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgorICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKKyAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCisgICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCisgIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQorCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCisJCSAgICAgID8gMSA6IC0xXTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKKwkgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgQ0M9IiRDQyAtbjMyIgorCSBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19sYXJnZWZpbGVfQ0M9JyAtbjMyJzsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisJIGJyZWFrCisgICAgICAgZG9uZQorICAgICAgIENDPSRhY19zYXZlX0NDCisgICAgICAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQyIgPiY2OyB9CisgIGlmIHRlc3QgIiRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDIiAhPSBubzsgdGhlbgorICAgIENDPSRDQyRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDCisgIGZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHdoaWxlIDo7IGRvCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KKyAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCisgICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycworICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQorICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKKwkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQorCQkgICAgICA/IDEgOiAtMV07CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzPW5vOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cz02NDsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHM9dW5rbm93bgorICBicmVhaworZG9uZQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyIgPiY2OyB9CitjYXNlICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyBpbiAjKAorICBubyB8IHVua25vd24pIDs7CisgICopCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cworX0FDRU9GCis7OworZXNhYworcm0gLXJmIGNvbmZ0ZXN0KgorICBpZiB0ZXN0ICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyA9IHVua25vd247IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfTEFSR0VfRklMRVMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgX0xBUkdFX0ZJTEVTIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc3lzX2xhcmdlX2ZpbGVzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgd2hpbGUgOjsgZG8KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgorICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKKyAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCisgICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCisgIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQorCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCisJCSAgICAgID8gMSA6IC0xXTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzPW5vOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjZGVmaW5lIF9MQVJHRV9GSUxFUyAxCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9MTsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzPXVua25vd24KKyAgYnJlYWsKK2RvbmUKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZV9maWxlcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3N5c19sYXJnZV9maWxlcyIgPiY2OyB9CitjYXNlICRhY19jdl9zeXNfbGFyZ2VfZmlsZXMgaW4gIygKKyAgbm8gfCB1bmtub3duKSA7OworICAqKQorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBfTEFSR0VfRklMRVMgJGFjX2N2X3N5c19sYXJnZV9maWxlcworX0FDRU9GCis7OworZXNhYworcm0gLXJmIGNvbmZ0ZXN0KgorICBmaQorCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9MQVJHRUZJTEVfU09VUkNFIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF9MQVJHRUZJTEVfU09VUkNFIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICB3aGlsZSA6OyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLworICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworaW50ICgqZnApIChGSUxFICosIG9mZl90LCBpbnQpID0gZnNlZWtvOworICAgICByZXR1cm4gZnNlZWtvIChzdGRpbiwgMCwgMCkgJiYgZnAgKHN0ZGluLCAwLCAwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZT1ubzsgYnJlYWsKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFIDEKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCisgICAgICNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitpbnQgKCpmcCkgKEZJTEUgKiwgb2ZmX3QsIGludCkgPSBmc2Vla287CisgICAgIHJldHVybiBmc2Vla28gKHN0ZGluLCAwLCAwKSAmJiBmcCAoc3RkaW4sIDAsIDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlPTE7IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2U9dW5rbm93bgorICBicmVhaworZG9uZQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSIgPiY2OyB9CitjYXNlICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSBpbiAjKAorICBubyB8IHVua25vd24pIDs7CisgICopCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZQorX0FDRU9GCis7OworZXNhYworcm0gLXJmIGNvbmZ0ZXN0KgorCisjIFdlIHVzZWQgdG8gdHJ5IGRlZmluaW5nIF9YT1BFTl9TT1VSQ0U9NTAwIHRvbywgdG8gd29yayBhcm91bmQgYSBidWcKKyMgaW4gZ2xpYmMgMi4xLjMsIGJ1dCB0aGF0IGJyZWFrcyB0b28gbWFueSBvdGhlciB0aGluZ3MuCisjIElmIHlvdSB3YW50IGZzZWVrbyBhbmQgZnRlbGxvIHdpdGggZ2xpYmMsIHVwZ3JhZGUgdG8gYSBmaXhlZCBnbGliYy4KK2lmIHRlc3QgJGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlICE9IHVua25vd247IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9GU0VFS08gMSIgPj5jb25mZGVmcy5oCisKK2ZpCiAKIAogZm9yIGFjX2hlYWRlciBpbiBzeXMvaW9jY29tLmggc3lzL3NvY2tpby5oIGxpbWl0cy5oIHBhdGhzLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oZWFkZXJfY29tcGlsZXI9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0gIHllczpubzogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotCi0gICAgOzsKLWVzYWMKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotCi1maQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQogX0FDRU9GCiAKIGZpCiAKIGRvbmUKIAorZm9yIGFjX2hlYWRlciBpbiBsaW51eC90eXBlcy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC90eXBlcy5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3R5cGVzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X3R5cGVzX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSU5VWF9UWVBFU19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gbGludXgvaWZfcGFja2V0LmggbmV0cGFja2V0L3BhY2tldC5oIG5ldHBhY2tldC9pZl9wYWNrZXQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQogCiBmb3IgYWNfaGVhZGVyIGluIG5ldC9wZnZhci5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIm5ldC9wZnZhci5oIiAiYWNfY3ZfaGVhZGVyX25ldF9wZnZhcl9oIiAiI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXQvaWYuaD4KLQotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX25ldF9wZnZhcl9oIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorI2RlZmluZSBIQVZFX05FVF9QRlZBUl9IIDEKIF9BQ0VPRgogCiBmaQogCiBkb25lCiAKLQotZm9yIGFjX2hlYWRlciBpbiBuZXRpbmV0L2lmX2V0aGVyLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgoraWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPSB5ZXM7IHRoZW4KKwkjCisJIyBDaGVjayBmb3IgdmFyaW91cyBQRiBhY3Rpb25zLgorCSMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbmV0L3BmdmFyLmggZGVmaW5lcyBQRl9OQVQgdGhyb3VnaCBQRl9OT1JEUiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIG5ldC9wZnZhci5oIGRlZmluZXMgUEZfTkFUIHRocm91Z2ggUEZfTk9SRFIuLi4gIiA+JjY7IH0KKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KKwkgICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkgICAgI2luY2x1ZGUgPG5ldC9pZi5oPgorCSAgICAjaW5jbHVkZSA8bmV0L3BmdmFyLmg+CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBQRl9OQVQrUEZfTk9OQVQrUEZfQklOQVQrUEZfTk9CSU5BVCtQRl9SRFIrUEZfTk9SRFI7CisgIDsKKyAgcmV0dXJuIDA7Cit9CiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QRl9OQVRfVEhST1VHSF9QRl9OT1JEUiAxIiA+PmNvbmZkZWZzLmgKKworCiBlbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCitmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvaWZfZXRoZXIuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibmV0aW5ldC9pZl9ldGhlci5oIiAiYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2giID0geHllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCisjZGVmaW5lIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IIDEKIF9BQ0VPRgogCiBmaQpAQCAtNDM1Nyw2NiArNDY4MCwyMSBAQAogCSMgdHJlYXQgdGhlIHByZXZpb3VzIGZhaWx1cmUgYXMgYSBjYWNoZWQgdmFsdWUgYW5kCiAJIyBzdXBwcmVzcyB0aGUgbmV4dCB0ZXN0LgogCSMKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBSZWNoZWNraW5nIHdpdGggc29tZSBhZGRpdGlvbmFsIGluY2x1ZGVzIiA+JjUKLWVjaG8gIiRhc19tZTogUmVjaGVja2luZyB3aXRoIHNvbWUgYWRkaXRpb25hbCBpbmNsdWRlcyIgPiY2O30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlY2hlY2tpbmcgd2l0aCBzb21lIGFkZGl0aW9uYWwgaW5jbHVkZXMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVjaGVja2luZyB3aXRoIHNvbWUgYWRkaXRpb25hbCBpbmNsdWRlcyIgPiY2O30KIAl1bnNldCBhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oCi0KLWZvciBhY19oZWFkZXIgaW4gbmV0aW5ldC9pZl9ldGhlci5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwlmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvaWZfZXRoZXIuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibmV0aW5ldC9pZl9ldGhlci5oIiAiYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogc3RydWN0IG1idWY7CiBzdHJ1Y3QgcnRlbnRyeTsKICNpbmNsdWRlIDxuZXQvaWYuaD4KLQotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgPSB4eWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKKyNkZWZpbmUgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0ggMQogX0FDRU9GCiAKIGZpCkBAIC00NDI2LDE2ICs0NzA0LDEyIEBACiBmaQogCiBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KLQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBpb2N0bCBkZWZpbml0aW9ucy4uLiAkRUNIT19DIiA+JjY7IH0KLQkgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CisJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMuLi4gIiA+JjY7IH0KKwkgICAgaWYgJHthY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIC8qCiAJCSAgICAgKiBUaGlzIGdlbmVyYXRlcyBhICJkdXBsaWNhdGUgY2FzZSB2YWx1ZSIgd2hlbiBmaXhpbmNsdWRlcwpAQCAtNDQ1OCwxMzUgKzQ3MzIsMzAgQEAKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcz15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXM9bm8KKyAgYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcz1ubwogZmkKLQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi0JICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMiID4mNjsgfQorCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzIiA+JjY7IH0KIAkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcyA9IG5vIDsgdGhlbgogCQkgICAgIyBEb24ndCBjYWNoZSBmYWlsdXJlCiAJCSAgICB1bnNldCBhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzCi0JCSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBzZWUgdGhlIElOU1RBTEwgZm9yIG1vcmUgaW5mbyIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBzZWUgdGhlIElOU1RBTEwgZm9yIG1vcmUgaW5mbyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQkgICAgYXNfZm5fZXJyb3IgJD8gInNlZSB0aGUgSU5TVEFMTCBmb3IgbW9yZSBpbmZvIiAiJExJTkVOTyIgNQogCSAgICBmaQogICAgIGZpCiAKLQotCiBmb3IgYWNfZnVuYyBpbiBzdHJlcnJvciBzdHJsY3B5Ci1kbwotYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJGFjX2Z1bmMKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkYWNfZnVuYyAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gJGFjX2Z1bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY192YXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCiBfQUNFT0YKIAogZmkKQEAgLTQ1OTQsOTYgKzQ3NjMsMTMgQEAKIAogCiBuZWVkc25wcmludGY9bm8KLQotCiBmb3IgYWNfZnVuYyBpbiB2c25wcmludGYgc25wcmludGYKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKIF9BQ0VPRgogCiBlbHNlCkBAIC00NzA5LDE3ICs0Nzk1LDEzIEBACiAgICAgIyBsaWJyYXJpZXMgKGkuZS4gbGliYyk6CiAgICAgIyBTb21lIE9TZXMgKGVnLiBTb2xhcmlzKSBwbGFjZSBpdCBpbiBsaWJuc2wKICAgICAjIFNvbWUgc3RyYW5nZSBPU2VzIChTSU5JWCkgaGF2ZSBpdCBpbiBsaWJzb2NrZXQ6Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBnZXRob3N0YnluYW1lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBnZXRob3N0YnluYW1lLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBnZXRob3N0YnluYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0aG9zdGJ5bmFtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgpAQCAtNDc0NCw1MCArNDgyNiwyNyBAQAogICAgIGFjX3Jlcz0tbCRhY19saWIKICAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCiAgIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lPSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCiBmaQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKICAgYnJlYWsKIGZpCiBkb25lCi1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lK3NldH0iID0gc2V0OyB0aGVuCi0gIDoKK2lmICR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgorCiBlbHNlCiAgIGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lPW5vCiBmaQogcm0gY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CiBhY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lCi1pZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgogICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgogCiBmaQpAQCAtNDc5NiwxOCArNDg1NSwxNCBAQAogICAgICMgQUNfU0VBUkNIX0xJQlMgaXNuJ3QgdXAgdG8gdGhlIHRhc2sgb2YgaGFuZGxpbmcgZGVwZW5kZW5jaWVzIGxpa2UgdGhpcy4KICAgICBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUiID0gIm5vIgogICAgIHRoZW4KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbHNvY2tldCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKIExJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgpAQCAtNDgyNSw1NCArNDg4MCwyOSBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZT15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZT1ubworICBhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWU9bm8KIGZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUgPSB5ZXM7IHRoZW4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgogICBMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIKIGZpCiAKICAgICBmaQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzb2NrZXQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9zb2NrZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KQEAgLTQ4OTcsNjUgKzQ5MjcsMzggQEAKICAgICBhY19yZXM9LWwkYWNfbGliCiAgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgogICBmaQotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgogICBhY19jdl9zZWFyY2hfc29ja2V0PSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCiBmaQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbgorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6CiAgIGJyZWFrCiBmaQogZG9uZQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCi0gIDoKK2lmICR7YWNfY3Zfc2VhcmNoX3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6CisKIGVsc2UKICAgYWNfY3Zfc2VhcmNoX3NvY2tldD1ubwogZmkKIHJtIGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUwogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zb2NrZXQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9zb2NrZXQiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc29ja2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY2OyB9CiBhY19yZXM9JGFjX2N2X3NlYXJjaF9zb2NrZXQKLWlmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CiAgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCiAKIGVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwogTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAogLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCkBAIC00OTczLDU2ICs0OTc2LDMxIEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCiBlbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubworICBhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubwogZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCA9IHllczsgdGhlbgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID0geHllczsgdGhlbiA6CiAgIExJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgogZmkKIAogZmkKIAogICAgICMgRExQSSBuZWVkcyBwdXRtc2cgdW5kZXIgSFBVWCBzbyB0ZXN0IGZvciAtbHN0ciB3aGlsZSB3ZSdyZSBhdCBpdAotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHV0bXNnIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdXRtc2cuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9wdXRtc2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHV0bXNnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHV0bXNnLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9wdXRtc2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KQEAgLTUwNDcsNTAgKzUwMjUsMjcgQEAKICAgICBhY19yZXM9LWwkYWNfbGliCiAgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgogICBmaQotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgogICBhY19jdl9zZWFyY2hfcHV0bXNnPSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCiBmaQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3B1dG1zZytzZXR9IiA9IHNldDsgdGhlbgorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX3B1dG1zZys6fSBmYWxzZTsgdGhlbiA6CiAgIGJyZWFrCiBmaQogZG9uZQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfcHV0bXNnK3NldH0iID0gc2V0OyB0aGVuCi0gIDoKK2lmICR7YWNfY3Zfc2VhcmNoX3B1dG1zZys6fSBmYWxzZTsgdGhlbiA6CisKIGVsc2UKICAgYWNfY3Zfc2VhcmNoX3B1dG1zZz1ubwogZmkKIHJtIGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUwogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9wdXRtc2ciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9wdXRtc2ciID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfcHV0bXNnIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3B1dG1zZyIgPiY2OyB9CiBhY19yZXM9JGFjX2N2X3NlYXJjaF9wdXRtc2cKLWlmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CiAgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCiAKIGZpCkBAIC01MTA4LDk1ICs1MDYzLDEyIEBACiAjCiAjIEJlZm9yZSB5b3UgaXMgYSBDIGNvbXBpbGVyLgogIwotCiBmb3IgYWNfZnVuYyBpbiBldGhlcl9ob3N0dG9uCi1kbwotYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJGFjX2Z1bmMKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkYWNfZnVuYyAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gJGFjX2Z1bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY192YXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJldGhlcl9ob3N0dG9uIiAiYWNfY3ZfZnVuY19ldGhlcl9ob3N0dG9uIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2V0aGVyX2hvc3R0b24iID0geHllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorI2RlZmluZSBIQVZFX0VUSEVSX0hPU1RUT04gMQogX0FDRU9GCiAKIGZpCkBAIC01MjEwLDE4ICs1MDgyLDcgQEAKIAkJIwogCQkjIFllcy4gIERvZXMgaXQgZGVjbGFyZSBldGhlcl9ob3N0dG9uKCk/CiAJCSMKLQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBldGhlcl9ob3N0dG9uIGlzIGRlY2xhcmVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBldGhlcl9ob3N0dG9uIGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQorCQlhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJldGhlcl9ob3N0dG9uIiAiYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24iICIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpAQCAtNTIzMSw1MyArNTA5MiwxMSBAQAogI2luY2x1ZGUgPG5ldC9pZi5oPgogI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KIAotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgZXRoZXJfaG9zdHRvbgotICAodm9pZCkgZXRoZXJfaG9zdHRvbjsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b249eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uID0geWVzOyB0aGVuCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uIiA9IHh5ZXM7IHRoZW4gOgogCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIE5FVElORVRfSUZfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OCi1fQUNFT0YKKyRhc19lY2hvICIjZGVmaW5lIE5FVElORVRfSUZfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OIC8qKi8iID4+Y29uZmRlZnMuaAogCiAKIGZpCkBAIC01MjkwLDE0MCArNTEwOSwxMiBAQAogCQkjCiAJCSMgTm8sIGhvdyBhYm91dCA8bmV0aW5ldC9ldGhlci5oPiwgYXMgb24gTGludXg/CiAJCSMKLQotZm9yIGFjX2hlYWRlciBpbiBuZXRpbmV0L2V0aGVyLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oZWFkZXJfY29tcGlsZXI9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0gIHllczpubzogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotCi0gICAgOzsKLWVzYWMKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotCi1maQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorCQlmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvZXRoZXIuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibmV0aW5ldC9ldGhlci5oIiAiYWNfY3ZfaGVhZGVyX25ldGluZXRfZXRoZXJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmV0aW5ldF9ldGhlcl9oIiA9IHh5ZXM7IHRoZW4gOgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorI2RlZmluZSBIQVZFX05FVElORVRfRVRIRVJfSCAxCiBfQUNFT0YKIAogZmkKQEAgLTU0MzgsNjcgKzUxMjksMTQgQEAKIAkJCSMgc3VwcHJlc3MgdGhlIG5leHQgdGVzdC4KIAkJCSMKIAkJCXVuc2V0IGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uCi0JCQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGV0aGVyX2hvc3R0b24gaXMgZGVjbGFyZWQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGV0aGVyX2hvc3R0b24gaXMgZGVjbGFyZWQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCisJCQlhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJldGhlcl9ob3N0dG9uIiAiYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24iICIKICNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CiAKLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIGV0aGVyX2hvc3R0b24KLSAgKHZvaWQpIGV0aGVyX2hvc3R0b247Ci0jZW5kaWYKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b249bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiA9IHllczsgdGhlbgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgPSB4eWVzOyB0aGVuIDoKIAogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTgotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTiAvKiovIiA+PmNvbmZkZWZzLmgKIAogCiBmaQpAQCAtNTUxMywxOCArNTE1MSw3IEBACiAJCSMgTm8sIHdlJ2xsIGhhdmUgdG8gZGVjbGFyZSBpdCBvdXJzZWx2ZXMuCiAJCSMgRG8gd2UgaGF2ZSAic3RydWN0IGV0aGVyX2FkZHIiPwogCQkjCi0JCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHJ1Y3QgZXRoZXJfYWRkciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHJ1Y3QgZXRoZXJfYWRkci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQorCQlhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3QgZXRoZXJfYWRkciIgImFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIiICIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpAQCAtNTUzNCw0OSArNTE2MSw4IEBACiAjaW5jbHVkZSA8bmV0L2lmLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgogCi0KLXR5cGVkZWYgc3RydWN0IGV0aGVyX2FkZHIgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHI9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX3N0cnVjdF9ldGhlcl9hZGRyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3N0cnVjdF9ldGhlcl9hZGRyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3N0cnVjdF9ldGhlcl9hZGRyIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIgPSB5ZXM7IHRoZW4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkciIgPSB4eWVzOyB0aGVuIDoKIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBIQVZFX1NUUlVDVF9FVEhFUl9BRERSIDEKQEAgLTU1ODYsMjMgKzUxNzIsMTkgQEAKIGZpCiAKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX0VUSEVSX0hPU1RUT04gMAotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTiAwIiA+PmNvbmZkZWZzLmgKIAogCWVsc2UKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX0VUSEVSX0hPU1RUT04gMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTiAxIiA+PmNvbmZkZWZzLmgKIAogCWZpCiBmaQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAtLWRpc2FibGUtcHJvdG9jaGFpbiBvcHRpb24gaXMgc3BlY2lmaWVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgLS1kaXNhYmxlLXByb3RvY2hhaW4gb3B0aW9uIGlzIHNwZWNpZmllZC4uLiAkRUNIT19DIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgLS1kaXNhYmxlLXByb3RvY2hhaW4gb3B0aW9uIGlzIHNwZWNpZmllZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAtLWRpc2FibGUtcHJvdG9jaGFpbiBvcHRpb24gaXMgc3BlY2lmaWVkLi4uICIgPiY2OyB9CiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcHJvdG9jaGFpbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9wcm90b2NoYWluK3NldH0iID0gc2V0OyB0aGVuCitpZiB0ZXN0ICIke2VuYWJsZV9wcm90b2NoYWluK3NldH0iID0gc2V0OyB0aGVuIDoKICAgZW5hYmxldmFsPSRlbmFibGVfcHJvdG9jaGFpbjsKIGZpCiAKQEAgLTU2MTQsMzggKzUxOTYsNTIgQEAKIAogaWYgdGVzdCAiJGVuYWJsZV9wcm90b2NoYWluIiA9ICJkaXNhYmxlZCI7IHRoZW4KIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTk9fUFJPVE9DSEFJTiAxCi1fQUNFT0YKKyRhc19lY2hvICIjZGVmaW5lIE5PX1BST1RPQ0hBSU4gMSIgPj5jb25mZGVmcy5oCiAKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7ZW5hYmxlX3Byb3RvY2hhaW59IiA+JjUKLWVjaG8gIiR7RUNIT19UfSR7ZW5hYmxlX3Byb3RvY2hhaW59IiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke2VuYWJsZV9wcm90b2NoYWlufSIgPiY1CiskYXNfZWNobyAiJHtlbmFibGVfcHJvdG9jaGFpbn0iID4mNjsgfQorCisjCisjIFNJVEEgc3VwcG9ydCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBuYXRpdmUgY2FwdHVyZSBzdXBwb3J0OworIyAiLS13aXRoLXNpdGEiIHNlbGVjdHMgU0lUQSBzdXBwb3J0LgorIworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNpdGEgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3NpdGErc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3NpdGE7CisJaWYgdGVzdCAhICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNJVEEgMSIgPj5jb25mZGVmcy5oCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBFbmFibGluZyBTSVRBIEFDTiBzdXBwb3J0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEVuYWJsaW5nIFNJVEEgQUNOIHN1cHBvcnQiID4mNjt9CisJCVZfUENBUD1zaXRhCisJCVZfRklOREFMTERFVlM9c2l0YQorCWZpCisKK2Vsc2UKIAogaWYgdGVzdCAteiAiJHdpdGhfcGNhcCIgJiYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBwY2FwIHR5cGUgbm90IGRldGVybWluZWQgd2hlbiBjcm9zcy1jb21waWxpbmc7IHVzZSAtLXdpdGgtcGNhcD0uLi4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcGNhcCB0eXBlIG5vdCBkZXRlcm1pbmVkIHdoZW4gY3Jvc3MtY29tcGlsaW5nOyB1c2UgLS13aXRoLXBjYXA9Li4uIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJYXNfZm5fZXJyb3IgJD8gInBjYXAgdHlwZSBub3QgZGV0ZXJtaW5lZCB3aGVuIGNyb3NzLWNvbXBpbGluZzsgdXNlIC0td2l0aC1wY2FwPS4uLiIgIiRMSU5FTk8iIDUKIGZpCiAKICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcGNhcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfcGNhcCtzZXR9IiA9IHNldDsgdGhlbgoraWYgdGVzdCAiJHt3aXRoX3BjYXArc2V0fSIgPSBzZXQ7IHRoZW4gOgogICB3aXRodmFsPSR3aXRoX3BjYXA7CiBmaQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBwYWNrZXQgY2FwdHVyZSB0eXBlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgcGFja2V0IGNhcHR1cmUgdHlwZS4uLiAkRUNIT19DIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgcGFja2V0IGNhcHR1cmUgdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBwYWNrZXQgY2FwdHVyZSB0eXBlLi4uICIgPiY2OyB9CiBpZiB0ZXN0ICEgLXogIiR3aXRoX3BjYXAiIDsgdGhlbgogCVZfUENBUD0iJHdpdGh2YWwiCi1lbGlmIHRlc3QgLXIgL2Rldi9icGYgOyB0aGVuCitlbGlmIHRlc3QgLXIgL2Rldi9icGYgLW8gLWggL2Rldi9icGYgOyB0aGVuCiAJIwogCSMgQ2xvbmluZyBCUEYgZGV2aWNlLgogCSMKIAlWX1BDQVA9YnBmCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfQ0xPTklOR19CUEYgMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0NMT05JTkdfQlBGIDEiID4+Y29uZmRlZnMuaAogCiBlbGlmIHRlc3QgLXIgL2Rldi9icGYwIDsgdGhlbgogCVZfUENBUD1icGYKQEAgLTU2NjgsMTAgKzUyNjQsMTAgQEAKIAkjIFdlIGNoZWNrIGZvciBvZG1pLmggaW5zdGVhZC4KIAkjCiAJVl9QQ0FQPWJwZgotZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9zeXMvZGxwaS5oIDsgdGhlbgotCVZfUENBUD1kbHBpCiBlbGlmIHRlc3QgLWMgL2Rldi9icGYwIDsgdGhlbgkJIyBjaGVjayBhZ2FpbiBpbiBjYXNlIG5vdCByZWFkYWJsZQogCVZfUENBUD1icGYKK2VsaWYgdGVzdCAtciAvdXNyL2luY2x1ZGUvc3lzL2RscGkuaCA7IHRoZW4KKwlWX1BDQVA9ZGxwaQogZWxpZiB0ZXN0IC1jIC9kZXYvZW5ldCA7IHRoZW4JCSMgY2hlY2sgYWdhaW4gaW4gY2FzZSBub3QgcmVhZGFibGUKIAlWX1BDQVA9ZW5ldAogZWxpZiB0ZXN0IC1jIC9kZXYvbml0IDsgdGhlbgkJIyBjaGVjayBhZ2FpbiBpbiBjYXNlIG5vdCByZWFkYWJsZQpAQCAtNTY3OSw4ICs1Mjc1LDYwOCBAQAogZWxzZQogCVZfUENBUD1udWxsCiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkVl9QQ0FQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRWX1BDQVAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRWX1BDQVAiID4mNQorJGFzX2VjaG8gIiRWX1BDQVAiID4mNjsgfQorCisjCisjIERvIGNhcHR1cmUtbWVjaGFuaXNtLWRlcGVuZGVudCB0ZXN0cy4KKyMKK2Nhc2UgIiRWX1BDQVAiIGluCitkbHBpKQorCSMKKwkjIE5lZWRlZCBmb3IgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHBjYXAtW2RscGksbGliZGxwaV0uYworCSMKKyAJU1NSQz0iZGxwaXN1YnMuYyIKKworCSMKKwkjIENoZWNrcyBmb3Igc29tZSBoZWFkZXIgZmlsZXMuCisJIworCWZvciBhY19oZWFkZXIgaW4gc3lzL2J1Zm1vZC5oIHN5cy9kbHBpX2V4dC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCSMKKwkjIENoZWNrcyB0byBzZWUgaWYgU29sYXJpcyBoYXMgdGhlIHB1YmxpYyBsaWJkbHBpKDNMSUIpIGxpYnJhcnkuCisJIyBOb3RlOiBUaGUgZXhpc3RlbmNlIG9mIC91c3IvaW5jbHVkZS9saWJkbHBpLmggZG9lcyBub3QgbWVhbiBpdCBpcyB0aGUKKwkjIHB1YmxpYyBsaWJkbHBpKDNMSUIpIHZlcnNpb24uIEJlZm9yZSBsaWJkbHBpIHdhcyBtYWRlIHB1YmxpYywgYQorCSMgcHJpdmF0ZSB2ZXJzaW9uIGFsc28gZXhpc3RlZCwgd2hpY2ggZGlkIG5vdCBoYXZlIHRoZSBzYW1lIEFQSXMuCisJIyBEdWUgdG8gYSBnY2MgYnVnLCB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgMzItYml0IGxpYnJhcmllcyBkb2VzCisJIyBub3QgaW5jbHVkZSAvbGliLCB3ZSBhZGQgaXQgZXhwbGljaXRseSBoZXJlLgorCSMgW2h0dHA6Ly9idWdzLm9wZW5zb2xhcmlzLm9yZy92aWV3X2J1Zy5kbz9idWdfaWQ9NjYxOTQ4NV0uCisJIyBBbHNvLCBkdWUgdG8gdGhlIGJ1ZyBhYm92ZSBhcHBsaWNhdGlvbnMgdGhhdCBsaW5rIHRvIGxpYnBjYXAgd2l0aAorCSMgbGliZGxwaSB3aWxsIGhhdmUgdG8gYWRkICItTC9saWIiIG9wdGlvbiB0byAiY29uZmlndXJlIi4KKwkjCisJc2F2ZWRfbGRmbGFncz0kTERGTEFHUworCUxERkxBR1M9IiRMSUJTIC1ML2xpYiIKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbHBpX3dhbGsgaW4gLWxkbHBpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbHBpX3dhbGsgaW4gLWxkbHBpLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbHBpX2RscGlfd2Fsays6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxwaSAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxwaV93YWxrICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxwaV93YWxrICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbHBpX2RscGlfd2Fsaz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RscGlfZGxwaV93YWxrPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbHBpX2RscGlfd2FsayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbHBpX2RscGlfd2FsayIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbHBpX2RscGlfd2FsayIgPSB4eWVzOyB0aGVuIDoKKworCQkJTElCUz0iLWxkbHBpICRMSUJTIgorCQkJVl9QQ0FQPWxpYmRscGkKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJETFBJIDEiID4+Y29uZmRlZnMuaAorCisKK2Vsc2UKKyAgVl9QQ0FQPWRscGkKK2ZpCisKKwlMREZMQUdTPSRzYXZlZF9sZGZsYWdzCisKKwkjCisJIyBDaGVja3Mgd2hldGhlciA8c3lzL2RscGkuaD4gaXMgdXNhYmxlLCB0byBjYXRjaCB3ZWlyZCBTQ08KKwkjIHZlcnNpb25zIG9mIERMUEkuCisJIworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciA8c3lzL2RscGkuaD4gaXMgdXNhYmxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgPHN5cy9kbHBpLmg+IGlzIHVzYWJsZS4uLiAiID4mNjsgfQorCWlmICR7YWNfY3Zfc3lzX2RscGlfdXNhYmxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisJCQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCQkjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKwkJCSNpbmNsdWRlIDxzeXMvZGxwaS5oPgorCitpbnQKK21haW4gKCkKK3sKK2ludCBpID0gRExfUFJPTUlTQ19QSFlTOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19kbHBpX3VzYWJsZT15ZXMKK2Vsc2UKKyAgYWNfY3Zfc3lzX2RscGlfdXNhYmxlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zeXNfZGxwaV91c2FibGUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zeXNfZGxwaV91c2FibGUiID4mNjsgfQorCWlmIHRlc3QgJGFjX2N2X3N5c19kbHBpX3VzYWJsZSA9IG5vIDsgdGhlbgorCQlhc19mbl9lcnJvciAkPyAiPHN5cy9kbHBpLmg+IGlzIG5vdCB1c2FibGUgb24gdGhpcyBzeXN0ZW07IGl0IHByb2JhYmx5IGhhcyBhIG5vbi1zdGFuZGFyZCBETFBJIiAiJExJTkVOTyIgNQorCWZpCisKKwkjCisJIyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSAvZGV2L2RscGkgZGV2aWNlIG9yIGhhdmUgbXVsdGlwbGUgZGV2aWNlcy4KKwkjCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgL2Rldi9kbHBpIGRldmljZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgL2Rldi9kbHBpIGRldmljZS4uLiAiID4mNjsgfQorCWlmIHRlc3QgLWMgL2Rldi9kbHBpIDsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RFVl9ETFBJIDEiID4+Y29uZmRlZnMuaAorCisJZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJZGlyPSIvZGV2L2RscGkiCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRkaXIgZGlyZWN0b3J5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkZGlyIGRpcmVjdG9yeS4uLiAiID4mNjsgfQorCQlpZiB0ZXN0IC1kICRkaXIgOyB0aGVuCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBDQVBfREVWX1BSRUZJWCAiJGRpciIKK19BQ0VPRgorCisJCWVsc2UKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlmaQorCWZpCisKKwkjCisJIyBUaGlzIGNoZWNrIGlzIGZvciBTb2xhcmlzIHdpdGggRExQSSBzdXBwb3J0IGZvciBwYXNzaXZlIG1vZGVzLgorCSMgU2VlIGRscGkoN1ApIGZvciBtb3JlIGRldGFpbHMuCisJIworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgZGxfcGFzc2l2ZV9yZXFfdCBzdHJ1Y3QgZXhpc3RzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGRsX3Bhc3NpdmVfcmVxX3Qgc3RydWN0IGV4aXN0cy4uLiAiID4mNjsgfQorICAgICAgIGlmICR7YWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjICAgICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgICAgICBpbmNsdWRlIDxzeXMvZGxwaS5oPgoraW50CittYWluICgpCit7Cit1X2ludCBpID0gc2l6ZW9mKGRsX3Bhc3NpdmVfcmVxX3QpCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90PXllcworZWxzZQorICBhY19jdl9sYmxfaGFzX2RsX3Bhc3NpdmVfcmVxX3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdCIgPiY2OyB9CisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90ID0geWVzIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RMUElfUEFTU0lWRSAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisJOzsKKworbGludXgpCisJIworCSMgRG8gd2UgaGF2ZSB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucz8KKwkjCisJZm9yIGFjX2hlYWRlciBpbiBsaW51eC93aXJlbGVzcy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsaW51eC93aXJlbGVzcy5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3dpcmVsZXNzX2giICIKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF93aXJlbGVzc19oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfV0lSRUxFU1NfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKwkjCisJIyBEbyB3ZSBoYXZlIGxpYm5sPworCSMKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJubCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbGlibmwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2xpYm5sOyB3aXRoX2xpYm5sPSR3aXRodmFsCitmaQorCisKKwlpZiB0ZXN0IHgkd2l0aF9saWJubCAhPSB4bm8gOyB0aGVuCisJCWhhdmVfYW55X25sPSJubyIKKworCQkjCisJCSMgVHJ5IGxpYm5sIDMueCBmaXJzdC4KKwkJIworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBubF9zb2NrZXRfYWxsb2MgaW4gLWxubC0zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBubF9zb2NrZXRfYWxsb2MgaW4gLWxubC0zLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9ubF8zX25sX3NvY2tldF9hbGxvYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sbmwtMyAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgbmxfc29ja2V0X2FsbG9jICgpOworaW50CittYWluICgpCit7CityZXR1cm4gbmxfc29ja2V0X2FsbG9jICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9ubF8zX25sX3NvY2tldF9hbGxvYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25sXzNfbmxfc29ja2V0X2FsbG9jPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ubF8zX25sX3NvY2tldF9hbGxvYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9ubF8zX25sX3NvY2tldF9hbGxvYyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ubF8zX25sX3NvY2tldF9hbGxvYyIgPSB4eWVzOyB0aGVuIDoKKworCQkJIworCQkJIyBZZXMsIHdlIGhhdmUgbGlibmwgMy54LgorCQkJIworCQkJTElCUz0iLWxubC1nZW5sLTMgLWxubC0zICRMSUJTIgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQk5MIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCTkxfM194IDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCTkxfTkxFIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCTkxfU09DS0VUUyAxIiA+PmNvbmZkZWZzLmgKKworCQkJVl9JTkNMUz0iJFZfSU5DTFMgLUkvdXNyL2luY2x1ZGUvbGlibmwzIgorCQkJaGF2ZV9hbnlfbmw9InllcyIKKworZmkKKworCisJCWlmIHRlc3QgeCRoYXZlX2FueV9ubCA9IHhubyA7IHRoZW4KKwkJCSMKKwkJCSMgVHJ5IGxpYm5sIDIueAorCQkJIworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbmxfc29ja2V0X2FsbG9jIGluIC1sbmwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5sX3NvY2tldF9hbGxvYyBpbiAtbG5sLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9ubF9ubF9zb2NrZXRfYWxsb2MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG5sICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBubF9zb2NrZXRfYWxsb2MgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBubF9zb2NrZXRfYWxsb2MgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX25sX25sX3NvY2tldF9hbGxvYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25sX25sX3NvY2tldF9hbGxvYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbmxfbmxfc29ja2V0X2FsbG9jIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX25sX25sX3NvY2tldF9hbGxvYyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ubF9ubF9zb2NrZXRfYWxsb2MiID0geHllczsgdGhlbiA6CisKKwkJCQkjCisJCQkJIyBZZXMsIHdlIGhhdmUgbGlibmwgMi54LgorCQkJCSMKKwkJCQlMSUJTPSItbG5sLWdlbmwgLWxubCAkTElCUyIKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJOTCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQk5MXzJfeCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQk5MX05MRSAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQk5MX1NPQ0tFVFMgMSIgPj5jb25mZGVmcy5oCisKKwkJCQloYXZlX2FueV9ubD0ieWVzIgorCitmaQorCisJCWZpCisKKwkJaWYgdGVzdCB4JGhhdmVfYW55X25sID0geG5vIDsgdGhlbgorCQkJIworCQkJIyBObywgd2UgZG9uJ3Q7IGRvIHdlIGhhdmUgbGlibmwgMS54PworCQkJIworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbmxfaGFuZGxlX2FsbG9jIGluIC1sbmwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5sX2hhbmRsZV9hbGxvYyBpbiAtbG5sLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9ubF9ubF9oYW5kbGVfYWxsb2MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG5sICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBubF9oYW5kbGVfYWxsb2MgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBubF9oYW5kbGVfYWxsb2MgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX25sX25sX2hhbmRsZV9hbGxvYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25sX25sX2hhbmRsZV9hbGxvYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbmxfbmxfaGFuZGxlX2FsbG9jIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX25sX25sX2hhbmRsZV9hbGxvYyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ubF9ubF9oYW5kbGVfYWxsb2MiID0geHllczsgdGhlbiA6CisKKwkJCQkjCisJCQkJIyBZZXMuCisJCQkJIworCQkJCUxJQlM9Ii1sbmwgJExJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCTkwgMSIgPj5jb25mZGVmcy5oCisKKwkJCQloYXZlX2FueV9ubD0ieWVzIgorCitmaQorCisJCWZpCisKKwkJaWYgdGVzdCB4JGhhdmVfYW55X25sID0geG5vIDsgdGhlbgorCQkJIworCQkJIyBObywgd2UgZG9uJ3QgaGF2ZSBsaWJubCBhdCBhbGwuCisJCQkjCisJCQlpZiB0ZXN0IHgkd2l0aF9saWJubCA9IHh5ZXMgOyB0aGVuCisJCQkJYXNfZm5fZXJyb3IgJD8gImxpYm5sIHN1cHBvcnQgcmVxdWVzdGVkIGJ1dCBsaWJubCBub3QgZm91bmQiICIkTElORU5PIiA1CisJCQlmaQorCQlmaQorCWZpCisKKwlmb3IgYWNfaGVhZGVyIGluIGxpbnV4L2V0aHRvb2wuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibGludXgvZXRodG9vbC5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2V0aHRvb2xfaCIgIgorJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9ldGh0b29sX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSU5VWF9FVEhUT09MX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgaWZfcGFja2V0LmggaGFzIHRwYWNrZXRfc3RhdHMgZGVmaW5lZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBpZl9wYWNrZXQuaCBoYXMgdHBhY2tldF9zdGF0cyBkZWZpbmVkLi4uICIgPiY2OyB9CisgICBpZiAke2FjX2N2X2xibF90cGFja2V0X3N0YXRzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjICBpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IHRwYWNrZXRfc3RhdHMgc3RhdHMKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9sYmxfdHBhY2tldF9zdGF0cz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGJsX3RwYWNrZXRfc3RhdHM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX3RwYWNrZXRfc3RhdHMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfdHBhY2tldF9zdGF0cyIgPiY2OyB9CisgICBpZiB0ZXN0ICRhY19jdl9sYmxfdHBhY2tldF9zdGF0cyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1RQQUNLRVRfU1RBVFMgMSIgPj5jb25mZGVmcy5oCisKKyAgIGZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0cGFja2V0X2F1eGRhdGEgc3RydWN0IGhhcyB0cF92bGFuX3RjaSBtZW1iZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdHBhY2tldF9hdXhkYXRhIHN0cnVjdCBoYXMgdHBfdmxhbl90Y2kgbWVtYmVyLi4uICIgPiY2OyB9CisgICAgaWYgJHthY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KK2ludAorbWFpbiAoKQorewordV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCB0cGFja2V0X2F1eGRhdGEgKikwKS0+dHBfdmxhbl90Y2kpCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2kiID4mNjsgfQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2kgPSB5ZXMgOyB0aGVuCisJICAgIEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBPXRwX3ZsYW5fdGNpCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCTs7CisKK2JwZikKKwkjCisJIyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdGhlICpCU0Qtc3R5bGUgaW9jdGxzLgorCSMKKwlmb3IgYWNfaGVhZGVyIGluIG5ldC9pZl9tZWRpYS5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJuZXQvaWZfbWVkaWEuaCIgImFjX2N2X2hlYWRlcl9uZXRfaWZfbWVkaWFfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmV0X2lmX21lZGlhX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ORVRfSUZfTUVESUFfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBzdXBwb3J0cyB6ZXJvY29weSBCUEYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgc3lzdGVtIHN1cHBvcnRzIHplcm9jb3B5IEJQRi4uLiAiID4mNjsgfQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisJICAgICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKwkgICAgI2luY2x1ZGUgPG5ldC9pZi5oPgorCSAgICAjaW5jbHVkZSA8bmV0L2JwZi5oPgoraW50CittYWluICgpCit7CityZXR1cm4gKEJJT0NST1RaQlVGICsgQlBGX0JVRk1PREVfWkJVRik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1pFUk9DT1BZX0JQRiAxIiA+PmNvbmZkZWZzLmgKKworCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisJICAgICMKKwkgICAgIyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgc3RydWN0IEJQRl9USU1FVkFMLgorCSAgICAjCisJICAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBCUEZfVElNRVZBTCIgImFjX2N2X3R5cGVfc3RydWN0X0JQRl9USU1FVkFMIiAiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaWZkZWYgSEFWRV9TWVNfSU9DQ09NX0gKKyNpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXQvYnBmLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zdHJ1Y3RfQlBGX1RJTUVWQUwiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfQlBGX1RJTUVWQUwgMQorX0FDRU9GCisKKworZmkKKworCTs7CisKK2RhZykKKwlWX0RFRlM9IiRWX0RFRlMgLUREQUdfT05MWSIKKwk7OworCitzZXB0ZWwpCisJVl9ERUZTPSIkVl9ERUZTIC1EU0VQVEVMX09OTFkiCisJOzsKKworc25mKQorCVZfREVGUz0iJFZfREVGUyAtRFNORl9PTkxZIgorCTs7CisKK251bGwpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYW5ub3QgZGV0ZXJtaW5lIHBhY2tldCBjYXB0dXJlIGludGVyZmFjZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYW5ub3QgZGV0ZXJtaW5lIHBhY2tldCBjYXB0dXJlIGludGVyZmFjZSIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IChzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IChzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pIiA+JjI7fQorCTs7Citlc2FjCiAKIGlmIHRlc3QgIiRWX1BDQVAiID0gbnVsbAogdGhlbgpAQCAtNTY5MCwyMTkgKzU4ODYsMTUgQEAKIAkjCiAJVl9GSU5EQUxMREVWUz1udWxsCiBlbHNlCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdldGlmYWRkcnMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ2V0aWZhZGRycy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19nZXRpZmFkZHJzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lIGdldGlmYWRkcnMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXRpZmFkZHJzLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lIGdldGlmYWRkcnMgaW5ub2N1b3VzX2dldGlmYWRkcnMKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgZ2V0aWZhZGRycyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiBnZXRpZmFkZHJzCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2V0aWZhZGRycyAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViX2dldGlmYWRkcnMgfHwgZGVmaW5lZCBfX3N0dWJfX19nZXRpZmFkZHJzCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGlmYWRkcnMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9mdW5jX2dldGlmYWRkcnM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9mdW5jX2dldGlmYWRkcnM9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfZ2V0aWZhZGRycyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19nZXRpZmFkZHJzIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aWZhZGRycyA9IHllczsgdGhlbgorCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGlmYWRkcnMiICJhY19jdl9mdW5jX2dldGlmYWRkcnMiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0aWZhZGRycyIgPSB4eWVzOyB0aGVuIDoKIAogCQkjCiAJCSMgV2UgaGF2ZSAiZ2V0aWZhZGRycygpIjsgbWFrZSBzdXJlIHdlIGhhdmUgPGlmYWRkcnMuaD4KIAkJIyBhcyB3ZWxsLCBqdXN0IGluIGNhc2Ugc29tZSBwbGF0Zm9ybSBpcyByZWFsbHkgd2VpcmQuCiAJCSMKLQkJaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfaWZhZGRyc19oK3NldH0iID0gc2V0OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpZmFkZHJzLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaWZhZGRycy5oLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfaWZhZGRyc19oK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lmYWRkcnNfaCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2lmYWRkcnNfaCIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWZhZGRycy5oIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGlmYWRkcnMuaCB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaW5jbHVkZSA8aWZhZGRycy5oPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hlYWRlcl9jb21waWxlcj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWZhZGRycy5oIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWZhZGRycy5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8aWZhZGRycy5oPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQotCi0jIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLWNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KLSAgeWVzOm5vOiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaWZhZGRycy5oOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogaWZhZGRycy5oOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGlmYWRkcnMuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlmYWRkcnMuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaWZhZGRycy5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZmFkZHJzLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpZmFkZHJzLmg6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZmFkZHJzLmg6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaWZhZGRycy5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZmFkZHJzLmg6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpZmFkZHJzLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZmFkZHJzLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaWZhZGRycy5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlmYWRkcnMuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaWZhZGRycy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZmFkZHJzLmg6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaWZhZGRycy5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGlmYWRkcnMuaC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2lmYWRkcnNfaCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9oZWFkZXJfaWZhZGRyc19oPSRhY19oZWFkZXJfcHJlcHJvYwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9pZmFkZHJzX2giID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9pZmFkZHJzX2giID4mNjsgfQotCi1maQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2lmYWRkcnNfaCA9IHllczsgdGhlbgorCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiaWZhZGRycy5oIiAiYWNfY3ZfaGVhZGVyX2lmYWRkcnNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfaWZhZGRyc19oIiA9IHh5ZXM7IHRoZW4gOgogCiAJCSAgICAjCiAJCSAgICAjIFdlIGhhdmUgdGhlIGhlYWRlciwgc28gd2UgdXNlICJnZXRpZmFkZHJzKCkiIHRvCkBAIC01OTIxLDkgKzU5MTMsNyBAQAogCQkgICAgIyBidXQgd2l0aG91dCAiaWZhZGRycy5oIiwgaWYgdGhlcmUgaXMgc29tZXRoaW5nCiAJCSAgICAjIHdlIGNhbiBkbyBvbiB0aG9zZSBzeXN0ZW1zLgogCQkgICAgIwotCQkgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogWW91ciBzeXN0ZW0gaGFzIGdldGlmYWRkcnMoKSBidXQgZG9lc24ndCBoYXZlIGEgdXNhYmxlIDxpZmFkZHJzLmg+LiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBZb3VyIHN5c3RlbSBoYXMgZ2V0aWZhZGRycygpIGJ1dCBkb2Vzbid0IGhhdmUgYSB1c2FibGUgPGlmYWRkcnMuaD4uIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJCSAgICBhc19mbl9lcnJvciAkPyAiWW91ciBzeXN0ZW0gaGFzIGdldGlmYWRkcnMoKSBidXQgZG9lc24ndCBoYXZlIGEgdXNhYmxlIDxpZmFkZHJzLmg+LiIgIiRMSU5FTk8iIDUKIAogZmkKIApAQCAtNTk0MCwyMyArNTkzMCwxOSBAQAogCQkjCiAJCWNhc2UgIiRWX1BDQVAiIGluCiAKLQkJZGxwaSkKKwkJZGxwaXxsaWJkbHBpKQogCQkJIwogCQkJIyBUaGlzIG1pZ2h0IGJlIFNvbGFyaXMgOCBvciBsYXRlciwgd2l0aAogCQkJIyBTSU9DR0xJRkNPTkYsIG9yIGl0IG1pZ2h0IGJlIHNvbWUgb3RoZXIgT1MKIAkJCSMgb3Igc29tZSBvbGRlciB2ZXJzaW9uIG9mIFNvbGFyaXMsIHdpdGgKIAkJCSMganVzdCBTSU9DR0lGQ09ORi4KIAkJCSMKLQkJCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBTSU9DR0xJRkNPTkYiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU0lPQ0dMSUZDT05GLi4uICRFQ0hPX0MiID4mNjsgfQotCQkJaWYgdGVzdCAiJHthY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmYrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIFNJT0NHTElGQ09ORiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU0lPQ0dMSUZDT05GLi4uICIgPiY2OyB9CisJCQlpZiAke2FjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAJCQkJI2luY2x1ZGUgPHN5cy9maWxlLmg+CkBAIC01OTcxLDM2ICs1OTU3LDE2IEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZj15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZj1ubworICBhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmY9bm8KIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmYiID4mNjsgfQorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmYiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmYiID4mNjsgfQogCQkJaWYgdGVzdCAkYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mID0geWVzIDsgdGhlbgogCQkJCVZfRklOREFMTERFVlM9Z2xpZmMKIAkJCWVsc2UKQEAgLTYwMjIsMzYxICs1OTg4LDEwMSBAQAogCiBmaQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAtLWVuYWJsZS1pcHY2IG9wdGlvbiBpcyBzcGVjaWZpZWQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAtLWVuYWJsZS1pcHY2IG9wdGlvbiBpcyBzcGVjaWZpZWQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtaXB2NiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9pcHY2K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0kZW5hYmxlX2lwdjY7CiBmaQogCi1pZiB0ZXN0ICIkZW5hYmxlX2lwdjYiID0gInllcyI7IHRoZW4KIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSU5FVDYgMQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrbGVuX3QuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitpbnQKK21haW4gKCkKK3sKKyBzb2NrbGVuX3QgeDsKKyAgOworICByZXR1cm4gMDsKK30KIF9BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBoYXZlX3NvY2tsZW5fdD15ZXMKK2Vsc2UKKyAgaGF2ZV9zb2NrbGVuX3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgIngkaGF2ZV9zb2NrbGVuX3QiID0gInh5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU09DS0xFTl9UIDEiID4+Y29uZmRlZnMuaAogCiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAke2VuYWJsZV9pcHY2LW5vfSIgPiY1Ci1lY2hvICIke0VDSE9fVH0ke2VuYWJsZV9pcHY2LW5vfSIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhdmVfc29ja2xlbl90IiA+JjUKKyRhc19lY2hvICIkaGF2ZV9zb2NrbGVuX3QiID4mNjsgfQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIG9wdGltaXplciBkZWJ1Z2dpbmcgY29kZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgb3B0aW1pemVyIGRlYnVnZ2luZyBjb2RlLi4uICRFQ0hPX0MiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlwdjYgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfaXB2NitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2lwdjY7CitlbHNlCisgIGVuYWJsZV9pcHY2PWlmYXZhaWxhYmxlCitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX2lwdjYiICE9ICJubyI7IHRoZW4KKwlhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRhZGRyaW5mbyIgImFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0YWRkcmluZm8iID0geHllczsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgSU5FVDYgMSIgPj5jb25mZGVmcy5oCisKKworZWxzZQorCisJCWlmIHRlc3QgIiRlbmFibGVfaXB2NiIgIT0gImlmYXZhaWxhYmxlIjsgdGhlbgorCQkJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiLS1lbmFibGUtaXB2NiB3YXMgZ2l2ZW4sIGJ1dCBnZXRhZGRyaW5mbyBpc24ndCBhdmFpbGFibGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisJCWZpCisKK2ZpCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBvcHRpbWl6ZXIgZGVidWdnaW5nIGNvZGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBvcHRpbWl6ZXIgZGVidWdnaW5nIGNvZGUuLi4gIiA+JjY7IH0KICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vcHRpbWl6ZXItZGJnIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX29wdGltaXplcl9kYmcrc2V0fSIgPSBzZXQ7IHRoZW4KK2lmIHRlc3QgIiR7ZW5hYmxlX29wdGltaXplcl9kYmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICBlbmFibGV2YWw9JGVuYWJsZV9vcHRpbWl6ZXJfZGJnOwogZmkKIAogaWYgdGVzdCAiJGVuYWJsZV9vcHRpbWl6ZXJfZGJnIiA9ICJ5ZXMiOyB0aGVuCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEJERUJVRyAxCi1fQUNFT0YKKyRhc19lY2hvICIjZGVmaW5lIEJERUJVRyAxIiA+PmNvbmZkZWZzLmgKIAogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtlbmFibGVfb3B0aW1pemVyX2RiZy1ub30iID4mNQotZWNobyAiJHtFQ0hPX1R9JHtlbmFibGVfb3B0aW1pemVyX2RiZy1ub30iID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7ZW5hYmxlX29wdGltaXplcl9kYmctbm99IiA+JjUKKyRhc19lY2hvICIke2VuYWJsZV9vcHRpbWl6ZXJfZGJnLW5vfSIgPiY2OyB9CiAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcGFyc2VyIGRlYnVnZ2luZyBjb2RlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBwYXJzZXIgZGVidWdnaW5nIGNvZGUuLi4gJEVDSE9fQyIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcGFyc2VyIGRlYnVnZ2luZyBjb2RlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcGFyc2VyIGRlYnVnZ2luZyBjb2RlLi4uICIgPiY2OyB9CiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUteXlkZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV95eWRlYnVnK3NldH0iID0gc2V0OyB0aGVuCitpZiB0ZXN0ICIke2VuYWJsZV95eWRlYnVnK3NldH0iID0gc2V0OyB0aGVuIDoKICAgZW5hYmxldmFsPSRlbmFibGVfeXlkZWJ1ZzsKIGZpCiAKIGlmIHRlc3QgIiRlbmFibGVfeXlkZWJ1ZyIgPSAieWVzIjsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBZWURFQlVHIDEKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgWVlERUJVRyAxIiA+PmNvbmZkZWZzLmgKIAogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHtlbmFibGVfeXlkZWJ1Zy1ub30iID4mNQotZWNobyAiJHtFQ0hPX1R9JHtlbmFibGVfeXlkZWJ1Zy1ub30iID4mNjsgfQotCi1jYXNlICIkVl9QQ0FQIiBpbgotCi1kbHBpKQotCi0KLWZvciBhY19oZWFkZXIgaW4gc3lzL2J1Zm1vZC5oIHN5cy9kbHBpX2V4dC5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWVsc2UKLSAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotICB5ZXM6bm86ICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgL2Rldi9kbHBpIGRldmljZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAvZGV2L2RscGkgZGV2aWNlLi4uICRFQ0hPX0MiID4mNjsgfQotCWlmIHRlc3QgLWMgL2Rldi9kbHBpIDsgdGhlbgotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFVl9ETFBJIDEKLV9BQ0VPRgotCi0JZWxzZQotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQkJZGlyPSIvZGV2L2RscGkiCi0JCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkZGlyIGRpcmVjdG9yeSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkZGlyIGRpcmVjdG9yeS4uLiAkRUNIT19DIiA+JjY7IH0KLQkJaWYgdGVzdCAtZCAkZGlyIDsgdGhlbgotCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQ0FQX0RFVl9QUkVGSVggIiRkaXIiCi1fQUNFT0YKLQotCQllbHNlCi0JCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQkJZmkKLQlmaQotCTs7Ci0KLWxpbnV4KQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgTGludXgga2VybmVsIHZlcnNpb24uLi4gJEVDSE9fQyIgPiY2OyB9Ci0gCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gCQlpZiB0ZXN0ICIke2FjX2N2X2xpbnV4X3ZlcnMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfbGludXhfdmVycz11bmtub3duCi1maQotCi0gCWVsc2UKLSAJCWlmIHRlc3QgIiR7YWNfY3ZfbGludXhfdmVycytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9saW51eF92ZXJzPWB1bmFtZSAtciAyPiYxIHwgXAotIAkJCXNlZCAtbiAtZSAnJHMvLiogLy8nIC1lICckcy9cLi4qLy9wJ2AKLWZpCi0KLSAJZmkKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saW51eF92ZXJzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saW51eF92ZXJzIiA+JjY7IH0KLSAJaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyA9IHVua25vd24gOyB0aGVuCi0gCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGxpbnV4IHZlcnNpb24gd2hlbiBjcm9zcy1jb21waWxpbmciID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGRldGVybWluZSBsaW51eCB2ZXJzaW9uIHdoZW4gY3Jvc3MtY29tcGlsaW5nIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gCWZpCi0JaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyAtbHQgMiA7IHRoZW4KLQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdmVyc2lvbiAyIG9yIGhpZ2hlciByZXF1aXJlZDsgc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHZlcnNpb24gMiBvciBoaWdoZXIgcmVxdWlyZWQ7IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCWZpCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgaWZfcGFja2V0LmggaGFzIHRwYWNrZXRfc3RhdHMgZGVmaW5lZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIGlmX3BhY2tldC5oIGhhcyB0cGFja2V0X3N0YXRzIGRlZmluZWQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gICBpZiB0ZXN0ICIke2FjX2N2X2xibF90cGFja2V0X3N0YXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jICBpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KLWludAotbWFpbiAoKQotewotc3RydWN0IHRwYWNrZXRfc3RhdHMgc3RhdHMKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9sYmxfdHBhY2tldF9zdGF0cz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF90cGFja2V0X3N0YXRzPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLSAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF90cGFja2V0X3N0YXRzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfdHBhY2tldF9zdGF0cyIgPiY2OyB9Ci0gICBpZiB0ZXN0ICRhY19jdl9sYmxfdHBhY2tldF9zdGF0cyA9IHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1RQQUNLRVRfU1RBVFMgMQotX0FDRU9GCi0KLSAgIGZpCi0JOzsKLQotZGFnKQotCVZfREVGUz0iJFZfREVGUyAtRERBR19PTkxZIgotCTs7Ci0KLXNlcHRlbCkKLQlWX0RFRlM9IiRWX0RFRlMgLURTRVBURUxfT05MWSIKLQk7OwotCi1udWxsKQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhbm5vdCBkZXRlcm1pbmUgcGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogY2Fubm90IGRldGVybWluZSBwYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAoc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKSIgPiYyO30KLQk7OwotCi1lc2FjCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSAvcHJvYy9uZXQvZGV2IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIC9wcm9jL25ldC9kZXYuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0IC1yIC9wcm9jL25ldC9kZXYgOyB0aGVuCi0JYWNfY3ZfbGJsX3Byb2NfbmV0X2Rldj15ZXMKLWVsc2UKLQlhY19jdl9sYmxfcHJvY19uZXRfZGV2PW5vCi1maQotaWYgdGVzdCAkYWNfY3ZfbGJsX3Byb2NfbmV0X2RldiA9IHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1BST0NfTkVUX0RFViAxCi1fQUNFT0YKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9wcm9jX25ldF9kZXYiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9wcm9jX25ldF9kZXYiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7ZW5hYmxlX3l5ZGVidWctbm99IiA+JjUKKyRhc19lY2hvICIke2VuYWJsZV95eWRlYnVnLW5vfSIgPiY2OyB9CiAKICMgQ2hlY2sgZm9yIEVuZGFjZSBEQUcgY2FyZCBzdXBwb3J0LgogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZGFnK3NldH0iID0gc2V0OyB0aGVuCitpZiB0ZXN0ICIke3dpdGhfZGFnK3NldH0iID0gc2V0OyB0aGVuIDoKICAgd2l0aHZhbD0kd2l0aF9kYWc7CiAJaWYgdGVzdCAiJHdpdGh2YWwiID0gbm8KIAl0aGVuCkBAIC02NDA0LDcgKzYxMTAsNyBAQAogCiAKICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGFnLWluY2x1ZGVzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9kYWdfaW5jbHVkZXMrc2V0fSIgPSBzZXQ7IHRoZW4KK2lmIHRlc3QgIiR7d2l0aF9kYWdfaW5jbHVkZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICB3aXRodmFsPSR3aXRoX2RhZ19pbmNsdWRlczsKIAkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYW5kIGhhcyBzcGVjaWZpZWQgYSBoZWFkZXIgZGlyZWN0b3J5LCBzbyB1c2UgdGhlIHByb3ZpZGVkIHZhbHVlLgogCXdhbnRfZGFnPXllcwpAQCAtNjQxNSw3ICs2MTIxLDcgQEAKIAogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhZy1saWJyYXJpZXMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2RhZ19saWJyYXJpZXMrc2V0fSIgPSBzZXQ7IHRoZW4KK2lmIHRlc3QgIiR7d2l0aF9kYWdfbGlicmFyaWVzK3NldH0iID0gc2V0OyB0aGVuIDoKICAgd2l0aHZhbD0kd2l0aF9kYWdfbGlicmFyaWVzOwogCSMgVXNlciB3YW50cyBEQUcgc3VwcG9ydCBhbmQgaGFzIHNwZWNpZmllZCBhIGxpYnJhcnkgZGlyZWN0b3J5LCBzbyB1c2UgdGhlIHByb3ZpZGVkIHZhbHVlLgogCXdhbnRfZGFnPXllcwpAQCAtNjQzOSw5ICs2MTQ1LDcgQEAKIAkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCiAJIwogCWlmIHRlc3QgJHdhbnRfZGFnID0geWVzOyB0aGVuCi0JCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IERBRyBzdXBwb3J0IGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggJ2xpbnV4JyAnYnBmJyBhbmQgJ2RhZycgcGFja2V0IGNhcHR1cmUgdHlwZXMiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogREFHIHN1cHBvcnQgaXMgb25seSBhdmFpbGFibGUgd2l0aCAnbGludXgnICdicGYnIGFuZCAnZGFnJyBwYWNrZXQgY2FwdHVyZSB0eXBlcyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQlhc19mbl9lcnJvciAkPyAiREFHIHN1cHBvcnQgaXMgb25seSBhdmFpbGFibGUgd2l0aCAnbGludXgnICdicGYnIGFuZCAnZGFnJyBwYWNrZXQgY2FwdHVyZSB0eXBlcyIgIiRMSU5FTk8iIDUKIAllbGlmIHRlc3QgJHdhbnRfZGFnID0geWVzOyB0aGVuCiAJCXdhbnRfZGFnPW5vCiAJZmkKQEAgLTY0NTEsOCArNjE1NSw4IEBACiBhY19jdl9sYmxfZGFnX2FwaT1ubwogaWYgdGVzdCAiJHdhbnRfZGFnIiAhPSBubzsgdGhlbgogCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIERBRyBBUEkgaGVhZGVycyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBEQUcgQVBJIGhlYWRlcnMuLi4gJEVDSE9fQyIgPiY2OyB9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgREFHIEFQSSBoZWFkZXJzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBEQUcgQVBJIGhlYWRlcnMuLi4gIiA+JjY7IH0KIAogCSMgSWYgbmVjZXNzYXJ5LCBzZXQgZGVmYXVsdCBwYXRocyBmb3IgREFHIEFQSSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCiAJaWYgdGVzdCAteiAiJGRhZ19yb290IjsgdGhlbgpAQCAtNjQ2OSwxMTkgKzYxNzMsMTggQEAKIAogCWlmIHRlc3QgLXogIiRkYWdfdG9vbHNfZGlyIjsgdGhlbgogCSAgICBkYWdfdG9vbHNfZGlyPSIkZGFnX3Jvb3QvdG9vbHMiCi0JCWZpCisJZmkKIAogCWlmIHRlc3QgLXIgJGRhZ19pbmNsdWRlX2Rpci9kYWdhcGkuaDsgdGhlbgogCQlhY19jdl9sYmxfZGFnX2FwaT15ZXMKIAlmaQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9kYWdfYXBpICgkZGFnX2luY2x1ZGVfZGlyKSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2RhZ19hcGkgKCRkYWdfaW5jbHVkZV9kaXIpIiA+JjY7IH0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2xibF9kYWdfYXBpID0geWVzOyB0aGVuCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkYWdhcGkubyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGRhZ2FwaS5vLi4uICRFQ0hPX0MiID4mNjsgfQotCWRhZ2FwaV9vYmo9bm8KLQlpZiB0ZXN0IC1yICRkYWdfdG9vbHNfZGlyL2RhZ2FwaS5vOyB0aGVuCi0JCSMgMi40LnguCi0JCWRhZ2FwaV9vYmo9JGRhZ190b29sc19kaXIvZGFnYXBpLm8KLQllbGlmIHRlc3QgLXIgJGRhZ19saWJfZGlyL2RhZ2FwaS5vOyB0aGVuCi0JCSMgMi41LnguCi0JCWRhZ2FwaV9vYmo9JGRhZ19saWJfZGlyL2RhZ2FwaS5vCi0JZWxpZiB0ZXN0IC1yICRkYWdfbGliX2Rpci9saWJkYWcuYTsgdGhlbgotCQkjIDIuNS54LgotCQlhciB4ICRkYWdfbGliX2Rpci9saWJkYWcuYSBkYWdhcGkubwotCQlpZiB0ZXN0IC1yIC4vZGFnYXBpLm87IHRoZW4KLQkJICAgIGRhZ2FwaV9vYmo9Li9kYWdhcGkubwotCQllbHNlCi0JCSAgICBhciB4ICRkYWdfbGliX2Rpci9saWJkYWcuYSBsaWJkYWdfbGEtZGFnYXBpLm8KLQkJICAgIGlmIHRlc3QgLXIgLi9saWJkYWdfbGEtZGFnYXBpLm87IHRoZW4KLQkJICAgICAgIGRhZ2FwaV9vYmo9Li9saWJkYWdfbGEtZGFnYXBpLm8KLQkJICAgIGZpCi0JCWZpCi0JZmkKLQotCWlmIHRlc3QgJGRhZ2FwaV9vYmogPSBubzsgdGhlbgotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIChjaGVja2VkICRkYWdfbGliX2RpciAgJGRhZ190b29sc19kaXIgICRkYWdfbGliX2Rpci9saWJkYWcuYSkiID4mNQotZWNobyAiJHtFQ0hPX1R9bm8gKGNoZWNrZWQgJGRhZ19saWJfZGlyICAkZGFnX3Rvb2xzX2RpciAgJGRhZ19saWJfZGlyL2xpYmRhZy5hKSIgPiY2OyB9Ci0JCQlhY19jdl9sYmxfZGFnX2FwaT1ubwotCWVsc2UKLQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMgKCRkYWdhcGlfb2JqKSIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMgKCRkYWdhcGlfb2JqKSIgPiY2OyB9Ci0JZmkKLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2xibF9kYWdfYXBpID0geWVzOyB0aGVuCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkYWdvcHRzLm8iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBkYWdvcHRzLm8uLi4gJEVDSE9fQyIgPiY2OyB9Ci0JZGFnb3B0c19vYmo9bm8KLQlpZiB0ZXN0IC1yICRkYWdfdG9vbHNfZGlyL2RhZ29wdHMubzsgdGhlbgotCQkjIDIuNC54LgotCQlkYWdvcHRzX29iaj0kZGFnX3Rvb2xzX2Rpci9kYWdvcHRzLm8KLQllbGlmIHRlc3QgLXIgJGRhZ19saWJfZGlyL2RhZ29wdHMubzsgdGhlbgotCQkjIDIuNS54LgotCQlkYWdvcHRzX29iaj0kZGFnX2xpYl9kaXIvZGFnb3B0cy5vCi0JZWxpZiB0ZXN0IC1yICRkYWdfbGliX2Rpci9saWJkYWcuYTsgdGhlbgotCQkjIDIuNS54LgotCQlhciB4ICRkYWdfbGliX2Rpci9saWJkYWcuYSBkYWdvcHRzLm8KLQkJaWYgdGVzdCAtciAuL2RhZ29wdHMubzsgdGhlbgotCQkgICAgZGFnb3B0c19vYmo9Li9kYWdvcHRzLm8KLQkJZWxzZQotCQkgICAgYXIgeCAkZGFnX2xpYl9kaXIvbGliZGFnLmEgbGliZGFnX2xhLWRhZ29wdHMubwotCQkgICAgaWYgdGVzdCAtciAuL2xpYmRhZ19sYS1kYWdvcHRzLm87IHRoZW4KLQkJICAgICAgIGRhZ29wdHNfb2JqPS4vbGliZGFnX2xhLWRhZ29wdHMubwotCQkgICAgZmkKLQkJZmkKLQlmaQotCi0JaWYgdGVzdCAkZGFnb3B0c19vYmogPSBubzsgdGhlbgotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIChjaGVja2VkICRkYWdfbGliX2RpciAgJGRhZ190b29sc19kaXIgICRkYWdfbGliX2Rpci9saWJkYWcuYSkiID4mNQotZWNobyAiJHtFQ0hPX1R9bm8gKGNoZWNrZWQgJGRhZ19saWJfZGlyICAkZGFnX3Rvb2xzX2RpciAgJGRhZ19saWJfZGlyL2xpYmRhZy5hKSIgPiY2OyB9Ci0JCWFjX2N2X2xibF9kYWdfYXBpPW5vCi0JZWxzZQotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyAoJGRhZ29wdHNfb2JqKSIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMgKCRkYWdvcHRzX29iaikiID4mNjsgfQotCWZpCi1maQotCi1pZiB0ZXN0ICRhY19jdl9sYmxfZGFnX2FwaSA9IHllczsgdGhlbgotCSMgVW5kZXIgMi41Lnggb25seSB3ZSBuZWVkIHRvIGFkZCBkYWdyZWcuby4KLQlpZiB0ZXN0IC1yICRkYWdfaW5jbHVkZV9kaXIvZGFncmVnLmg7IHRoZW4KLQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGFncmVnLm8iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBkYWdyZWcuby4uLiAkRUNIT19DIiA+JjY7IH0KLQkJZGFncmVnX29iaj1ubwotCQlpZiB0ZXN0IC1yICRkYWdfbGliX2Rpci9kYWdyZWcubzsgdGhlbgotCQkJIyBPYmplY3QgZmlsZSBpcyByZWFkeSBhbmQgd2FpdGluZy4KLQkJCWRhZ3JlZ19vYmo9JGRhZ19saWJfZGlyL2RhZ3JlZy5vCi0JCWVsaWYgdGVzdCAtciAkZGFnX2xpYl9kaXIvbGliZGFnLmE7IHRoZW4KLQkJCSMgRXh0cmFjdCBmcm9tIGxpYmRhZy5hLgotCQkJYXIgeCAkZGFnX2xpYl9kaXIvbGliZGFnLmEgZGFncmVnLm8KLQkJCWlmIHRlc3QgLXIgLi9kYWdyZWcubzsgdGhlbgotCQkJCWRhZ3JlZ19vYmo9Li9kYWdyZWcubwotCQkJZWxzZQotCQkJCWFyIHggJGRhZ19saWJfZGlyL2xpYmRhZy5hIGxpYmRhZ19sYS1kYWdyZWcubwotCQkJCWlmIHRlc3QgLXIgLi9saWJkYWdfbGEtZGFncmVnLm87IHRoZW4KLQkJCQkgICBkYWdyZWdfb2JqPS4vbGliZGFnX2xhLWRhZ3JlZy5vCi0JCQkJZmkKLQkJCWZpCi0JCWZpCi0KLQkJaWYgdGVzdCAkZGFncmVnX29iaiA9IG5vOyB0aGVuCi0JCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIChjaGVja2VkICRkYWdfbGliX2RpciAgJGRhZ19saWJfZGlyL2xpYmRhZy5hKSIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyAoY2hlY2tlZCAkZGFnX2xpYl9kaXIgICRkYWdfbGliX2Rpci9saWJkYWcuYSkiID4mNjsgfQotCQkJYWNfY3ZfbGJsX2RhZ19hcGk9bm8KLQkJZWxzZQotCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMgKCRkYWdyZWdfb2JqKSIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMgKCRkYWdyZWdfb2JqKSIgPiY2OyB9Ci0JCWZpCi0JZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9kYWdfYXBpICgkZGFnX2luY2x1ZGVfZGlyKSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9kYWdfYXBpICgkZGFnX2luY2x1ZGVfZGlyKSIgPiY2OyB9CiBmaQogCiBpZiB0ZXN0ICRhY19jdl9sYmxfZGFnX2FwaSA9IHllczsgdGhlbgogCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJGRhZ19pbmNsdWRlX2RpciIKLQlWX0xJQlM9IiRWX0xJQlMgJGRhZ2FwaV9vYmogJGRhZ29wdHNfb2JqICRkYWdyZWdfb2JqIgorCiAJaWYgdGVzdCAkVl9QQ0FQICE9IGRhZyA7IHRoZW4KIAkJIFNTUkM9InBjYXAtZGFnLmMiCiAJZmkKQEAgLTY1OTEsMTggKzYxOTQsMTQgQEAKIAkjIGluY2x1ZGVkIGlmIHRoZXJlJ3MgYSBmb3VuZC1hY3Rpb24gKGFyZyAzKS4KIAlzYXZlZF9sZGZsYWdzPSRMREZMQUdTCiAJTERGTEFHUz0iLUwkZGFnX2xpYl9kaXIiCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRhZ19hdHRhY2hfc3RyZWFtIGluIC1sZGFnIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRhZ19hdHRhY2hfc3RyZWFtIGluIC1sZGFnLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZGFnX2RhZ19hdHRhY2hfc3RyZWFtK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGFnX2F0dGFjaF9zdHJlYW0gaW4gLWxkYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRhZ19hdHRhY2hfc3RyZWFtIGluIC1sZGFnLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW0rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCiBMSUJTPSItbGRhZyAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAogLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCkBAIC02NjIwLDU2ICs2MjE5LDMxIEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfbGliX2RhZ19kYWdfYXR0YWNoX3N0cmVhbT15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW09bm8KKyAgYWNfY3ZfbGliX2RhZ19kYWdfYXR0YWNoX3N0cmVhbT1ubwogZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW0iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW0iID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX2RhZ19kYWdfYXR0YWNoX3N0cmVhbSA9IHllczsgdGhlbgotICBkYWdfdmVyc2lvbj0iMi41LngiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW0iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGFnX2RhZ19hdHRhY2hfc3RyZWFtIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RhZ19kYWdfYXR0YWNoX3N0cmVhbSIgPSB4eWVzOyB0aGVuIDoKKyAgZGFnX3N0cmVhbXM9IjEiCiBlbHNlCi0gIGRhZ192ZXJzaW9uPSIyLjQueCIKKyAgZGFnX3N0cmVhbXM9IjAiCiBmaQogCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRhZ19nZXRfZXJmX3R5cGVzIGluIC1sZGFnIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRhZ19nZXRfZXJmX3R5cGVzIGluIC1sZGFnLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZGFnX2RhZ19nZXRfZXJmX3R5cGVzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGFnX2dldF9lcmZfdHlwZXMgaW4gLWxkYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRhZ19nZXRfZXJmX3R5cGVzIGluIC1sZGFnLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCiBMSUJTPSItbGRhZyAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAogLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCkBAIC02Njg3LDk0ICs2MjYxLDE1NiBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXM9eWVzCiBlbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfZGFnX2RhZ19nZXRfZXJmX3R5cGVzPW5vCisgIGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXM9bm8KIGZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZGFnX2RhZ19nZXRfZXJmX3R5cGVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGFnX2RhZ19nZXRfZXJmX3R5cGVzIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXMgPSB5ZXM7IHRoZW4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RhZ19kYWdfZ2V0X2VyZl90eXBlcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXMiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGFnX2RhZ19nZXRfZXJmX3R5cGVzIiA9IHh5ZXM7IHRoZW4gOgogCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfREFHX0dFVF9FUkZfVFlQRVMgMQotX0FDRU9GCi0KKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfREFHX0dFVF9FUkZfVFlQRVMgMSIgPj5jb25mZGVmcy5oCiAKIGZpCiAKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMgaW4gLWxkYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyBpbiAtbGRhZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGFnX2RhZ19nZXRfc3RyZWFtX2VyZl90eXBlcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGFnICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2RhZ19kYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXM9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kYWdfZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kYWdfZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2RhZ19kYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGFnX2RhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyIgPSB4eWVzOyB0aGVuIDoKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RBR19HRVRfU1RSRUFNX0VSRl9UWVBFUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCiAJTERGTEFHUz0kc2F2ZWRfbGRmbGFncwogCi0JaWYgdGVzdCAiJGRhZ192ZXJzaW9uIiA9IDIuNS54OyB0aGVuCisJaWYgdGVzdCAiJGRhZ19zdHJlYW1zIiA9IDE7IHRoZW4KIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9EQUdfU1RSRUFNU19BUEkgMQorJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfU1RSRUFNU19BUEkgMSIgPj5jb25mZGVmcy5oCisKKwkJTElCUz0iJExJQlMgLWxkYWciCisJCUxERkxBR1M9IiRMREZMQUdTIC1MJGRhZ19saWJfZGlyIgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHZkYWdfc2V0X2RldmljZV9pbmZvIGluIC1sdmRhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgdmRhZ19zZXRfZGV2aWNlX2luZm8gaW4gLWx2ZGFnLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl92ZGFnX3ZkYWdfc2V0X2RldmljZV9pbmZvKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWx2ZGFnICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciB2ZGFnX3NldF9kZXZpY2VfaW5mbyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHZkYWdfc2V0X2RldmljZV9pbmZvICgpOworICA7CisgIHJldHVybiAwOworfQogX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl92ZGFnX3ZkYWdfc2V0X2RldmljZV9pbmZvPXllcworZWxzZQorICBhY19jdl9saWJfdmRhZ192ZGFnX3NldF9kZXZpY2VfaW5mbz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfdmRhZ192ZGFnX3NldF9kZXZpY2VfaW5mbyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl92ZGFnX3ZkYWdfc2V0X2RldmljZV9pbmZvIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3ZkYWdfdmRhZ19zZXRfZGV2aWNlX2luZm8iID0geHllczsgdGhlbiA6CisgIGFjX2RhZ19oYXZlX3ZkYWc9IjEiCitlbHNlCisgIGFjX2RhZ19oYXZlX3ZkYWc9IjAiCitmaQogCi0JCURBR0xJQlM9Ii1sZGFnIgorCQlpZiB0ZXN0ICIkYWNfZGFnX2hhdmVfdmRhZyIgPSAxOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfREFHX1ZEQUcgMSIgPj5jb25mZGVmcy5oCisKKwkJCUxJQlM9IiRMSUJTIC1scHRocmVhZCIKKwkJZmkKIAlmaQogCi0JIyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBzcGVjaWZpYyB2ZXJzaW9uIHN0cmluZy4KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB0aGUgREFHIEFQSSB2ZXJzaW9uIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhlIERBRyBBUEkgdmVyc2lvbi4uLiAkRUNIT19DIiA+JjY7IH0KLQlpZiB0ZXN0IC1yICIkZGFnX3Jvb3QvVkVSU0lPTiI7IHRoZW4KLQkJZGFnX3ZlcnNpb249ImBjYXQgJGRhZ19yb290L1ZFUlNJT05gIgotCWZpCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZGFnX3ZlcnNpb24iID4mNQotZWNobyAiJHtFQ0hPX1R9JGRhZ192ZXJzaW9uIiA+JjY7IH0KIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9EQUdfQVBJIDEKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfQVBJIDEiID4+Y29uZmRlZnMuaAogCiBmaQogCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSB0aGUgREFHIEFQSSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgdGhlIERBRyBBUEkuLi4gIiA+JjY7IH0KKwogaWYgdGVzdCAkYWNfY3ZfbGJsX2RhZ19hcGkgPSBubzsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogCWlmIHRlc3QgIiR3YW50X2RhZyIgPSB5ZXM7IHRoZW4KICAgICAgICAgCSMgVXNlciB3YW50ZWQgREFHIHN1cHBvcnQgYnV0IHdlIGNvdWxkbid0IGZpbmQgaXQuCi0JCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IERBRyBBUEkgcmVxdWVzdGVkLCBidXQgbm90IGZvdW5kIGF0ICRkYWdfcm9vdDogdXNlIC0td2l0aG91dC1kYWciID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogREFHIEFQSSByZXF1ZXN0ZWQsIGJ1dCBub3QgZm91bmQgYXQgJGRhZ19yb290OiB1c2UgLS13aXRob3V0LWRhZyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQlhc19mbl9lcnJvciAkPyAiREFHIEFQSSByZXF1ZXN0ZWQsIGJ1dCBub3QgZm91bmQgYXQgJGRhZ19yb290OiB1c2UgLS13aXRob3V0LWRhZyIgIiRMSU5FTk8iIDUKIAlmaQogCiAJaWYgdGVzdCAiJFZfUENBUCIgPSBkYWc7IHRoZW4KIAkJIyBVc2VyIHJlcXVlc3RlZCAiZGFnIiBjYXB0dXJlIHR5cGUgYnV0IHRoZSBEQUcgQVBJIHdhc24ndAogCQkjIGZvdW5kLgotCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgXCJkYWdcIiByZXF1aXJlcyB0aGUgREFHIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgdGhlIC0td2l0aC1kYWcgb3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbi4gKFRyeSBcIi4vY29uZmlndXJlIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLikiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzIFwiZGFnXCIgcmVxdWlyZXMgdGhlIERBRyBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIHRoZSAtLXdpdGgtZGFnIG9wdGlvbnMgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24uIChUcnkgXCIuL2NvbmZpZ3VyZSAtLWhlbHBcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4pIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJCWFzX2ZuX2Vycm9yICQ/ICJTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgXCJkYWdcIiByZXF1aXJlcyB0aGUgREFHIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgdGhlIC0td2l0aC1kYWcgb3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbi4gKFRyeSBcIi4vY29uZmlndXJlIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLikiICIkTElORU5PIiA1CiAJZmkKK2Vsc2UKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQogZmkKIAogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNlcHRlbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc2VwdGVsK3NldH0iID0gc2V0OyB0aGVuCitpZiB0ZXN0ICIke3dpdGhfc2VwdGVsK3NldH0iID0gc2V0OyB0aGVuIDoKICAgd2l0aHZhbD0kd2l0aF9zZXB0ZWw7CiAJaWYgdGVzdCAiJHdpdGh2YWwiID0gbm8KIAl0aGVuCkBAIC02ODE0LDkgKzY0NTAsNyBAQAogCSMgSWYgdGhleSBleHByZXNzZWQgbm8gcHJlZmVyZW5jZSwgZG9uJ3QgaW5jbHVkZSBpdC4KIAkjCiAJaWYgdGVzdCAkd2FudF9zZXB0ZWwgPSB5ZXM7IHRoZW4KLQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogU2VwdGVsIHN1cHBvcnQgb25seSBhdmFpbGFibGUgd2l0aCAnbGludXgnIGFuZCAnc2VwdGVsJyBwYWNrZXQgY2FwdHVyZSB0eXBlcyIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBTZXB0ZWwgc3VwcG9ydCBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgYW5kICdzZXB0ZWwnIHBhY2tldCBjYXB0dXJlIHR5cGVzIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJCWFzX2ZuX2Vycm9yICQ/ICJTZXB0ZWwgc3VwcG9ydCBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgYW5kICdzZXB0ZWwnIHBhY2tldCBjYXB0dXJlIHR5cGVzIiAiJExJTkVOTyIgNQogCWVsaWYgdGVzdCAkd2FudF9zZXB0ZWwgPSB5ZXM7IHRoZW4KIAkJd2FudF9zZXB0ZWw9bm8KIAlmaQpAQCAtNjgyNCw2NCArNjQ1OCwyMjQgQEAKIGVzYWMKIAogaWYgdGVzdCAiJHdpdGhfc2VwdGVsIiAhPSBubzsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBTZXB0ZWwgQVBJIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIFNlcHRlbCBBUEkuLi4gJEVDSE9fQyIgPiY2OyB9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU2VwdGVsIEFQSSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU2VwdGVsIEFQSS4uLiAiID4mNjsgfQogCiAJaWYgdGVzdCAteiAiJHNlcHRlbF9yb290IjsgdGhlbgogCQlzZXB0ZWxfcm9vdD0kc3JjZGlyLy4uL3NlcHRlbAotCiAJZmkKIAogCXNlcHRlbF90b29sc19kaXI9IiRzZXB0ZWxfcm9vdCIKIAlzZXB0ZWxfaW5jbHVkZV9kaXI9IiRzZXB0ZWxfcm9vdC9JTkMiCi0JREVGPSItREhBVkVfU0VQVEVMX0FQSSIKIAogCWFjX2N2X2xibF9zZXB0ZWxfYXBpPW5vCiAJaWYgdGVzdCAtciAiJHNlcHRlbF9pbmNsdWRlX2Rpci9tc2cuaCI7IHRoZW4KIAkJVl9JTkNMUz0iJFZfSU5DTFMgLUkkc2VwdGVsX2luY2x1ZGVfZGlyIgotCQlWX0RFRlM9IiRWX0RFRlMgJERFRiIKLQkJVl9MSUJTPSIkVl9MSUJTICRzZXB0ZWxfdG9vbHNfZGlyL2FzY2lpYmluLm8gJHNlcHRlbF90b29sc19kaXIvYml0MmJ5dGUubyAkc2VwdGVsX3Rvb2xzX2Rpci9jb25maXJtLm8gJHNlcHRlbF90b29sc19kaXIvZm10bXNnLm8gJHNlcHRlbF90b29sc19kaXIvZ2N0X3VuaXgubyAkc2VwdGVsX3Rvb2xzX2Rpci9ocXVldWUubyAkc2VwdGVsX3Rvb2xzX2Rpci9pZGVudC5vICRzZXB0ZWxfdG9vbHNfZGlyL21lbS5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhY2subyAkc2VwdGVsX3Rvb2xzX2Rpci9wYXJzZS5vICRzZXB0ZWxfdG9vbHNfZGlyL3Bvb2wubyAkc2VwdGVsX3Rvb2xzX2Rpci9zZGxzaWcubyAkc2VwdGVsX3Rvb2xzX2Rpci9zdHJ0b251bS5vICRzZXB0ZWxfdG9vbHNfZGlyL3RpbWVyLm8gJHNlcHRlbF90b29sc19kaXIvdHJhY2UubyAiCisJCUFERExPQkpTPSIkQURETE9CSlMgJHNlcHRlbF90b29sc19kaXIvYXNjaWliaW4ubyAkc2VwdGVsX3Rvb2xzX2Rpci9iaXQyYnl0ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2NvbmZpcm0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9mbXRtc2cubyAkc2VwdGVsX3Rvb2xzX2Rpci9nY3RfdW5peC5vICRzZXB0ZWxfdG9vbHNfZGlyL2hxdWV1ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2lkZW50Lm8gJHNlcHRlbF90b29sc19kaXIvbWVtLm8gJHNlcHRlbF90b29sc19kaXIvcGFjay5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhcnNlLm8gJHNlcHRlbF90b29sc19kaXIvcG9vbC5vICRzZXB0ZWxfdG9vbHNfZGlyL3NkbHNpZy5vICRzZXB0ZWxfdG9vbHNfZGlyL3N0cnRvbnVtLm8gJHNlcHRlbF90b29sc19kaXIvdGltZXIubyAkc2VwdGVsX3Rvb2xzX2Rpci90cmFjZS5vIgorCQlBRERMQVJDSElWRU9CSlM9IiRBRERMQVJDSElWRU9CSlMgJHNlcHRlbF90b29sc19kaXIvYXNjaWliaW4ubyAkc2VwdGVsX3Rvb2xzX2Rpci9iaXQyYnl0ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2NvbmZpcm0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9mbXRtc2cubyAkc2VwdGVsX3Rvb2xzX2Rpci9nY3RfdW5peC5vICRzZXB0ZWxfdG9vbHNfZGlyL2hxdWV1ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2lkZW50Lm8gJHNlcHRlbF90b29sc19kaXIvbWVtLm8gJHNlcHRlbF90b29sc19kaXIvcGFjay5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhcnNlLm8gJHNlcHRlbF90b29sc19kaXIvcG9vbC5vICRzZXB0ZWxfdG9vbHNfZGlyL3NkbHNpZy5vICRzZXB0ZWxfdG9vbHNfZGlyL3N0cnRvbnVtLm8gJHNlcHRlbF90b29sc19kaXIvdGltZXIubyAkc2VwdGVsX3Rvb2xzX2Rpci90cmFjZS5vIgogCiAJCWlmIHRlc3QgIiRWX1BDQVAiICE9IHNlcHRlbCA7IHRoZW4KIAkJCSBTU1JDPSJwY2FwLXNlcHRlbC5jIgotCiAJCWZpCiAJCWFjX2N2X2xibF9zZXB0ZWxfYXBpPXllcwogCWZpCiAKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfc2VwdGVsX2FwaSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID4mNjsgfQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfc2VwdGVsX2FwaSIgPiY2OyB9CiAJaWYgdGVzdCAkYWNfY3ZfbGJsX3NlcHRlbF9hcGkgPSBubzsgdGhlbgogCQlpZiB0ZXN0ICIkd2FudF9zZXB0ZWwiID0geWVzOyB0aGVuCi0JCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBTZXB0ZWwgQVBJIG5vdCBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJHNlcHRlbF9yb290OyB1c2UgLS13aXRob3V0LXNlcHRlbCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBTZXB0ZWwgQVBJIG5vdCBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJHNlcHRlbF9yb290OyB1c2UgLS13aXRob3V0LXNlcHRlbCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQkJYXNfZm5fZXJyb3IgJD8gIlNlcHRlbCBBUEkgbm90IGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAkc2VwdGVsX3Jvb3Q7IHVzZSAtLXdpdGhvdXQtc2VwdGVsIiAiJExJTkVOTyIgNQogCQlmaQogCWVsc2UKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TRVBURUxfQVBJIDEKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRVBURUxfQVBJIDEiID4+Y29uZmRlZnMuaAogCiAJZmkKIGZpCiAKIGlmIHRlc3QgIiRWX1BDQVAiID0gc2VwdGVsIC1hICIkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID0gbm87IHRoZW4KLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgJ3NlcHRlbCcgcmVxdWlyZXMgdGhlIFNlcHRlbCBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIC0td2l0aC1zZXB0ZWw9RElSIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFNwZWNpZnlpbmcgdGhlIGNhcHR1cmUgdHlwZSBhcyAnc2VwdGVsJyByZXF1aXJlcyB0aGUgU2VwdGVsIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgLS13aXRoLXNlcHRlbD1ESVIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwlhc19mbl9lcnJvciAkPyAiU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICdzZXB0ZWwnIHJlcXVpcmVzIHRoZSBTZXB0ZWwgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSAtLXdpdGgtc2VwdGVsPURJUiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgQ2hlY2sgZm9yIE15cmljb20gU05GIHN1cHBvcnQuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc25mIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zbmYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3NuZjsKKwlpZiB0ZXN0ICIkd2l0aHZhbCIgPSBubworCXRoZW4KKwkJIyBVc2VyIGV4cGxpY2l0bHkgZG9lc24ndCB3YW50IFNORgorCQl3YW50X3NuZj1ubworCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCisJdGhlbgorCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgYnV0IGhhc24ndCBzcGVjaWZpYyBhIGRpcmVjdG9yeS4KKwkJd2FudF9zbmY9eWVzCisJZWxzZQorCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgd2l0aCBhIHNwZWNpZmllZCBkaXJlY3RvcnkuCisJCXdhbnRfc25mPXllcworCQlzbmZfcm9vdD0kd2l0aHZhbAorCWZpCisKK2Vsc2UKKworCSMKKwkjIFVzZSBTbmlmZmVyIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkjCisJd2FudF9zbmY9aWZwcmVzZW50CisKIGZpCiAKIAogCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNuZi1pbmNsdWRlcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc25mX2luY2x1ZGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zbmZfaW5jbHVkZXM7CisJIyBVc2VyIHdhbnRzIFNORiB3aXRoIHNwZWNpZmljIGhlYWRlciBkaXJlY3RvcnkKKwl3YW50X3NuZj15ZXMKKwlzbmZfaW5jbHVkZV9kaXI9JHdpdGh2YWwKKworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc25mLWxpYnJhcmllcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc25mX2xpYnJhcmllcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc25mX2xpYnJhcmllczsKKwkjIFVzZXIgd2FudHMgU05GIHdpdGggc3BlY2lmaWMgbGliIGRpcmVjdG9yeQorCXdhbnRfc25mPXllcworCXNuZl9saWJfZGlyPSR3aXRodmFsCisKK2ZpCisKKworY2FzZSAiJFZfUENBUCIgaW4KK2JwZnxsaW51eHxzbmYpCisJIworCSMgV2Ugc3VwcG9ydCB0aGUgU25pZmZlciBBUEkgaWYgd2UncmUgb24gQlNELCBMaW51eCwgb3IgaWYgd2UncmUKKwkjIGJ1aWxkaW5nIGEgU25pZmZlci1vbmx5IGxpYnBjYXAuCisJIworCTs7CisqKQorCSMKKwkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIFNuaWZmZXIsIHRlbGwgdGhlbSBpdCdzIG5vdAorCSMgc3VwcG9ydGVkLgorCSMKKwkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCisJIworCWlmIHRlc3QgJHdhbnRfc25mID0geWVzOyB0aGVuCisJCWFzX2ZuX2Vycm9yICQ/ICJNeXJpY29tIFNORiBzdXBwb3J0IG9ubHkgYXZhaWxhYmxlIHdpdGggJ2JwZicgJ2xpbnV4JyBhbmQgJ3NuZicgcGFja2V0IGNhcHR1cmUgdHlwZXMiICIkTElORU5PIiA1CisJZWxpZiB0ZXN0ICR3YW50X3NuZiA9IHllczsgdGhlbgorCQl3YW50X3NuZj1ubworCWZpCisJOzsKK2VzYWMKKworYWNfY3ZfbGJsX3NuZl9hcGk9bm8KK2lmIHRlc3QgIiR3aXRoX3NuZiIgIT0gbm87IHRoZW4KKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkuLi4gIiA+JjY7IH0KKworCWlmIHRlc3QgLXogIiRzbmZfcm9vdCI7IHRoZW4KKwkJc25mX3Jvb3Q9L29wdC9zbmYKKwlmaQorCisJaWYgdGVzdCAteiAiJHNuZl9pbmNsdWRlX2RpciI7IHRoZW4KKwkJc25mX2luY2x1ZGVfZGlyPSIkc25mX3Jvb3QvaW5jbHVkZSIKKwlmaQorCisJaWYgdGVzdCAteiAiJHNuZl9saWJfZGlyIjsgdGhlbgorCQlzbmZfbGliX2Rpcj0iJHNuZl9yb290L2xpYiIKKwlmaQorCisJaWYgdGVzdCAtZiAiJHNuZl9pbmNsdWRlX2Rpci9zbmYuaCI7IHRoZW4KKwkJYWNfY3ZfbGJsX3NuZl9hcGk9eWVzCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9zbmZfYXBpICgkc25mX3Jvb3QpIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX3NuZl9hcGkgKCRzbmZfcm9vdCkiID4mNjsgfQorCisJaWYgdGVzdCAkYWNfY3ZfbGJsX3NuZl9hcGkgPSBubzsgdGhlbgorCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCisJCQlhc19mbl9lcnJvciAkPyAiU05GIEFQSSBoZWFkZXJzIG5vdCBmb3VuZCB1bmRlciAkc25mX2luY2x1ZGVfZGlyOyB1c2UgLS13aXRob3V0LXNuZiIgIiRMSU5FTk8iIDUKKwkJZmkKKwllbHNlCisJCXNhdmVkX2xkZmxhZ3M9JExERkxBR1MKKwkJTERGTEFHUz0iJExERkxBR1MgLUwkc25mX2xpYl9kaXIiCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNuZl9pbml0IGluIC1sc25mIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzbmZfaW5pdCBpbiAtbHNuZi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfc25mX3NuZl9pbml0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzbmYgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNuZl9pbml0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc25mX2luaXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3NuZl9zbmZfaW5pdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NuZl9zbmZfaW5pdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc25mX3NuZl9pbml0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3NuZl9zbmZfaW5pdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zbmZfc25mX2luaXQiID0geHllczsgdGhlbiA6CisgIGFjX2N2X2xibF9zbmZfYXBpPSJ5ZXMiCitlbHNlCisgIGFjX2N2X2xibF9zbmZfYXBpPSJubyIKK2ZpCisKKwkJTERGTEFHUz0iJHNhdmVkX2xkZmxhZ3MiCisKKwkJaWYgdGVzdCAkYWNfY3ZfbGJsX3NuZl9hcGkgPSBubzsgdGhlbgorCQkJaWYgdGVzdCAiJHdhbnRfc25mIiA9IHllczsgdGhlbgorCQkJCWFzX2ZuX2Vycm9yICQ/ICJTTkYgQVBJIGNhbm5vdCBjb3JyZWN0bHkgYmUgbGlua2VkIGNoZWNrIGNvbmZpZy5sb2c7IHVzZSAtLXdpdGhvdXQtc25mIiAiJExJTkVOTyIgNQorCQkJZmkKKwkJZWxzZQorCQkJVl9JTkNMUz0iJFZfSU5DTFMgLUkkc25mX2luY2x1ZGVfZGlyIgorCQkJTElCUz0iJExJQlMgLWxzbmYiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtTCRzbmZfbGliX2RpciIKKwkJCWlmIHRlc3QgIiRWX1BDQVAiICE9IHNuZiA7IHRoZW4KKwkJCQlTU1JDPSJwY2FwLXNuZi5jIgorCQkJZmkKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TTkZfQVBJIDEiID4+Y29uZmRlZnMuaAorCisJCWZpCisJZmkKK2ZpCisKK2lmIHRlc3QgIiRWX1BDQVAiID0gc25mIC1hICIkYWNfY3ZfbGJsX3NuZl9hcGkiID0gbm87IHRoZW4KKwlhc19mbl9lcnJvciAkPyAiU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICdzbmYnIHJlcXVpcmVzIHRoZSBNeXJpY29tIFNuaWZmZXIgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSAtLXdpdGgtc25mPURJUiIgIiRMSU5FTk8iIDUKK2ZpCisKKwogIyBDaGVjayB3aGV0aGVyIC0td2l0aC1mbGV4IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9mbGV4K3NldH0iID0gc2V0OyB0aGVuCitpZiB0ZXN0ICIke3dpdGhfZmxleCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgIHdpdGh2YWw9JHdpdGhfZmxleDsKIGZpCiAKIAogIyBDaGVjayB3aGV0aGVyIC0td2l0aC1iaXNvbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfYmlzb24rc2V0fSIgPSBzZXQ7IHRoZW4KK2lmIHRlc3QgIiR7d2l0aF9iaXNvbitzZXR9IiA9IHNldDsgdGhlbiA6CiAgIHdpdGh2YWw9JHdpdGhfYmlzb247CiBmaQogCkBAIC02ODkyLDEwICs2Njg2LDEwIEBACiBkbwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1ZfTEVYK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19WX0xFWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiRWX0xFWCI7IHRoZW4KICAgYWNfY3ZfcHJvZ19WX0xFWD0iJFZfTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KQEAgLTY5MDUsMjUgKzY2OTksMjUgQEAKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgogICAgIGFjX2N2X3Byb2dfVl9MRVg9IiRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCi1kb25lCisgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAogZmkKIGZpCiBWX0xFWD0kYWNfY3ZfcHJvZ19WX0xFWAogaWYgdGVzdCAtbiAiJFZfTEVYIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRWX0xFWCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kVl9MRVgiID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFZfTEVYIiA+JjUKKyRhc19lY2hvICIkVl9MRVgiID4mNjsgfQogZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKQEAgLTY5MzQsMTAgKzY3MjgsMTAgQEAKICAgICBmaQogICAgIGlmIHRlc3QgIiRWX0xFWCIgPSBmbGV4IDsgdGhlbgogCSAgICAjIFRoZSAtViBmbGFnIHdhcyBhZGRlZCBpbiAyLjQKLQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZsZXggMi40IG9yIGhpZ2hlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmbGV4IDIuNCBvciBoaWdoZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2ZsZXhfdjI0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CisJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZsZXggMi40IG9yIGhpZ2hlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZmxleCAyLjQgb3IgaGlnaGVyLi4uICIgPiY2OyB9CisJICAgIGlmICR7YWNfY3ZfbGJsX2ZsZXhfdjI0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgZmxleCAtViA+L2Rldi9udWxsIDI+JjE7IHRoZW4KIAkJCWFjX2N2X2xibF9mbGV4X3YyND15ZXMKQEAgLTY5NDYsMTIgKzY3NDAsMTIgQEAKIAkJZmkKIGZpCiAKLQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2ZsZXhfdjI0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfZmxleF92MjQiID4mNjsgfQorCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9mbGV4X3YyNCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9mbGV4X3YyNCIgPiY2OyB9CiAJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9mbGV4X3YyNCA9IG5vIDsgdGhlbgogCQkgICAgcz0iMi40IG9yIGhpZ2hlciByZXF1aXJlZCIKLQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGlnbm9yaW5nIG9ic29sZXRlIGZsZXggZXhlY3V0YWJsZSAoJHMpIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogaWdub3Jpbmcgb2Jzb2xldGUgZmxleCBleGVjdXRhYmxlICgkcykiID4mMjt9CisJCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGlnbm9yaW5nIG9ic29sZXRlIGZsZXggZXhlY3V0YWJsZSAoJHMpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlnbm9yaW5nIG9ic29sZXRlIGZsZXggZXhlY3V0YWJsZSAoJHMpIiA+JjI7fQogCQkgICAgVl9MRVg9bGV4CiAJICAgIGZpCiAgICAgZmkKQEAgLTY5NjIsMTAgKzY3NTYsMTAgQEAKIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfVl9ZQUNDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19WX1lBQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkVl9ZQUNDIjsgdGhlbgogICBhY19jdl9wcm9nX1ZfWUFDQz0iJFZfWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCkBAIC02OTc1LDI1ICs2NzY5LDI1IEBACiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX1ZfWUFDQz0iJGFjX3Byb2ciCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKIGRvbmUKLWRvbmUKKyAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKIFZfWUFDQz0kYWNfY3ZfcHJvZ19WX1lBQ0MKIGlmIHRlc3QgLW4gIiRWX1lBQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFZfWUFDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kVl9ZQUNDIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRWX1lBQ0MiID4mNQorJGFzX2VjaG8gIiRWX1lBQ0MiID4mNjsgfQogZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKQEAgLTcwMDYsMjIgKzY4MDAsMjYgQEAKIAkgICAgVl9ZQUNDPSIkVl9ZQUNDIC15IgogICAgIGZpCiAgICAgaWYgdGVzdCAiJFZfTEVYIiAhPSBsZXggLWEgIiRWX1lBQ0MiID0geWFjYyAtbyAiJFZfTEVYIiA9IGxleCAtYSAiJFZfWUFDQyIgIT0geWFjYyA7IHRoZW4KLQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogZG9uJ3QgaGF2ZSBib3RoIGZsZXggYW5kIGJpc29uOyByZXZlcnRpbmcgdG8gbGV4L3lhY2MiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkb24ndCBoYXZlIGJvdGggZmxleCBhbmQgYmlzb247IHJldmVydGluZyB0byBsZXgveWFjYyIgPiYyO30KKwkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBkb24ndCBoYXZlIGJvdGggZmxleCBhbmQgYmlzb247IHJldmVydGluZyB0byBsZXgveWFjYyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkb24ndCBoYXZlIGJvdGggZmxleCBhbmQgYmlzb247IHJldmVydGluZyB0byBsZXgveWFjYyIgPiYyO30KIAkgICAgVl9MRVg9bGV4CiAJICAgIFZfWUFDQz15YWNjCiAgICAgZmkKICAgICBpZiB0ZXN0ICIkVl9MRVgiID0gZmxleCAtYSAtbiAicGNhcF8iIDsgdGhlbgogCSAgICBWX0xFWD0iJFZfTEVYIC1QcGNhcF8iCiAJICAgIFZfWUFDQz0iJFZfWUFDQyAtcCBwY2FwXyIKKyAgICBlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIE5FRURfWVlQQVJTRV9XUkFQUEVSIDEiID4+Y29uZmRlZnMuaAorCiAgICAgZmkKIGlmIHRlc3QgIiRWX0xFWCIgPSBsZXggOyB0aGVuCiAjIFNvbWUgdmVyc2lvbnMgb2YgbGV4IGNhbid0IGhhbmRsZSB0aGUgZGVmaW5pdGlvbnMgc2VjdGlvbiBvZiBzY2FubmVyLmwgLgogIyBUcnkgbGV4aW5nIGl0IGFuZCBjb21wbGFpbiBpZiBpdCBjYW4ndCBkZWFsLgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjYXBhYmxlIGxleCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjYXBhYmxlIGxleC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7dGNwZHVtcF9jdl9jYXBhYmxlX2xleCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNhcGFibGUgbGV4IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBjYXBhYmxlIGxleC4uLiAiID4mNjsgfQoraWYgJHt0Y3BkdW1wX2N2X2NhcGFibGVfbGV4Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgbGV4IC10IHNjYW5uZXIubCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAJCQl0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PXllcwpAQCAtNzAyOSw2NSArNjgyNywyNTAgQEAKIAkJCXRjcGR1bXBfY3ZfY2FwYWJsZV9sZXg9aW5zdWZmaWNpZW50CiAJCWZpCiBmaQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkdGNwZHVtcF9jdl9jYXBhYmxlX2xleCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kdGNwZHVtcF9jdl9jYXBhYmxlX2xleCIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHRjcGR1bXBfY3ZfY2FwYWJsZV9sZXgiID4mNQorJGFzX2VjaG8gIiR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4IiA+JjY7IH0KIAlpZiB0ZXN0ICR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4ID0gaW5zdWZmaWNpZW50IDsgdGhlbgotCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBZb3VyIG9wZXJhdGluZyBzeXN0ZW0ncyBsZXggaXMgaW5zdWZmaWNpZW50IHRvIGNvbXBpbGUKKwkJYXNfZm5fZXJyb3IgJD8gIllvdXIgb3BlcmF0aW5nIHN5c3RlbSdzIGxleCBpcyBpbnN1ZmZpY2llbnQgdG8gY29tcGlsZQogIGxpYnBjYXAuICBmbGV4IGlzIGEgbGV4IHJlcGxhY2VtZW50IHRoYXQgaGFzIG1hbnkgYWR2YW50YWdlcywgaW5jbHVkaW5nCiAgYmVpbmcgYWJsZSB0byBjb21waWxlIGxpYnBjYXAuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi0gaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2ZsZXgvZmxleC5odG1sIC4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogWW91ciBvcGVyYXRpbmcgc3lzdGVtJ3MgbGV4IGlzIGluc3VmZmljaWVudCB0byBjb21waWxlCi0gbGlicGNhcC4gIGZsZXggaXMgYSBsZXggcmVwbGFjZW1lbnQgdGhhdCBoYXMgbWFueSBhZHZhbnRhZ2VzLCBpbmNsdWRpbmcKLSBiZWluZyBhYmxlIHRvIGNvbXBpbGUgbGlicGNhcC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZmxleC9mbGV4Lmh0bWwgLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9mbGV4L2ZsZXguaHRtbCAuIiAiJExJTkVOTyIgNQogCWZpCiBmaQogCi1EWUVYVD0ic28iCisjCisjIEFzc3VtZSwgYnkgZGVmYXVsdCwgbm8gc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgVjcvQlNEIGNvbnZlbnRpb24KKyMgZm9yIG1hbiBwYWdlcyAoZmlsZSBmb3JtYXRzIGluIHNlY3Rpb24gNSwgbWlzY2VsbGFuZW91cyBpbmZvIGluIHNlY3Rpb24gNykuCisjIEluZGl2aWR1YWwgY2FzZXMgY2FuIG92ZXJyaWRlIHRoaXMuCisjCitEWUVYVD0ibm9uZSIKK01BTl9GSUxFX0ZPUk1BVFM9NQorTUFOX01JU0NfSU5GTz03CiBjYXNlICIkaG9zdF9vcyIgaW4KIAogYWl4KikKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgX1NVTiAxCi1fQUNFT0YKKyRhc19lY2hvICIjZGVmaW5lIF9TVU4gMSIgPj5jb25mZGVmcy5oCiAKKworCSMKKwkjIEFJWCBtYWtlcyBpdCBmdW4gdG8gYnVpbGQgc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLAorCSMgYmVjYXVzZSB0aGV5J3JlICpib3RoKiAiLmEiIGFyY2hpdmUgbGlicmFyaWVzLiAgV2UKKwkjIGJ1aWxkIHRoZSBzdGF0aWMgbGlicmFyeSBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIHRyYWRpdGlvbmFsCisJIyBzY2hlbWUgb2YgYnVpbGRpbmcgbGlicGNhcCBhbmQgdGNwZHVtcCBpbiBzdWJkaXJlY3RvcmllcyBvZgorCSMgdGhlIHNhbWUgZGlyZWN0b3J5LCB3aXRoIHRjcGR1bXAgc3RhdGljYWxseSBsaW5rZWQgd2l0aCB0aGUKKwkjIGxpYnBjYXAgaW4gcXVlc3Rpb24sIGJ1dCB3ZSBhbHNvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgYXMKKwkjICJsaWJwY2FwLnNoYXJlZGEiIGFuZCBpbnN0YWxsICppdCosIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMKKwkjIGxpYnJhcnksIGFzICJsaWJwY2FwLmEiLgorCSMKKwlEWUVYVD0ic2hhcmVkYSIKKworCWNhc2UgIiRWX1BDQVAiIGluCisKKwlkbHBpKQorCQkjCisJCSMgSWYgd2UncmUgdXNpbmcgRExQSSwgYXBwbGljYXRpb25zIHdpbGwgbmVlZCB0bworCQkjIHVzZSAvbGliL3BzZS5leHAgaWYgcHJlc2VudCwgYXMgd2UgdXNlIHRoZQorCQkjIFNUUkVBTVMgcm91dGluZXMuCisJCSMKKwkJcHNlZXhlPSIvbGliL3BzZS5leHAiCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRwc2VleGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRwc2VleGUuLi4gIiA+JjY7IH0KKwkJaWYgdGVzdCAtZiAkcHNlZXhlIDsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJCUxJQlM9Ii1JOiRwc2VleGUiCisJCWZpCisJCTs7CisKKwlicGYpCisJCSMKKwkJIyBJZiB3ZSdyZSB1c2luZyBCUEYsIHdlIG5lZWQgIi1sb2RtIiBhbmQgIi1sY2ZnIiwgYXMKKwkJIyB3ZSB1c2UgdGhlbSB0byBsb2FkIHRoZSBCUEYgbW9kdWxlLgorCQkjCisJCUxJQlM9Ii1sb2RtIC1sY2ZnIgorCQk7OworCWVzYWMKKwk7OworCitkYXJ3aW4qKQorCURZRVhUPSJkeWxpYiIKKwlWX0NDT1BUPSIkVl9DQ09QVCAtZm5vLWNvbW1vbiIKKwkjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdW5pdmVyc2FsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3VuaXZlcnNhbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3VuaXZlcnNhbDsKK2ZpCisKKwlpZiB0ZXN0ICIkZW5hYmxlX3VuaXZlcnNhbCIgIT0gIm5vIjsgdGhlbgorCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQlkYXJ3aW4wLTcuKikKKwkJCSMKKwkJCSMgUHJlLVRpZ2VyLiAgQnVpbGQgb25seSBmb3IgMzItYml0IFBvd2VyUEM7IG5vCisJCQkjIG5lZWQgZm9yIGFueSBzcGVjaWFsIGNvbXBpbGVyIG9yIGxpbmtlciBmbGFncy4KKwkJCSMKKwkJCTs7CisKKwkJZGFyd2luOC4wMTIzKikKKwkJCSMKKwkJCSMgVGlnZXIsIHByaW9yIHRvIEludGVsIHN1cHBvcnQuICBCdWlsZCBmb3IgMzItYml0CisJCQkjIFBvd2VyUEMgYW5kIDY0LWJpdCBQb3dlclBDLCB3aXRoIDMyLWJpdCBQb3dlclBDCisJCQkjIGZpcnN0LiAgKEknbSBndWVzc2luZyB0aGF0J3Mgd2hhdCBBcHBsZSBkb2VzLikKKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCIKKwkJCTs7CisKKwkJZGFyd2luOC40NTYqKQorCQkJIworCQkJIyBUaWdlciwgc3Vic2VxdWVudCB0byBJbnRlbCBzdXBwb3J0IGJ1dCBwcmlvciB0bworCQkJIyB4ODYtNjQgc3VwcG9ydC4gIEJ1aWxkIGZvciAzMi1iaXQgUG93ZXJQQywgNjQtYml0CisJCQkjIFBvd2VyUEMsIGFuZCB4ODYsIHdpdGggMzItYml0IFBvd2VyUEMgZmlyc3QuCisJCQkjIChJJ20gZ3Vlc3NpbmcgdGhhdCdzIHdoYXQgQXBwbGUgZG9lcy4pCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCAtYXJjaCBpMzg2IgorCQkJOzsKKworCQlkYXJ3aW44LiopCisJCQkjCisJCQkjIEFsbCBvdGhlciBUaWdlciwgc28gc3Vic2VxdWVudCB0byB4ODYtNjQKKwkJCSMgc3VwcG9ydC4gQnVpbGQgZm9yIDMyLWJpdCBQb3dlclBDLCA2NC1iaXQKKwkJCSMgUG93ZXJQQywgeDg2LCBhbmQgeDg2LTY0LCBhbmQgd2l0aCAzMi1iaXQgUG93ZXJQQworCQkJIyBmaXJzdC4gIChJJ20gZ3Vlc3NpbmcgdGhhdCdzIHdoYXQgQXBwbGUgZG9lcy4pCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQiCisJCQk7OworCisJCWRhcndpbjkuKikKKwkJCSMKKwkJCSMgTGVvcGFyZC4gIEJ1aWxkIGZvciAzMi1iaXQgUG93ZXJQQywgNjQtYml0CisJCQkjIFBvd2VyUEMsIHg4NiwgYW5kIHg4Ni02NCwgd2l0aCAzMi1iaXQgUG93ZXJQQworCQkJIyBmaXJzdC4gIChUaGF0J3Mgd2hhdCBBcHBsZSBkb2VzLikKKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCIKKwkJCTs7CisKKwkJZGFyd2luMTAuKikKKwkJCSMKKwkJCSMgU25vdyBMZW9wYXJkLiAgQnVpbGQgZm9yIHg4Ni02NCwgeDg2LCBhbmQKKwkJCSMgMzItYml0IFBvd2VyUEMsIHdpdGggeDg2LTY0IGZpcnN0LiAgKFRoYXQncworCQkJIyB3aGF0IEFwcGxlIGRvZXMsIGV2ZW4gdGhvdWdoIFNub3cgTGVvcGFyZAorCQkJIyBkb2Vzbid0IHJ1biBvbiBQUEMsIHNvIFBQQyBsaWJwY2FwIHJ1bnMgdW5kZXIKKwkJCSMgUm9zZXR0YSwgYW5kIFJvc2V0dGEgZG9lc24ndCBzdXBwb3J0IEJQRgorCQkJIyBpb2N0bHMsIHNvIFBQQyBwcm9ncmFtcyBjYW4ndCBkbyBsaXZlCisJCQkjIGNhcHR1cmVzLikKKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IC1hcmNoIHBwYyIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IC1hcmNoIHBwYyIKKwkJCTs7CisKKwkJZGFyd2luKikKKwkJCSMKKwkJCSMgUG9zdC1Tbm93IExlb3BhcmQuICBCdWlsZCBmb3IgeDg2LTY0IGFuZAorCQkJIyB4ODYsIHdpdGggeDg2LTY0IGZpcnN0LiAgKFRoYXQncyBwcm9iYWJseSB3aGF0CisJCQkjIEFwcGxlIGRvZXMsIGdpdmVuIHRoYXQgUm9zZXR0YSBpcyBnb25lLikKKwkJCSMgWFhYIC0gdXBkYXRlIGlmIGFuZCB3aGVuIEFwcGxlIGRyb3BzIHN1cHBvcnQKKwkJCSMgZm9yIDMyLWJpdCB4ODYgY29kZS4KKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IgorCQkJTERGTEFHUz0iJExERkxBR1MgLWFyY2ggeDg2XzY0IC1hcmNoIGkzODYiCisJCQk7OworCQllc2FjCisJZmkKIAk7OwogCiBocHV4OSopCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfSFBVWDkgMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0hQVVg5IDEiID4+Y29uZmRlZnMuaAogCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CiAJOzsKIAogaHB1eDEwLjAqKQorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQogCTs7CiAKIGhwdXgxMC4xKikKKworCSMKKwkjIFVzZSBTeXN0ZW0gViBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2VzLgorCSMKKwlNQU5fRklMRV9GT1JNQVRTPTQKKwlNQU5fTUlTQ19JTkZPPTUKIAk7OwogCiBocHV4KikKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9IUFVYMTBfMjBfT1JfTEFURVIgMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0hQVVgxMF8yMF9PUl9MQVRFUiAxIiA+PmNvbmZkZWZzLmgKIAorCWlmIHRlc3QgImB1bmFtZSAtbWAiID0gImlhNjQiOyB0aGVuCisJCURZRVhUPSJzbyIKKwllbHNlCisJCURZRVhUPSJzbCIKKwlmaQorCisJIworCSMgIi1iIiBidWlsZHMgYSBzaGFyZWQgbGlicmFyeTsgIitoIiBzZXRzIHRoZSBzb25hbWUuCisJIworCVNITElCX09QVD0iLWIiCisJU09OQU1FX09QVD0iK2giCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CisJOzsKKworaXJpeCopCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK2xpbnV4KnxmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8a2ZyZWVic2QqfGdudSopCisJRFlFWFQ9InNvIgorCisJIworCSMgQ29tcGlsZXIgYXNzdW1lZCB0byBiZSBHQ0M7IHJ1bi10aW1lIGxpbmtlciBtYXkgcmVxdWlyZSBhIC1SCisJIyBmbGFnLgorCSMKKwlpZiB0ZXN0ICIkbGliZGlyIiAhPSAiL3Vzci9saWIiOyB0aGVuCisJCVZfUkZMQUdTPS1XbCwtUiRsaWJkaXIKKwlmaQorCTs7CisKK29zZiopCisJRFlFWFQ9InNvIgorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQogCTs7CiAKIHNpbml4KikKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBTSU5JWCBjb21waWxlciBkZWZpbmVzIHNpbml4IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgU0lOSVggY29tcGlsZXIgZGVmaW5lcyBzaW5peC4uLiAkRUNIT19DIiA+JjY7IH0KLQlpZiB0ZXN0ICIke2FjX2N2X2NjX3Npbml4X2RlZmluZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIFNJTklYIGNvbXBpbGVyIGRlZmluZXMgc2luaXgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgU0lOSVggY29tcGlsZXIgZGVmaW5lcyBzaW5peC4uLiAiID4mNjsgfQorCWlmICR7YWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKIGludApAQCAtNzA5OCw3MSArNzA4MSw1MSBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgogICBhY19jdl9jY19zaW5peF9kZWZpbmVkPXllcwogZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfY2Nfc2luaXhfZGVmaW5lZD1ubworICBhY19jdl9jY19zaW5peF9kZWZpbmVkPW5vCiBmaQotCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCIgPiY2OyB9CisJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NjX3Npbml4X2RlZmluZWQiID4mNjsgfQogCSAgICBpZiB0ZXN0ICRhY19jdl9jY19zaW5peF9kZWZpbmVkID0gbm8gOyB0aGVuCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIHNpbml4IDEKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgc2luaXggMSIgPj5jb25mZGVmcy5oCiAKIAkgICAgZmkKIAk7OwogCiBzb2xhcmlzKikKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TT0xBUklTIDEKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TT0xBUklTIDEiID4+Y29uZmRlZnMuaAogCisKKwlEWUVYVD0ic28iCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQogCTs7Ci0KLWRhcndpbiopCi0JRFlFWFQ9ImR5bGliIgotCVZfQ0NPUFQ9IiRWX0NDT1BUIC1mbm8tY29tbW9uIgotCTs7Ci0KLWxpbnV4KikKLQlWX0NDT1BUPSIkVl9DQ09QVCAtZlBJQyIKLQk7OwotCiBlc2FjCiAKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOworZmkKKwordGVzdCAieCRlbmFibGVfc2hhcmVkIiA9ICJ4bm8iICYmIERZRVhUPSJub25lIgorCiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgogICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCkBAIC03MTcyLDI1ICs3MTM1LDI1IEBACiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKIGRvbmUKLWRvbmUKKyAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKIFJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQogZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKQEAgLTcxOTksMTAgKzcxNjIsMTAgQEAKICAgYWNfY3RfUkFOTElCPSRSQU5MSUIKICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgpAQCAtNzIxMiwyNSArNzE3NSwyNSBAQAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQotZG9uZQorICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgogaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9SQU5MSUIiID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9CiBlbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKICAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgpAQCAtNzIzOCwxMiArNzIwMSw4IEBACiAgIGVsc2UKICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCiB5ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CiBhY190b29sX3dhcm5lZD15ZXMgOzsKIGVzYWMKICAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgpAQCAtNzI1Miw1OCArNzIxMSwzODAgQEAKICAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCiBmaQogCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FSPSRhY19jdl9wcm9nX0FSCitpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQorJGFzX2VjaG8gIiRBUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiOyB0aGVuCisgIGFjX2N0X0FSPSRBUgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgoraWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCisgICAgQVI9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBBUj0kYWNfY3RfQVIKKyAgZmkKK2Vsc2UKKyAgQVI9IiRhY19jdl9wcm9nX0FSIgorZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAiID4mNjsgfQorTE5fUz0kYXNfbG5fcworaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKKyRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQorZmkKKworCiAKIHJtIC1mIG9zLXByb3RvLmgKICAgICBpZiB0ZXN0ICIke0xCTF9DRkxBR1Mrc2V0fSIgPSBzZXQ7IHRoZW4KIAkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgJHtMQkxfQ0ZMQUdTfSIKICAgICBmaQogICAgIGlmIHRlc3QgLWYgLmRldmVsIDsgdGhlbgotCSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KLQkJICAgIGlmIHRlc3QgIiR7TEJMX0NGTEFHUytzZXR9IiAhPSBzZXQ7IHRoZW4KLQkJCSAgICBpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19nIiA9IHllcyA7IHRoZW4KLQkJCQkgICAgVl9DQ09QVD0iLWcgJFZfQ0NPUFQiCi0JCQkgICAgZmkKLQkJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtV2FsbCIKLQkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZ2NjX3ZlcnMgLWd0IDEgOyB0aGVuCi0JCQkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMiCi0JCQkgICAgZmkKLQkJICAgIGZpCi0JICAgIGVsc2UKLQkJICAgIGNhc2UgIiR0YXJnZXRfb3MiIGluCisJICAgICMKKwkgICAgIyBTa2lwIGFsbCB0aGUgd2FybmluZyBvcHRpb24gc3R1ZmYgb24gc29tZSBjb21waWxlcnMuCisJICAgICMKKwkgICAgaWYgdGVzdCAiJGFjX2xibF9jY19kb250X3RyeV9nY2NfZGFzaFciICE9IHllczsgdGhlbgogCi0JCSAgICBpcml4NiopCi0JCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLW4zMiIKLQkJCSAgICA7OworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgZmFpbHMgd2hlbiBnaXZlbiBhbiB1bmtub3duIHdhcm5pbmcgb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIGZhaWxzIHdoZW4gZ2l2ZW4gYW4gdW5rbm93biB3YXJuaW5nIG9wdGlvbi4uLiAiID4mNjsgfQorCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCUNGTEFHUz0iJENGTEFHUyAtV3h5enp5LXRoaXMtd2lsbC1uZXZlci1zdWNjZWVkLXh5enp5IgorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotCQkgICAgKikKLQkJCSAgICA7OwotCQkgICAgZXNhYworaW50CittYWluICgpCit7CityZXR1cm4gMAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCSMKKwkJIyBXZSdyZSBhc3N1bWluZyB0aGlzIGlzIGNsYW5nLCB3aGVyZQorCQkjIC1XZXJyb3I9dW5rbm93bi13YXJuaW5nLW9wdGlvbiBpcyB0aGUgYXBwcm9wcmlhdGUKKwkJIyBvcHRpb24gdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIGZhaWwuCisJCSMKKwkJYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3I9Ii1XZXJyb3I9dW5rbm93bi13YXJuaW5nLW9wdGlvbiIKKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdhbGwgb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV2FsbCBvcHRpb24uLi4gIiA+JjY7IH0KKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yIC1XYWxsIgorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CityZXR1cm4gMAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1XYWxsIgorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIC1XbWlzc2luZy1wcm90b3R5cGVzIG9wdGlvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdtaXNzaW5nLXByb3RvdHlwZXMgb3B0aW9uLi4uICIgPiY2OyB9CisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAtV21pc3NpbmctcHJvdG90eXBlcyIKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIDAKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCQlWX0NDT1BUPSIkVl9DQ09QVCAtV21pc3NpbmctcHJvdG90eXBlcyIKKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV3N0cmljdC1wcm90b3R5cGVzIG9wdGlvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdzdHJpY3QtcHJvdG90eXBlcyBvcHRpb24uLi4gIiA+JjY7IH0KKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yIC1Xc3RyaWN0LXByb3RvdHlwZXMiCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAwCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwkJVl9DQ09QVD0iJFZfQ0NPUFQgLVdzdHJpY3QtcHJvdG90eXBlcyIKKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCiAJICAgIGZpCi0JICAgIG9zPWBlY2hvICR0YXJnZXRfb3MgfCBzZWQgLWUgJ3MvXChbMC05XVswLTldKlwpW14wLTldLiokL1wxLydgCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzLi4uICIgPiY2OyB9CisJaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJCSMKKwkJIyBHQ0MsIG9yIGEgY29tcGlsZXIgZGVlbWVkIHRvIGJlIEdDQyBieSBBQ19QUk9HX0NDIChldmVuCisJCSMgdGhvdWdoIGl0J3Mgbm90KTsgd2UgYXNzdW1lIHRoYXQsIGluIHRoaXMgY2FzZSwgdGhlIGZsYWcKKwkJIyB3b3VsZCBiZSAtTS4KKwkJIworCQlhY19sYmxfZGVwZW5kZW5jeV9mbGFnPSItTSIKKwllbHNlCisJCSMKKwkJIyBOb3QgR0NDIG9yIGEgY29tcGlsZXIgZGVlbWVkIHRvIGJlIEdDQzsgd2hhdCBwbGF0Zm9ybSBpcworCQkjIHRoaXM/ICAoV2UncmUgYXNzdW1pbmcgdGhhdCBpZiB0aGUgY29tcGlsZXIgaXNuJ3QgR0NDCisJCSMgaXQncyB0aGUgY29tcGlsZXIgZnJvbSB0aGUgdmVuZG9yIG9mIHRoZSBPUzsgdGhhdCB3b24ndAorCQkjIG5lY2Vzc2FyaWx5IGJlIHRydWUgZm9yIHg4NiBwbGF0Zm9ybXMsIHdoZXJlIGl0IG1pZ2h0IGJlCisJCSMgdGhlIEludGVsIEMgY29tcGlsZXIuKQorCQkjCisJCWNhc2UgIiRob3N0X29zIiBpbgorCisJCWlyaXgqfG9zZip8ZGFyd2luKikKKwkJCSMKKwkJCSMgTUlQUyBDIGZvciBJUklYLCBERUMgQywgYW5kIGNsYW5nIGFsbCB1c2UgLU0uCisJCQkjCisJCQlhY19sYmxfZGVwZW5kZW5jeV9mbGFnPSItTSIKKwkJCTs7CisKKwkJc29sYXJpcyopCisJCQkjCisJCQkjIFN1biBDIHVzZXMgLXhNLgorCQkJIworCQkJYWNfbGJsX2RlcGVuZGVuY3lfZmxhZz0iLXhNIgorCQkJOzsKKworCQlocHV4KikKKwkJCSMKKwkJCSMgSFAncyBvbGRlciBDIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IHRoaXMuCisJCQkjIEhQJ3MgbmV3ZXIgQyBjb21waWxlcnMgc3VwcG9ydCB0aGlzIHdpdGgKKwkJCSMgZWl0aGVyICtNIG9yICtNYWtlOyB0aGUgb2xkZXIgY29tcGlsZXJzCisJCQkjIGludGVycHJldCArTSBhcyBzb21ldGhpbmcgY29tcGxldGVseQorCQkJIyBkaWZmZXJlbnQsIHNvIHdlIHVzZSArTWFrZSBzbyB3ZSBkb24ndAorCQkJIyB0aGluayBpdCB3b3JrcyB3aXRoIHRoZSBvbGRlciBjb21waWxlcnMuCisJCQkjCisJCQlhY19sYmxfZGVwZW5kZW5jeV9mbGFnPSIrTWFrZSIKKwkJCTs7CisKKwkJKikKKwkJCSMKKwkJCSMgTm90IG9uZSBvZiB0aGUgYWJvdmU7IGFzc3VtZSBubyBzdXBwb3J0IGZvcgorCQkJIyBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcy4KKwkJCSMKKwkJCWFjX2xibF9kZXBlbmRlbmN5X2ZsYWc9IiIKKwkJCTs7CisJCWVzYWMKKwlmaQorCisJIworCSMgSXMgYWNfbGJsX2RlcGVuZGVuY3lfZmxhZyBkZWZpbmVkIGFuZCwgaWYgc28sIGRvZXMgdGhlIGNvbXBpbGVyCisJIyBjb21wbGFpbiBhYm91dCBpdD8KKwkjCisJIyBOb3RlOiBjbGFuZyBkb2Vzbid0IHNlZW0gdG8gZXhpdCB3aXRoIGFuIGVycm9yIHN0YXR1cyB3aGVuIGhhbmRlZAorCSMgYW4gdW5rbm93biBub24td2FybmluZyBlcnJvciwgZXZlbiBpZiB5b3UgcGFzcyBpdAorCSMgLVdlcnJvcj11bmtub3duLXdhcm5pbmctb3B0aW9uLiAgSG93ZXZlciwgaXQgYWx3YXlzIHN1cHBvcnRzCisJIyAtTSwgc28gdGhlIGZhY3QgdGhhdCB0aGlzIHRlc3QgYWx3YXlzIHN1Y2NlZWRzIHdpdGggY2xhbmcKKwkjIGlzbid0IGFuIGlzc3VlLgorCSMKKwlpZiB0ZXN0ICEgLXogIiRhY19sYmxfZGVwZW5kZW5jeV9mbGFnIjsgdGhlbgorCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitfQUNFT0YKKwkJZWNobyAiJENDIiAkYWNfbGJsX2RlcGVuZGVuY3lfZmxhZyBjb25mdGVzdC5jID4mNQorCQlpZiAiJENDIiAkYWNfbGJsX2RlcGVuZGVuY3lfZmxhZyBjb25mdGVzdC5jID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcywgd2l0aCAkYWNfbGJsX2RlcGVuZGVuY3lfZmxhZyIgPiY1CiskYXNfZWNobyAieWVzLCB3aXRoICRhY19sYmxfZGVwZW5kZW5jeV9mbGFnIiA+JjY7IH0KKwkJCURFUEVOREVOQ1lfQ0ZMQUc9IiRhY19sYmxfZGVwZW5kZW5jeV9mbGFnIgorCQkJTUtERVA9JyR7c3JjZGlyfS9ta2RlcCcKKwkJZWxzZQorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkjCisJCQkjIFdlIGNhbid0IHJ1biBta2RlcCwgc28gaGF2ZSAibWFrZSBkZXBlbmQiIGRvCisJCQkjIG5vdGhpbmcuCisJCQkjCisJCQlNS0RFUD06CisJCWZpCisJCXJtIC1yZiBjb25mdGVzdCoKKwllbHNlCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQkjCisJCSMgV2UgY2FuJ3QgcnVuIG1rZGVwLCBzbyBoYXZlICJtYWtlIGRlcGVuZCIgZG8KKwkJIyBub3RoaW5nLgorCQkjCisJCU1LREVQPToKKwlmaQorCisKKworCSAgICAjCisJICAgICMgV2UgdXNlZCB0byBzZXQgLW4zMiBmb3IgSVJJWCA2IHdoZW4gbm90IHVzaW5nIEdDQyAocHJlc3VtZWQKKwkgICAgIyB0byBtZWFuIHRoYXQgd2UncmUgdXNpbmcgTUlQUyBDIG9yIE1JUFNwcm8gQyk7IGl0IHNwZWNpZmllZAorCSAgICAjIHRoZSAibmV3IiBmYXN0ZXIgMzItYml0IEFCSSwgaW50cm9kdWNlZCBpbiBJUklYIDYuMi4gIEknbQorCSAgICAjIG5vdCBzdXJlIHdoeSB0aGF0IHdvdWxkIGJlIHNvbWV0aGluZyB0byBkbyAqb25seSogd2l0aCBhCisJICAgICMgLmRldmVsIGZpbGU7IHdoeSBzaG91bGQgdGhlIEFCSSBmb3Igd2hpY2ggd2UgcHJvZHVjZSBjb2RlCisJICAgICMgZGVwZW5kIG9uIC5kZXZlbD8KKwkgICAgIworCSAgICBvcz1gZWNobyAkaG9zdF9vcyB8IHNlZCAtZSAncy9cKFswLTldWzAtOV0qXClbXjAtOV0uKiQvXDEvJ2AKIAkgICAgbmFtZT0ibGJsL29zLSRvcy5oIgogCSAgICBpZiB0ZXN0IC1mICRuYW1lIDsgdGhlbgogCQkgICAgbG4gLXMgJG5hbWUgb3MtcHJvdG8uaAogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX09TX1BST1RPX0ggMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX09TX1BST1RPX0ggMSIgPj5jb25mZGVmcy5oCiAKIAkgICAgZWxzZQotCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogY2FuJ3QgZmluZCAkbmFtZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbid0IGZpbmQgJG5hbWUiID4mMjt9CisJCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhbid0IGZpbmQgJG5hbWUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FuJ3QgZmluZCAkbmFtZSIgPiYyO30KIAkgICAgZmkKICAgICBmaQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBzb2NrYWRkciBzdHJ1Y3QgaGFzIHNhX2xlbiBtZW1iZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBzb2NrYWRkciBzdHJ1Y3QgaGFzIHNhX2xlbiBtZW1iZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gICAgaWYgdGVzdCAiJHthY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBzb2NrYWRkciBzdHJ1Y3QgaGFzIHRoZSBzYV9sZW4gbWVtYmVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgdGhlIHNhX2xlbiBtZW1iZXIuLi4gIiA+JjY7IH0KKyAgICBpZiAke2FjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAogIwlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTczMTYsNTQgKzc1OTcsMjggQEAKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKICAgYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW49eWVzCiBlbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubworICBhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubwogZmkKLQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjY7IH0KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4iID4mNjsgfQogICAgIGlmIHRlc3QgJGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuID0geWVzIDsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NBX0xFTiAxCi1fQUNFT0YKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU09DS0FERFJfU0FfTEVOIDEiID4+Y29uZmRlZnMuaAogCiAgICAgZmkKIAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3QgZXhpc3RzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3QgZXhpc3RzLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHNvY2thZGRyX3N0b3JhZ2Ugc3RydWN0IGV4aXN0cyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBzb2NrYWRkcl9zdG9yYWdlIHN0cnVjdCBleGlzdHMuLi4gIiA+JjY7IH0KKyAgICBpZiAke2FjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKICMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC03Mzc2LDU0ICs3NjMxLDI4IEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZT15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZT1ubworICBhY19jdl9sYmxfaGFzX3NvY2thZGRyX3N0b3JhZ2U9bm8KIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlIiA+JjY7IH0KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZSIgPiY2OyB9CiAgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlID0geWVzIDsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMSIgPj5jb25mZGVmcy5oCiAKICAgICBmaQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBkbF9ocF9wcGFfaW5mb190IHN0cnVjdCBoYXMgZGxfbW9kdWxlX2lkXzEgbWVtYmVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgZGxfaHBfcHBhX2luZm9fdCBzdHJ1Y3QgaGFzIGRsX21vZHVsZV9pZF8xIG1lbWJlci4uLiAkRUNIT19DIiA+JjY7IH0KLSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBkbF9ocF9wcGFfaW5mb190IHN0cnVjdCBoYXMgZGxfbW9kdWxlX2lkXzEgbWVtYmVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGRsX2hwX3BwYV9pbmZvX3Qgc3RydWN0IGhhcyBkbF9tb2R1bGVfaWRfMSBtZW1iZXIuLi4gIiA+JjY7IH0KKyAgICBpZiAke2FjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKICMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC03NDM3LDQ4ICs3NjY2LDI2IEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CiAgIGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMT15ZXMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMT1ubworICBhY19jdl9sYmxfZGxfaHBfcHBhX2luZm9fdF9oYXNfZGxfbW9kdWxlX2lkXzE9bm8KIGZpCi0KIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xIiA+JjY7IH0KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSIgPiY2OyB9CiAgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xID0geWVzIDsgdGhlbgogCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX0hQX1BQQV9JTkZPX1RfRExfTU9EVUxFX0lEXzEgMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0hQX1BQQV9JTkZPX1RfRExfTU9EVUxFX0lEXzEgMSIgPj5jb25mZGVmcy5oCiAKICAgICBmaQogCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB1bmFsaWduZWQgYWNjZXNzZXMgZmFpbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsLi4uICIgPiY2OyB9CisgICAgaWYgJHthY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBjYXNlICIkaG9zdF9jcHUiIGluCiAKQEAgLTc1MTQsNyArNzcyMSw3IEBACiAJIyBrbm93IGl0IGRvZXMgd29yaywgYW5kIGhhdmUgdGhlIHNjcmlwdCBqdXN0IGZhaWwgb24gb3RoZXIKIAkjIGNwdSB0eXBlcyBhbmQgdXBkYXRlIGl0IHdoZW4gc3VjaCBhIGZhaWx1cmUgb2NjdXJzLgogCSMKLQlhbHBoYSp8YXJtKnxocCp8bWlwcyp8c2gqfHNwYXJjKnxpYTY0fG52MSkKKwlhbHBoYSp8YXJtKnxiZmluKnxocCp8bWlwcyp8c2gqfHNwYXJjKnxpYTY0fG52MSkKIAkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPXllcwogCQk7OwogCkBAIC03NTU3LDE4ICs3NzY0LDE2IEBACiAJCQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPW5vCiAJCQlmaQogCQlmaQotCQlybSAtZiBjb25mdGVzdCogY29yZSBjb3JlLmNvbmZ0ZXN0CisJCXJtIC1mIC1yIGNvbmZ0ZXN0KiBjb3JlIGNvcmUuY29uZnRlc3QKIAkJOzsKIAllc2FjCiBmaQogCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjY7IH0KICAgICBpZiB0ZXN0ICRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwgPSB5ZXMgOyB0aGVuCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIExCTF9BTElHTiAxCi1fQUNFT0YKKyRhc19lY2hvICIjZGVmaW5lIExCTF9BTElHTiAxIiA+PmNvbmZkZWZzLmgKIAogICAgIGZpCiAKQEAgLTc1NzcsOSArNzc4Miw3IEBACiAjIHRoYXQgaXQgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYXV0b2NvbmYgaXMgdXNlZC4KICMKIAotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9WRVJTSU9OX0ggMQotX0FDRU9GCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1ZFUlNJT05fSCAxIiA+PmNvbmZkZWZzLmgKIAogCiBybSAtZiBuZXQKQEAgLTc1OTgsNiArNzgwMSw1MDkgQEAKIAogCiAKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBVU0Igc25pZmZpbmcgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgVVNCIHNuaWZmaW5nIHN1cHBvcnQuLi4gIiA+JjY7IH0KK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCiskYXNfZWNobyAiI2RlZmluZSBQQ0FQX1NVUFBPUlRfVVNCIDEiID4+Y29uZmRlZnMuaAorCisJVVNCX1NSQz1wY2FwLXVzYi1saW51eC5jCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwlhY191c2JfZGV2X25hbWU9YHVkZXZpbmZvIC1xIG5hbWUgLXAgL3N5cy9jbGFzcy91c2JfZGV2aWNlL3VzYm1vbiAyPi9kZXYvbnVsbGAKKwlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgorCSAgYWNfdXNiX2Rldl9uYW1lPSJ1c2Jtb24iCisJZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMSU5VWF9VU0JfTU9OX0RFViAiL2Rldi8kYWNfdXNiX2Rldl9uYW1lIgorX0FDRU9GCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IERldmljZSBmb3IgVVNCIHNuaWZmaW5nIGlzIC9kZXYvJGFjX3VzYl9kZXZfbmFtZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBEZXZpY2UgZm9yIFVTQiBzbmlmZmluZyBpcyAvZGV2LyRhY191c2JfZGV2X25hbWUiID4mNjt9CisJIworCSMgRG8gd2UgaGF2ZSBhIHZlcnNpb24gb2YgPGxpbnV4L2NvbXBpbGVyLmg+IGF2YWlsYWJsZT8KKwkjIElmIHNvLCB3ZSBtaWdodCBuZWVkIGl0IGZvciA8bGludXgvdXNiZGV2aWNlX2ZzLmg+LgorCSMKKwlmb3IgYWNfaGVhZGVyIGluIGxpbnV4L2NvbXBpbGVyLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L2NvbXBpbGVyLmgiICJhY19jdl9oZWFkZXJfbGludXhfY29tcGlsZXJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfY29tcGlsZXJfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTlVYX0NPTVBJTEVSX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbGludXhfY29tcGlsZXJfaCIgPSB5ZXM7IHRoZW4KKwkgICMKKwkgICMgWWVzIC0gaW5jbHVkZSBpdCB3aGVuIHRlc3RpbmcgZm9yIDxsaW51eC91c2JkZXZpY2VfZnMuaD4uCisJICAjCisJICBmb3IgYWNfaGVhZGVyIGluIGxpbnV4L3VzYmRldmljZV9mcy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsaW51eC91c2JkZXZpY2VfZnMuaCIgImFjX2N2X2hlYWRlcl9saW51eF91c2JkZXZpY2VfZnNfaCIgIiNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfdXNiZGV2aWNlX2ZzX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSU5VWF9VU0JERVZJQ0VfRlNfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisJZWxzZQorCSAgZm9yIGFjX2hlYWRlciBpbiBsaW51eC91c2JkZXZpY2VfZnMuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvdXNiZGV2aWNlX2ZzLmgiICJhY19jdl9oZWFkZXJfbGludXhfdXNiZGV2aWNlX2ZzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X3VzYmRldmljZV9mc19oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCWZpCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9saW51eF91c2JkZXZpY2VfZnNfaCIgPSB5ZXM7IHRoZW4KKwkgICMKKwkgICMgT0ssIGRvZXMgaXQgZGVmaW5lIGJSZXF1ZXN0VHlwZT8gIE9sZGVyIHZlcnNpb25zIG9mIHRoZSBrZXJuZWwKKwkgICMgZGVmaW5lIGZpZWxkcyB3aXRoIG5hbWVzIGxpa2UgInJlcXVlc3R0eXBlLCAicmVxdWVzdCIsIGFuZAorCSAgIyAidmFsdWUiLCByYXRoZXIgdGhhbiAiYlJlcXVlc3RUeXBlIiwgImJSZXF1ZXN0IiwgYW5kCisJICAjICJ3VmFsdWUiLgorCSAgIworCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB1c2JkZXZmc19jdHJsdHJhbnNmZXIgc3RydWN0IGhhcyBiUmVxdWVzdFR5cGUgbWVtYmVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHVzYmRldmZzX2N0cmx0cmFuc2ZlciBzdHJ1Y3QgaGFzIGJSZXF1ZXN0VHlwZSBtZW1iZXIuLi4gIiA+JjY7IH0KKwkgIGlmICR7YWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTElOVVhfQ09NUElMRVJfSAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KK2ludAorbWFpbiAoKQorewordV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgKikwKS0+YlJlcXVlc3RUeXBlKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlPXllcworZWxzZQorICBhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGUiID4mNjsgfQorCSAgICBpZiB0ZXN0ICRhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZSA9IHllcyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VU0JERVZGU19DVFJMVFJBTlNGRVJfQlJFUVVFU1RUWVBFIDEiID4+Y29uZmRlZnMuaAorCisJICAgIGZpCisJZmkKKwk7OworKikKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwk7OworZXNhYworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBjb3VsZCBzdXBwb3J0IG5ldGZpbHRlciBzbmlmZmluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBjb3VsZCBzdXBwb3J0IG5ldGZpbHRlciBzbmlmZmluZy4uLiAiID4mNjsgfQorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkjCisJIyBMaWZlJ3MgdG9vIHNob3J0IHRvIGRlYWwgd2l0aCB0cnlpbmcgdG8gZ2V0IHRoaXMgdG8gY29tcGlsZQorCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCisJIyBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgZ2V0dGluZyBkZWZpbmVkIGJ5IHNvbWUgb3RoZXIgaW5jbHVkZS4KKwkjCisJIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KKwkjIG5ldGZpbHRlciBzdXBwb3J0LgorCSMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0Li4uICIgPiY2OyB9CisJaWYgJHthY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaD4KK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlPXllcworZWxzZQorICBhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSIgPiY2OyB9CisJaWYgdGVzdCAkYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlID0geWVzIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBQQ0FQX1NVUFBPUlRfTkVURklMVEVSIDEiID4+Y29uZmRlZnMuaAorCisJICBORVRGSUxURVJfU1JDPXBjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKKwlmaQorCTs7CisqKQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCTs7Citlc2FjCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYmx1ZXRvb3RoIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2JsdWV0b290aCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2JsdWV0b290aDsKK2Vsc2UKKyAgZW5hYmxlX2JsdWV0b290aD15ZXMKK2ZpCisKKworaWYgdGVzdCAieCRlbmFibGVfYmx1ZXRvb3RoIiAhPSAieG5vIiA7IHRoZW4KKwkJY2FzZSAiJGhvc3Rfb3MiIGluCisJbGludXgqKQorCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiYmx1ZXRvb3RoL2JsdWV0b290aC5oIiAiYWNfY3ZfaGVhZGVyX2JsdWV0b290aF9ibHVldG9vdGhfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYmx1ZXRvb3RoX2JsdWV0b290aF9oIiA9IHh5ZXM7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIFBDQVBfU1VQUE9SVF9CVCAxIiA+PmNvbmZkZWZzLmgKKworCQkgIEJUX1NSQz1wY2FwLWJ0LWxpbnV4LmMKKwkJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEJsdWV0b290aCBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQmx1ZXRvb3RoIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCIgPiY2O30KKworCQkgICMKKwkJICAjIE9LLCBkb2VzIHN0cnVjdCBzb2NrYWRkcl9oY2kgaGF2ZSBhbiBoY2lfY2hhbm5lbAorCQkgICMgbWVtYmVyPworCQkgICMKKwkJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHN0cnVjdCBzb2NrYWRkcl9oY2kgaGFzIGhjaV9jaGFubmVsIG1lbWJlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBzdHJ1Y3Qgc29ja2FkZHJfaGNpIGhhcyBoY2lfY2hhbm5lbCBtZW1iZXIuLi4gIiA+JjY7IH0KKwkJICBpZiAke2FjX2N2X2xibF9zb2NrYWRkcl9oY2lfaGFzX2hjaV9jaGFubmVsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPGJsdWV0b290aC9oY2kuaD4KKworaW50CittYWluICgpCit7Cit1X2ludCBpID0gc2l6ZW9mKCgoc3RydWN0IHNvY2thZGRyX2hjaSAqKTApLT5oY2lfY2hhbm5lbCkKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9sYmxfc29ja2FkZHJfaGNpX2hhc19oY2lfY2hhbm5lbD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGJsX3NvY2thZGRyX2hjaV9oYXNfaGNpX2NoYW5uZWw9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX3NvY2thZGRyX2hjaV9oYXNfaGNpX2NoYW5uZWwiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfc29ja2FkZHJfaGNpX2hhc19oY2lfY2hhbm5lbCIgPiY2OyB9CisJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfc29ja2FkZHJfaGNpX2hhc19oY2lfY2hhbm5lbCA9IHllcyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU09DS0FERFJfSENJX0hBU19IQ0lfQ0hBTk5FTCAvKiovIiA+PmNvbmZkZWZzLmgKKworCQkgICAgZmkKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEJsdWV0b290aCBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGJsdWV6LWxpYiBkZXZlbCB0byBlbmFibGUgaXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQmx1ZXRvb3RoIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgYmx1ZXotbGliIGRldmVsIHRvIGVuYWJsZSBpdCIgPiY2O30KKworZmkKKworCisJCTs7CisJKikKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBubyBCbHVldG9vdGggc25pZmZpbmcgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm8gQmx1ZXRvb3RoIHNuaWZmaW5nIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiA+JjY7fQorCQk7OworCWVzYWMKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2FudXNiIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NhbnVzYitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2NhbnVzYjsKK2Vsc2UKKyAgZW5hYmxlX2NhbnVzYj15ZXMKK2ZpCisKKworaWYgdGVzdCAieCRlbmFibGVfY2FudXNiIiAhPSAieG5vIiA7IHRoZW4KKwkJY2FzZSAiJGhvc3Rfb3MiIGluCisJbGludXgqKQorCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGlidXNiLTEuMC9saWJ1c2IuaCIgImFjX2N2X2hlYWRlcl9saWJ1c2JfMV8wX2xpYnVzYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saWJ1c2JfMV8wX2xpYnVzYl9oIiA9IHh5ZXM7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIFBDQVBfU1VQUE9SVF9DQU5VU0IgMSIgPj5jb25mZGVmcy5oCisKKwkJICAgIENBTlVTQl9TUkM9cGNhcC1jYW51c2ItbGludXguYworCQkgICAgTElCUz0iLWx1c2ItMS4wIC1scHRocmVhZCAkTElCUyIKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2FudXNiIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjYW51c2Igc25pZmZpbmcgaXMgc3VwcG9ydGVkIiA+JjY7fQorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2FudXNiIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgbGlidXNiMS4wIGxpYiBkZXZlbCB0byBlbmFibGUgaXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY2FudXNiIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgbGlidXNiMS4wIGxpYiBkZXZlbCB0byBlbmFibGUgaXQiID4mNjt9CisKK2ZpCisKKworCQk7OworCSopCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm8gY2FudXNiIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vIGNhbnVzYiBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgPiY2O30KKwkJOzsKKwllc2FjCisKKworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jYW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9jYW47CitlbHNlCisgIGVuYWJsZV9jYW49eWVzCitmaQorCisKK2lmIHRlc3QgIngkZW5hYmxlX2NhbiIgIT0gInhubyIgOyB0aGVuCisJCWNhc2UgIiRob3N0X29zIiBpbgorCWxpbnV4KikKKwkJYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImxpbnV4L2Nhbi5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2Nhbl9oIiAiI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfY2FuX2giID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIFBDQVBfU1VQUE9SVF9DQU4gMSIgPj5jb25mZGVmcy5oCisKKwkJCUNBTl9TUkM9cGNhcC1jYW4tbGludXguYworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBDQU4gc25pZmZpbmcgaXMgc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENBTiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNjt9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ0FOIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ0FOIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQiID4mNjt9CitmaQorCisKKwkJOzsKKwkqKQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vIENBTiBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBubyBDQU4gc25pZmZpbmcgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNjt9CisJCTs7CisJZXNhYworCisKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kYnVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RidXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kYnVzOworZWxzZQorICBlbmFibGVfZGJ1cz1pZmF2YWlsYWJsZQorZmkKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9kYnVzIiAhPSAieG5vIjsgdGhlbgorCWlmIHRlc3QgIngkZW5hYmxlX2RidXMiID0gInh5ZXMiOyB0aGVuCisJCWNhc2UgIiRob3N0X29zIiBpbgorCisJCWRhcndpbiopCisJCQkjCisJCQkjIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDI5CisJCQkjCisJCQlhc19mbl9lcnJvciAkPyAiRHVlIHRvIGZyZWVkZXNrdG9wLm9yZyBidWcgNzQwMjksIEQtQnVzIGNhcHR1cmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIG9uIE9TIFgiICIkTElORU5PIiA1CisJCQk7OworCQllc2FjCisJZWxzZQorCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQlkYXJ3aW4qKQorCQkJIworCQkJIyBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD03NDAyOQorCQkJIworCQkJOzsKKworCQkqKQorCQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwa2ctY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19QS0dDT05GSUcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUEtHQ09ORklHIjsgdGhlbgorICBhY19jdl9wcm9nX1BLR0NPTkZJRz0iJFBLR0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1BLR0NPTkZJRz0icGtnLWNvbmZpZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19QS0dDT05GSUciICYmIGFjX2N2X3Byb2dfUEtHQ09ORklHPSJubyIKK2ZpCitmaQorUEtHQ09ORklHPSRhY19jdl9wcm9nX1BLR0NPTkZJRworaWYgdGVzdCAtbiAiJFBLR0NPTkZJRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dDT05GSUciID4mNQorJGFzX2VjaG8gIiRQS0dDT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCQkJaWYgdGVzdCAieCRQS0dDT05GSUciICE9ICJ4bm8iOyB0aGVuCisJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRC1CdXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEQtQnVzLi4uICIgPiY2OyB9CisJCQkJaWYgIiRQS0dDT05GSUciIGRidXMtMTsgdGhlbgorCQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQkJCQlEQlVTX0NGTEFHUz1gIiRQS0dDT05GSUciIC0tY2ZsYWdzIGRidXMtMWAKKwkJCQkJREJVU19MSUJTPWAiJFBLR0NPTkZJRyIgLS1saWJzIGRidXMtMWAKKwkJCQkJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJCQkJCXNhdmVfTElCUz0iJExJQlMiCisJCQkJCUNGTEFHUz0iJENGTEFHUyAkREJVU19DRkxBR1MiCisJCQkJCUxJQlM9IiRMSUJTICREQlVTX0xJQlMiCisJCQkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgRC1CdXMgbGlicmFyeSBkZWZpbmVzIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEQtQnVzIGxpYnJhcnkgZGVmaW5lcyBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZS4uLiAiID4mNjsgfQorCQkJCQljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKwkJCQkJICAgICAjaW5jbHVkZSA8dGltZS5oPgorCQkJCQkgICAgICNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisJCQkJCSAgICAgI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgoraW50CittYWluICgpCit7CityZXR1cm4gZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoTlVMTCwgMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworCQkJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgUENBUF9TVVBQT1JUX0RCVVMgMSIgPj5jb25mZGVmcy5oCisKKwkJCQkJCURCVVNfU1JDPXBjYXAtZGJ1cy5jCisJCQkJCQlWX0lOQ0xTPSIkVl9JTkNMUyAkREJVU19DRkxBR1MiCisKK2Vsc2UKKworCQkJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkJCQlpZiB0ZXN0ICJ4JGVuYWJsZV9kYnVzIiA9ICJ4eWVzIjsgdGhlbgorCQkJCQkJICAgIGFzX2ZuX2Vycm9yICQ/ICItLWVuYWJsZS1kYnVzIHdhcyBnaXZlbiwgYnV0IHRoZSBELUJ1cyBsaWJyYXJ5IGRvZXNuJ3QgZGVmaW5lIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlKCkiICIkTElORU5PIiA1CisJCQkJCQlmaQorCQkJCQkJTElCUz0iJHNhdmVfTElCUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisJCQkJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCQkJCWVsc2UKKwkJCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkJCWlmIHRlc3QgIngkZW5hYmxlX2RidXMiID0gInh5ZXMiOyB0aGVuCisJCQkJCQlhc19mbl9lcnJvciAkPyAiLS1lbmFibGUtZGJ1cyB3YXMgZ2l2ZW4sIGJ1dCB0aGUgZGJ1cy0xIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCIgIiRMSU5FTk8iIDUKKwkJCQkJZmkKKwkJCQlmaQorCQkJZmkKKwkJCTs7CisJCWVzYWMKKwlmaQorCisKK2ZpCisKK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCWZvciBhY19oZWFkZXIgaW4gbGludXgvbmV0X3RzdGFtcC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC9uZXRfdHN0YW1wLmgiICJhY19jdl9oZWFkZXJfbGludXhfbmV0X3RzdGFtcF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9uZXRfdHN0YW1wX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSU5VWF9ORVRfVFNUQU1QX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCTs7CisqKQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm8gaGFyZHdhcmUgdGltZXN0YW1wIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vIGhhcmR3YXJlIHRpbWVzdGFtcCBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgPiY2O30KKwk7OworZXNhYworCiAjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKICMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgogIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CkBAIC03NjExLDIyICs4MzE3LDIzIEBACiAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiAjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKICMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9CisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQogaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgoraWYgJHthY19jdl9wYXRoX2luc3RhbGwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbgotICAuLyB8IC4vLyB8IC9jQy8qIHwgXAorICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAogICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAogICAvdXNyL3VjYi8qICkgOzsKICAgKikKICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgpAQCAtNzYzNCw3ICs4MzQxLDcgQEAKICAgICAjIGJ5IGRlZmF1bHQuCiAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwogICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0JaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorCWlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KIAkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCiAJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KIAkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgpAQCAtNzY0NCwxNyArODM1MSwyOSBAQAogCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KIAkgICAgOgogCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgIGJyZWFrIDMKKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQogCSAgZmkKIAlmaQogICAgICAgZG9uZQogICAgIGRvbmUKICAgICA7OwogZXNhYwotZG9uZQorCisgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAorcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCiAKIGZpCiAgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCkBAIC03NjY3LDggKzgzODYsOCBAQAogICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKICAgZmkKIGZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSU5TVEFMTCIgPiY1CiskYXNfZWNobyAiJElOU1RBTEwiID4mNjsgfQogCiAjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCiAjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgpAQCAtNzY4Miw3ICs4NDAxLDkgQEAKIGFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCiAKIAotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgorYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlZmF1bHQtMSIKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIHBjYXAtZmlsdGVyLm1hbm1pc2MgcGNhcC1saW5rdHlwZS5tYW5taXNjIHBjYXAtdHN0YW1wLm1hbm1pc2MgcGNhcC1zYXZlZmlsZS5tYW5maWxlIHBjYXAuM3BjYXAgcGNhcF9jb21waWxlLjNwY2FwIHBjYXBfZGF0YWxpbmsuM3BjYXAgcGNhcF9kdW1wX29wZW4uM3BjYXAgcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcCBwY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAgcGNhcF9vcGVuX2RlYWQuM3BjYXAgcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAgcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcCBwY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcCIKIAogY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCiAjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKQEAgLTc3MTEsMTIgKzg0MzIsMTMgQEAKICAgICBjYXNlICRhY192YWwgaW4gIygKICAgICAqJHthc19ubH0qKQogICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKICAgICAgIGVzYWMKICAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAogICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OwogICAgICAgZXNhYyA7OwogICAgIGVzYWMKICAgZG9uZQpAQCAtNzcyNCw4ICs4NDQ2LDggQEAKICAgKHNldCkgMj4mMSB8CiAgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAogICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKLSAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KICAgICAgIHNlZCAtbiBcCiAJInMvJy8nXFxcXCcnL2c7CiAJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCkBAIC03NzQ3LDEzICs4NDY5LDI0IEBACiAgICAgIDplbmQnID4+Y29uZmNhY2hlCiBpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCiAgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCisgICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KKwljYXQgY29uZmNhY2hlID4iJGNhY2hlX2ZpbGUiCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4gIygKKyAgICAgICAgKi8qIHwgPzoqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIkJCAmJgorCSAgbXYgLWYgIiRjYWNoZV9maWxlIiQkICIkY2FjaGVfZmlsZSIgOzsgIygKKyAgICAgICAgKikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiIDs7CisJZXNhYworICAgICAgZmkKKyAgICBmaQogICBlbHNlCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQogICBmaQogZmkKIHJtIC1mIGNvbmZjYWNoZQpAQCAtNzc2NiwxNCArODQ5OSwxNSBAQAogCiBhY19saWJvYmpzPQogYWNfbHRsaWJvYmpzPQorVT0KIGZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQogICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCiAgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJwotICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorICBhY19pPWAkYXNfZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKICAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgogICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KLSAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworICBhc19mbl9hcHBlbmQgYWNfbGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhc19mbl9hcHBlbmQgYWNfbHRsaWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKIGRvbmUKIExJQk9CSlM9JGFjX2xpYm9ianMKIApAQCAtNzc4MSwxMiArODUxNSwxNCBAQAogCiAKIAotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCithY193cml0ZV9mYWlsPTAKIGFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCiBhY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KLWNhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCiAjISAkU0hFTEwKICMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KICMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgpAQCAtNzc5Niw1OSArODUzMiw3OSBAQAogZGVidWc9ZmFsc2UKIGFjX2NzX3JlY2hlY2s9ZmFsc2UKIGFjX2NzX3NpbGVudD1mYWxzZQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLV9BQ0VPRgogCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogCiAjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKIERVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKICAgZW11bGF0ZSBzaAogICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKICAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KICAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCiAgIHNldG9wdCBOT19HTE9CX1NVQlNUCiBlbHNlCi0gIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OwogZXNhYwotCiBmaQogCiAKLQotCi0jIFBBVEggbmVlZHMgQ1IKLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQogCiAjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KIGlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKLSAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotICBjaG1vZCAreCBjb25mJCQuc2gKLSAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgZWxzZQotICAgIFBBVEhfU0VQQVJBVE9SPToKLSAgZmkKLSAgcm0gLWYgY29uZiQkLnNoCi1maQotCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KIGZpCiAKIApAQCAtNzg1NywyMCArODYxMywxOSBAQAogIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCiAjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKICMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKIElGUz0iICIiCSRhc19ubCIKIAogIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCiAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotZG9uZQorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAogICAgICA7OwpAQCAtNzg4MSwzMiArODYzNiwxMTEgQEAKICAgYXNfbXlzZWxmPSQwCiBmaQogaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKIGZpCiAKLSMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgotZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAotZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKIGRvbmUKIFBTMT0nJCAnCiBQUzI9Jz4gJwogUFM0PScrICcKIAogIyBOTFMgbnVpc2FuY2VzLgotZm9yIGFzX3ZhciBpbiBcCi0gIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCi0gIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCi0gIExDX1RFTEVQSE9ORSBMQ19USU1FCi1kbwotICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgotICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgotICBlbHNlCi0gICAgKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLSAgZmkKLWRvbmUKK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKIAotIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKwogaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCiAgIGFzX2V4cHI9ZXhwcgpAQCAtNzkyMCwxMyArODc1NCwxNyBAQAogICBhc19iYXNlbmFtZT1mYWxzZQogZmkKIAoraWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQogCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCiBhc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKICRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCiAJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCiAJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAorJGFzX2VjaG8gWC8iJDAiIHwKICAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKIAkgICAgcy8vXDEvCiAJICAgIHEKQEAgLTc5NDEsNTk1ICs4Nzc5LDY4IEBACiAJICB9CiAJICBzLy4qLy4vOyBxJ2AKIAotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwogCiBFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQotY2FzZSBgZWNobyAtbiB4YCBpbgorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKIC1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KKyAgY2FzZSBgZWNobyAneHlcYydgIGluCiAgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgotICAqKSAgIEVDSE9fQz0nXGMnOzsKKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKICAgZXNhYzs7CiAqKQogICBFQ0hPX049Jy1uJzs7CiBlc2FjCiAKLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQogcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKIGlmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgogICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCiBlbHNlCiAgIHJtIC1mIGNvbmYkJC5kaXIKLSAgbWtkaXIgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCiBmaQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wUicKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcFInCisgIGZpCiBlbHNlCi0gIGFzX2xuX3M9J2NwIC1wJworICBhc19sbl9zPSdjcCAtcFInCiBmaQogcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQogcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAogCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQogCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi1leGVjIDY+JjEKLQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KLSMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KLWFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MSwKLSAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKLQotQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0Ci0jIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotYWNfbmVlZF9kZWZhdWx0cz06Ci13aGlsZSB0ZXN0ICQjICE9IDAKLWRvCi0gIGNhc2UgJDEgaW4KLSAgLS0qPSopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Ci0gIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCi0gICAgZGVidWc9OiA7OwotICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCi0gICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKLQotICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1pZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KLSAgZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMICRTSEVMTCAkMCAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2Ci0gIENPTkZJR19TSEVMTD0kU0hFTEwKLSAgZXhwb3J0IENPTkZJR19TSEVMTAotICBleGVjICRTSEVMTCAiJDAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKIHsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLSAgZWNobyAiJGFjX2xvZyIKLX0gPiY1CiAKLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLQotIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCi1mb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKLWRvCi0gIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KLSAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLQotICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0KLSMKLSMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCi0jCi0KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotCi1fQUNFT0YKLQotCi0KLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotU0hFTEwhJFNIRUxMJGFjX2RlbGltCi1QQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KLVBBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi1QQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQotUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KLVBBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCi1leGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KLXByZWZpeCEkcHJlZml4JGFjX2RlbGltCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCi1iaW5kaXIhJGJpbmRpciRhY19kZWxpbQotc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQotZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCi1kYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi1zeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCi1zaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KLWxvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLWluY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KLW9sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KLWRvY2RpciEkZG9jZGlyJGFjX2RlbGltCi1pbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCi1odG1sZGlyISRodG1sZGlyJGFjX2RlbGltCi1kdmlkaXIhJGR2aWRpciRhY19kZWxpbQotcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KLXBzZGlyISRwc2RpciRhY19kZWxpbQotbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLWxvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCi1tYW5kaXIhJG1hbmRpciRhY19kZWxpbQotREVGUyEkREVGUyRhY19kZWxpbQotRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KLUVDSE9fTiEkRUNIT19OJGFjX2RlbGltCi1FQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotTElCUyEkTElCUyRhY19kZWxpbQotYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCi1ob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi10YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQotYnVpbGQhJGJ1aWxkJGFjX2RlbGltCi1idWlsZF9jcHUhJGJ1aWxkX2NwdSRhY19kZWxpbQotYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KLWJ1aWxkX29zISRidWlsZF9vcyRhY19kZWxpbQotaG9zdCEkaG9zdCRhY19kZWxpbQotaG9zdF9jcHUhJGhvc3RfY3B1JGFjX2RlbGltCi1ob3N0X3ZlbmRvciEkaG9zdF92ZW5kb3IkYWNfZGVsaW0KLWhvc3Rfb3MhJGhvc3Rfb3MkYWNfZGVsaW0KLXRhcmdldCEkdGFyZ2V0JGFjX2RlbGltCi10YXJnZXRfY3B1ISR0YXJnZXRfY3B1JGFjX2RlbGltCi10YXJnZXRfdmVuZG9yISR0YXJnZXRfdmVuZG9yJGFjX2RlbGltCi10YXJnZXRfb3MhJHRhcmdldF9vcyRhY19kZWxpbQotU0hMSUNDMiEkU0hMSUNDMiRhY19kZWxpbQotQ0MhJENDJGFjX2RlbGltCi1DRkxBR1MhJENGTEFHUyRhY19kZWxpbQotTERGTEFHUyEkTERGTEFHUyRhY19kZWxpbQotQ1BQRkxBR1MhJENQUEZMQUdTJGFjX2RlbGltCi1hY19jdF9DQyEkYWNfY3RfQ0MkYWNfZGVsaW0KLUVYRUVYVCEkRVhFRVhUJGFjX2RlbGltCi1PQkpFWFQhJE9CSkVYVCRhY19kZWxpbQotQ1BQISRDUFAkYWNfZGVsaW0KLUdSRVAhJEdSRVAkYWNfZGVsaW0KLUVHUkVQISRFR1JFUCRhY19kZWxpbQotTElCT0JKUyEkTElCT0JKUyRhY19kZWxpbQotVl9MRVghJFZfTEVYJGFjX2RlbGltCi1WX1lBQ0MhJFZfWUFDQyRhY19kZWxpbQotUkFOTElCISRSQU5MSUIkYWNfZGVsaW0KLVZfQ0NPUFQhJFZfQ0NPUFQkYWNfZGVsaW0KLVZfREVGUyEkVl9ERUZTJGFjX2RlbGltCi1WX0lOQ0xTISRWX0lOQ0xTJGFjX2RlbGltCi1WX0xJQlMhJFZfTElCUyRhY19kZWxpbQotVl9QQ0FQISRWX1BDQVAkYWNfZGVsaW0KLVZfRklOREFMTERFVlMhJFZfRklOREFMTERFVlMkYWNfZGVsaW0KLVZfUkFOTElCISRWX1JBTkxJQiRhY19kZWxpbQotU1NSQyEkU1NSQyRhY19kZWxpbQotRFlFWFQhJERZRVhUJGFjX2RlbGltCi1EQUdMSUJTISREQUdMSUJTJGFjX2RlbGltCi1JTlNUQUxMX1BST0dSQU0hJElOU1RBTExfUFJPR1JBTSRhY19kZWxpbQotSU5TVEFMTF9TQ1JJUFQhJElOU1RBTExfU0NSSVBUJGFjX2RlbGltCi1JTlNUQUxMX0RBVEEhJElOU1RBTExfREFUQSRhY19kZWxpbQotTFRMSUJPQkpTISRMVExJQk9CSlMkYWNfZGVsaW0KLV9BQ0VPRgotCi0gIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gNzg7IHRoZW4KLSAgICBicmVhawotICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotCi1hY19lb2Y9YHNlZCAtbiAnL15DRU9GWzAtOV0qJC9zL0NFT0YvMC9wJyBjb25mJCRzdWJzLnNlZGAKLWlmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCi0gIGFjX2VvZj1gZWNobyAiJGFjX2VvZiIgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCi0gIGFjX2VvZj1gZXhwciAkYWNfZW9mICsgMWAKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1jYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYiBlbmQKLV9BQ0VPRgotc2VkICcKLXMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKLXMvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KLTpuCi10IG4KLXMvJyIkYWNfZGVsaW0iJyQvLGcvOyB0Ci1zLyQvXFwvOyBwCi1OOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgotJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAotcm0gLWYgY29uZiQkc3Vicy5zZWQKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi06ZW5kCi1zL3wjXyEhXyN8Ly9nCi1DRU9GJGFjX2VvZgotX0FDRU9GCi0KLQotIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAotIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKLSMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0vewotcy86KlwkKHNyY2Rpcik6Ki86Lwotcy86Klwke3NyY2Rpcn06Ki86Lwotcy86KkBzcmNkaXJAOiovOi8KLXMvXlwoW149XSo9WwkgXSpcKToqL1wxLwotcy86KiQvLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLWZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKLQotCi1mb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMKLWRvCi0gIGNhc2UgJGFjX3RhZyBpbgotICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKLSAgZXNhYwotICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgotICA6W0ZITF0qOiopOzsKLSAgOkwqIHwgOkMqOiopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgOltGSF0tKSBhY190YWc9LTotOzsKLSAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKLSAgZXNhYwotICBhY19zYXZlX0lGUz0kSUZTCi0gIElGUz06Ci0gIHNldCB4ICRhY190YWcKLSAgSUZTPSRhY19zYXZlX0lGUwotICBzaGlmdAotICBhY19maWxlPSQxCi0gIHNoaWZ0Ci0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6TCkgYWNfc291cmNlPSQxOzsKLSAgOltGSF0pCi0gICAgYWNfZmlsZV9pbnB1dHM9Ci0gICAgZm9yIGFjX2YKLSAgICBkbwotICAgICAgY2FzZSAkYWNfZiBpbgotICAgICAgLSkgYWNfZj0iJHRtcC9zdGRpbiI7OwotICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKLQkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCi0JICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0JIHRlc3QgLWYgIiRhY19mIiB8fAotCSAgIGNhc2UgJGFjX2YgaW4KLQkgICBbXFwvJF0qKSBmYWxzZTs7Ci0JICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwotCSAgIGVzYWMgfHwKLQkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gICAgICBlc2FjCi0gICAgICBhY19maWxlX2lucHV0cz0iJGFjX2ZpbGVfaW5wdXRzICRhY19mIgotICAgIGRvbmUKLQotICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Ci0gICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgotICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCi0gICAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgZnJvbSAiYElGUz06Ci0JICBlY2hvICQqIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZydgIiBieSBjb25maWd1cmUuIgotICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KLSAgICBmaQotCi0gICAgY2FzZSAkYWNfdGFnIGluCi0gICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotCi0gIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFjX2ZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXClbXi9dLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wvXCkkL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotICB7IGFzX2Rpcj0iJGFjX2RpciIKICAgY2FzZSAkYXNfZGlyIGluICMoCiAgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKICAgZXNhYwotICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7CisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewogICAgIGFzX2RpcnM9CiAgICAgd2hpbGUgOjsgZG8KICAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotICAgICAgKlwnKikgYXNfcWRpcj1gZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCiAgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwogICAgICAgZXNhYwogICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKQEAgLTg1MzgsNyArODg0OSw3IEBACiAJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKIAkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAogCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhc19kaXIiIHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAogICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CiAJICAgIHMvL1wxLwogCSAgICBxCkBAIC04NTU5LDE3ICs4ODcwLDY2OSBAQAogICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKICAgICBkb25lCiAgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgotICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworCisjIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KK2FzX2ZuX2V4ZWN1dGFibGVfcCAoKQoreworICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCit9ICMgYXNfZm5fZXhlY3V0YWJsZV9wCithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCitleGVjIDY+JjEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2YgJENPTkZJR19TVEFUVVMgc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0VPRgordGVzdCAkYXNfd3JpdGVfZmFpbCA9IDAgJiYgY2htb2QgK3ggJENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJDAgYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgorYWNfbG9nPSIKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorIgorCitfQUNFT0YKKworY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Citlc2FjCisKK2Nhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworZXNhYworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKK2Zyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcworYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKKyAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4iCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgorYWNfY3NfdmVyc2lvbj0iXFwKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSwKKyAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCisKK0NvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCit0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KK2FjX25lZWRfZGVmYXVsdHM9Ogord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICBjYXNlICQxIGluCisgIC0tKj0/KikKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLS0qPSkKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz0KKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCisgICAgJGFzX2VjaG8gIiRhY19jc19jb25maWciOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgJycpIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGZpbGUgYXJndW1lbnQiIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICBhc19mbl9lcnJvciAkPyAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJFNIRUxMICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKyAgc2hpZnQKKyAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKKyAgQ09ORklHX1NIRUxMPSckU0hFTEwnCisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgZXhlYyAiXCRAIgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgJGFzX2VjaG8gIiRhY19sb2ciCit9ID4mNQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIworIyBJTklULUNPTU1BTkRTCisjCisKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OworICAgICJkZWZhdWx0LTEiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVmYXVsdC0xIiA7OworICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgICAicGNhcC1maWx0ZXIubWFubWlzYyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwLWZpbHRlci5tYW5taXNjIiA7OworICAgICJwY2FwLWxpbmt0eXBlLm1hbm1pc2MiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcC1saW5rdHlwZS5tYW5taXNjIiA7OworICAgICJwY2FwLXRzdGFtcC5tYW5taXNjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXAtdHN0YW1wLm1hbm1pc2MiIDs7CisgICAgInBjYXAtc2F2ZWZpbGUubWFuZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwLXNhdmVmaWxlLm1hbmZpbGUiIDs7CisgICAgInBjYXAuM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcC4zcGNhcCIgOzsKKyAgICAicGNhcF9jb21waWxlLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXBfY29tcGlsZS4zcGNhcCIgOzsKKyAgICAicGNhcF9kYXRhbGluay4zcGNhcCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwX2RhdGFsaW5rLjNwY2FwIiA7OworICAgICJwY2FwX2R1bXBfb3Blbi4zcGNhcCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwX2R1bXBfb3Blbi4zcGNhcCIgOzsKKyAgICAicGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwIiA7OworICAgICJwY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAiIDs7CisgICAgInBjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcCIgOzsKKyAgICAicGNhcF9vcGVuX2RlYWQuM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcF9vcGVuX2RlYWQuM3BjYXAiIDs7CisgICAgInBjYXBfb3Blbl9vZmZsaW5lLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXBfb3Blbl9vZmZsaW5lLjNwY2FwIiA7OworICAgICJwY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAiIDs7CisgICAgInBjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwIiA7OworCisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OworICBlc2FjCitkb25lCisKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKyAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAorIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgorIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCiskZGVidWcgfHwKK3sKKyAgdG1wPSBhY190bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIDogIiR7YWNfdG1wOj0kdG1wfSIKKyAgeyB0ZXN0ICEgLWQgIiRhY190bXAiIHx8IHJtIC1mciAiJGFjX3RtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICdhc19mbl9leGl0IDEnIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iICIkTElORU5PIiA1CithY190bXA9JHRtcAorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCisKK2FjX2NyPWBlY2hvIFggfCB0ciBYICdcMDE1J2AKKyMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KKyMgQnV0IHdlIGtub3cgb2Ygbm8gb3RoZXIgc2hlbGwgd2hlcmUgYWNfY3Igd291bGQgYmUgZW1wdHkgYXQgdGhpcworIyBwb2ludCwgc28gd2UgY2FuIHVzZSBhIGJhc2hpc20gYXMgYSBmYWxsYmFjay4KK2lmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgorICBldmFsIGFjX2NyPVwkXCdcXHJcJworZmkKK2FjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisgIGFjX2NzX2F3a19jcj0nXFxyJworZWxzZQorICBhY19jc19hd2tfY3I9JGFjX2NyCitmaQorCitlY2hvICdCRUdJTiB7JyA+IiRhY190bXAvc3ViczEuYXdrIiAmJgorX0FDRU9GCisKKworeworICBlY2hvICJjYXQgPmNvbmYkJHN1YnMuYXdrIDw8X0FDRU9GIiAmJgorICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisgIGVjaG8gIl9BQ0VPRiIKK30gPmNvbmYkJHN1YnMuc2ggfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICdeJ2AKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKKyAgYWNfZGVsaW1fbj1gc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLmF3ayB8IGdyZXAgLWMgWGAKKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCitybSAtZiBjb25mJCRzdWJzLnNoCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorX0FDRU9GCitzZWQgLW4gJworaAorcy9eL1NbIi87IHMvIS4qLyJdPS8KK3AKK2cKK3MvXlteIV0qIS8vCis6cmVwbAordCByZXBsCitzLyciJGFjX2RlbGltIickLy8KK3QgZGVsaW0KKzpubAoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCitwCituCitiIHJlcGwKKzptb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IG5sCis6ZGVsaW0KK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KK3AKK2IKKzptb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IGRlbGltCisnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCisvXlteIiJdL3sKKyAgTgorICBzL1xuLy8KK30KKycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKK3JtIC1mIGNvbmYkJHN1YnMuYXdrCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0FXSworY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKKworfQoreworICBsaW5lID0gJCAwCisgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorICBzdWJzdGVkID0gMAorICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCisgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKyAgICBrZXkgPSBmaWVsZFtpXQorICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCisgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKyAgICAgIHZhbHVlID0gU1trZXldCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCisgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorICAgICAgc3Vic3RlZCA9IDEKKyAgICB9IGVsc2UKKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisgIH0KKworICBwcmludCBsaW5lCit9CisKK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKK2Vsc2UKKyAgY2F0CitmaSA8ICIkYWNfdG1wL3N1YnMxLmF3ayIgPiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitfQUNFT0YKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBlbnRyaWVzIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9WwkgXSoveworaAorcy8vLworcy9eLzovCitzL1sJIF0qJC86Lworcy86XCQoc3JjZGlyKTovOi9nCitzLzpcJHtzcmNkaXJ9Oi86L2cKK3MvOkBzcmNkaXJAOi86L2cKK3MvXjoqLy8KK3MvOiokLy8KK3gKK3MvXCg9WwkgXSpcKS4qL1wxLworRworcy9cbi8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19IRUFERVJTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyI7IHRoZW4KK2NhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorQkVHSU4geworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCisjIGhlcmUtZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisKKyMgQ3JlYXRlIGEgZGVsaW1pdGVyIHN0cmluZyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIGNvbmZkZWZzLmgsIHRvIGVhc2UKKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KKyAgYWNfdHQ9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorICBpZiB0ZXN0IC16ICIkYWNfdHQiOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKKworIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisjIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKKyMgbmV3bGluZSBzZXF1ZW5jZXMuCisKK2FjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCitzZWQgLW4gJworcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IHJzZXQKKzpyc2V0CitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwordCBkZWYKK2QKKzpkZWYKK3MvXFwkLy8KK3QgYnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDMiL3AKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCitkCis6YnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDNcXFxcXFxuIlxcL3AKK3QgY29udAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKK3QgY29udAorZAorOmNvbnQKK24KK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCBjbGVhcgorOmNsZWFyCitzL1xcJC8vCit0IGJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKK2QKKzpic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCitiIGNvbnQKKycgPGNvbmZkZWZzLmggfCBzZWQgJworcy8nIiRhY19kZWxpbSInLyJcXFwKKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCit9CisvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKyAgbGluZSA9IFwkIDAKKyAgc3BsaXQobGluZSwgYXJnLCAiICIpCisgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisgICAgZGVmdW5kZWYgPSBhcmdbMl0KKyAgICBtYWMxID0gYXJnWzNdCisgIH0gZWxzZSB7CisgICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQorICAgIG1hYzEgPSBhcmdbMl0KKyAgfQorICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCisgIG1hY3JvID0gbWFjMlsxXQorICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKyAgaWYgKERfaXNfc2V0W21hY3JvXSkgeworICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCisgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorICAgIG5leHQKKyAgfSBlbHNlIHsKKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisgICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisgICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCisgICAgICBuZXh0CisgICAgfQorICB9Cit9Cit7IHByaW50IH0KK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisKKworZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUyIKK3NoaWZ0Citmb3IgYWNfdGFnCitkbworICBjYXNlICRhY190YWcgaW4KKyAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7CisgIGVzYWMKKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKyAgOltGSExdKjoqKTs7CisgIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDU7OworICA6W0ZIXS0pIGFjX3RhZz0tOi07OworICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OworICBlc2FjCisgIGFjX3NhdmVfSUZTPSRJRlMKKyAgSUZTPToKKyAgc2V0IHggJGFjX3RhZworICBJRlM9JGFjX3NhdmVfSUZTCisgIHNoaWZ0CisgIGFjX2ZpbGU9JDEKKyAgc2hpZnQKKworICBjYXNlICRhY19tb2RlIGluCisgIDpMKSBhY19zb3VyY2U9JDE7OworICA6W0ZIXSkKKyAgICBhY19maWxlX2lucHV0cz0KKyAgICBmb3IgYWNfZgorICAgIGRvCisgICAgICBjYXNlICRhY19mIGluCisgICAgICAtKSBhY19mPSIkYWNfdG1wL3N0ZGluIjs7CisgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQorCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKwkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KKwkgdGVzdCAtZiAiJGFjX2YiIHx8CisJICAgY2FzZSAkYWNfZiBpbgorCSAgIFtcXC8kXSopIGZhbHNlOzsKKwkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CisJICAgZXNhYyB8fAorCSAgIGFzX2ZuX2Vycm9yIDEgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCisgICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgorICAgIGRvbmUKKworICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorCSAgJGFzX2VjaG8gIiQqIiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnCisJYCcgYnkgY29uZmlndXJlLicKKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgZmkKKyAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgorICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAorICAgICpcJiogfCAqXHwqIHwgKlxcKiApCisgICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8CisgICAgICAgc2VkICdzL1tcXFxcJnxdL1xcXFwmL2cnYDs7ICMoCisgICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CisgICAgZXNhYworCisgICAgY2FzZSAkYWNfdGFnIGluCisgICAgKjotOiogfCAqOi0pIGNhdCA+IiRhY190bXAvc3RkaW4iIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNSA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisKKyAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCiAgIGFjX2J1aWxkZGlyPS4KIAogY2FzZSAiJGFjX2RpciIgaW4KIC4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwogKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAogICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAogICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCiAgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKICAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CkBAIC04NjA5LDEyICs5NTcyLDEyIEBACiAgIGVzYWMKIF9BQ0VPRgogCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKICMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KICMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgogYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci0KLWNhc2UgYHNlZCAtbiAnL2RhdGFyb290ZGlyLyB7CithY19zZWRfZGF0YXJvb3Q9JworL2RhdGFyb290ZGlyLyB7CiAgIHAKICAgcQogfQpAQCAtODYyMiwzNiArOTU4NSwzNyBAQAogL0Bkb2NkaXJAL3AKIC9AaW5mb2RpckAvcAogL0Bsb2NhbGVkaXJAL3AKLS9AbWFuZGlyQC9wCi0nICRhY19maWxlX2lucHV0c2AgaW4KKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgogKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwogKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQogX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiAgIGFjX2RhdGFyb290ZGlyX2hhY2s9JwogICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCiAgIHMmQGRvY2RpckAmJGRvY2RpciZnCiAgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKICAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKICAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKLSAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OwogZXNhYwogX0FDRU9GCiAKICMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KICMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgogIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgc2VkICIkYWNfdnBzdWIKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKICRleHRyYXN1YgogX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKIDp0CiAvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCi1zJkBjb25maWd1cmVfaW5wdXRAJiRjb25maWd1cmVfaW5wdXQmO3QgdAorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAogcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CiBzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAogcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAogcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdApAQCAtODY2MSwxMzIgKzk2MjUsNzUgQEAKIHMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKIHMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKICRhY19kYXRhcm9vdGRpcl9oYWNrCi0iICRhY19maWxlX2lucHV0cyB8IHNlZCAtZiAiJHRtcC9zdWJzLTEuc2VkIiA+JHRtcC9vdXQKKyIKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siIFwKKyAgPiRhY190bXAvb3V0IHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQogCiB0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgotICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi13aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkYWNfdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyBcCisgICAgICAiJGFjX3RtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KIAotICBybSAtZiAiJHRtcC9zdGRpbiIKKyAgcm0gLWYgIiRhY190bXAvc3RkaW4iCiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgLSkgY2F0ICIkdG1wL291dCI7IHJtIC1mICIkdG1wL291dCI7OwotICAqKSBybSAtZiAiJGFjX2ZpbGUiOyBtdiAiJHRtcC9vdXQiICRhY19maWxlOzsKLSAgZXNhYworICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CiAgOzsKICAgOkgpCiAgICMKICAgIyBDT05GSUdfSEVBREVSCiAgICMKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGBjb25mdGVzdC5kZWZpbmVzJywgdGhhdAotIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLSMgRmlyc3QsIGFwcGVuZCBhIHNwYWNlIHRvIGV2ZXJ5IHVuZGVmL2RlZmluZSBsaW5lLCB0byBlYXNlIG1hdGNoaW5nLgotZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcwotIyBUaGVuLCBwcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QsIG9yIGluCi0jIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQsIGluIGNvbmZpZy5zdGF0dXMuICBJZiBzb21lIG1hY3JvcyB3ZXJlCi0jIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCi0jIHN5bWJvbCwgd2hpY2ggaXMgdXNlbGVzcy4gIEJ1dCBkbyBub3Qgc29ydCB0aGVtLCBzaW5jZSB0aGUgbGFzdAotIyBBQ19ERUZJTkUgbXVzdCBiZSBob25vcmVkLgotYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBQQVJBTVMgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQsIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMgUEFSQU1TIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi0taW4gbW9zdCBjYXNlcywgaXQncwotIyBqdXN0IGFuIGVtcHR5IHN0cmluZy4KLWFjX2RBPSdzLF5cXChbCSAjXSpcXClbXgkgXSpcXChbCSBdKicKLWFjX2RCPSdcXClbCSAoXS4qLFxcMWRlZmluZVxcMicKLWFjX2RDPScgJwotYWNfZEQ9JyAsJwotCi11bmlxIGNvbmZkZWZzLmggfAotICBzZWQgLW4gJwotCXQgcnNldAotCTpyc2V0Ci0Jcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovLwotCXQgb2sKLQlkCi0JOm9rCi0Jcy9bXFwmLF0vXFwmL2cKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvICciJGFjX2RBIidcMSciJGFjX2RCIidcMiciJHthY19kQ30iJ1wzJyIkYWNfZEQiJy9wCi0Jcy9eXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpLyciJGFjX2RBIidcMSciJGFjX2RCJGFjX2RDIidcMiciJGFjX2REIicvcAotICAnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIFJlbW92ZSB0aGUgc3BhY2UgdGhhdCB3YXMgYXBwZW5kZWQgdG8gZWFzZSBtYXRjaGluZy4KLSMgVGhlbiByZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi0jIChUaGUgcmVnZXhwIGNhbiBiZSBzaG9ydCwgc2luY2UgdGhlIGxpbmUgY29udGFpbnMgZWl0aGVyICNkZWZpbmUgb3IgI3VuZGVmLikKLWVjaG8gJ3MvICQvLwotcyxeWwkgI10qdS4qLC8qICYgKi8sJyA+PmNvbmZ0ZXN0LmRlZmluZXMKLQotIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzOgotYWNfbWF4X3NlZF9saW5lcz01MAotCi0jIEZpcnN0IHNlZCBjb21tYW5kIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICRhY19maWxlX2lucHV0cyA+IiR0bXAvb3V0MSIKLSMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKLSMgVGhpcmQgb25lIHdpbGwgYmU6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MiIgPiIkdG1wL291dDEiCi0jIGV0IGNldGVyYS4KLWFjX2luPSckYWNfZmlsZV9pbnB1dHMnCi1hY19vdXQ9JyIkdG1wL291dDEiJwotYWNfbnh0PSciJHRtcC9vdXQyIicKLQotd2hpbGUgOgotZG8KLSAgIyBXcml0ZSBhIGhlcmUgZG9jdW1lbnQ6Ci0gICAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgICAjIEZpcnN0LCBjaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBsaW5lOgotICAgIGNhdCA+IlwkdG1wL2RlZmluZXMuc2VkIiA8PFxcQ0VPRgotL15bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qJGFjX3dvcmRfcmVbCSBdKlwkL2IgZGVmCi0vXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qJGFjX3dvcmRfcmVbKAkgXS9iIGRlZgotYgotOmRlZgotX0FDRU9GCi0gIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICAgIHNlZCAtZiAiJHRtcC9kZWZpbmVzLnNlZCInICIkYWNfaW4gPiRhY19vdXQiID4+JENPTkZJR19TVEFUVVMKLSAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KLSAgc2VkIDEsJHthY19tYXhfc2VkX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAotICBncmVwIC4gY29uZnRlc3QudGFpbCA+L2Rldi9udWxsIHx8IGJyZWFrCi0gIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCi1kb25lCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLQotZWNobyAiYWNfcmVzdWx0PSRhY19pbiIgPj4kQ09ORklHX1NUQVRVUwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCiAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgPiIkdG1wL2NvbmZpZy5oIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIgPj4iJHRtcC9jb25maWcuaCIKLSAgICBpZiBkaWZmICRhY19maWxlICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1Ci1lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICB7CisgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgorICAgIH0gPiIkYWNfdG1wL2NvbmZpZy5oIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiRhY190bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQogICAgIGVsc2UKLSAgICAgIHJtIC1mICRhY19maWxlCi0gICAgICBtdiAiJHRtcC9jb25maWcuaCIgJGFjX2ZpbGUKKyAgICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgICAgIG12ICIkYWNfdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKwl8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKICAgICBmaQogICBlbHNlCi0gICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iCi0gICAgY2F0ICIkYWNfcmVzdWx0IgorICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CiAgIGZpCi0gIHJtIC1mICIkdG1wL291dDEyIgogIDs7CiAKLQorICA6QykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KKyA7OwogICBlc2FjCiAKKworICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KKyAgICAiZGVmYXVsdC0xIjpDKSBpZiB0ZXN0IC1mIC5kZXZlbDsgdGhlbgorCWVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAorCWNhdCBNYWtlZmlsZS1kZXZlbC1hZGRzID4+IE1ha2VmaWxlCisJbWFrZSBkZXBlbmQKK2ZpIDs7CisKKyAgZXNhYwogZG9uZSAjIGZvciBhY190YWcKIAogCi17IChleGl0IDApOyBleGl0IDA7IH0KK2FzX2ZuX2V4aXQgMAogX0FDRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwogYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKIAordGVzdCAkYWNfd3JpdGVfZmFpbCA9IDAgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIndyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKIAogIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgogIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCkBAIC04ODA2LDExICs5NzEzLDExIEBACiAgIGV4ZWMgNT4+Y29uZmlnLmxvZwogICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAogICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KLSAgJGFjX2NzX3N1Y2Nlc3MgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisgICRhY19jc19zdWNjZXNzIHx8IGFzX2ZuX2V4aXQgMQorZmkKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjI7fQogZmkKIAotCi1pZiB0ZXN0IC1mIC5kZXZlbCA7IHRoZW4KLQltYWtlIGRlcGVuZAotZmkKIGV4aXQgMApkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IDVjZDhiMTQuLjM1NjZmODIgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTEsNCArMSw0IEBACi1kbmwgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9jb25maWd1cmUuaW4sdiAxLjEyMC4yLjEzIDIwMDcvMDkvMTIgMTk6MTc6MjQgZ3V5IEV4cCAkIChMQkwpCitkbmwgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9jb25maWd1cmUuaW4sdiAxLjE2OCAyMDA4LTEyLTIzIDIwOjQ5OjI2IGd1eSBFeHAgJCAoTEJMKQogZG5sCiBkbmwgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CiBkbmwJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC02LDMwICs2LDEyOSBAQAogZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCiBkbmwKIAotQUNfUkVWSVNJT04oJFJldmlzaW9uOiAxLjEyMC4yLjEzICQpCi1BQ19QUkVSRVEoMi41MCkKKyMKKyMgU2VlCisjCisjCWh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvY29uZmlnL1JFQURNRQorIworIyBmb3IgdGhlIFVSTHMgdG8gdXNlIHRvIGZldGNoIG5ldyB2ZXJzaW9ucyBvZiBjb25maWcuZ3Vlc3MgYW5kCisjIGNvbmZpZy5zdWIuCisjCisKK0FDX1BSRVJFUSgyLjYxKQogQUNfSU5JVChwY2FwLmMpCiAKIEFDX0NBTk9OSUNBTF9TWVNURU0KIAotQUNfTEJMX0NfSU5JVChWX0NDT1BULCBWX0lOQ0xTLCBWX0xJQlMpCitBQ19MQkxfQ19JTklUX0JFRk9SRV9DQyhWX0NDT1BULCBWX0lOQ0xTKQorQUNfUFJPR19DQworQUNfTEJMX0NfSU5JVChWX0NDT1BULCBWX0lOQ0xTKQorQUNfTEJMX1NITElCU19JTklUCiBBQ19MQkxfQ19JTkxJTkUKIEFDX0NfX19BVFRSSUJVVEVfXworaWYgdGVzdCAiJGFjX2N2X19fYXR0cmlidXRlX18iID0gInllcyI7IHRoZW4KKwlBQ19DX19fQVRUUklCVVRFX19fVU5VU0VECisJQUNfQ19fX0FUVFJJQlVURV9fX0ZPUk1BVAorZmkKIAotQUNfTEJMX0NIRUNLX1RZUEUodV9pbnQ4X3QsIHVfY2hhcikKLUFDX0xCTF9DSEVDS19UWVBFKHVfaW50MTZfdCwgdV9zaG9ydCkKLUFDX0xCTF9DSEVDS19UWVBFKHVfaW50MzJfdCwgdV9pbnQpCitBQ19DSEVDS19IRUFERVJTKHN5cy9iaXR5cGVzLmgpCisKK0FDX0NIRUNLX1RZUEUoW2ludDhfdF0sICwKKwlbQUNfREVGSU5FKFtpbnQ4X3RdLCBbc2lnbmVkIGNoYXJdLAorCVtEZWZpbmUgdG8gYHNpZ25lZCBjaGFyJyBpZiBpbnQ4X3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCitBQ19DSEVDS19UWVBFKFt1X2ludDhfdF0sICwKKwlbQUNfREVGSU5FKFt1X2ludDhfdF0sIFt1bnNpZ25lZCBjaGFyXSwKKwlbRGVmaW5lIHRvIGB1bnNpZ25lZCBjaGFyJyBpZiB1X2ludDhfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW2ludDE2X3RdLCAsCisJW0FDX0RFRklORShbaW50MTZfdF0sIFtzaG9ydF0sCisJW0RlZmluZSB0byBgc2hvcnQnIGlmIGludDE2X3Qgbm90IGRlZmluZWQuXSldCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW3VfaW50MTZfdF0sICwKKwlbQUNfREVGSU5FKFt1X2ludDE2X3RdLCBbdW5zaWduZWQgc2hvcnRdLAorCVtEZWZpbmUgdG8gYHVuc2lnbmVkIHNob3J0JyBpZiB1X2ludDE2X3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCitBQ19DSEVDS19UWVBFKFtpbnQzMl90XSwgLAorCVtBQ19ERUZJTkUoW2ludDMyX3RdLCBbaW50XSwKKwlbRGVmaW5lIHRvIGBpbnQnIGlmIGludDMyX3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCitBQ19DSEVDS19UWVBFKFt1X2ludDMyX3RdLCAsCisJW0FDX0RFRklORShbdV9pbnQzMl90XSwgW3Vuc2lnbmVkIGludF0sCisJW0RlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiB1X2ludDMyX3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCitBQ19DSEVDS19UWVBFKFtpbnQ2NF90XSwgLAorCVtBQ19ERUZJTkUoW2ludDY0X3RdLCBbbG9uZyBsb25nXSwKKwlbRGVmaW5lIHRvIGBsb25nIGxvbmcnIGlmIGludDY0X3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCitBQ19DSEVDS19UWVBFKFt1X2ludDY0X3RdLCAsCisJW0FDX0RFRklORShbdV9pbnQ2NF90XSwgW3Vuc2lnbmVkIGxvbmcgbG9uZ10sCisJW0RlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCisKKyMKKyMgVHJ5IHRvIGFycmFuZ2UgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydC4KKyMKK0FDX1NZU19MQVJHRUZJTEUKK0FDX0ZVTkNfRlNFRUtPCiAKIGRubAotZG5sIGxpYnBjYXAgZG9lc24ndCBpdHNlbGYgdXNlIDxzeXMvaW9jY29tLmg+OyBob3dldmVyLCB0aGUgdGVzdCBwcm9ncmFtCi1kbmwgaW4gIkFDX0xCTF9GSVhJTkNMVURFUyIgaW4gImFjbG9jYWwubTQiIHVzZXMgaXQsIHNvIHdlIGhhdmUgdG8KLWRubCB0ZXN0IGZvciBpdCBhbmQgc2V0ICJIQVZFX1NZU19JT0NDT01fSCIgaWYgd2UgaGF2ZSBpdCwgb3RoZXJ3aXNlCi1kbmwgIkFDX0xCTF9GSVhJTkNMVURFUyIgd29uJ3Qgd29yayBvbiBzb21lIHBsYXRmb3JtcyBzdWNoIGFzIFNvbGFyaXMuCitkbmwgRXZlbiBpZiA8bmV0L2JwZi5oPiB3ZXJlLCBvbiBhbGwgT1NlcyB0aGF0IHN1cHBvcnQgQlBGLCBmaXhlZCB0bworZG5sIGluY2x1ZGUgPHN5cy9pb2Njb20uaD4sIGFuZCB3ZSB3ZXJlIHRvIGRyb3Agc3VwcG9ydCBmb3Igb2xkZXIKK2RubCByZWxlYXNlcyB3aXRob3V0IHRoYXQgZml4LCBzbyB0aGF0IHBjYXAtYnBmLmMgZG9lc24ndCBuZWVkIHRvCitkbmwgaW5jbHVkZSA8c3lzL2lvY2NvbS5oPiwgdGhlIHRlc3QgcHJvZ3JhbSBpbiAiQUNfTEJMX0ZJWElOQ0xVREVTIgorZG5sIGluICJhY2xvY2FsLm00IiB1c2VzIGl0LCBzbyB3ZSB3b3VsZCBzdGlsbCBoYXZlIHRvIHRlc3QgZm9yIGl0CitkbmwgYW5kIHNldCAiSEFWRV9TWVNfSU9DQ09NX0giIGlmIHdlIGhhdmUgaXQsIG90aGVyd2lzZQorZG5sICJBQ19MQkxfRklYSU5DTFVERVMiIHdvdWxkbid0IHdvcmsgb24gc29tZSBwbGF0Zm9ybXMgc3VjaCBhcyBTb2xhcmlzLgogZG5sCiBBQ19DSEVDS19IRUFERVJTKHN5cy9pb2Njb20uaCBzeXMvc29ja2lvLmggbGltaXRzLmggcGF0aHMuaCkKK0FDX0NIRUNLX0hFQURFUlMobGludXgvdHlwZXMuaCkKK0FDX0NIRUNLX0hFQURFUlMobGludXgvaWZfcGFja2V0LmggbmV0cGFja2V0L3BhY2tldC5oIG5ldHBhY2tldC9pZl9wYWNrZXQuaCkKIEFDX0NIRUNLX0hFQURFUlMobmV0L3BmdmFyLmgsICwgLCBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXQvaWYuaD5dKQoraWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPSB5ZXM7IHRoZW4KKwkjCisJIyBDaGVjayBmb3IgdmFyaW91cyBQRiBhY3Rpb25zLgorCSMKKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBuZXQvcGZ2YXIuaCBkZWZpbmVzIFBGX05BVCB0aHJvdWdoIFBGX05PUkRSKQorCUFDX1RSWV9DT01QSUxFKAorCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCSAgICAjaW5jbHVkZSA8bmV0L2lmLmg+CisJICAgICNpbmNsdWRlIDxuZXQvcGZ2YXIuaD5dLAorCSAgICBbcmV0dXJuIFBGX05BVCtQRl9OT05BVCtQRl9CSU5BVCtQRl9OT0JJTkFUK1BGX1JEUitQRl9OT1JEUjtdLAorCSAgICBbCisJCUFDX01TR19SRVNVTFQoeWVzKQorCQlBQ19ERUZJTkUoSEFWRV9QRl9OQVRfVEhST1VHSF9QRl9OT1JEUiwgMSwKKwkJICAgIFtkZWZpbmUgaWYgbmV0L3BmdmFyLmggZGVmaW5lcyBQRl9OQVQgdGhyb3VnaCBQRl9OT1JEUl0pCisJICAgIF0sCisJICAgIEFDX01TR19SRVNVTFQobm8pKQorZmkKIEFDX0NIRUNLX0hFQURFUlMobmV0aW5ldC9pZl9ldGhlci5oLCAsICwgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSkKIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAhPSB5ZXM7IHRoZW4KQEAgLTU4LDcgKzE1Nyw3IEBACiBBQ19DSEVDS19GVU5DUyh2c25wcmludGYgc25wcmludGYsLAogCVtuZWVkc25wcmludGY9eWVzXSkKIGlmIHRlc3QgJG5lZWRzbnByaW50ZiA9IHllczsgdGhlbgotCUFDX0xJQk9CSihzbnByaW50ZikKKwlBQ19MSUJPQkooW3NucHJpbnRmXSkKIGZpCiAKICMKQEAgLTE2MCw3ICsyNTksOCBAQAogCiBkbmwgdG8gcGFjaWZ5IHRob3NlIHdobyBoYXRlIHByb3RvY2hhaW4gaW5zbgogQUNfTVNHX0NIRUNLSU5HKGlmIC0tZGlzYWJsZS1wcm90b2NoYWluIG9wdGlvbiBpcyBzcGVjaWZpZWQpCi1BQ19BUkdfRU5BQkxFKHByb3RvY2hhaW4sIFsgIC0tZGlzYWJsZS1wcm90b2NoYWluICAgIGRpc2FibGUgXCJwcm90b2NoYWluXCIgaW5zbl0pCitBQ19BUkdfRU5BQkxFKHByb3RvY2hhaW4sCitBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXByb3RvY2hhaW5dLFtkaXNhYmxlIFwicHJvdG9jaGFpblwiIGluc25dKSkKIGNhc2UgIngkZW5hYmxlX3Byb3RvY2hhaW4iIGluCiB4eWVzKQllbmFibGVfcHJvdG9jaGFpbj1lbmFibGVkCTs7CiB4bm8pCWVuYWJsZV9wcm90b2NoYWluPWRpc2FibGVkCTs7CkBAIC0xNzIsNiArMjcyLDIxIEBACiBmaQogQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9wcm90b2NoYWlufSkKIAorIworIyBTSVRBIHN1cHBvcnQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbmF0aXZlIGNhcHR1cmUgc3VwcG9ydDsKKyMgIi0td2l0aC1zaXRhIiBzZWxlY3RzIFNJVEEgc3VwcG9ydC4KKyMKK0FDX0FSR19XSVRIKHNpdGEsCitBQ19IRUxQX1NUUklORyhbLS13aXRoLXNpdGFdLFtpbmNsdWRlIFNJVEEgc3VwcG9ydF0pLAorWworCWlmIHRlc3QgISAieCR3aXRodmFsIiA9ICJ4bm8iIDsgdGhlbgorCQlBQ19ERUZJTkUoU0lUQSwxLFtpbmNsdWRlIEFDTiBzdXBwb3J0XSkKKwkJQUNfTVNHX05PVElDRShFbmFibGluZyBTSVRBIEFDTiBzdXBwb3J0KQorCQlWX1BDQVA9c2l0YQorCQlWX0ZJTkRBTExERVZTPXNpdGEKKwlmaQorXSwKK1sKIGRubAogZG5sIE5vdCBhbGwgdmVyc2lvbnMgb2YgdGVzdCBzdXBwb3J0IC1jIChjaGFyYWN0ZXIgc3BlY2lhbCkgYnV0IGl0J3MgYQogZG5sIGJldHRlciB3YXkgb2YgdGVzdGluZyBzaW5jZSB0aGUgZGV2aWNlIG1pZ2h0IGJlIHByb3RlY3RlZC4gU28gd2UKQEAgLTE4MywxMSArMjk4LDEyIEBACiBpZiB0ZXN0IC16ICIkd2l0aF9wY2FwIiAmJiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgogCUFDX01TR19FUlJPUihwY2FwIHR5cGUgbm90IGRldGVybWluZWQgd2hlbiBjcm9zcy1jb21waWxpbmc7IHVzZSAtLXdpdGgtcGNhcD0uLi4pCiBmaQotQUNfQVJHX1dJVEgocGNhcCwgWyAgLS13aXRoLXBjYXA9VFlQRSAgICAgICAgdXNlIHBhY2tldCBjYXB0dXJlIFRZUEVdKQorQUNfQVJHX1dJVEgocGNhcCwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtcGNhcD1UWVBFXSxbdXNlIHBhY2tldCBjYXB0dXJlIFRZUEVdKSkKIEFDX01TR19DSEVDS0lORyhwYWNrZXQgY2FwdHVyZSB0eXBlKQogaWYgdGVzdCAhIC16ICIkd2l0aF9wY2FwIiA7IHRoZW4KIAlWX1BDQVA9IiR3aXRodmFsIgotZWxpZiB0ZXN0IC1yIC9kZXYvYnBmIDsgdGhlbgorZWxpZiB0ZXN0IC1yIC9kZXYvYnBmIC1vIC1oIC9kZXYvYnBmIDsgdGhlbgogCSMKIAkjIENsb25pbmcgQlBGIGRldmljZS4KIAkjCkBAIC0yMTQsMTAgKzMzMCwxMCBAQAogCSMgV2UgY2hlY2sgZm9yIG9kbWkuaCBpbnN0ZWFkLgogCSMKIAlWX1BDQVA9YnBmCi1lbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL3N5cy9kbHBpLmggOyB0aGVuCi0JVl9QQ0FQPWRscGkKIGVsaWYgdGVzdCAtYyAvZGV2L2JwZjAgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCiAJVl9QQ0FQPWJwZgorZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9zeXMvZGxwaS5oIDsgdGhlbgorCVZfUENBUD1kbHBpCiBlbGlmIHRlc3QgLWMgL2Rldi9lbmV0IDsgdGhlbgkJIyBjaGVjayBhZ2FpbiBpbiBjYXNlIG5vdCByZWFkYWJsZQogCVZfUENBUD1lbmV0CiBlbGlmIHRlc3QgLWMgL2Rldi9uaXQgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCkBAIC0yMjcsNiArMzQzLDIzMSBAQAogZmkKIEFDX01TR19SRVNVTFQoJFZfUENBUCkKIAorIworIyBEbyBjYXB0dXJlLW1lY2hhbmlzbS1kZXBlbmRlbnQgdGVzdHMuCisjCitjYXNlICIkVl9QQ0FQIiBpbgorZGxwaSkKKwkjCisJIyBOZWVkZWQgZm9yIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBieSBwY2FwLVtkbHBpLGxpYmRscGldLmMKKwkjCisgCVNTUkM9ImRscGlzdWJzLmMiCisKKwkjCisJIyBDaGVja3MgZm9yIHNvbWUgaGVhZGVyIGZpbGVzLgorCSMKKwlBQ19DSEVDS19IRUFERVJTKHN5cy9idWZtb2QuaCBzeXMvZGxwaV9leHQuaCkKKworCSMKKwkjIENoZWNrcyB0byBzZWUgaWYgU29sYXJpcyBoYXMgdGhlIHB1YmxpYyBsaWJkbHBpKDNMSUIpIGxpYnJhcnkuCisJIyBOb3RlOiBUaGUgZXhpc3RlbmNlIG9mIC91c3IvaW5jbHVkZS9saWJkbHBpLmggZG9lcyBub3QgbWVhbiBpdCBpcyB0aGUKKwkjIHB1YmxpYyBsaWJkbHBpKDNMSUIpIHZlcnNpb24uIEJlZm9yZSBsaWJkbHBpIHdhcyBtYWRlIHB1YmxpYywgYSAKKwkjIHByaXZhdGUgdmVyc2lvbiBhbHNvIGV4aXN0ZWQsIHdoaWNoIGRpZCBub3QgaGF2ZSB0aGUgc2FtZSBBUElzLiAKKwkjIER1ZSB0byBhIGdjYyBidWcsIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGZvciAzMi1iaXQgbGlicmFyaWVzIGRvZXMKKwkjIG5vdCBpbmNsdWRlIC9saWIsIHdlIGFkZCBpdCBleHBsaWNpdGx5IGhlcmUuCisJIyBbaHR0cDovL2J1Z3Mub3BlbnNvbGFyaXMub3JnL3ZpZXdfYnVnLmRvP2J1Z19pZD02NjE5NDg1XS4gCisJIyBBbHNvLCBkdWUgdG8gdGhlIGJ1ZyBhYm92ZSBhcHBsaWNhdGlvbnMgdGhhdCBsaW5rIHRvIGxpYnBjYXAgd2l0aAorCSMgbGliZGxwaSB3aWxsIGhhdmUgdG8gYWRkICItTC9saWIiIG9wdGlvbiB0byAiY29uZmlndXJlIi4KKwkjCisJc2F2ZWRfbGRmbGFncz0kTERGTEFHUworCUxERkxBR1M9IiRMSUJTIC1ML2xpYiIKKwlBQ19DSEVDS19MSUIoZGxwaSwgZGxwaV93YWxrLAorCQlbCisJCQlMSUJTPSItbGRscGkgJExJQlMiCisJCQlWX1BDQVA9bGliZGxwaQorCQkJQUNfREVGSU5FKEhBVkVfTElCRExQSSwxLFtpZiBsaWJkbHBpIGV4aXN0c10pCisJCV0sCisJCVZfUENBUD1kbHBpKQorCUxERkxBR1M9JHNhdmVkX2xkZmxhZ3MKKworCSMKKwkjIENoZWNrcyB3aGV0aGVyIDxzeXMvZGxwaS5oPiBpcyB1c2FibGUsIHRvIGNhdGNoIHdlaXJkIFNDTworCSMgdmVyc2lvbnMgb2YgRExQSS4KKwkjCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgPHN5cy9kbHBpLmg+IGlzIHVzYWJsZSkKKwlBQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2RscGlfdXNhYmxlLAorCQlBQ19UUllfQ09NUElMRSgKKwkJICAgIFsKKwkJCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkJCSNpbmNsdWRlIDxzeXMvdGltZS5oPgorCQkJI2luY2x1ZGUgPHN5cy9kbHBpLmg+CisJCSAgICBdLAorCQkgICAgW2ludCBpID0gRExfUFJPTUlTQ19QSFlTO10sCisJCSAgICBhY19jdl9zeXNfZGxwaV91c2FibGU9eWVzLAorCQkgICAgYWNfY3Zfc3lzX2RscGlfdXNhYmxlPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfZGxwaV91c2FibGUpCisJaWYgdGVzdCAkYWNfY3Zfc3lzX2RscGlfdXNhYmxlID0gbm8gOyB0aGVuCisJCUFDX01TR19FUlJPUig8c3lzL2RscGkuaD4gaXMgbm90IHVzYWJsZSBvbiB0aGlzIHN5c3RlbTsgaXQgcHJvYmFibHkgaGFzIGEgbm9uLXN0YW5kYXJkIERMUEkpCisJZmkKKworCSMKKwkjIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIC9kZXYvZGxwaSBkZXZpY2Ugb3IgaGF2ZSBtdWx0aXBsZSBkZXZpY2VzLgorCSMKKwlBQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvZGxwaSBkZXZpY2UpCisJaWYgdGVzdCAtYyAvZGV2L2RscGkgOyB0aGVuCisJCUFDX01TR19SRVNVTFQoeWVzKQorCQlBQ19ERUZJTkUoSEFWRV9ERVZfRExQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBhIC9kZXYvZGxwaV0pCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKG5vKQorCQlkaXI9Ii9kZXYvZGxwaSIKKwkJQUNfTVNHX0NIRUNLSU5HKGZvciAkZGlyIGRpcmVjdG9yeSkKKwkJaWYgdGVzdCAtZCAkZGlyIDsgdGhlbgorCQkJQUNfTVNHX1JFU1VMVCh5ZXMpCisJCQlBQ19ERUZJTkVfVU5RVU9URUQoUENBUF9ERVZfUFJFRklYLCAiJGRpciIsIFsvZGV2L2RscGkgZGlyZWN0b3J5XSkKKwkJZWxzZQorCQkJQUNfTVNHX1JFU1VMVChubykKKwkJZmkKKwlmaQorCisJIworCSMgVGhpcyBjaGVjayBpcyBmb3IgU29sYXJpcyB3aXRoIERMUEkgc3VwcG9ydCBmb3IgcGFzc2l2ZSBtb2Rlcy4KKwkjIFNlZSBkbHBpKDdQKSBmb3IgbW9yZSBkZXRhaWxzLgorCSMKKwlBQ19MQkxfRExfUEFTU0lWRV9SRVFfVAorCTs7CisKK2xpbnV4KQorCSMKKwkjIERvIHdlIGhhdmUgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnM/CisJIworCUFDX0NIRUNLX0hFQURFUlMobGludXgvd2lyZWxlc3MuaCwgW10sIFtdLAorCVsKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCV0pCisKKwkjCisJIyBEbyB3ZSBoYXZlIGxpYm5sPworCSMKKwlBQ19BUkdfV0lUSChsaWJubCwKKwlBQ19IRUxQX1NUUklORyhbLS13aXRob3V0LWxpYm5sXSxbZGlzYWJsZSBsaWJubCBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgb24gTGludXgsIGlmIHByZXNlbnRAOj5AXSksCisJCXdpdGhfbGlibmw9JHdpdGh2YWwsLCkKKworCWlmIHRlc3QgeCR3aXRoX2xpYm5sICE9IHhubyA7IHRoZW4KKwkJaGF2ZV9hbnlfbmw9Im5vIgorCisJCSMKKwkJIyBUcnkgbGlibmwgMy54IGZpcnN0LgorCQkjCisJCUFDX0NIRUNLX0xJQihubC0zLCBubF9zb2NrZXRfYWxsb2MsCisJCVsKKwkJCSMKKwkJCSMgWWVzLCB3ZSBoYXZlIGxpYm5sIDMueC4KKwkJCSMKKwkJCUxJQlM9Ii1sbmwtZ2VubC0zIC1sbmwtMyAkTElCUyIKKwkJCUFDX0RFRklORShIQVZFX0xJQk5MLDEsW2lmIGxpYm5sIGV4aXN0c10pCisJCQlBQ19ERUZJTkUoSEFWRV9MSUJOTF8zX3gsMSxbaWYgbGlibmwgZXhpc3RzIGFuZCBpcyB2ZXJzaW9uIDMueF0pCisJCQlBQ19ERUZJTkUoSEFWRV9MSUJOTF9OTEUsMSxbbGlibmwgaGFzIE5MRV9GQUlMVVJFXSkKKwkJCUFDX0RFRklORShIQVZFX0xJQk5MX1NPQ0tFVFMsMSxbbGlibmwgaGFzIG5ldy1zdHlsZSBzb2NrZXQgYXBpXSkKKwkJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JL3Vzci9pbmNsdWRlL2xpYm5sMyIKKwkJCWhhdmVfYW55X25sPSJ5ZXMiCisJCV0pCisKKwkJaWYgdGVzdCB4JGhhdmVfYW55X25sID0geG5vIDsgdGhlbgorCQkJIworCQkJIyBUcnkgbGlibmwgMi54CisJCQkjCisJCQlBQ19DSEVDS19MSUIobmwsIG5sX3NvY2tldF9hbGxvYywKKwkJCVsKKwkJCQkjCisJCQkJIyBZZXMsIHdlIGhhdmUgbGlibmwgMi54LgorCQkJCSMKKwkJCQlMSUJTPSItbG5sLWdlbmwgLWxubCAkTElCUyIKKwkJCQlBQ19ERUZJTkUoSEFWRV9MSUJOTCwxLFtpZiBsaWJubCBleGlzdHNdKQorCQkJCUFDX0RFRklORShIQVZFX0xJQk5MXzJfeCwxLFtpZiBsaWJubCBleGlzdHMgYW5kIGlzIHZlcnNpb24gMi54XSkKKwkJCQlBQ19ERUZJTkUoSEFWRV9MSUJOTF9OTEUsMSxbbGlibmwgaGFzIE5MRV9GQUlMVVJFXSkKKwkJCQlBQ19ERUZJTkUoSEFWRV9MSUJOTF9TT0NLRVRTLDEsW2xpYm5sIGhhcyBuZXctc3R5bGUgc29ja2V0IGFwaV0pCisJCQkJaGF2ZV9hbnlfbmw9InllcyIKKwkJCV0pCisJCWZpCisKKwkJaWYgdGVzdCB4JGhhdmVfYW55X25sID0geG5vIDsgdGhlbgorCQkJIworCQkJIyBObywgd2UgZG9uJ3Q7IGRvIHdlIGhhdmUgbGlibmwgMS54PworCQkJIworCQkJQUNfQ0hFQ0tfTElCKG5sLCBubF9oYW5kbGVfYWxsb2MsCisJCQlbCisJCQkJIworCQkJCSMgWWVzLgorCQkJCSMKKwkJCQlMSUJTPSItbG5sICRMSUJTIgorCQkJCUFDX0RFRklORShIQVZFX0xJQk5MLDEsW2lmIGxpYm5sIGV4aXN0c10pCisJCQkJaGF2ZV9hbnlfbmw9InllcyIKKwkJCV0pCisJCWZpCisKKwkJaWYgdGVzdCB4JGhhdmVfYW55X25sID0geG5vIDsgdGhlbgorCQkJIworCQkJIyBObywgd2UgZG9uJ3QgaGF2ZSBsaWJubCBhdCBhbGwuCisJCQkjCisJCQlpZiB0ZXN0IHgkd2l0aF9saWJubCA9IHh5ZXMgOyB0aGVuCisJCQkJQUNfTVNHX0VSUk9SKFtsaWJubCBzdXBwb3J0IHJlcXVlc3RlZCBidXQgbGlibmwgbm90IGZvdW5kXSkKKwkJCWZpCisJCWZpCisJZmkKKworCUFDX0NIRUNLX0hFQURFUlMobGludXgvZXRodG9vbC5oLCwsCisJICAgIFsKK0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCSAgICBdKQorCUFDX0xCTF9UUEFDS0VUX1NUQVRTCisJQUNfTEJMX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSQorCTs7CisKK2JwZikKKwkjCisJIyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdGhlICpCU0Qtc3R5bGUgaW9jdGxzLgorCSMKKwlBQ19DSEVDS19IRUFERVJTKG5ldC9pZl9tZWRpYS5oKQorCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdGhlIHN5c3RlbSBzdXBwb3J0cyB6ZXJvY29weSBCUEYpCisJQUNfVFJZX0NPTVBJTEUoCisJICAgIFsjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCSAgICAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisJICAgICNpbmNsdWRlIDxuZXQvaWYuaD4KKwkgICAgI2luY2x1ZGUgPG5ldC9icGYuaD5dLAorCSAgICBbcmV0dXJuIChCSU9DUk9UWkJVRiArIEJQRl9CVUZNT0RFX1pCVUYpO10sCisJICAgIFsgIAorCQlBQ19NU0dfUkVTVUxUKHllcykKKwkJQUNfREVGSU5FKEhBVkVfWkVST0NPUFlfQlBGLCAxLAorCQlbZGVmaW5lIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgemVyb2NvcHkgQlBGXSkKKwkgICAgXSwKKwkgICAgQUNfTVNHX1JFU1VMVChubykpCisKKwkgICAgIworCSAgICAjIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBzdHJ1Y3QgQlBGX1RJTUVWQUwuCisJICAgICMKKwkgICAgQUNfQ0hFQ0tfVFlQRVMoc3RydWN0IEJQRl9USU1FVkFMLCwsCisJCVsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZmRlZiBIQVZFX1NZU19JT0NDT01fSAorI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9icGYuaD4KKwkJICAgIF0pCisJOzsKKworZGFnKQorCVZfREVGUz0iJFZfREVGUyAtRERBR19PTkxZIgorCTs7CisKK3NlcHRlbCkKKwlWX0RFRlM9IiRWX0RFRlMgLURTRVBURUxfT05MWSIKKwk7OworCitzbmYpCisJVl9ERUZTPSIkVl9ERUZTIC1EU05GX09OTFkiCisJOzsKKworbnVsbCkKKwlBQ19NU0dfV0FSTihjYW5ub3QgZGV0ZXJtaW5lIHBhY2tldCBjYXB0dXJlIGludGVyZmFjZSkKKwlBQ19NU0dfV0FSTigoc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKSkKKwk7OworZXNhYworCiBkbmwKIGRubCBOb3cgZmlndXJlIG91dCBob3cgd2UgZ2V0IGEgbGlzdCBvZiBpbnRlcmZhY2VzIGFuZCBhZGRyZXNzZXMsCiBkbmwgaWYgd2Ugc3VwcG9ydCBjYXB0dXJpbmcuICBEb24ndCBib3RoZXIgaWYgd2UgZG9uJ3Qgc3VwcG9ydApAQCAtMjczLDcgKzYxNCw3IEBACiAJCSMKIAkJY2FzZSAiJFZfUENBUCIgaW4KIAotCQlkbHBpKQorCQlkbHBpfGxpYmRscGkpCiAJCQkjCiAJCQkjIFRoaXMgbWlnaHQgYmUgU29sYXJpcyA4IG9yIGxhdGVyLCB3aXRoCiAJCQkjIFNJT0NHTElGQ09ORiwgb3IgaXQgbWlnaHQgYmUgc29tZSBvdGhlciBPUwpAQCAtMzEwLDk3ICs2NTEsNTYgQEAKIAkJCTs7CiAJCWVzYWNdKQogZmkKK10pCiAKLUFDX01TR19DSEVDS0lORyhpZiAtLWVuYWJsZS1pcHY2IG9wdGlvbiBpcyBzcGVjaWZpZWQpCi1BQ19BUkdfRU5BQkxFKGlwdjYsIFsgIC0tZW5hYmxlLWlwdjYgICAgICAgICAgIGJ1aWxkIElQdjYtY2FwYWJsZSB2ZXJzaW9uXSkKLWlmIHRlc3QgIiRlbmFibGVfaXB2NiIgPSAieWVzIjsgdGhlbgotCUFDX0RFRklORShJTkVUNiwxLFtJUHY2XSkKK0FDX01TR19DSEVDS0lORyhmb3Igc29ja2xlbl90KQorQUNfVFJZX0NPTVBJTEUoWworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCV0sCisJWyBzb2NrbGVuX3QgeDsgXSwKKwloYXZlX3NvY2tsZW5fdD15ZXMsCisJaGF2ZV9zb2NrbGVuX3Q9bm8pCitpZiB0ZXN0ICJ4JGhhdmVfc29ja2xlbl90IiA9ICJ4eWVzIjsgdGhlbgorCUFDX0RFRklORShIQVZFX1NPQ0tMRU5fVCwgMSwgW2RlZmluZSBpZiBzb2NrbGVuX3QgaXMgZGVmaW5lZF0pCiBmaQotQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9pcHY2LW5vfSkKK0FDX01TR19SRVNVTFQoJGhhdmVfc29ja2xlbl90KQorCitBQ19BUkdfRU5BQkxFKGlwdjYsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtaXB2Nl0sW2J1aWxkIElQdjYtY2FwYWJsZSB2ZXJzaW9uIEA8OkBkZWZhdWx0PXllcywgaWYgZ2V0YWRkcmluZm8gYXZhaWxhYmxlQDo+QF0pLAorICAgIFtdLAorICAgIFtlbmFibGVfaXB2Nj1pZmF2YWlsYWJsZV0pCitpZiB0ZXN0ICIkZW5hYmxlX2lwdjYiICE9ICJubyI7IHRoZW4KKwlBQ19DSEVDS19GVU5DKGdldGFkZHJpbmZvLAorCSAgICBbCisJCUFDX0RFRklORShJTkVUNiwxLFtJUHY2XSkKKwkgICAgXSwKKwkgICAgWworCQlpZiB0ZXN0ICIkZW5hYmxlX2lwdjYiICE9ICJpZmF2YWlsYWJsZSI7IHRoZW4KKwkJCUFDX01TR19GQUlMVVJFKFstLWVuYWJsZS1pcHY2IHdhcyBnaXZlbiwgYnV0IGdldGFkZHJpbmZvIGlzbid0IGF2YWlsYWJsZV0pCisJCWZpCisJICAgIF0pCitmaQogCiBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBidWlsZCBvcHRpbWl6ZXIgZGVidWdnaW5nIGNvZGUpCi1BQ19BUkdfRU5BQkxFKG9wdGltaXplci1kYmcsIFsgIC0tZW5hYmxlLW9wdGltaXplci1kYmcgIGJ1aWxkIG9wdGltaXplciBkZWJ1Z2dpbmcgY29kZV0pCitBQ19BUkdfRU5BQkxFKG9wdGltaXplci1kYmcsCitBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtb3B0aW1pemVyLWRiZ10sW2J1aWxkIG9wdGltaXplciBkZWJ1Z2dpbmcgY29kZV0pKQogaWYgdGVzdCAiJGVuYWJsZV9vcHRpbWl6ZXJfZGJnIiA9ICJ5ZXMiOyB0aGVuCiAJQUNfREVGSU5FKEJERUJVRywxLFtFbmFibGUgb3B0aW1pemVyIGRlYnVnZ2luZ10pCiBmaQogQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9vcHRpbWl6ZXJfZGJnLW5vfSkKIAogQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgcGFyc2VyIGRlYnVnZ2luZyBjb2RlKQotQUNfQVJHX0VOQUJMRSh5eWRlYnVnLCBbICAtLWVuYWJsZS15eWRlYnVnICAgICAgICBidWlsZCBwYXJzZXIgZGVidWdnaW5nIGNvZGVdKQorQUNfQVJHX0VOQUJMRSh5eWRlYnVnLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXl5ZGVidWddLFtidWlsZCBwYXJzZXIgZGVidWdnaW5nIGNvZGVdKSkKIGlmIHRlc3QgIiRlbmFibGVfeXlkZWJ1ZyIgPSAieWVzIjsgdGhlbgogCUFDX0RFRklORShZWURFQlVHLDEsW0VuYWJsZSBwYXJzZXIgZGVidWdnaW5nXSkKIGZpCiBBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX3l5ZGVidWctbm99KQogCi1jYXNlICIkVl9QQ0FQIiBpbgotCi1kbHBpKQotCUFDX0NIRUNLX0hFQURFUlMoc3lzL2J1Zm1vZC5oIHN5cy9kbHBpX2V4dC5oKQotCUFDX01TR19DSEVDS0lORyhmb3IgL2Rldi9kbHBpIGRldmljZSkKLQlpZiB0ZXN0IC1jIC9kZXYvZGxwaSA7IHRoZW4KLQkJQUNfTVNHX1JFU1VMVCh5ZXMpCi0JCUFDX0RFRklORShIQVZFX0RFVl9ETFBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGEgL2Rldi9kbHBpXSkKLQllbHNlCi0JCUFDX01TR19SRVNVTFQobm8pCi0JCWRpcj0iL2Rldi9kbHBpIgotCQlBQ19NU0dfQ0hFQ0tJTkcoZm9yICRkaXIgZGlyZWN0b3J5KQotCQlpZiB0ZXN0IC1kICRkaXIgOyB0aGVuCi0JCQlBQ19NU0dfUkVTVUxUKHllcykKLQkJCUFDX0RFRklORV9VTlFVT1RFRChQQ0FQX0RFVl9QUkVGSVgsICIkZGlyIiwgWy9kZXYvZGxwaSBkaXJlY3RvcnldKQotCQllbHNlCi0JCQlBQ19NU0dfUkVTVUxUKG5vKQotCQlmaQotCWZpCi0JOzsKLQotbGludXgpCi0JQUNfTVNHX0NIRUNLSU5HKExpbnV4IGtlcm5lbCB2ZXJzaW9uKQotIAlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotIAkJQUNfQ0FDSEVfVkFMKGFjX2N2X2xpbnV4X3ZlcnMsCi0gCQkgICAgYWNfY3ZfbGludXhfdmVycz11bmtub3duKQotIAllbHNlCi0gCQlBQ19DQUNIRV9WQUwoYWNfY3ZfbGludXhfdmVycywKLSAJCSAgICBhY19jdl9saW51eF92ZXJzPWB1bmFtZSAtciAyPiYxIHwgXAotIAkJCXNlZCAtbiAtZSAnJHMvLiogLy8nIC1lICckcy9cLi4qLy9wJ2ApCi0gCWZpCi0JQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGludXhfdmVycykKLSAJaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyA9IHVua25vd24gOyB0aGVuCi0gCQlBQ19NU0dfRVJST1IoY2Fubm90IGRldGVybWluZSBsaW51eCB2ZXJzaW9uIHdoZW4gY3Jvc3MtY29tcGlsaW5nKQotIAlmaQotCWlmIHRlc3QgJGFjX2N2X2xpbnV4X3ZlcnMgLWx0IDIgOyB0aGVuCi0JCUFDX01TR19FUlJPUih2ZXJzaW9uIDIgb3IgaGlnaGVyIHJlcXVpcmVkOyBzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pCi0JZmkKLQlBQ19MQkxfVFBBQ0tFVF9TVEFUUwotCTs7Ci0KLWRhZykKLQlWX0RFRlM9IiRWX0RFRlMgLUREQUdfT05MWSIKLQk7OwotCi1zZXB0ZWwpCi0JVl9ERUZTPSIkVl9ERUZTIC1EU0VQVEVMX09OTFkiCi0JOzsKLQotbnVsbCkKLQlBQ19NU0dfV0FSTihjYW5ub3QgZGV0ZXJtaW5lIHBhY2tldCBjYXB0dXJlIGludGVyZmFjZSkKLQlBQ19NU0dfV0FSTigoc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKSkKLQk7OwotCi1lc2FjCi0KLUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHdlIGhhdmUgL3Byb2MvbmV0L2RldikKLWlmIHRlc3QgLXIgL3Byb2MvbmV0L2RldiA7IHRoZW4KLQlhY19jdl9sYmxfcHJvY19uZXRfZGV2PXllcwotZWxzZQotCWFjX2N2X2xibF9wcm9jX25ldF9kZXY9bm8KLWZpCi1pZiB0ZXN0ICRhY19jdl9sYmxfcHJvY19uZXRfZGV2ID0geWVzOyB0aGVuCi0JQUNfREVGSU5FKEhBVkVfUFJPQ19ORVRfREVWLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGEgL3Byb2MvbmV0L2Rldl0pCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX3Byb2NfbmV0X2RldikKLQogIyBDaGVjayBmb3IgRW5kYWNlIERBRyBjYXJkIHN1cHBvcnQuCi1BQ19BUkdfV0lUSChbZGFnXSwgWyAgLS13aXRoLWRhZ1tbPURJUl1dICAgICAgICBpbmNsdWRlIEVuZGFjZSBEQUcgc3VwcG9ydCAoInllcyIsICJubyIgb3IgRElSOyBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudCldLAorQUNfQVJHX1dJVEgoW2RhZ10sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLWRhZ0A8OkA9RElSQDo+QF0sW2luY2x1ZGUgRW5kYWNlIERBRyBzdXBwb3J0IEA8OkAieWVzIiwgIm5vIiBvciBESVI7IGRlZmF1bHQ9InllcyIgb24gQlNEIGFuZCBMaW51eCBpZiBwcmVzZW50QDo+QF0pLAogWwogCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCiAJdGhlbgpAQCAtNDIyLDE0ICs3MjIsMTYgQEAKIAl3YW50X2RhZz1pZnByZXNlbnQKIF0pCiAKLUFDX0FSR19XSVRIKFtkYWctaW5jbHVkZXNdLCBbICAtLXdpdGgtZGFnLWluY2x1ZGVzPURJUiAgIEVuZGFjZSBEQUcgaW5jbHVkZSBkaXJlY3RvcnldLAorQUNfQVJHX1dJVEgoW2RhZy1pbmNsdWRlc10sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLWRhZy1pbmNsdWRlcz1ESVJdLFtFbmRhY2UgREFHIGluY2x1ZGUgZGlyZWN0b3J5XSksCiBbCiAJIyBVc2VyIHdhbnRzIERBRyBzdXBwb3J0IGFuZCBoYXMgc3BlY2lmaWVkIGEgaGVhZGVyIGRpcmVjdG9yeSwgc28gdXNlIHRoZSBwcm92aWRlZCB2YWx1ZS4KIAl3YW50X2RhZz15ZXMKIAlkYWdfaW5jbHVkZV9kaXI9JHdpdGh2YWwKIF0sW10pCiAKLUFDX0FSR19XSVRIKFtkYWctbGlicmFyaWVzXSwgWyAgLS13aXRoLWRhZy1saWJyYXJpZXM9RElSICBFbmRhY2UgREFHIGxpYnJhcnkgZGlyZWN0b3J5XSwKK0FDX0FSR19XSVRIKFtkYWctbGlicmFyaWVzXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGFnLWxpYnJhcmllcz1ESVJdLFtFbmRhY2UgREFHIGxpYnJhcnkgZGlyZWN0b3J5XSksCiBbCiAJIyBVc2VyIHdhbnRzIERBRyBzdXBwb3J0IGFuZCBoYXMgc3BlY2lmaWVkIGEgbGlicmFyeSBkaXJlY3RvcnksIHNvIHVzZSB0aGUgcHJvdmlkZWQgdmFsdWUuCiAJd2FudF9kYWc9eWVzCkBAIC00NzgsNyArNzgwLDcgQEAKIAkKIAlpZiB0ZXN0IC16ICIkZGFnX3Rvb2xzX2RpciI7IHRoZW4KIAkgICAgZGFnX3Rvb2xzX2Rpcj0iJGRhZ19yb290L3Rvb2xzIgotCQlmaQorCWZpCiAKIAlpZiB0ZXN0IC1yICRkYWdfaW5jbHVkZV9kaXIvZGFnYXBpLmg7IHRoZW4KIAkJYWNfY3ZfbGJsX2RhZ19hcGk9eWVzCkBAIC00ODcsMTAwICs3ODksOCBAQAogZmkKIAogaWYgdGVzdCAkYWNfY3ZfbGJsX2RhZ19hcGkgPSB5ZXM7IHRoZW4KLQotCUFDX01TR19DSEVDS0lORyhbZGFnYXBpLm9dKQkKLQlkYWdhcGlfb2JqPW5vCi0JaWYgdGVzdCAtciAkZGFnX3Rvb2xzX2Rpci9kYWdhcGkubzsgdGhlbgotCQkjIDIuNC54LgotCQlkYWdhcGlfb2JqPSRkYWdfdG9vbHNfZGlyL2RhZ2FwaS5vCi0JZWxpZiB0ZXN0IC1yICRkYWdfbGliX2Rpci9kYWdhcGkubzsgdGhlbgotCQkjIDIuNS54LgotCQlkYWdhcGlfb2JqPSRkYWdfbGliX2Rpci9kYWdhcGkubwotCWVsaWYgdGVzdCAtciAkZGFnX2xpYl9kaXIvbGliZGFnLmE7IHRoZW4KLQkJIyAyLjUueC4KLQkJYXIgeCAkZGFnX2xpYl9kaXIvbGliZGFnLmEgZGFnYXBpLm8KLQkJaWYgdGVzdCAtciAuL2RhZ2FwaS5vOyB0aGVuCi0JCSAgICBkYWdhcGlfb2JqPS4vZGFnYXBpLm8KLQkJZWxzZQotCQkgICAgYXIgeCAkZGFnX2xpYl9kaXIvbGliZGFnLmEgbGliZGFnX2xhLWRhZ2FwaS5vCi0JCSAgICBpZiB0ZXN0IC1yIC4vbGliZGFnX2xhLWRhZ2FwaS5vOyB0aGVuCi0JCSAgICAgICBkYWdhcGlfb2JqPS4vbGliZGFnX2xhLWRhZ2FwaS5vCi0JCSAgICBmaQkJCi0JCWZpCi0JZmkKLQotCWlmIHRlc3QgJGRhZ2FwaV9vYmogPSBubzsgdGhlbgotCQlBQ19NU0dfUkVTVUxUKFtubyAoY2hlY2tlZCAkZGFnX2xpYl9kaXIgICRkYWdfdG9vbHNfZGlyICAkZGFnX2xpYl9kaXIvbGliZGFnLmEpXSkKLQkJCWFjX2N2X2xibF9kYWdfYXBpPW5vCi0JZWxzZQotCQlBQ19NU0dfUkVTVUxUKFt5ZXMgKCRkYWdhcGlfb2JqKV0pCi0JZmkKLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2xibF9kYWdfYXBpID0geWVzOyB0aGVuCi0KLQlBQ19NU0dfQ0hFQ0tJTkcoW2RhZ29wdHMub10pCQotCWRhZ29wdHNfb2JqPW5vCi0JaWYgdGVzdCAtciAkZGFnX3Rvb2xzX2Rpci9kYWdvcHRzLm87IHRoZW4KLQkJIyAyLjQueC4KLQkJZGFnb3B0c19vYmo9JGRhZ190b29sc19kaXIvZGFnb3B0cy5vCi0JZWxpZiB0ZXN0IC1yICRkYWdfbGliX2Rpci9kYWdvcHRzLm87IHRoZW4KLQkJIyAyLjUueC4KLQkJZGFnb3B0c19vYmo9JGRhZ19saWJfZGlyL2RhZ29wdHMubwotCWVsaWYgdGVzdCAtciAkZGFnX2xpYl9kaXIvbGliZGFnLmE7IHRoZW4KLQkJIyAyLjUueC4KLQkJYXIgeCAkZGFnX2xpYl9kaXIvbGliZGFnLmEgZGFnb3B0cy5vCi0JCWlmIHRlc3QgLXIgLi9kYWdvcHRzLm87IHRoZW4KLQkJICAgIGRhZ29wdHNfb2JqPS4vZGFnb3B0cy5vCi0JCWVsc2UKLQkJICAgIGFyIHggJGRhZ19saWJfZGlyL2xpYmRhZy5hIGxpYmRhZ19sYS1kYWdvcHRzLm8KLQkJICAgIGlmIHRlc3QgLXIgLi9saWJkYWdfbGEtZGFnb3B0cy5vOyB0aGVuCi0JCSAgICAgICBkYWdvcHRzX29iaj0uL2xpYmRhZ19sYS1kYWdvcHRzLm8KLQkJICAgIGZpCi0JCWZpCi0JZmkKLQotCWlmIHRlc3QgJGRhZ29wdHNfb2JqID0gbm87IHRoZW4KLQkJQUNfTVNHX1JFU1VMVChbbm8gKGNoZWNrZWQgJGRhZ19saWJfZGlyICAkZGFnX3Rvb2xzX2RpciAgJGRhZ19saWJfZGlyL2xpYmRhZy5hKV0pCi0JCWFjX2N2X2xibF9kYWdfYXBpPW5vCi0JZWxzZQotCQlBQ19NU0dfUkVTVUxUKFt5ZXMgKCRkYWdvcHRzX29iaildKQotCWZpCi1maQotCi1pZiB0ZXN0ICRhY19jdl9sYmxfZGFnX2FwaSA9IHllczsgdGhlbgotCSMgVW5kZXIgMi41Lnggb25seSB3ZSBuZWVkIHRvIGFkZCBkYWdyZWcuby4KLQlpZiB0ZXN0IC1yICRkYWdfaW5jbHVkZV9kaXIvZGFncmVnLmg7IHRoZW4KLQkJQUNfTVNHX0NIRUNLSU5HKFtkYWdyZWcub10pCQotCQlkYWdyZWdfb2JqPW5vCi0JCWlmIHRlc3QgLXIgJGRhZ19saWJfZGlyL2RhZ3JlZy5vOyB0aGVuCi0JCQkjIE9iamVjdCBmaWxlIGlzIHJlYWR5IGFuZCB3YWl0aW5nLgotCQkJZGFncmVnX29iaj0kZGFnX2xpYl9kaXIvZGFncmVnLm8KLQkJZWxpZiB0ZXN0IC1yICRkYWdfbGliX2Rpci9saWJkYWcuYTsgdGhlbgotCQkJIyBFeHRyYWN0IGZyb20gbGliZGFnLmEuCi0JCQlhciB4ICRkYWdfbGliX2Rpci9saWJkYWcuYSBkYWdyZWcubwotCQkJaWYgdGVzdCAtciAuL2RhZ3JlZy5vOyB0aGVuCi0JCQkJZGFncmVnX29iaj0uL2RhZ3JlZy5vCi0JCQllbHNlCi0JCQkJYXIgeCAkZGFnX2xpYl9kaXIvbGliZGFnLmEgbGliZGFnX2xhLWRhZ3JlZy5vCi0JCQkJaWYgdGVzdCAtciAuL2xpYmRhZ19sYS1kYWdyZWcubzsgdGhlbgotCQkJCSAgIGRhZ3JlZ19vYmo9Li9saWJkYWdfbGEtZGFncmVnLm8KLQkJCQlmaQotCQkJZmkKLQkJZmkKLQotCQlpZiB0ZXN0ICRkYWdyZWdfb2JqID0gbm87IHRoZW4KLQkJCUFDX01TR19SRVNVTFQoW25vIChjaGVja2VkICRkYWdfbGliX2RpciAgJGRhZ19saWJfZGlyL2xpYmRhZy5hKV0pCi0JCQlhY19jdl9sYmxfZGFnX2FwaT1ubwotCQllbHNlCi0JCQlBQ19NU0dfUkVTVUxUKFt5ZXMgKCRkYWdyZWdfb2JqKV0pCi0JCWZpCi0JZmkKLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2xibF9kYWdfYXBpID0geWVzOyB0aGVuCiAJVl9JTkNMUz0iJFZfSU5DTFMgLUkkZGFnX2luY2x1ZGVfZGlyIgotCVZfTElCUz0iJFZfTElCUyAkZGFnYXBpX29iaiAkZGFnb3B0c19vYmogJGRhZ3JlZ19vYmoiCisKIAlpZiB0ZXN0ICRWX1BDQVAgIT0gZGFnIDsgdGhlbgogCQkgU1NSQz0icGNhcC1kYWcuYyIKIAlmaQpAQCAtNTkwLDI3ICs4MDAsMzMgQEAKIAkjIGluY2x1ZGVkIGlmIHRoZXJlJ3MgYSBmb3VuZC1hY3Rpb24gKGFyZyAzKS4KIAlzYXZlZF9sZGZsYWdzPSRMREZMQUdTCiAJTERGTEFHUz0iLUwkZGFnX2xpYl9kaXIiCi0JQUNfQ0hFQ0tfTElCKFtkYWddLCBbZGFnX2F0dGFjaF9zdHJlYW1dLCBbZGFnX3ZlcnNpb249IjIuNS54Il0sIFtkYWdfdmVyc2lvbj0iMi40LngiXSkKKwlBQ19DSEVDS19MSUIoW2RhZ10sIFtkYWdfYXR0YWNoX3N0cmVhbV0sIFtkYWdfc3RyZWFtcz0iMSJdLCBbZGFnX3N0cmVhbXM9IjAiXSkKIAlBQ19DSEVDS19MSUIoW2RhZ10sW2RhZ19nZXRfZXJmX3R5cGVzXSwgWwotCQlBQ19ERUZJTkUoSEFWRV9EQUdfR0VUX0VSRl9UWVBFUywgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBkYWdfZ2V0X2VyZl90eXBlcygpXSldCi0JKQorCQlBQ19ERUZJTkUoSEFWRV9EQUdfR0VUX0VSRl9UWVBFUywgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBkYWdfZ2V0X2VyZl90eXBlcygpXSldKQorCUFDX0NIRUNLX0xJQihbZGFnXSxbZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzXSwgWworCQlBQ19ERUZJTkUoSEFWRV9EQUdfR0VUX1NUUkVBTV9FUkZfVFlQRVMsIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzKCldKV0pCisKIAlMREZMQUdTPSRzYXZlZF9sZGZsYWdzCiAKLQlpZiB0ZXN0ICIkZGFnX3ZlcnNpb24iID0gMi41Lng7IHRoZW4KKwlpZiB0ZXN0ICIkZGFnX3N0cmVhbXMiID0gMTsgdGhlbgogCQlBQ19ERUZJTkUoSEFWRV9EQUdfU1RSRUFNU19BUEksIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgc3RyZWFtcyBjYXBhYmxlIERBRyBBUEldKQotCQlEQUdMSUJTPSItbGRhZyIKKwkJTElCUz0iJExJQlMgLWxkYWciCisJCUxERkxBR1M9IiRMREZMQUdTIC1MJGRhZ19saWJfZGlyIgorCQkKKwkJQUNfQ0hFQ0tfTElCKFt2ZGFnXSxbdmRhZ19zZXRfZGV2aWNlX2luZm9dLCBbYWNfZGFnX2hhdmVfdmRhZz0iMSJdLCBbYWNfZGFnX2hhdmVfdmRhZz0iMCJdKQorCQlpZiB0ZXN0ICIkYWNfZGFnX2hhdmVfdmRhZyIgPSAxOyB0aGVuCisJCQlBQ19ERUZJTkUoSEFWRV9EQUdfVkRBRywgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSB2ZGFnX3NldF9kZXZpY2VfaW5mbygpXSkKKwkJCUxJQlM9IiRMSUJTIC1scHRocmVhZCIKKwkJZmkKIAlmaQogCi0JIyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBzcGVjaWZpYyB2ZXJzaW9uIHN0cmluZy4KLQlBQ19NU0dfQ0hFQ0tJTkcoW3RoZSBEQUcgQVBJIHZlcnNpb25dKQotCWlmIHRlc3QgLXIgIiRkYWdfcm9vdC9WRVJTSU9OIjsgdGhlbgotCQlkYWdfdmVyc2lvbj0iYGNhdCAkZGFnX3Jvb3QvVkVSU0lPTmAiCi0JZmkKLQlBQ19NU0dfUkVTVUxUKFskZGFnX3ZlcnNpb25dKQogCUFDX0RFRklORShIQVZFX0RBR19BUEksIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgdGhlIERBRyBBUEldKQogZmkKIAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgd2UgaGF2ZSB0aGUgREFHIEFQSSkKKwogaWYgdGVzdCAkYWNfY3ZfbGJsX2RhZ19hcGkgPSBubzsgdGhlbgorCUFDX01TR19SRVNVTFQobm8pCiAJaWYgdGVzdCAiJHdhbnRfZGFnIiA9IHllczsgdGhlbgogICAgICAgICAJIyBVc2VyIHdhbnRlZCBEQUcgc3VwcG9ydCBidXQgd2UgY291bGRuJ3QgZmluZCBpdC4KIAkJQUNfTVNHX0VSUk9SKFtEQUcgQVBJIHJlcXVlc3RlZCwgYnV0IG5vdCBmb3VuZCBhdCAkZGFnX3Jvb3Q6IHVzZSAtLXdpdGhvdXQtZGFnXSkKQEAgLTYyMSw5ICs4MzcsMTIgQEAKIAkJIyBmb3VuZC4KIAkJQUNfTVNHX0VSUk9SKFtTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgImRhZyIgcmVxdWlyZXMgdGhlIERBRyBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIHRoZSAtLXdpdGgtZGFnIG9wdGlvbnMgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24uIChUcnkgIi4vY29uZmlndXJlIC0taGVscCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uKV0pCiAJZmkKK2Vsc2UKKwlBQ19NU0dfUkVTVUxUKHllcykKIGZpCiAKLUFDX0FSR19XSVRIKHNlcHRlbCwgWyAgLS13aXRoLXNlcHRlbFtbPURJUl1dICAgICBpbmNsdWRlIFNlcHRlbCBzdXBwb3J0IChsb2NhdGVkIGluIGRpcmVjdG9yeSBESVIsIGlmIHN1cHBsaWVkKS4gIFtkZWZhdWx0PXllcywgb24gTGludXgsIGlmIHByZXNlbnRdXSwKK0FDX0FSR19XSVRIKHNlcHRlbCwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc2VwdGVsQDw6QD1ESVJAOj5AXSxbaW5jbHVkZSBTZXB0ZWwgc3VwcG9ydCAobG9jYXRlZCBpbiBkaXJlY3RvcnkgRElSLCBpZiBzdXBwbGllZCkuICBAPDpAZGVmYXVsdD15ZXMsIG9uIExpbnV4LCBpZiBwcmVzZW50QDo+QF0pLAogWwogCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCiAJdGhlbgpAQCAtNjcxLDIyICs4OTAsMTkgQEAKIAogCWlmIHRlc3QgLXogIiRzZXB0ZWxfcm9vdCI7IHRoZW4KIAkJc2VwdGVsX3Jvb3Q9JHNyY2Rpci8uLi9zZXB0ZWwKLQogCWZpCiAKIAlzZXB0ZWxfdG9vbHNfZGlyPSIkc2VwdGVsX3Jvb3QiCiAJc2VwdGVsX2luY2x1ZGVfZGlyPSIkc2VwdGVsX3Jvb3QvSU5DIgotCURFRj0iLURIQVZFX1NFUFRFTF9BUEkiCiAKIAlhY19jdl9sYmxfc2VwdGVsX2FwaT1ubwogCWlmIHRlc3QgLXIgIiRzZXB0ZWxfaW5jbHVkZV9kaXIvbXNnLmgiOyB0aGVuCiAJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJHNlcHRlbF9pbmNsdWRlX2RpciIKLQkJVl9ERUZTPSIkVl9ERUZTICRERUYiCi0JCVZfTElCUz0iJFZfTElCUyAkc2VwdGVsX3Rvb2xzX2Rpci9hc2NpaWJpbi5vICRzZXB0ZWxfdG9vbHNfZGlyL2JpdDJieXRlLm8gJHNlcHRlbF90b29sc19kaXIvY29uZmlybS5vICRzZXB0ZWxfdG9vbHNfZGlyL2ZtdG1zZy5vICRzZXB0ZWxfdG9vbHNfZGlyL2djdF91bml4Lm8gJHNlcHRlbF90b29sc19kaXIvaHF1ZXVlLm8gJHNlcHRlbF90b29sc19kaXIvaWRlbnQubyAkc2VwdGVsX3Rvb2xzX2Rpci9tZW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9wYWNrLm8gJHNlcHRlbF90b29sc19kaXIvcGFyc2UubyAkc2VwdGVsX3Rvb2xzX2Rpci9wb29sLm8gJHNlcHRlbF90b29sc19kaXIvc2Rsc2lnLm8gJHNlcHRlbF90b29sc19kaXIvc3RydG9udW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci90aW1lci5vICRzZXB0ZWxfdG9vbHNfZGlyL3RyYWNlLm8gIgorCQlBRERMT0JKUz0iJEFERExPQkpTICRzZXB0ZWxfdG9vbHNfZGlyL2FzY2lpYmluLm8gJHNlcHRlbF90b29sc19kaXIvYml0MmJ5dGUubyAkc2VwdGVsX3Rvb2xzX2Rpci9jb25maXJtLm8gJHNlcHRlbF90b29sc19kaXIvZm10bXNnLm8gJHNlcHRlbF90b29sc19kaXIvZ2N0X3VuaXgubyAkc2VwdGVsX3Rvb2xzX2Rpci9ocXVldWUubyAkc2VwdGVsX3Rvb2xzX2Rpci9pZGVudC5vICRzZXB0ZWxfdG9vbHNfZGlyL21lbS5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhY2subyAkc2VwdGVsX3Rvb2xzX2Rpci9wYXJzZS5vICRzZXB0ZWxfdG9vbHNfZGlyL3Bvb2wubyAkc2VwdGVsX3Rvb2xzX2Rpci9zZGxzaWcubyAkc2VwdGVsX3Rvb2xzX2Rpci9zdHJ0b251bS5vICRzZXB0ZWxfdG9vbHNfZGlyL3RpbWVyLm8gJHNlcHRlbF90b29sc19kaXIvdHJhY2UubyIKKwkJQURETEFSQ0hJVkVPQkpTPSIkQURETEFSQ0hJVkVPQkpTICRzZXB0ZWxfdG9vbHNfZGlyL2FzY2lpYmluLm8gJHNlcHRlbF90b29sc19kaXIvYml0MmJ5dGUubyAkc2VwdGVsX3Rvb2xzX2Rpci9jb25maXJtLm8gJHNlcHRlbF90b29sc19kaXIvZm10bXNnLm8gJHNlcHRlbF90b29sc19kaXIvZ2N0X3VuaXgubyAkc2VwdGVsX3Rvb2xzX2Rpci9ocXVldWUubyAkc2VwdGVsX3Rvb2xzX2Rpci9pZGVudC5vICRzZXB0ZWxfdG9vbHNfZGlyL21lbS5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhY2subyAkc2VwdGVsX3Rvb2xzX2Rpci9wYXJzZS5vICRzZXB0ZWxfdG9vbHNfZGlyL3Bvb2wubyAkc2VwdGVsX3Rvb2xzX2Rpci9zZGxzaWcubyAkc2VwdGVsX3Rvb2xzX2Rpci9zdHJ0b251bS5vICRzZXB0ZWxfdG9vbHNfZGlyL3RpbWVyLm8gJHNlcHRlbF90b29sc19kaXIvdHJhY2UubyIKIAogCQlpZiB0ZXN0ICIkVl9QQ0FQIiAhPSBzZXB0ZWwgOyB0aGVuCiAJCQkgU1NSQz0icGNhcC1zZXB0ZWwuYyIKLQogCQlmaQogCQlhY19jdl9sYmxfc2VwdGVsX2FwaT15ZXMKIAlmaQpAQCAtNzA1LDYgKzkyMSwxMTkgQEAKIAlBQ19NU0dfRVJST1IoU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICdzZXB0ZWwnIHJlcXVpcmVzIHRoZSBTZXB0ZWwgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSAtLXdpdGgtc2VwdGVsPURJUikKIGZpCiAKKyMgQ2hlY2sgZm9yIE15cmljb20gU05GIHN1cHBvcnQuCitBQ19BUkdfV0lUSChbc25mXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc25mQDw6QD1ESVJAOj5AXSxbaW5jbHVkZSBNeXJpY29tIFNORiBzdXBwb3J0IEA8OkAieWVzIiwgIm5vIiBvciBESVI7IGRlZmF1bHQ9InllcyIgb24gQlNEIGFuZCBMaW51eCBpZiBwcmVzZW50QDo+QF0pLAorWworCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCisJdGhlbgorCQkjIFVzZXIgZXhwbGljaXRseSBkb2Vzbid0IHdhbnQgU05GCisJCXdhbnRfc25mPW5vCisJZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXMKKwl0aGVuCisJCSMgVXNlciB3YW50cyBTTkYgc3VwcG9ydCBidXQgaGFzbid0IHNwZWNpZmljIGEgZGlyZWN0b3J5LgorCQl3YW50X3NuZj15ZXMKKwllbHNlCisJCSMgVXNlciB3YW50cyBTTkYgc3VwcG9ydCB3aXRoIGEgc3BlY2lmaWVkIGRpcmVjdG9yeS4KKwkJd2FudF9zbmY9eWVzCisJCXNuZl9yb290PSR3aXRodmFsCisJZmkKK10sWworCSMKKwkjIFVzZSBTbmlmZmVyIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkjCisJd2FudF9zbmY9aWZwcmVzZW50CitdKQorCitBQ19BUkdfV0lUSChbc25mLWluY2x1ZGVzXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc25mLWluY2x1ZGVzPURJUl0sW015cmljb20gU05GIGluY2x1ZGUgZGlyZWN0b3J5XSksCitbCisJIyBVc2VyIHdhbnRzIFNORiB3aXRoIHNwZWNpZmljIGhlYWRlciBkaXJlY3RvcnkKKwl3YW50X3NuZj15ZXMKKwlzbmZfaW5jbHVkZV9kaXI9JHdpdGh2YWwKK10sW10pCisKK0FDX0FSR19XSVRIKFtzbmYtbGlicmFyaWVzXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc25mLWxpYnJhcmllcz1ESVJdLFtNeXJpY29tIFNORiBsaWJyYXJ5IGRpcmVjdG9yeV0pLAorWworCSMgVXNlciB3YW50cyBTTkYgd2l0aCBzcGVjaWZpYyBsaWIgZGlyZWN0b3J5CisJd2FudF9zbmY9eWVzCisJc25mX2xpYl9kaXI9JHdpdGh2YWwKK10sW10pCisKK2Nhc2UgIiRWX1BDQVAiIGluCiticGZ8bGludXh8c25mKQorCSMKKwkjIFdlIHN1cHBvcnQgdGhlIFNuaWZmZXIgQVBJIGlmIHdlJ3JlIG9uIEJTRCwgTGludXgsIG9yIGlmIHdlJ3JlCisJIyBidWlsZGluZyBhIFNuaWZmZXItb25seSBsaWJwY2FwLgorCSMKKwk7OworKikKKwkjCisJIyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBTbmlmZmVyLCB0ZWxsIHRoZW0gaXQncyBub3QKKwkjIHN1cHBvcnRlZC4KKwkjCisJIyBJZiB0aGV5IGV4cHJlc3NlZCBubyBwcmVmZXJlbmNlLCBkb24ndCBpbmNsdWRlIGl0LgorCSMKKwlpZiB0ZXN0ICR3YW50X3NuZiA9IHllczsgdGhlbgorCQlBQ19NU0dfRVJST1IoTXlyaWNvbSBTTkYgc3VwcG9ydCBvbmx5IGF2YWlsYWJsZSB3aXRoICdicGYnICdsaW51eCcgYW5kICdzbmYnIHBhY2tldCBjYXB0dXJlIHR5cGVzKQorCWVsaWYgdGVzdCAkd2FudF9zbmYgPSB5ZXM7IHRoZW4KKwkJd2FudF9zbmY9bm8KKwlmaQorCTs7Citlc2FjCisKK2FjX2N2X2xibF9zbmZfYXBpPW5vCitpZiB0ZXN0ICIkd2l0aF9zbmYiICE9IG5vOyB0aGVuCisKKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkpCisKKwlpZiB0ZXN0IC16ICIkc25mX3Jvb3QiOyB0aGVuCisJCXNuZl9yb290PS9vcHQvc25mCisJZmkKKworCWlmIHRlc3QgLXogIiRzbmZfaW5jbHVkZV9kaXIiOyB0aGVuCisJCXNuZl9pbmNsdWRlX2Rpcj0iJHNuZl9yb290L2luY2x1ZGUiCisJZmkKKworCWlmIHRlc3QgLXogIiRzbmZfbGliX2RpciI7IHRoZW4KKwkJc25mX2xpYl9kaXI9IiRzbmZfcm9vdC9saWIiCisJZmkKKworCWlmIHRlc3QgLWYgIiRzbmZfaW5jbHVkZV9kaXIvc25mLmgiOyB0aGVuCisJCWFjX2N2X2xibF9zbmZfYXBpPXllcworCWZpCisJQUNfTVNHX1JFU1VMVChbJGFjX2N2X2xibF9zbmZfYXBpICgkc25mX3Jvb3QpXSkKKworCWlmIHRlc3QgJGFjX2N2X2xibF9zbmZfYXBpID0gbm87IHRoZW4KKwkJaWYgdGVzdCAiJHdhbnRfc25mIiA9IHllczsgdGhlbgorCQkJQUNfTVNHX0VSUk9SKFNORiBBUEkgaGVhZGVycyBub3QgZm91bmQgdW5kZXIgJHNuZl9pbmNsdWRlX2RpcjsgdXNlIC0td2l0aG91dC1zbmYpCisJCWZpCisJZWxzZQorCQlzYXZlZF9sZGZsYWdzPSRMREZMQUdTCisJCUxERkxBR1M9IiRMREZMQUdTIC1MJHNuZl9saWJfZGlyIgorCQlBQ19DSEVDS19MSUIoW3NuZl0sIFtzbmZfaW5pdF0sIFthY19jdl9sYmxfc25mX2FwaT0ieWVzIl0sIFthY19jdl9sYmxfc25mX2FwaT0ibm8iXSkKKwkJTERGTEFHUz0iJHNhdmVkX2xkZmxhZ3MiCisKKwkJaWYgdGVzdCAkYWNfY3ZfbGJsX3NuZl9hcGkgPSBubzsgdGhlbgorCQkJaWYgdGVzdCAiJHdhbnRfc25mIiA9IHllczsgdGhlbgorCQkJCUFDX01TR19FUlJPUihTTkYgQVBJIGNhbm5vdCBjb3JyZWN0bHkgYmUgbGlua2VkIGNoZWNrIGNvbmZpZy5sb2c7IHVzZSAtLXdpdGhvdXQtc25mKQorCQkJZmkKKwkJZWxzZQorCQkJVl9JTkNMUz0iJFZfSU5DTFMgLUkkc25mX2luY2x1ZGVfZGlyIgorCQkJTElCUz0iJExJQlMgLWxzbmYiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtTCRzbmZfbGliX2RpciIKKwkJCWlmIHRlc3QgIiRWX1BDQVAiICE9IHNuZiA7IHRoZW4KKwkJCQlTU1JDPSJwY2FwLXNuZi5jIgorCQkJZmkKKwkJCUFDX0RFRklORShIQVZFX1NORl9BUEksIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgTXlyaWNvbSBTTkYgQVBJXSkKKwkJZmkKKwlmaQorZmkKKworaWYgdGVzdCAiJFZfUENBUCIgPSBzbmYgLWEgIiRhY19jdl9sYmxfc25mX2FwaSIgPSBubzsgdGhlbgorCUFDX01TR19FUlJPUihTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgJ3NuZicgcmVxdWlyZXMgdGhlIE15cmljb20gU25pZmZlciBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIC0td2l0aC1zbmY9RElSKQorZmkKIAogQUNfTEJMX0xFWF9BTkRfWUFDQyhWX0xFWCwgVl9ZQUNDLCBwY2FwXykKIGlmIHRlc3QgIiRWX0xFWCIgPSBsZXggOyB0aGVuCkBAIC03MjQsMjIgKzEwNTMsMTcwIEBACiAJZmkKIGZpCiAKLURZRVhUPSJzbyIKKyMKKyMgQXNzdW1lLCBieSBkZWZhdWx0LCBubyBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBWNy9CU0QgY29udmVudGlvbgorIyBmb3IgbWFuIHBhZ2VzIChmaWxlIGZvcm1hdHMgaW4gc2VjdGlvbiA1LCBtaXNjZWxsYW5lb3VzIGluZm8gaW4gc2VjdGlvbiA3KS4KKyMgSW5kaXZpZHVhbCBjYXNlcyBjYW4gb3ZlcnJpZGUgdGhpcy4KKyMKK0RZRVhUPSJub25lIgorTUFOX0ZJTEVfRk9STUFUUz01CitNQU5fTUlTQ19JTkZPPTcKIGNhc2UgIiRob3N0X29zIiBpbgogCiBhaXgqKQogCWRubCBXb3JrYXJvdW5kIHRvIGVuYWJsZSBjZXJ0YWluIGZlYXR1cmVzCiAJQUNfREVGSU5FKF9TVU4sMSxbZGVmaW5lIG9uIEFJWCB0byBnZXQgY2VydGFpbiBmdW5jdGlvbnNdKQorCisJIworCSMgQUlYIG1ha2VzIGl0IGZ1biB0byBidWlsZCBzaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMsCisJIyBiZWNhdXNlIHRoZXkncmUgKmJvdGgqICIuYSIgYXJjaGl2ZSBsaWJyYXJpZXMuICBXZQorCSMgYnVpbGQgdGhlIHN0YXRpYyBsaWJyYXJ5IGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgdHJhZGl0aW9uYWwKKwkjIHNjaGVtZSBvZiBidWlsZGluZyBsaWJwY2FwIGFuZCB0Y3BkdW1wIGluIHN1YmRpcmVjdG9yaWVzIG9mCisJIyB0aGUgc2FtZSBkaXJlY3RvcnksIHdpdGggdGNwZHVtcCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIHRoZQorCSMgbGlicGNhcCBpbiBxdWVzdGlvbiwgYnV0IHdlIGFsc28gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSBhcworCSMgImxpYnBjYXAuc2hhcmVkYSIgYW5kIGluc3RhbGwgKml0KiwgcmF0aGVyIHRoYW4gdGhlIHN0YXRpYworCSMgbGlicmFyeSwgYXMgImxpYnBjYXAuYSIuCisJIworCURZRVhUPSJzaGFyZWRhIgorCisJY2FzZSAiJFZfUENBUCIgaW4KKworCWRscGkpCisJCSMKKwkJIyBJZiB3ZSdyZSB1c2luZyBETFBJLCBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIHRvCisJCSMgdXNlIC9saWIvcHNlLmV4cCBpZiBwcmVzZW50LCBhcyB3ZSB1c2UgdGhlCisJCSMgU1RSRUFNUyByb3V0aW5lcy4KKwkJIworCQlwc2VleGU9Ii9saWIvcHNlLmV4cCIKKwkJQUNfTVNHX0NIRUNLSU5HKGZvciAkcHNlZXhlKQorCQlpZiB0ZXN0IC1mICRwc2VleGUgOyB0aGVuCisJCQlBQ19NU0dfUkVTVUxUKHllcykKKwkJCUxJQlM9Ii1JOiRwc2VleGUiCisJCWZpCisJCTs7CisKKwlicGYpCisJCSMKKwkJIyBJZiB3ZSdyZSB1c2luZyBCUEYsIHdlIG5lZWQgIi1sb2RtIiBhbmQgIi1sY2ZnIiwgYXMKKwkJIyB3ZSB1c2UgdGhlbSB0byBsb2FkIHRoZSBCUEYgbW9kdWxlLgorCQkjCisJCUxJQlM9Ii1sb2RtIC1sY2ZnIgorCQk7OworCWVzYWMKKwk7OworCitkYXJ3aW4qKQorCURZRVhUPSJkeWxpYiIKKwlWX0NDT1BUPSIkVl9DQ09QVCAtZm5vLWNvbW1vbiIKKwlBQ19BUkdfRU5BQkxFKHVuaXZlcnNhbCwKKwlBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXVuaXZlcnNhbF0sW2Rvbid0IGJ1aWxkIHVuaXZlcnNhbCBvbiBPUyBYXSkpCisJaWYgdGVzdCAiJGVuYWJsZV91bml2ZXJzYWwiICE9ICJubyI7IHRoZW4KKwkJY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkJZGFyd2luWzAtN10uKikKKwkJCSMKKwkJCSMgUHJlLVRpZ2VyLiAgQnVpbGQgb25seSBmb3IgMzItYml0IFBvd2VyUEM7IG5vCisJCQkjIG5lZWQgZm9yIGFueSBzcGVjaWFsIGNvbXBpbGVyIG9yIGxpbmtlciBmbGFncy4KKwkJCSMKKwkJCTs7CisKKwkJZGFyd2luOC5bMDEyM10qKQorCQkJIworCQkJIyBUaWdlciwgcHJpb3IgdG8gSW50ZWwgc3VwcG9ydC4gIEJ1aWxkIGZvciAzMi1iaXQKKwkJCSMgUG93ZXJQQyBhbmQgNjQtYml0IFBvd2VyUEMsIHdpdGggMzItYml0IFBvd2VyUEMKKwkJCSMgZmlyc3QuICAoSSdtIGd1ZXNzaW5nIHRoYXQncyB3aGF0IEFwcGxlIGRvZXMuKQorCQkJIworCQkJVl9DQ09QVD0iJFZfQ0NPUFQgLWFyY2ggcHBjIC1hcmNoIHBwYzY0IgorCQkJTERGTEFHUz0iJExERkxBR1MgLWFyY2ggcHBjIC1hcmNoIHBwYzY0IgorCQkJOzsKKworCQlkYXJ3aW44Lls0NTZdKikKKwkJCSMKKwkJCSMgVGlnZXIsIHN1YnNlcXVlbnQgdG8gSW50ZWwgc3VwcG9ydCBidXQgcHJpb3IgdG8KKwkJCSMgeDg2LTY0IHN1cHBvcnQuICBCdWlsZCBmb3IgMzItYml0IFBvd2VyUEMsIDY0LWJpdAorCQkJIyBQb3dlclBDLCBhbmQgeDg2LCB3aXRoIDMyLWJpdCBQb3dlclBDIGZpcnN0LgorCQkJIyAoSSdtIGd1ZXNzaW5nIHRoYXQncyB3aGF0IEFwcGxlIGRvZXMuKQorCQkJIworCQkJVl9DQ09QVD0iJFZfQ0NPUFQgLWFyY2ggcHBjIC1hcmNoIHBwYzY0IC1hcmNoIGkzODYiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiIKKwkJCTs7CisKKwkJZGFyd2luOC4qKQorCQkJIworCQkJIyBBbGwgb3RoZXIgVGlnZXIsIHNvIHN1YnNlcXVlbnQgdG8geDg2LTY0CisJCQkjIHN1cHBvcnQuIEJ1aWxkIGZvciAzMi1iaXQgUG93ZXJQQywgNjQtYml0CisJCQkjIFBvd2VyUEMsIHg4NiwgYW5kIHg4Ni02NCwgYW5kIHdpdGggMzItYml0IFBvd2VyUEMKKwkJCSMgZmlyc3QuICAoSSdtIGd1ZXNzaW5nIHRoYXQncyB3aGF0IEFwcGxlIGRvZXMuKQorCQkJIworCQkJVl9DQ09QVD0iJFZfQ0NPUFQgLWFyY2ggcHBjIC1hcmNoIHBwYzY0IC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0IgorCQkJTERGTEFHUz0iJExERkxBR1MgLWFyY2ggcHBjIC1hcmNoIHBwYzY0IC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0IgorCQkJOzsKKworCQlkYXJ3aW45LiopCisJCQkjCisJCQkjIExlb3BhcmQuICBCdWlsZCBmb3IgMzItYml0IFBvd2VyUEMsIDY0LWJpdAorCQkJIyBQb3dlclBDLCB4ODYsIGFuZCB4ODYtNjQsIHdpdGggMzItYml0IFBvd2VyUEMKKwkJCSMgZmlyc3QuICAoVGhhdCdzIHdoYXQgQXBwbGUgZG9lcy4pCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQiCisJCQk7OworCisJCWRhcndpbjEwLiopCisJCQkjCisJCQkjIFNub3cgTGVvcGFyZC4gIEJ1aWxkIGZvciB4ODYtNjQsIHg4NiwgYW5kCisJCQkjIDMyLWJpdCBQb3dlclBDLCB3aXRoIHg4Ni02NCBmaXJzdC4gIChUaGF0J3MKKwkJCSMgd2hhdCBBcHBsZSBkb2VzLCBldmVuIHRob3VnaCBTbm93IExlb3BhcmQKKwkJCSMgZG9lc24ndCBydW4gb24gUFBDLCBzbyBQUEMgbGlicGNhcCBydW5zIHVuZGVyCisJCQkjIFJvc2V0dGEsIGFuZCBSb3NldHRhIGRvZXNuJ3Qgc3VwcG9ydCBCUEYKKwkJCSMgaW9jdGxzLCBzbyBQUEMgcHJvZ3JhbXMgY2FuJ3QgZG8gbGl2ZQorCQkJIyBjYXB0dXJlcy4pCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCB4ODZfNjQgLWFyY2ggaTM4NiAtYXJjaCBwcGMiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCB4ODZfNjQgLWFyY2ggaTM4NiAtYXJjaCBwcGMiCisJCQk7OworCisJCWRhcndpbiopCisJCQkjCisJCQkjIFBvc3QtU25vdyBMZW9wYXJkLiAgQnVpbGQgZm9yIHg4Ni02NCBhbmQKKwkJCSMgeDg2LCB3aXRoIHg4Ni02NCBmaXJzdC4gIChUaGF0J3MgcHJvYmFibHkgd2hhdAorCQkJIyBBcHBsZSBkb2VzLCBnaXZlbiB0aGF0IFJvc2V0dGEgaXMgZ29uZS4pCisJCQkjIFhYWCAtIHVwZGF0ZSBpZiBhbmQgd2hlbiBBcHBsZSBkcm9wcyBzdXBwb3J0CisJCQkjIGZvciAzMi1iaXQgeDg2IGNvZGUuCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCB4ODZfNjQgLWFyY2ggaTM4NiIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IgorCQkJOzsKKwkJZXNhYworCWZpCiAJOzsKIAogaHB1eDkqKQogCUFDX0RFRklORShIQVZFX0hQVVg5LDEsW29uIEhQLVVYIDkueF0pCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CiAJOzsKIAogaHB1eDEwLjAqKQorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQogCTs7CiAKIGhwdXgxMC4xKikKKworCSMKKwkjIFVzZSBTeXN0ZW0gViBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2VzLgorCSMKKwlNQU5fRklMRV9GT1JNQVRTPTQKKwlNQU5fTUlTQ19JTkZPPTUKIAk7OwogCiBocHV4KikKQEAgLTc1MCw2ICsxMjI3LDUzIEBACiAJZG5sIGZvciAzMi1iaXQgUEEtUklTQywgYnV0IHNob3VsZCBiZSBsZWZ0IGFzICJzbyIgZm9yCiAJZG5sIDY0LWJpdCBQQS1SSVNDIG9yLCBJIHN1c3BlY3QsIElBLTY0LgogCUFDX0RFRklORShIQVZFX0hQVVgxMF8yMF9PUl9MQVRFUiwxLFtvbiBIUC1VWCAxMC4yMCBvciBsYXRlcl0pCisJaWYgdGVzdCAiYHVuYW1lIC1tYCIgPSAiaWE2NCI7IHRoZW4KKwkJRFlFWFQ9InNvIgorCWVsc2UKKwkJRFlFWFQ9InNsIgorCWZpCisKKwkjCisJIyAiLWIiIGJ1aWxkcyBhIHNoYXJlZCBsaWJyYXJ5OyAiK2giIHNldHMgdGhlIHNvbmFtZS4KKwkjCisJU0hMSUJfT1BUPSItYiIKKwlTT05BTUVfT1BUPSIraCIKKworCSMKKwkjIFVzZSBTeXN0ZW0gViBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2VzLgorCSMKKwlNQU5fRklMRV9GT1JNQVRTPTQKKwlNQU5fTUlTQ19JTkZPPTUKKwk7OworCitpcml4KikKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CisJOzsKKworbGludXgqfGZyZWVic2QqfG5ldGJzZCp8b3BlbmJzZCp8ZHJhZ29uZmx5KnxrZnJlZWJzZCp8Z251KikKKwlEWUVYVD0ic28iCisKKwkjCisJIyBDb21waWxlciBhc3N1bWVkIHRvIGJlIEdDQzsgcnVuLXRpbWUgbGlua2VyIG1heSByZXF1aXJlIGEgLVIKKwkjIGZsYWcuCisJIworCWlmIHRlc3QgIiRsaWJkaXIiICE9ICIvdXNyL2xpYiI7IHRoZW4KKwkJVl9SRkxBR1M9LVdsLC1SJGxpYmRpcgorCWZpCisJOzsKKworb3NmKikKKwlEWUVYVD0ic28iCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CiAJOzsKIAogc2luaXgqKQpAQCAtNzY4LDIwICsxMjkyLDI1IEBACiAKIHNvbGFyaXMqKQogCUFDX0RFRklORShIQVZFX1NPTEFSSVMsMSxbT24gc29sYXJpc10pCi0JOzsKIAotZGFyd2luKikKLQlEWUVYVD0iZHlsaWIiCi0JVl9DQ09QVD0iJFZfQ0NPUFQgLWZuby1jb21tb24iCisJRFlFWFQ9InNvIgorCSMKKwkjIFVzZSBTeXN0ZW0gViBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2VzLgorCSMKKwlNQU5fRklMRV9GT1JNQVRTPTQKKwlNQU5fTUlTQ19JTkZPPTUKIAk7OwotCi1saW51eCopCi0JVl9DQ09QVD0iJFZfQ0NPUFQgLWZQSUMiCi0JOzsKLQogZXNhYwogCitBQ19BUkdfRU5BQkxFKHNoYXJlZCwKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRdLFtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PXllcywgaWYgc3VwcG9ydCBhdmFpbGFibGVAOj5AXSkpCit0ZXN0ICJ4JGVuYWJsZV9zaGFyZWQiID0gInhubyIgJiYgRFlFWFQ9Im5vbmUiCisKIEFDX1BST0dfUkFOTElCCitBQ19DSEVDS19UT09MKFtBUl0sIFthcl0pCisKK0FDX1BST0dfTE5fUworQUNfU1VCU1QoTE5fUykKIAogQUNfTEJMX0RFVkVMKFZfQ0NPUFQpCiAKQEAgLTgwNCwyNCArMTMzMywzMjIgQEAKIAogQUNfU1VCU1QoVl9DQ09QVCkKIEFDX1NVQlNUKFZfREVGUykKK0FDX1NVQlNUKFZfRklOREFMTERFVlMpCiBBQ19TVUJTVChWX0lOQ0xTKQotQUNfU1VCU1QoVl9MSUJTKQogQUNfU1VCU1QoVl9MRVgpCiBBQ19TVUJTVChWX1BDQVApCi1BQ19TVUJTVChWX0ZJTkRBTExERVZTKQotQUNfU1VCU1QoVl9SQU5MSUIpCitBQ19TVUJTVChWX1NITElCX0NNRCkKK0FDX1NVQlNUKFZfU0hMSUJfT1BUKQorQUNfU1VCU1QoVl9TT05BTUVfT1BUKQorQUNfU1VCU1QoVl9SUEFUSF9PUFQpCiBBQ19TVUJTVChWX1lBQ0MpCitBQ19TVUJTVChBRERMT0JKUykKK0FDX1NVQlNUKEFERExBUkNISVZFT0JKUykKIEFDX1NVQlNUKFNTUkMpCiBBQ19TVUJTVChEWUVYVCkKLUFDX1NVQlNUKERBR0xJQlMpCitBQ19TVUJTVChNQU5fRklMRV9GT1JNQVRTKQorQUNfU1VCU1QoTUFOX01JU0NfSU5GTykKKworZG5sIGNoZWNrIGZvciBVU0Igc25pZmZpbmcgc3VwcG9ydAorQUNfTVNHX0NIRUNLSU5HKGZvciBVU0Igc25pZmZpbmcgc3VwcG9ydCkKK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCUFDX0RFRklORShQQ0FQX1NVUFBPUlRfVVNCLCAxLCBbdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgVVNCIHNuaWZmaW5nXSkKKwlVU0JfU1JDPXBjYXAtdXNiLWxpbnV4LmMKKwlBQ19NU0dfUkVTVUxUKHllcykKKwlhY191c2JfZGV2X25hbWU9YHVkZXZpbmZvIC1xIG5hbWUgLXAgL3N5cy9jbGFzcy91c2JfZGV2aWNlL3VzYm1vbiAyPi9kZXYvbnVsbGAKKwlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgorCSAgYWNfdXNiX2Rldl9uYW1lPSJ1c2Jtb24iCisJZmkKKwlBQ19ERUZJTkVfVU5RVU9URUQoTElOVVhfVVNCX01PTl9ERVYsICIvZGV2LyRhY191c2JfZGV2X25hbWUiLCBbcGF0aCBmb3IgZGV2aWNlIGZvciBVU0Igc25pZmZpbmddKQorCUFDX01TR19OT1RJQ0UoRGV2aWNlIGZvciBVU0Igc25pZmZpbmcgaXMgL2Rldi8kYWNfdXNiX2Rldl9uYW1lKQorCSMKKwkjIERvIHdlIGhhdmUgYSB2ZXJzaW9uIG9mIDxsaW51eC9jb21waWxlci5oPiBhdmFpbGFibGU/CisJIyBJZiBzbywgd2UgbWlnaHQgbmVlZCBpdCBmb3IgPGxpbnV4L3VzYmRldmljZV9mcy5oPi4KKwkjCisJQUNfQ0hFQ0tfSEVBREVSUyhsaW51eC9jb21waWxlci5oKQorCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbGludXhfY29tcGlsZXJfaCIgPSB5ZXM7IHRoZW4KKwkgICMKKwkgICMgWWVzIC0gaW5jbHVkZSBpdCB3aGVuIHRlc3RpbmcgZm9yIDxsaW51eC91c2JkZXZpY2VfZnMuaD4uCisJICAjCisJICBBQ19DSEVDS19IRUFERVJTKGxpbnV4L3VzYmRldmljZV9mcy5oLCwsWyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPl0pCisJZWxzZQorCSAgQUNfQ0hFQ0tfSEVBREVSUyhsaW51eC91c2JkZXZpY2VfZnMuaCkKKwlmaQorCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbGludXhfdXNiZGV2aWNlX2ZzX2giID0geWVzOyB0aGVuCisJICAjCisJICAjIE9LLCBkb2VzIGl0IGRlZmluZSBiUmVxdWVzdFR5cGU/ICBPbGRlciB2ZXJzaW9ucyBvZiB0aGUga2VybmVsCisJICAjIGRlZmluZSBmaWVsZHMgd2l0aCBuYW1lcyBsaWtlICJyZXF1ZXN0dHlwZSwgInJlcXVlc3QiLCBhbmQKKwkgICMgInZhbHVlIiwgcmF0aGVyIHRoYW4gImJSZXF1ZXN0VHlwZSIsICJiUmVxdWVzdCIsIGFuZAorCSAgIyAid1ZhbHVlIi4KKwkgICMKKwkgIEFDX01TR19DSEVDS0lORyhpZiB1c2JkZXZmc19jdHJsdHJhbnNmZXIgc3RydWN0IGhhcyBiUmVxdWVzdFR5cGUgbWVtYmVyKQorCSAgQUNfQ0FDSEVfVkFMKGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlLAorCSAgICBBQ19UUllfQ09NUElMRShbCitBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTElOVVhfQ09NUElMRVJfSAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD5dLAorCSAgICAgIFt1X2ludCBpID0gc2l6ZW9mKCgoc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciAqKTApLT5iUmVxdWVzdFR5cGUpXSwKKwkgICAgICBhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZT15ZXMsCisJICAgICAgYWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGU9bm8pKQorCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZSkKKwkgICAgaWYgdGVzdCAkYWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGUgPSB5ZXMgOyB0aGVuCisJICAgICAgQUNfREVGSU5FKEhBVkVfVVNCREVWRlNfQ1RSTFRSQU5TRkVSX0JSRVFVRVNUVFlQRSwxLAorCSAgICAgICAgW2lmIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgaGFzIGJSZXF1ZXN0VHlwZV0pCisJICAgIGZpCisJZmkKKwk7OworKikKKwlBQ19NU0dfUkVTVUxUKG5vKQorCTs7Citlc2FjCitBQ19TVUJTVChQQ0FQX1NVUFBPUlRfVVNCKQorQUNfU1VCU1QoVVNCX1NSQykKKworZG5sIGNoZWNrIGZvciBuZXRmaWx0ZXIgc25pZmZpbmcgc3VwcG9ydAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdGhlIHBsYXRmb3JtIGNvdWxkIHN1cHBvcnQgbmV0ZmlsdGVyIHNuaWZmaW5nKQorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJQUNfTVNHX1JFU1VMVCh5ZXMpCisJIworCSMgTGlmZSdzIHRvbyBzaG9ydCB0byBkZWFsIHdpdGggdHJ5aW5nIHRvIGdldCB0aGlzIHRvIGNvbXBpbGUKKwkjIGlmIHlvdSBkb24ndCBnZXQgdGhlIHJpZ2h0IHR5cGVzIGRlZmluZWQgd2l0aAorCSMgX19LRVJORUxfU1RSSUNUX05BTUVTIGdldHRpbmcgZGVmaW5lZCBieSBzb21lIG90aGVyIGluY2x1ZGUuCisJIworCSMgQ2hlY2sgd2hldGhlciB0aGUgaW5jbHVkZXMgSnVzdCBXb3JrLiAgSWYgbm90LCBkb24ndCB0dXJuIG9uCisJIyBuZXRmaWx0ZXIgc3VwcG9ydC4KKwkjCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0KQorCUFDX0NBQ0hFX1ZBTChhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUsCisJICBBQ19UUllfQ09NUElMRShbCitBQ19JTkNMVURFU19ERUZBVUxUCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaD5dLAorCSAgICBbXSwKKwkgICAgYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlPXllcywKKwkgICAgYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUpCisJaWYgdGVzdCAkYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlID0geWVzIDsgdGhlbgorCSAgQUNfREVGSU5FKFBDQVBfU1VQUE9SVF9ORVRGSUxURVIsIDEsCisJICAgIFt0YXJnZXQgaG9zdCBzdXBwb3J0cyBuZXRmaWx0ZXIgc25pZmZpbmddKQorCSAgTkVURklMVEVSX1NSQz1wY2FwLW5ldGZpbHRlci1saW51eC5jCisJZmkKKwk7OworKikKKwlBQ19NU0dfUkVTVUxUKG5vKQorCTs7Citlc2FjCitBQ19TVUJTVChQQ0FQX1NVUFBPUlRfTkVURklMVEVSKQorQUNfU1VCU1QoTkVURklMVEVSX1NSQykKKworQUNfQVJHX0VOQUJMRShbYmx1ZXRvb3RoXSwKK1tBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtYmx1ZXRvb3RoXSxbZW5hYmxlIEJsdWV0b290aCBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgaWYgc3VwcG9ydCBhdmFpbGFibGVAOj5AXSldLAorICAgIFtdLAorICAgIFtlbmFibGVfYmx1ZXRvb3RoPXllc10pCisKK2lmIHRlc3QgIngkZW5hYmxlX2JsdWV0b290aCIgIT0gInhubyIgOyB0aGVuCisJZG5sIGNoZWNrIGZvciBCbHVldG9vdGggc25pZmZpbmcgc3VwcG9ydAorCWNhc2UgIiRob3N0X29zIiBpbgorCWxpbnV4KikKKwkJQUNfQ0hFQ0tfSEVBREVSKGJsdWV0b290aC9ibHVldG9vdGguaCwKKwkJWworCQkgIEFDX0RFRklORShQQ0FQX1NVUFBPUlRfQlQsIDEsIFt0YXJnZXQgaG9zdCBzdXBwb3J0cyBCbHVldG9vdGggc25pZmZpbmddKQorCQkgIEJUX1NSQz1wY2FwLWJ0LWxpbnV4LmMKKwkJICBBQ19NU0dfTk9USUNFKEJsdWV0b290aCBzbmlmZmluZyBpcyBzdXBwb3J0ZWQpCisKKwkJICAjCisJCSAgIyBPSywgZG9lcyBzdHJ1Y3Qgc29ja2FkZHJfaGNpIGhhdmUgYW4gaGNpX2NoYW5uZWwKKwkJICAjIG1lbWJlcj8KKwkJICAjCisJCSAgQUNfTVNHX0NIRUNLSU5HKGlmIHN0cnVjdCBzb2NrYWRkcl9oY2kgaGFzIGhjaV9jaGFubmVsIG1lbWJlcikKKwkJICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX3NvY2thZGRyX2hjaV9oYXNfaGNpX2NoYW5uZWwsCisJCSAgICBBQ19UUllfQ09NUElMRSgKK1sKKyNpbmNsdWRlIDxibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8Ymx1ZXRvb3RoL2hjaS5oPgorXSwKKwkJICAgICAgW3VfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopMCktPmhjaV9jaGFubmVsKV0sCisJCSAgICAgIGFjX2N2X2xibF9zb2NrYWRkcl9oY2lfaGFzX2hjaV9jaGFubmVsPXllcywKKwkJICAgICAgYWNfY3ZfbGJsX3NvY2thZGRyX2hjaV9oYXNfaGNpX2NoYW5uZWw9bm8pKQorCQkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX3NvY2thZGRyX2hjaV9oYXNfaGNpX2NoYW5uZWwpCisJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfc29ja2FkZHJfaGNpX2hhc19oY2lfY2hhbm5lbCA9IHllcyA7IHRoZW4KKwkJICAgICAgQUNfREVGSU5FKFNPQ0tBRERSX0hDSV9IQVNfSENJX0NIQU5ORUwsLAorCQkJW2lmIHN0cnVjdCBzb2NrYWRkcl9oY2kgaGFzIGhjaV9jaGFubmVsIG1lbWJlcl0pCisJCSAgICBmaQorCQldLAorCQlBQ19NU0dfTk9USUNFKEJsdWV0b290aCBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGJsdWV6LWxpYiBkZXZlbCB0byBlbmFibGUgaXQpCisJCSkKKwkJOzsKKwkqKQorCQlBQ19NU0dfTk9USUNFKG5vIEJsdWV0b290aCBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKKwkJOzsKKwllc2FjCisJQUNfU1VCU1QoUENBUF9TVVBQT1JUX0JUKQorCUFDX1NVQlNUKEJUX1NSQykKK2ZpCisKK0FDX0FSR19FTkFCTEUoW2NhbnVzYl0sCitbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNhbnVzYl0sW2VuYWJsZSBjYW51c2Igc3VwcG9ydCBAPDpAZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQgYXZhaWxhYmxlQDo+QF0pXSwKKyAgICBbXSwKKyAgICBbZW5hYmxlX2NhbnVzYj15ZXNdKQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9jYW51c2IiICE9ICJ4bm8iIDsgdGhlbgorCWRubCBjaGVjayBmb3IgY2FudXNiIHN1cHBvcnQKKwljYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCUFDX0NIRUNLX0hFQURFUihsaWJ1c2ItMS4wL2xpYnVzYi5oLAorCQlbCisJCSAgICBBQ19ERUZJTkUoUENBUF9TVVBQT1JUX0NBTlVTQiwgMSwgW3RhcmdldCBob3N0IHN1cHBvcnRzIGNhbnVzYl0pCisJCSAgICBDQU5VU0JfU1JDPXBjYXAtY2FudXNiLWxpbnV4LmMKKwkJICAgIExJQlM9Ii1sdXNiLTEuMCAtbHB0aHJlYWQgJExJQlMiCisJCSAgICBBQ19NU0dfTk9USUNFKGNhbnVzYiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQpCisJCV0sCisJCUFDX01TR19OT1RJQ0UoY2FudXNiIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgbGlidXNiMS4wIGxpYiBkZXZlbCB0byBlbmFibGUgaXQpCisJCSkKKwkJOzsKKwkqKQorCQlBQ19NU0dfTk9USUNFKG5vIGNhbnVzYiBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKKwkJOzsKKwllc2FjCisJQUNfU1VCU1QoUENBUF9TVVBQT1JUX0NBTlVTQikKKwlBQ19TVUJTVChDQU5VU0JfU1JDKQorZmkKKworQUNfQVJHX0VOQUJMRShbY2FuXSwKK1tBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtY2FuXSxbZW5hYmxlIENBTiBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgaWYgc3VwcG9ydCBhdmFpbGFibGVAOj5AXSldLAorICAgIFtdLAorICAgIFtlbmFibGVfY2FuPXllc10pCisKK2lmIHRlc3QgIngkZW5hYmxlX2NhbiIgIT0gInhubyIgOyB0aGVuCisJZG5sIGNoZWNrIGZvciBDQU4gc25pZmZpbmcgc3VwcG9ydAorCWNhc2UgIiRob3N0X29zIiBpbgorCWxpbnV4KikKKwkJQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L2Nhbi5oLAorCQkJWyBBQ19ERUZJTkUoUENBUF9TVVBQT1JUX0NBTiwgMSwgW3RhcmdldCBob3N0IHN1cHBvcnRzIENBTiBzbmlmZmluZ10pCisJCQlDQU5fU1JDPXBjYXAtY2FuLWxpbnV4LmMKKwkJCUFDX01TR19OT1RJQ0UoQ0FOIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCldLAorCQkJQUNfTVNHX05PVElDRShDQU4gc25pZmZpbmcgaXMgbm90IHN1cHBvcnRlZCksCisJCQlbI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5dCisJCSAgICkKKwkJOzsKKwkqKQorCQlBQ19NU0dfTk9USUNFKG5vIENBTiBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKKwkJOzsKKwllc2FjCisJQUNfU1VCU1QoUENBUF9TVVBQT1JUX0NBTikKKwlBQ19TVUJTVChDQU5fU1JDKQorZmkKKworQUNfQVJHX0VOQUJMRShbZGJ1c10sCitbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRidXNdLFtlbmFibGUgRC1CdXMgY2FwdHVyZSBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgaWYgc3VwcG9ydCBhdmFpbGFibGVAOj5AXSldLAorICAgIFtdLAorICAgIFtlbmFibGVfZGJ1cz1pZmF2YWlsYWJsZV0pCisKK2lmIHRlc3QgIngkZW5hYmxlX2RidXMiICE9ICJ4bm8iOyB0aGVuCisJaWYgdGVzdCAieCRlbmFibGVfZGJ1cyIgPSAieHllcyI7IHRoZW4KKwkJY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkJZGFyd2luKikKKwkJCSMKKwkJCSMgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMjkKKwkJCSMKKwkJCUFDX01TR19FUlJPUihbRHVlIHRvIGZyZWVkZXNrdG9wLm9yZyBidWcgNzQwMjksIEQtQnVzIGNhcHR1cmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIG9uIE9TIFhdKQorCQkJOzsKKwkJZXNhYworCWVsc2UJCQorCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQlkYXJ3aW4qKQorCQkJIworCQkJIyBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD03NDAyOQorCQkJIworCQkJOzsKKworCQkqKQorCQkJQUNfQ0hFQ0tfUFJPRyhbUEtHQ09ORklHXSwgW3BrZy1jb25maWddLCBbcGtnLWNvbmZpZ10sIFtub10pCisJCQlpZiB0ZXN0ICJ4JFBLR0NPTkZJRyIgIT0gInhubyI7IHRoZW4KKwkJCQlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBELUJ1c10pCisJCQkJaWYgIiRQS0dDT05GSUciIGRidXMtMTsgdGhlbgorCQkJCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCQkJCQlEQlVTX0NGTEFHUz1gIiRQS0dDT05GSUciIC0tY2ZsYWdzIGRidXMtMWAKKwkJCQkJREJVU19MSUJTPWAiJFBLR0NPTkZJRyIgLS1saWJzIGRidXMtMWAKKwkJCQkJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJCQkJCXNhdmVfTElCUz0iJExJQlMiCisJCQkJCUNGTEFHUz0iJENGTEFHUyAkREJVU19DRkxBR1MiCisJCQkJCUxJQlM9IiRMSUJTICREQlVTX0xJQlMiCisJCQkJCUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHRoZSBELUJ1cyBsaWJyYXJ5IGRlZmluZXMgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUpCisJCQkJCUFDX1RSWV9MSU5LKAorCQkJCQkgICAgWyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCQkJCQkgICAgICNpbmNsdWRlIDx0aW1lLmg+CisJCQkJCSAgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKwkJCQkJICAgICAjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+XSwKKwkJCQkJICAgIFtyZXR1cm4gZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoTlVMTCwgMCk7XSwKKwkJCQkJICAgIFsKKwkJCQkJCUFDX01TR19SRVNVTFQoW3llc10pCisJCQkJCQlBQ19ERUZJTkUoUENBUF9TVVBQT1JUX0RCVVMsIDEsIFtzdXBwb3J0IEQtQnVzIHNuaWZmaW5nXSkKKwkJCQkJCURCVVNfU1JDPXBjYXAtZGJ1cy5jCisJCQkJCQlWX0lOQ0xTPSIkVl9JTkNMUyAkREJVU19DRkxBR1MiCisJCQkJCSAgICBdLAorCQkJCQkgICAgWworCQkJCQkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJCQkJaWYgdGVzdCAieCRlbmFibGVfZGJ1cyIgPSAieHllcyI7IHRoZW4KKwkJCQkJCSAgICBBQ19NU0dfRVJST1IoWy0tZW5hYmxlLWRidXMgd2FzIGdpdmVuLCBidXQgdGhlIEQtQnVzIGxpYnJhcnkgZG9lc24ndCBkZWZpbmUgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKV0pCisJCQkJCQlmaQorCQkJCQkJTElCUz0iJHNhdmVfTElCUyIKKwkJCQkJICAgICBdKQorCQkJCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwkJCQllbHNlCisJCQkJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJCQkJaWYgdGVzdCAieCRlbmFibGVfZGJ1cyIgPSAieHllcyI7IHRoZW4KKwkJCQkJCUFDX01TR19FUlJPUihbLS1lbmFibGUtZGJ1cyB3YXMgZ2l2ZW4sIGJ1dCB0aGUgZGJ1cy0xIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZF0pCisJCQkJCWZpCisJCQkJZmkKKwkJCWZpCisJCQk7OwkKKwkJZXNhYworCWZpCisJQUNfU1VCU1QoUENBUF9TVVBQT1JUX0RCVVMpCisJQUNfU1VCU1QoREJVU19TUkMpCitmaQorCitkbmwgY2hlY2sgZm9yIGhhcmR3YXJlIHRpbWVzdGFtcCBzdXBwb3J0CitjYXNlICIkaG9zdF9vcyIgaW4KK2xpbnV4KikKKwlBQ19DSEVDS19IRUFERVJTKFtsaW51eC9uZXRfdHN0YW1wLmhdKQorCTs7CisqKQorCUFDX01TR19OT1RJQ0Uobm8gaGFyZHdhcmUgdGltZXN0YW1wIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zKQorCTs7Citlc2FjCiAKIEFDX1BST0dfSU5TVEFMTAogCiBBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKQogCi1BQ19PVVRQVVQoTWFrZWZpbGUpCi0KLWlmIHRlc3QgLWYgLmRldmVsIDsgdGhlbgorQUNfT1VUUFVUX0NPTU1BTkRTKFtpZiB0ZXN0IC1mIC5kZXZlbDsgdGhlbgorCWVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAorCWNhdCBNYWtlZmlsZS1kZXZlbC1hZGRzID4+IE1ha2VmaWxlCiAJbWFrZSBkZXBlbmQKLWZpCitmaV0pCitBQ19PVVRQVVQoTWFrZWZpbGUgcGNhcC1maWx0ZXIubWFubWlzYyBwY2FwLWxpbmt0eXBlLm1hbm1pc2MKKwlwY2FwLXRzdGFtcC5tYW5taXNjIHBjYXAtc2F2ZWZpbGUubWFuZmlsZSBwY2FwLjNwY2FwCisJcGNhcF9jb21waWxlLjNwY2FwIHBjYXBfZGF0YWxpbmsuM3BjYXAgcGNhcF9kdW1wX29wZW4uM3BjYXAKKwlwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwIHBjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAKKwlwY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwIHBjYXBfb3Blbl9kZWFkLjNwY2FwCisJcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAgcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcAorCXBjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwKQogZXhpdCAwCmRpZmYgLS1naXQgYS9kbHBpc3Vicy5jIGIvZGxwaXN1YnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzEzMDJmCi0tLSAvZGV2L251bGwKKysrIGIvZGxwaXN1YnMuYwpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gY29kZSBmb3JtZXJseSBpbiBwY2FwLWRscGkuYywgb3JpZ2luYWxseQorICogY29udHJpYnV0ZWQgYnkgQXRhbnUgR2hvc2ggKGF0YW51QGNzLnVjbC5hYy51ayksIFVuaXZlcnNpdHkgQ29sbGVnZQorICogTG9uZG9uLCBhbmQgc3Vic2VxdWVudGx5IG1vZGlmaWVkIGJ5IEd1eSBIYXJyaXMgKGd1eUBhbHVtLm1pdC5lZHUpLAorICogTWFyayBQaXp6b2xhdG8gPExpc3QtdGNwZHVtcC13b3JrZXJzQHN1YnNjcmlwdGlvbnMucGl6em9sYXRvLm5ldD4sCisgKiBNYXJrIEMuIEJyb3duIChtYnJvd25AaHAuY29tKSwgYW5kIFNhZ3VuIFNoYWt5YSA8U2FndW4uU2hha3lhQFN1bi5DT00+LgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGxwaS9saWJkbHBpIHJlbGF0ZWQgY29tbW9uIGZ1bmN0aW9ucyB1c2VkCisgKiBieSBwY2FwLVtkbHBpLGxpYmRscGldLmMuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorCSJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2RscGlzdWJzLmMsdiAxLjMgMjAwOC0xMi0wMiAxNjo0MDoxOSBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBETF9JUEFUTQorI2RlZmluZSBETF9JUEFUTQkweDEyCS8qIEFUTSBDbGFzc2ljYWwgSVAgaW50ZXJmYWNlICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICisJLyoKKwkgKiBTaXplIG9mIGEgYnVmbW9kIGNodW5rIHRvIHBhc3MgdXBzdHJlYW07IHRoYXQgYXBwZWFycyB0byBiZSB0aGUKKwkgKiBiaWdnZXN0IHZhbHVlIHRvIHdoaWNoIHlvdSBjYW4gc2V0IGl0LCBhbmQgc2V0dGluZyBpdCB0byB0aGF0IHZhbHVlCisJICogKHdoaWNoIGlzIGJpZ2dlciB0aGFuIHdoYXQgYXBwZWFycyB0byBiZSB0aGUgU29sYXJpcyBkZWZhdWx0IG9mIDgxOTIpCisJICogcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHBhY2tldCBkcm9wcy4KKwkgKi8KKyNkZWZpbmUJQ0hVTktTSVpFCTY1NTM2CisKKwkvKgorCSAqIFNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZSBmb3IgcGFja2V0IGRhdGEgd2UgcmVhZDsgaXQgbXVzdCBiZQorCSAqIGxhcmdlIGVub3VnaCB0byBob2xkIGEgY2h1bmsuCisJICovCisjZGVmaW5lCVBLVEJVRlNJWkUJQ0hVTktTSVpFCisKKyNlbHNlIC8qIEhBVkVfU1lTX0JVRk1PRF9IICovCisKKwkvKgorCSAqIFNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZSBmb3IgcGFja2V0IGRhdGEgd2UgcmVhZDsgdGhpcyBpcworCSAqIHdoYXQgdGhlIHZhbHVlIHVzZWQgdG8gYmUgLSB0aGVyZSdzIG5vIHBhcnRpY3VsYXIgcmVhc29uIHdoeSBpdAorCSAqIHNob3VsZCBiZSB0aWVkIHRvIE1BWERMQlVGLCBidXQgd2UnbGwgbGVhdmUgaXQgYXMgdGhpcyBmb3Igbm93LgorCSAqLworI2RlZmluZQlNQVhETEJVRgk4MTkyCisjZGVmaW5lCVBLVEJVRlNJWkUJKE1BWERMQlVGICogc2l6ZW9mKGJwZl91X2ludDMyKSkKKworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICisjaW5jbHVkZSA8c3lzL2J1Zm1vZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL2RscGkuaD4KKyNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgSEFWRV9MSUJETFBJCisjaW5jbHVkZSA8bGliZGxwaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgImRscGlzdWJzLmgiCisKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorc3RhdGljIHZvaWQgcGNhcF9zdHJlYW1fZXJyKGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICopOworI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIHBhY2tldCBzdGF0aXN0aWNzLgorICovCitpbnQKK3BjYXBfc3RhdHNfZGxwaShwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKworCS8qCisJICogInBzX3JlY3YiIGNvdW50cyBwYWNrZXRzIGhhbmRlZCB0byB0aGUgZmlsdGVyLCBub3QgcGFja2V0cworCSAqIHRoYXQgcGFzc2VkIHRoZSBmaWx0ZXIuICBBcyBmaWx0ZXJpbmcgaXMgZG9uZSBpbiB1c2VybGFuZCwKKwkgKiB0aGlzIHdvdWxkIG5vdCBpbmNsdWRlIHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIHdlIHJhbiBvdXQKKwkgKiBvZiBidWZmZXIgc3BhY2U7IGluIG9yZGVyIHRvIG1ha2UgdGhpcyBtb3JlIGxpa2Ugb3RoZXIKKwkgKiBwbGF0Zm9ybXMgKExpbnV4IDIuNCBhbmQgbGF0ZXIsIEJTRHMgd2l0aCBCUEYpLCB3aGVyZSB0aGUKKwkgKiAicGFja2V0cyByZWNlaXZlZCIgY291bnQgaW5jbHVkZXMgcGFja2V0cyByZWNlaXZlZCBidXQgZHJvcHBlZAorCSAqIGR1ZSB0byBydW5uaW5nIG91dCBvZiBidWZmZXIgc3BhY2UsIGFuZCB0byBrZWVwIGZyb20gY29uZnVzaW5nCisJICogYXBwbGljYXRpb25zIHRoYXQsIGZvciBleGFtcGxlLCBjb21wdXRlIHBhY2tldCBkcm9wIHBlcmNlbnRhZ2VzLAorCSAqIHdlIGFsc28gbWFrZSBpdCBjb3VudCBwYWNrZXRzIGRyb3BwZWQgYnkgImJ1Zm1vZCIgKG90aGVyd2lzZSB3ZQorCSAqIG1pZ2h0IHJ1biB0aGUgcmlzayBvZiB0aGUgcGFja2V0IGRyb3AgY291bnQgYmVpbmcgYmlnZ2VyIHRoYW4KKwkgKiB0aGUgcmVjZWl2ZWQtcGFja2V0IGNvdW50KS4KKwkgKgorCSAqICJwc19kcm9wIiBjb3VudHMgcGFja2V0cyBkcm9wcGVkIGJ5ICJidWZtb2QiIGJlY2F1c2Ugb2YKKwkgKiBmbG93IGNvbnRyb2wgcmVxdWlyZW1lbnRzIG9yIHJlc291cmNlIGV4aGF1c3Rpb247IGl0IGRvZXNuJ3QKKwkgKiBjb3VudCBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIGludGVyZmFjZSBkcml2ZXIsIG9yIHBhY2tldHMKKwkgKiBkcm9wcGVkIHVwc3RyZWFtLiAgQXMgZmlsdGVyaW5nIGlzIGRvbmUgaW4gdXNlcmxhbmQsIGl0IGNvdW50cworCSAqIHBhY2tldHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQndmUgcGFzc2VkIHRoZSBmaWx0ZXIuCisJICoKKwkgKiBUaGVzZSBzdGF0aXN0aWNzIGRvbid0IGluY2x1ZGUgcGFja2V0cyBub3QgeWV0IHJlYWQgZnJvbQorCSAqIHRoZSBrZXJuZWwgYnkgbGlicGNhcCwgYnV0IHRoZXkgbWF5IGluY2x1ZGUgcGFja2V0cyBub3QKKwkgKiB5ZXQgcmVhZCBmcm9tIGxpYnBjYXAgYnkgdGhlIGFwcGxpY2F0aW9uLgorCSAqLworCSpwcyA9IHBkLT5zdGF0OworCisJLyoKKwkgKiBBZGQgaW4gdGhlIGRyb3AgY291bnQsIGFzIHBlciB0aGUgYWJvdmUgY29tbWVudC4KKwkgKi8KKwlwcy0+cHNfcmVjdiArPSBwcy0+cHNfZHJvcDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogTG9vcCB0aHJvdWdoIHRoZSBwYWNrZXRzIGFuZCBjYWxsIHRoZSBjYWxsYmFjayBmb3IgZWFjaCBwYWNrZXQuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzIHJlYWQuCisgKi8KK2ludAorcGNhcF9wcm9jZXNzX3BrdHMocGNhcF90ICpwLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlciwKKwlpbnQgY291bnQsIHVfY2hhciAqYnVmcCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcGNhcF9kbHBpICpwZCA9IHAtPnByaXY7CisJaW50IG4sIGNhcGxlbiwgb3JpZ2xlbjsKKwl1X2NoYXIgKmVwLCAqcGs7CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGhkcjsKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorCXN0cnVjdCBzYl9oZHIgKnNicDsKKyNpZmRlZiBMQkxfQUxJR04KKwlzdHJ1Y3Qgc2JfaGRyIHNiaGRyOworI2VuZGlmCisjZW5kaWYKKworCS8qIExvb3AgdGhyb3VnaCBwYWNrZXRzICovCisJZXAgPSBidWZwICsgbGVuOworCW4gPSAwOworCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKwl3aGlsZSAoYnVmcCA8IGVwKSB7CisJCS8qCisJCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJCSAqIElmIHNvLCByZXR1cm4gaW1tZWRpYXRlbHkgLSBpZiB3ZSBoYXZlbid0IHJlYWQgYW55CisJCSAqIHBhY2tldHMsIGNsZWFyIHRoZSBmbGFnIGFuZCByZXR1cm4gLTIgdG8gaW5kaWNhdGUKKwkJICogdGhhdCB3ZSB3ZXJlIHRvbGQgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLCBvdGhlcndpc2UKKwkJICogbGVhdmUgdGhlIGZsYWcgc2V0LCBzbyB0aGF0IHRoZSAqbmV4dCogY2FsbCB3aWxsIGJyZWFrCisJCSAqIG91dCBvZiB0aGUgbG9vcCB3aXRob3V0IGhhdmluZyByZWFkIGFueSBwYWNrZXRzLCBhbmQKKwkJICogcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSd2ZSBwcm9jZXNzZWQgc28gZmFyLgorCQkgKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCWlmIChuID09IDApIHsKKwkJCQlwLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gKC0yKTsKKwkJCX0gZWxzZSB7CisJCQkJcC0+YnAgPSBidWZwOworCQkJCXAtPmNjID0gZXAgLSBidWZwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKyNpZmRlZiBMQkxfQUxJR04KKwkJaWYgKChsb25nKWJ1ZnAgJiAzKSB7CisJCQlzYnAgPSAmc2JoZHI7CisJCQltZW1jcHkoc2JwLCBidWZwLCBzaXplb2YoKnNicCkpOworCQl9IGVsc2UKKyNlbmRpZgorCQkJc2JwID0gKHN0cnVjdCBzYl9oZHIgKilidWZwOworCQlwZC0+c3RhdC5wc19kcm9wID0gc2JwLT5zYmhfZHJvcHM7CisJCXBrID0gYnVmcCArIHNpemVvZigqc2JwKTsKKwkJYnVmcCArPSBzYnAtPnNiaF90b3RsZW47CisJCW9yaWdsZW4gPSBzYnAtPnNiaF9vcmlnbGVuOworCQljYXBsZW4gPSBzYnAtPnNiaF9tc2dsZW47CisjZWxzZQorCQlvcmlnbGVuID0gbGVuOworCQljYXBsZW4gPSBtaW4ocC0+c25hcHNob3QsIGxlbik7CisJCXBrID0gYnVmcDsKKwkJYnVmcCArPSBjYXBsZW47CisjZW5kaWYKKwkJKytwZC0+c3RhdC5wc19yZWN2OworCQlpZiAoYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgcGssIG9yaWdsZW4sIGNhcGxlbikpIHsKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorCQkJcGt0aGRyLnRzLnR2X3NlYyA9IHNicC0+c2JoX3RpbWVzdGFtcC50dl9zZWM7CisJCQlwa3RoZHIudHMudHZfdXNlYyA9IHNicC0+c2JoX3RpbWVzdGFtcC50dl91c2VjOworI2Vsc2UKKwkJCSh2b2lkKSBnZXR0aW1lb2ZkYXkoJnBrdGhkci50cywgTlVMTCk7CisjZW5kaWYKKwkJCXBrdGhkci5sZW4gPSBvcmlnbGVuOworCQkJcGt0aGRyLmNhcGxlbiA9IGNhcGxlbjsKKwkJCS8qIEluc3VyZSBjYXBsZW4gZG9lcyBub3QgZXhjZWVkIHNuYXBzaG90ICovCisJCQlpZiAocGt0aGRyLmNhcGxlbiA+IHAtPnNuYXBzaG90KQorCQkJCXBrdGhkci5jYXBsZW4gPSBwLT5zbmFwc2hvdDsKKwkJCSgqY2FsbGJhY2spKHVzZXIsICZwa3RoZHIsIHBrKTsKKwkJCWlmICgrK24gPj0gY291bnQgJiYgIVBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQoY291bnQpKSB7CisJCQkJcC0+Y2MgPSBlcCAtIGJ1ZnA7CisJCQkJcC0+YnAgPSBidWZwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorCX0KKyNlbmRpZgorCXAtPmNjID0gMDsKKwlyZXR1cm4gKG4pOworfQorCisvKgorICogUHJvY2VzcyB0aGUgbWFjIHR5cGUuIFJldHVybnMgLTEgaWYgbm8gbWF0Y2hpbmcgbWFjIHR5cGUgZm91bmQsIG90aGVyd2lzZSAwLgorICovCitpbnQKK3BjYXBfcHJvY2Vzc19tYWN0eXBlKHBjYXBfdCAqcCwgdV9pbnQgbWFjdHlwZSkKK3sKKwlpbnQgcmV0diA9IDA7CisKKwlzd2l0Y2ggKG1hY3R5cGUpIHsKKworCWNhc2UgRExfQ1NNQUNEOgorCWNhc2UgRExfRVRIRVI6CisJCXAtPmxpbmt0eXBlID0gRExUX0VOMTBNQjsKKwkJcC0+b2Zmc2V0ID0gMjsKKwkJLyoKKwkJICogVGhpcyBpcyAocHJlc3VtYWJseSkgYSByZWFsIEV0aGVybmV0IGNhcHR1cmU7IGdpdmUgaXQgYQorCQkgKiBsaW5rLWxheWVyLXR5cGUgbGlzdCB3aXRoIERMVF9FTjEwTUIgYW5kIERMVF9ET0NTSVMsIHNvCisJCSAqIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGxldCB5b3UgY2hvb3NlIGl0LCBpbiBjYXNlIHlvdSdyZQorCQkgKiBjYXB0dXJpbmcgRE9DU0lTIHRyYWZmaWMgdGhhdCBhIENpc2NvIENhYmxlIE1vZGVtCisJCSAqIFRlcm1pbmF0aW9uIFN5c3RlbSBpcyBwdXR0aW5nIG91dCBvbnRvIGFuIEV0aGVybmV0IChpdAorCQkgKiBkb2Vzbid0IHB1dCBhbiBFdGhlcm5ldCBoZWFkZXIgb250byB0aGUgd2lyZSwgaXQgcHV0cyByYXcKKwkJICogRE9DU0lTIGZyYW1lcyBvdXQgb24gdGhlIHdpcmUgaW5zaWRlIHRoZSBsb3ctbGV2ZWwKKwkJICogRXRoZXJuZXQgZnJhbWluZykuCisJCSAqLworCQlwLT5kbHRfbGlzdCA9ICh1X2ludCAqKW1hbGxvYyhzaXplb2YodV9pbnQpICogMik7CisJCS8qCisJCSAqIElmIHRoYXQgZmFpbHMsIGp1c3QgbGVhdmUgdGhlIGxpc3QgZW1wdHkuCisJCSAqLworCQlpZiAocC0+ZGx0X2xpc3QgIT0gTlVMTCkgeworCQkJcC0+ZGx0X2xpc3RbMF0gPSBETFRfRU4xME1COworCQkJcC0+ZGx0X2xpc3RbMV0gPSBETFRfRE9DU0lTOworCQkJcC0+ZGx0X2NvdW50ID0gMjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRExfRkRESToKKwkJcC0+bGlua3R5cGUgPSBETFRfRkRESTsKKwkJcC0+b2Zmc2V0ID0gMzsKKwkJYnJlYWs7CisKKwljYXNlIERMX1RQUjoKKwkJLyogWFhYIC0gd2hhdCBhYm91dCBETF9UUEI/ICBJcyB0aGF0IFRva2VuIEJ1cz8gICovCisJCXAtPmxpbmt0eXBlID0gRExUX0lFRUU4MDI7CisJCXAtPm9mZnNldCA9IDI7CisJCWJyZWFrOworCisjaWZkZWYgSEFWRV9TT0xBUklTCisJY2FzZSBETF9JUEFUTToKKwkJcC0+bGlua3R5cGUgPSBETFRfU1VOQVRNOworCQlwLT5vZmZzZXQgPSAwOyAgLyogd29ya3MgZm9yIExBTkUgYW5kIExMQyBlbmNhcHN1bGF0aW9uICovCisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJ1bmtub3duIG1hY3R5cGUgJXUiLAorCQkgICAgbWFjdHlwZSk7CisJCXJldHYgPSAtMTsKKwl9CisKKwlyZXR1cm4gKHJldHYpOworfQorCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKy8qCisgKiBQdXNoIGFuZCBjb25maWd1cmUgdGhlIGJ1ZmZlciBtb2R1bGUuIFJldHVybnMgLTEgZm9yIGVycm9yLCBvdGhlcndpc2UgMC4KKyAqLworaW50CitwY2FwX2NvbmZfYnVmbW9kKHBjYXBfdCAqcCwgaW50IHNuYXBsZW4pCit7CisJc3RydWN0IHRpbWV2YWwgdG87CisJYnBmX3VfaW50MzIgc3MsIGNodW5rc2l6ZTsKKworCS8qIE5vbi1zdGFuZGFyZCBjYWxsIHRvIGdldCB0aGUgZGF0YSBuaWNlbHkgYnVmZmVyZWQuICovCisJaWYgKGlvY3RsKHAtPmZkLCBJX1BVU0gsICJidWZtb2QiKSAhPSAwKSB7CisJCXBjYXBfc3RyZWFtX2VycigiSV9QVVNIIGJ1Zm1vZCIsIGVycm5vLCBwLT5lcnJidWYpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlzcyA9IHNuYXBsZW47CisJaWYgKHNzID4gMCAmJgorCSAgICBzdHJpb2N0bChwLT5mZCwgU0JJT0NTU05BUCwgc2l6ZW9mKHNzKSwgKGNoYXIgKikmc3MpICE9IDApIHsKKwkJcGNhcF9zdHJlYW1fZXJyKCJTQklPQ1NTTkFQIiwgZXJybm8sIHAtPmVycmJ1Zik7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChwLT5vcHQuaW1tZWRpYXRlKSB7CisJCS8qIFNldCB0aGUgdGltZW91dCB0byB6ZXJvLCBmb3IgaW1tZWRpYXRlIGRlbGl2ZXJ5LiAqLworCQl0by50dl9zZWMgPSAwOworCQl0by50dl91c2VjID0gMDsKKwkJaWYgKHN0cmlvY3RsKHAtPmZkLCBTQklPQ1NUSU1FLCBzaXplb2YodG8pLCAoY2hhciAqKSZ0bykgIT0gMCkgeworCQkJcGNhcF9zdHJlYW1fZXJyKCJTQklPQ1NUSU1FIiwgZXJybm8sIHAtPmVycmJ1Zik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNldCB1cCB0aGUgYnVmbW9kIHRpbWVvdXQuICovCisJCWlmIChwLT5vcHQudGltZW91dCAhPSAwKSB7CisJCQl0by50dl9zZWMgPSBwLT5vcHQudGltZW91dCAvIDEwMDA7CisJCQl0by50dl91c2VjID0gKHAtPm9wdC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOworCQkJaWYgKHN0cmlvY3RsKHAtPmZkLCBTQklPQ1NUSU1FLCBzaXplb2YodG8pLCAoY2hhciAqKSZ0bykgIT0gMCkgeworCQkJCXBjYXBfc3RyZWFtX2VycigiU0JJT0NTVElNRSIsIGVycm5vLCBwLT5lcnJidWYpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQl9CisKKwkJLyogU2V0IHRoZSBjaHVuayBsZW5ndGguICovCisJCWNodW5rc2l6ZSA9IENIVU5LU0laRTsKKwkJaWYgKHN0cmlvY3RsKHAtPmZkLCBTQklPQ1NDSFVOSywgc2l6ZW9mKGNodW5rc2l6ZSksIChjaGFyICopJmNodW5rc2l6ZSkKKwkJICAgICE9IDApIHsKKwkJCXBjYXBfc3RyZWFtX2VycigiU0JJT0NTQ0hVTktQIiwgZXJybm8sIHAtPmVycmJ1Zik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogSEFWRV9TWVNfQlVGTU9EX0ggKi8KKworLyoKKyAqIEFsbG9jYXRlIGRhdGEgYnVmZmVyLiBSZXR1cm5zIC0xIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCBlbHNlIDAuCisgKi8KK2ludAorcGNhcF9hbGxvY19kYXRhYnVmKHBjYXBfdCAqcCkKK3sKKwlwLT5idWZzaXplID0gUEtUQlVGU0laRTsKKwlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUgKyBwLT5vZmZzZXQpOworCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgeworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSXNzdWUgYSBTVFJFQU1TIElfU1RSIGlvY3RsLiBSZXR1cm5zIC0xIG9uIGVycm9yLCBvdGhlcndpc2UKKyAqIGxlbmd0aCBvZiByZXR1cm5lZCBkYXRhIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorc3RyaW9jdGwoaW50IGZkLCBpbnQgY21kLCBpbnQgbGVuLCBjaGFyICpkcCkKK3sKKwlzdHJ1Y3Qgc3RyaW9jdGwgc3RyOworCWludCByZXR2OworCisJc3RyLmljX2NtZCA9IGNtZDsKKwlzdHIuaWNfdGltb3V0ID0gLTE7CisJc3RyLmljX2xlbiA9IGxlbjsKKwlzdHIuaWNfZHAgPSBkcDsKKwlpZiAoKHJldHYgPSBpb2N0bChmZCwgSV9TVFIsICZzdHIpKSA8IDApCisJCXJldHVybiAocmV0dik7CisKKwlyZXR1cm4gKHN0ci5pY19sZW4pOworfQorCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKy8qCisgKiBXcml0ZSBzdHJlYW0gZXJyb3IgbWVzc2FnZSB0byBlcnJidWYuCisgKi8KK3N0YXRpYyB2b2lkCitwY2FwX3N0cmVhbV9lcnIoY29uc3QgY2hhciAqZnVuYywgaW50IGVyciwgY2hhciAqZXJyYnVmKQoreworCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIGZ1bmMsIHBjYXBfc3RyZXJyb3IoZXJyKSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RscGlzdWJzLmggYi9kbHBpc3Vicy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGJjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kbHBpc3Vicy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2RscGlzdWJzLmgsdiAxLjIgMjAwOC0wNC0wNCAxOTozNzo0NSBndXkgRXhwICQKKyAqLworCisjaWZuZGVmIGRscGlzdWJzX2gKKyNkZWZpbmUJZGxwaXN1YnNfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBETFBJIGRldmljZXMuCisgKi8KK3N0cnVjdCBwY2FwX2RscGkgeworI2lmZGVmIEhBVkVfTElCRExQSQorCWRscGlfaGFuZGxlX3QgZGxwaV9oZDsKKyNlbmRpZiAvKiBIQVZFX0xJQkRMUEkgKi8KKyNpZmRlZiBETF9IUF9SQVdETFMKKwlpbnQgc2VuZF9mZDsKKyNlbmRpZiAvKiBETF9IUF9SQVdETFMgKi8KKworCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKK307CisKKy8qCisgKiBGdW5jdGlvbnMgZGVmaW5lZCBieSBkbHBpc3Vicy5jLgorICovCitpbnQgcGNhcF9zdGF0c19kbHBpKHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOworaW50IHBjYXBfcHJvY2Vzc19wa3RzKHBjYXBfdCAqLCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQpOworaW50IHBjYXBfcHJvY2Vzc19tYWN0eXBlKHBjYXBfdCAqLCB1X2ludCk7CisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKK2ludCBwY2FwX2NvbmZfYnVmbW9kKHBjYXBfdCAqLCBpbnQpOworI2VuZGlmCitpbnQgcGNhcF9hbGxvY19kYXRhYnVmKHBjYXBfdCAqKTsKK2ludCBzdHJpb2N0bChpbnQsIGludCwgaW50LCBjaGFyICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V0aGVyZW50LmMgYi9ldGhlcmVudC5jCmluZGV4IDlkMjk5NTUuLmQ5ZGUxMTQgMTAwNjQ0Ci0tLSBhL2V0aGVyZW50LmMKKysrIGIvZXRoZXJlbnQuYwpAQCAtMjEsMTQgKzIxLDI2IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2V0aGVyZW50LmMsdiAxLjIyIDIwMDMvMTEvMTUgMjM6MjM6NTcgZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9ldGhlcmVudC5jLHYgMS4yMyAyMDA2LTEwLTA0IDE4OjA5OjIyIGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPG1lbW9yeS5oPgpAQCAtMzcsNyArNDksNyBAQAogCiAjaW5jbHVkZSAicGNhcC1pbnQuaCIKIAotI2luY2x1ZGUgPHBjYXAtbmFtZWRiLmg+CisjaW5jbHVkZSA8cGNhcC9uYW1lZGIuaD4KIAogI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAogI2luY2x1ZGUgIm9zLXByb3RvLmgiCmRpZmYgLS1naXQgYS9ldGhlcnR5cGUuaCBiL2V0aGVydHlwZS5oCmluZGV4IDJkMjFjNmQuLjJkNmJiZWIgMTAwNjQ0Ci0tLSBhL2V0aGVydHlwZS5oCisrKyBiL2V0aGVydHlwZS5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2V0aGVydHlwZS5oLHYgMS4xMy4yLjEgMjAwNS8wOS8wNSAwOTowODowMyBndXkgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZXRoZXJ0eXBlLmgsdiAxLjE0IDIwMDUtMDktMDUgMDk6MDY6NTggZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAogLyoKQEAgLTExNywzICsxMTcsNiBAQAogI2lmbmRlZglFVEhFUlRZUEVfTE9PUEJBQ0sKICNkZWZpbmUJRVRIRVJUWVBFX0xPT1BCQUNLCTB4OTAwMAogI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV84MDIxUUlOUQorI2RlZmluZSBFVEhFUlRZUEVfODAyMVFJTlEJMHg5MTAwCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZhZC1nZXRhZC5jIGIvZmFkLWdldGFkLmMKaW5kZXggODEwMTE2NS4uYWYzNzFkNCAxMDA2NDQKLS0tIGEvZmFkLWdldGFkLmMKKysrIGIvZmFkLWdldGFkLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLWdldGFkLmMsdiAxLjEwLjIuMiAyMDA3LzA5LzE0IDAwOjQ1OjE3IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLWdldGFkLmMsdiAxLjEyIDIwMDctMDktMTQgMDA6NDQ6NTUgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtNjAsMTMgKzYwLDI4IEBACiAjaW5jbHVkZSAib3MtcHJvdG8uaCIKICNlbmRpZgogCi0jaWZkZWYgQUZfUEFDS0VUCisvKgorICogV2UgZG9uJ3QgZG8gdGhpcyBvbiBTb2xhcmlzIDExIGFuZCBsYXRlciwgYXMgaXQgYXBwZWFycyB0aGVyZSBhcmVuJ3QKKyAqIGFueSBBRl9QQUNLRVQgYWRkcmVzc2VzIG9uIGludGVyZmFjZXMsIHNvIHdlIGRvbid0IG5lZWQgdGhpcywgYW5kCisgKiB3ZSBlbmQgdXAgaW5jbHVkaW5nIGJvdGggdGhlIE9TJ3MgPG5ldC9icGYuaD4gYW5kIG91ciA8cGNhcC9icGYuaD4sCisgKiBhbmQgdGhlaXIgZGVmaW5pdGlvbnMgb2Ygc29tZSBkYXRhIHN0cnVjdHVyZXMgY29sbGlkZS4KKyAqLworI2lmIChkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fTHlueF9fKSkgJiYgZGVmaW5lZChBRl9QQUNLRVQpCisjIGlmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICisvKiBMaW51eCBkaXN0cmlidXRpb25zIHdpdGggbmV3ZXIgZ2xpYmMgKi8KKyMgIGluY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKyMgZWxzZSAvKiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSCAqLworLyogTHlueE9TLCBMaW51eCBkaXN0cmlidXRpb25zIHdpdGggb2xkZXIgZ2xpYmMgKi8KICMgaWZkZWYgX19MeW54X18KLSMgIGluY2x1ZGUgPG5ldHBhY2tldC9pZl9wYWNrZXQuaD4JLyogTHlueE9TICovCi0jIGVsc2UKLSMgIGluY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgkJLyogTGludXggKi8KLSMgZW5kaWYKLSNlbmRpZgorLyogTHlueE9TICovCisjICBpbmNsdWRlIDxuZXRwYWNrZXQvaWZfcGFja2V0Lmg+CisjIGVsc2UgLyogX19MeW54X18gKi8KKy8qIExpbnV4ICovCisjICBpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorIyAgaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjIGVuZGlmIC8qIF9fTHlueF9fICovCisjIGVuZGlmIC8qIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IICovCisjZW5kaWYgLyogKGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19MeW54X18pKSAmJiBkZWZpbmVkKEFGX1BBQ0tFVCkgKi8KIAogLyoKICAqIFRoaXMgaXMgZnVuLgpAQCAtMTExLDcgKzEyNiw3IEBACiAJCXJldHVybiAoc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CiAjZW5kaWYKIAotI2lmZGVmIEFGX1BBQ0tFVAorI2lmIChkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fTHlueF9fKSkgJiYgZGVmaW5lZChBRl9QQUNLRVQpCiAJY2FzZSBBRl9QQUNLRVQ6CiAJCXJldHVybiAoc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKICNlbmRpZgpAQCAtMTMyLDExICsxNDcsOSBAQAogICogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvdGhlcndpc2UuCiAgKiBUaGUgbGlzdCwgYXMgcmV0dXJuZWQgdGhyb3VnaCAiYWxsZGV2c3AiLCBtYXkgYmUgbnVsbCBpZiBubyBpbnRlcmZhY2VzCiAgKiB3ZXJlIHVwIGFuZCBjb3VsZCBiZSBvcGVuZWQuCi0gKgotICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCBvbiBwbGF0Zm9ybXMgdGhhdCBoYXZlICJnZXRpZmFkZHJzKCkiLgogICovCiBpbnQKLXBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3BjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogewogCXBjYXBfaWZfdCAqZGV2bGlzdCA9IE5VTEw7CiAJc3RydWN0IGlmYWRkcnMgKmlmYXAsICppZmE7CkBAIC0yNjQsMTUgKzI3Nyw2IEBACiAKIAlmcmVlaWZhZGRycyhpZmFwKTsKIAotCWlmIChyZXQgIT0gLTEpIHsKLQkJLyoKLQkJICogV2UgaGF2ZW4ndCBoYWQgYW55IGVycm9ycyB5ZXQ7IGRvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYwotCQkgKiBvcGVyYXRpb25zIHRvIGFkZCBkZXZpY2VzLgotCQkgKi8KLQkJaWYgKHBjYXBfcGxhdGZvcm1fZmluZGRldnMoJmRldmxpc3QsIGVycmJ1ZikgPCAwKQotCQkJcmV0ID0gLTE7Ci0JfQotCiAJaWYgKHJldCA9PSAtMSkgewogCQkvKgogCQkgKiBXZSBoYWQgYW4gZXJyb3I7IGZyZWUgdGhlIGxpc3Qgd2UndmUgYmVlbiBjb25zdHJ1Y3RpbmcuCmRpZmYgLS1naXQgYS9mYWQtZ2lmYy5jIGIvZmFkLWdpZmMuYwppbmRleCA5ODVkMmMwLi5kNDUzNTE4IDEwMDY0NAotLS0gYS9mYWQtZ2lmYy5jCisrKyBiL2ZhZC1naWZjLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLWdpZmMuYyx2IDEuOC4yLjIgMjAwNS8wNi8yOSAwNjo0MzozMSBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2ZhZC1naWZjLmMsdiAxLjEyIDIwMDgtMDgtMDYgMDc6MzQ6MDkgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtNDIsNyArNDIsNiBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpZmRlZiBIQVZFX1NZU19TT0NLSU9fSApAQCAtMTIzLDEzNiArMTIyLDYgQEAKICAqLwogI2RlZmluZSBNQVhfU0FfTEVOCTI1NQogCi0jaWZkZWYgSEFWRV9QUk9DX05FVF9ERVYKLS8qCi0gKiBHZXQgZnJvbSAiL3Byb2MvbmV0L2RldiIgYWxsIGludGVyZmFjZXMgbGlzdGVkIHRoZXJlOyBpZiB0aGV5J3JlCi0gKiBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgd2UgaGF2ZSwgdGhhdCB3b24ndCBhZGQgYW5vdGhlcgotICogaW5zdGFuY2UsIGJ1dCBpZiB0aGV5J3JlIG5vdCwgdGhhdCdsbCBhZGQgdGhlbS4KLSAqCi0gKiBXZSBkb24ndCBib3RoZXIgZ2V0dGluZyBhbnkgYWRkcmVzc2VzIGZvciB0aGVtOyBpdCBhcHBlYXJzIHlvdSBjYW4ndAotICogdXNlIFNJT0NHSUZBRERSIG9uIExpbnV4IHRvIGdldCBJUHY2IGFkZHJlc3NlcyBmb3IgaW50ZXJmYWNlcywgYW5kLAotICogYWx0aG91Z2ggc29tZSBvdGhlciB0eXBlcyBvZiBhZGRyZXNzZXMgY2FuIGJlIGZldGNoZWQgd2l0aCBTSU9DR0lGQUREUiwKLSAqIHdlIGRvbid0IGJvdGhlciB3aXRoIHRoZW0gZm9yIG5vdy4KLSAqCi0gKiBXZSBhbHNvIGRvbid0IGZhaWwgaWYgd2UgY291bGRuJ3Qgb3BlbiAiL3Byb2MvbmV0L2RldiI7IHdlIGp1c3QgbGVhdmUKLSAqIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgYXMgaXMuCi0gKi8KLXN0YXRpYyBpbnQKLXNjYW5fcHJvY19uZXRfZGV2KHBjYXBfaWZfdCAqKmRldmxpc3RwLCBpbnQgZmQsIGNoYXIgKmVycmJ1ZikKLXsKLQlGSUxFICpwcm9jX25ldF9mOwotCWNoYXIgbGluZWJ1Zls1MTJdOwotCWludCBsaW5lbnVtOwotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JY2hhciBuYW1lWzUxMl07CS8qIFhYWCAtIHBpY2sgYSBzaXplICovCi0JY2hhciAqcSwgKnNhdmVxOwotCXN0cnVjdCBpZnJlcSBpZnJmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCXByb2NfbmV0X2YgPSBmb3BlbigiL3Byb2MvbmV0L2RldiIsICJyIik7Ci0JaWYgKHByb2NfbmV0X2YgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQotCWZvciAobGluZW51bSA9IDE7Ci0JICAgIGZnZXRzKGxpbmVidWYsIHNpemVvZiBsaW5lYnVmLCBwcm9jX25ldF9mKSAhPSBOVUxMOyBsaW5lbnVtKyspIHsKLQkJLyoKLQkJICogU2tpcCB0aGUgZmlyc3QgdHdvIGxpbmVzIC0gdGhleSdyZSBoZWFkZXJzLgotCQkgKi8KLQkJaWYgKGxpbmVudW0gPD0gMikKLQkJCWNvbnRpbnVlOwotCi0JCXAgPSAmbGluZWJ1ZlswXTsKLQotCQkvKgotCQkgKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UuCi0JCSAqLwotCQl3aGlsZSAoKnAgIT0gJ1wwJyAmJiBpc3NwYWNlKCpwKSkKLQkJCXArKzsKLQkJaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJ1xuJykKLQkJCWNvbnRpbnVlOwkvKiBibGFuayBsaW5lICovCi0KLQkJLyoKLQkJICogR2V0IHRoZSBpbnRlcmZhY2UgbmFtZS4KLQkJICovCi0JCXEgPSAmbmFtZVswXTsKLQkJd2hpbGUgKCpwICE9ICdcMCcgJiYgIWlzc3BhY2UoKnApKSB7Ci0JCQlpZiAoKnAgPT0gJzonKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIGNvdWxkIGJlIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBhCi0JCQkJICogbmFtZSBhbmQgYW4gYWxpYXMgbnVtYmVyLCBvciBpdCBjb3VsZCBiZQotCQkJCSAqIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBhIG5hbWUgd2l0aCBubwotCQkJCSAqIGFsaWFzIG51bWJlciBhbmQgdGhlIG5leHQgZmllbGQuCi0JCQkJICoKLQkJCQkgKiBJZiB0aGVyZSdzIGEgY29sb24gYWZ0ZXIgZGlnaXRzLCBpdAotCQkJCSAqIHNlcGFyYXRlcyB0aGUgbmFtZSBhbmQgdGhlIGFsaWFzIG51bWJlciwKLQkJCQkgKiBvdGhlcndpc2UgaXQgc2VwYXJhdGVzIHRoZSBuYW1lIGFuZCB0aGUKLQkJCQkgKiBuZXh0IGZpZWxkLgotCQkJCSAqLwotCQkJCXNhdmVxID0gcTsKLQkJCQl3aGlsZSAoaXNkaWdpdCgqcCkpCi0JCQkJCSpxKysgPSAqcCsrOwotCQkJCWlmICgqcCAhPSAnOicpIHsKLQkJCQkJLyoKLQkJCQkJICogVGhhdCB3YXMgdGhlIG5leHQgZmllbGQsCi0JCQkJCSAqIG5vdCB0aGUgYWxpYXMgbnVtYmVyLgotCQkJCQkgKi8KLQkJCQkJcSA9IHNhdmVxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gZWxzZQotCQkJCSpxKysgPSAqcCsrOwotCQl9Ci0JCSpxID0gJ1wwJzsKLQotCQkvKgotCQkgKiBHZXQgdGhlIGZsYWdzIGZvciB0aGlzIGludGVyZmFjZSwgYW5kIHNraXAgaXQgaWYKLQkJICogaXQncyBub3QgdXAuCi0JCSAqLwotCQlzdHJuY3B5KGlmcmZsYWdzLmlmcl9uYW1lLCBuYW1lLCBzaXplb2YoaWZyZmxhZ3MuaWZyX25hbWUpKTsKLQkJaWYgKGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmcmZsYWdzKSA8IDApIHsKLQkJCWlmIChlcnJubyA9PSBFTlhJTykKLQkJCQljb250aW51ZTsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAgICAiU0lPQ0dJRkZMQUdTOiAlLipzOiAlcyIsCi0JCQkgICAgKGludClzaXplb2YoaWZyZmxhZ3MuaWZyX25hbWUpLAotCQkJICAgIGlmcmZsYWdzLmlmcl9uYW1lLAotCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCEoaWZyZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX1VQKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIEFkZCBhbiBlbnRyeSBmb3IgdGhpcyBpbnRlcmZhY2UsIHdpdGggbm8gYWRkcmVzc2VzLgotCQkgKi8KLQkJaWYgKHBjYXBfYWRkX2lmKGRldmxpc3RwLCBuYW1lLCBpZnJmbGFncy5pZnJfZmxhZ3MsIE5VTEwsCi0JCSAgICBlcnJidWYpID09IC0xKSB7Ci0JCQkvKgotCQkJICogRmFpbHVyZS4KLQkJCSAqLwotCQkJcmV0ID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocmV0ICE9IC0xKSB7Ci0JCS8qCi0JCSAqIFdlbGwsIHdlIGRpZG4ndCBmYWlsIGZvciBhbnkgb3RoZXIgcmVhc29uOyBkaWQgd2UKLQkJICogZmFpbCBkdWUgdG8gYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZT8KLQkJICovCi0JCWlmIChmZXJyb3IocHJvY19uZXRfZikpIHsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAgICAiRXJyb3IgcmVhZGluZyAvcHJvYy9uZXQvZGV2OiAlcyIsCi0JCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0ID0gLTE7Ci0JCX0KLQl9Ci0KLQkodm9pZClmY2xvc2UocHJvY19uZXRfZik7Ci0JcmV0dXJuIChyZXQpOwotfQotI2VuZGlmIC8qIEhBVkVfUFJPQ19ORVRfREVWICovCi0KIC8qCiAgKiBHZXQgYSBsaXN0IG9mIGFsbCBpbnRlcmZhY2VzIHRoYXQgYXJlIHVwIGFuZCB0aGF0IHdlIGNhbiBvcGVuLgogICogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvdGhlcndpc2UuCkBAIC0yNjQsMTAgKzEzMywxMSBAQAogICoKICAqIFhYWCAtIG9yIHBsYXRmb3JtcyB0aGF0IGhhdmUgb3RoZXIsIGJldHRlciBtZWNoYW5pc21zIGJ1dCBmb3Igd2hpY2gKICAqIHdlIGRvbid0IHlldCBoYXZlIGNvZGUgdG8gdXNlIHRoYXQgbWVjaGFuaXNtOyBJIHRoaW5rIHRoZXJlJ3MgYSBiZXR0ZXIKLSAqIHdheSBvbiBMaW51eCwgZm9yIGV4YW1wbGUuCisgKiB3YXkgb24gTGludXgsIGZvciBleGFtcGxlLCBidXQgaWYgdGhhdCBiZXR0ZXIgd2F5IGlzICJnZXRpZmFkZHJzKCkiLAorICogd2UgYWxyZWFkeSBoYXZlIHRoYXQuCiAgKi8KIGludAotcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQorcGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7CiAJcGNhcF9pZl90ICpkZXZsaXN0ID0gTlVMTDsKIAlyZWdpc3RlciBpbnQgZmQ7CkBAIC01MzgsMzEgKzQwOCw4IEBACiAJCX0KIAl9CiAJZnJlZShidWYpOwotCi0jaWZkZWYgSEFWRV9QUk9DX05FVF9ERVYKLQlpZiAocmV0ICE9IC0xKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmVuJ3QgaGFkIGFueSBlcnJvcnMgeWV0OyBub3cgcmVhZCAiL3Byb2MvbmV0L2RldiIsCi0JCSAqIGFuZCBhZGQgdG8gdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyBhbGwgaW50ZXJmYWNlcyBsaXN0ZWQKLQkJICogdGhlcmUgdGhhdCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUsIGJlY2F1c2UsIG9uIExpbnV4LAotCQkgKiBTSU9DR0lGQ09ORiByZXBvcnRzIG9ubHkgaW50ZXJmYWNlcyB3aXRoIElQdjQgYWRkcmVzc2VzLAotCQkgKiBzbyB5b3UgbmVlZCB0byByZWFkICIvcHJvYy9uZXQvZGV2IiB0byBnZXQgdGhlIG5hbWVzIG9mCi0JCSAqIHRoZSByZXN0IG9mIHRoZSBpbnRlcmZhY2VzLgotCQkgKi8KLQkJcmV0ID0gc2Nhbl9wcm9jX25ldF9kZXYoJmRldmxpc3QsIGZkLCBlcnJidWYpOwotCX0KLSNlbmRpZgogCSh2b2lkKWNsb3NlKGZkKTsKIAotCWlmIChyZXQgIT0gLTEpIHsKLQkJLyoKLQkJICogV2UgaGF2ZW4ndCBoYWQgYW55IGVycm9ycyB5ZXQ7IGRvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYwotCQkgKiBvcGVyYXRpb25zIHRvIGFkZCBkZXZpY2VzLgotCQkgKi8KLQkJaWYgKHBjYXBfcGxhdGZvcm1fZmluZGRldnMoJmRldmxpc3QsIGVycmJ1ZikgPCAwKQotCQkJcmV0ID0gLTE7Ci0JfQotCiAJaWYgKHJldCA9PSAtMSkgewogCQkvKgogCQkgKiBXZSBoYWQgYW4gZXJyb3I7IGZyZWUgdGhlIGxpc3Qgd2UndmUgYmVlbiBjb25zdHJ1Y3RpbmcuCmRpZmYgLS1naXQgYS9mYWQtZ2xpZmMuYyBiL2ZhZC1nbGlmYy5jCmluZGV4IDhhODZhM2QuLmIyNGI1NjQgMTAwNjQ0Ci0tLSBhL2ZhZC1nbGlmYy5jCisrKyBiL2ZhZC1nbGlmYy5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2ZhZC1nbGlmYy5jLHYgMS41LjIuMSAyMDA1LzA0LzE5IDAwOjU0OjE2IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLWdsaWZjLmMsdiAxLjcgMjAwOC0wMS0zMCAwOTozNTo0OCBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC03NSwxMiArNzUsMTIgQEAKICAqIFRoZSBsaXN0LCBhcyByZXR1cm5lZCB0aHJvdWdoICJhbGxkZXZzcCIsIG1heSBiZSBudWxsIGlmIG5vIGludGVyZmFjZXMKICAqIHdlcmUgdXAgYW5kIGNvdWxkIGJlIG9wZW5lZC4KICAqCi0gKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgU0lPQ0xHSUZDT05GCisgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgU0lPQ0dMSUZDT05GCiAgKiBidXQgZG9uJ3QgaGF2ZSAiZ2V0aWZhZGRycygpIi4gIChTb2xhcmlzIDggYW5kIGxhdGVyOyB3ZSB1c2UKLSAqIFNJT0NMR0lGQ09ORiByYXRoZXIgdGhhbiBTSU9DR0lGQ09ORiBpbiBvcmRlciB0byBnZXQgSVB2NiBhZGRyZXNzZXMuKQorICogU0lPQ0dMSUZDT05GIHJhdGhlciB0aGFuIFNJT0NHSUZDT05GIGluIG9yZGVyIHRvIGdldCBJUHY2IGFkZHJlc3Nlcy4pCiAgKi8KIGludAotcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQorcGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7CiAJcGNhcF9pZl90ICpkZXZsaXN0ID0gTlVMTDsKIAlyZWdpc3RlciBpbnQgZmQ0LCBmZDYsIGZkOwpAQCAtMzYyLDE1ICszNjIsNiBAQAogCSh2b2lkKWNsb3NlKGZkNik7CiAJKHZvaWQpY2xvc2UoZmQ0KTsKIAotCWlmIChyZXQgIT0gLTEpIHsKLQkJLyoKLQkJICogV2UgaGF2ZW4ndCBoYWQgYW55IGVycm9ycyB5ZXQ7IGRvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYwotCQkgKiBvcGVyYXRpb25zIHRvIGFkZCBkZXZpY2VzLgotCQkgKi8KLQkJaWYgKHBjYXBfcGxhdGZvcm1fZmluZGRldnMoJmRldmxpc3QsIGVycmJ1ZikgPCAwKQotCQkJcmV0ID0gLTE7Ci0JfQotCiAJaWYgKHJldCA9PSAtMSkgewogCQkvKgogCQkgKiBXZSBoYWQgYW4gZXJyb3I7IGZyZWUgdGhlIGxpc3Qgd2UndmUgYmVlbiBjb25zdHJ1Y3RpbmcuCmRpZmYgLS1naXQgYS9mYWQtbnVsbC5jIGIvZmFkLW51bGwuYwppbmRleCA2NzZmZjcxLi5mNjM4NGZkIDEwMDY0NAotLS0gYS9mYWQtbnVsbC5jCisrKyBiL2ZhZC1udWxsLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLW51bGwuYyx2IDEuMiAyMDAzLzExLzE1IDIzOjIzOjU4IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLW51bGwuYyx2IDEuMiAyMDAzLTExLTE1IDIzOjIzOjU4IGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKQEAgLTUzLDcgKzUzLDcgQEAKICAqIHBhY2tldCBjYXB0dXJlLgogICovCiBpbnQKLXBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3BjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogewogCS8qCiAJICogU3VjY2VlZCwgYnV0IGRvbid0IHJldHVybiBhbnkgaW50ZXJmYWNlczsgd2UgcmV0dXJuIG9ubHkgdGhvc2UKZGlmZiAtLWdpdCBhL2ZhZC1zaXRhLmMgYi9mYWQtc2l0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZGNiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWQtc2l0YS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiAgZmFkLXNpdGEuYzogUGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlIGFkZGl0aW9ucyBmb3IgU0lUQSBBQ04gZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgRnVsa28gSGV3LCBTSVRBIElOQyBDYW5hZGEsIEluYyA8ZnVsa28uaGV3QHNpdGEuYWVybz4KKyAqCisgKiAgTGljZW5zZTogQlNECisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworIC8qICRJZDogZmFkLXNpdGEuYyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAicGNhcC1zaXRhLmgiCisKK2V4dGVybiBwY2FwX2lmX3QJKmFjbl9pZl9saXN0OwkJCQkJCQkJLyogcGNhcCdzIGxpc3Qgb2YgYXZhaWxhYmxlIGludGVyZmFjZXMgKi8KKworaW50IHBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKSB7CisKKwkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpXG4iKTsJCQkJLy8gZnVsa28KKworCSphbGxkZXZzcCA9IDA7CQkJCQkJCQkJCQkJLyogaW5pdGlhbGl6ZSB0aGUgcmV0dXJuZWQgdmFyaWFibGVzIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyAqLworCXN0cmNweShlcnJidWYsICIiKTsKKwlpZiAoYWNuX3BhcnNlX2hvc3RzX2ZpbGUoZXJyYnVmKSkJCQkJCQkJLyogc2NhbiB0aGUgaG9zdHMgZmlsZSBmb3IgcG90ZW50aWFsIElPUHMgKi8KKwkJeworCQkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpIHJldHVybmluZyBCQUQgYWZ0ZXIgcGFyc2Vob3N0c1xuIik7CQkJCS8vIGZ1bGtvCisJCXJldHVybiAtMTsKKwkJfQorCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKCkgZ290IGhvc3RsaXN0IG5vdyBmaW5kaW5nIGRldnNcbiIpOwkJCQkvLyBmdWxrbworCWlmIChhY25fZmluZGFsbGRldnMoZXJyYnVmKSkJCQkJCQkJCS8qIHRoZW4gYXNrIHRoZSBJT1BzIGZvciB0aGVpciBtb25pdG9yYWJsZSBkZXZpY2VzICovCisJCXsKKwkJLy9wcmludGYoInBjYXBfZmluZGFsbGRldnMoKSByZXR1cm5pbmcgQkFEIGFmdGVyIGZpbmRhbGxkZXZzXG4iKTsJCQkJLy8gZnVsa28KKwkJcmV0dXJuIC0xOworCQl9CisJKmFsbGRldnNwID0gYWNuX2lmX2xpc3Q7CisJYWNuX2lmX2xpc3QgPSAwOwkJCQkJCQkJCQkJLyogdGhlbiBmb3JnZXQgb3VyIGxpc3QgaGVhZCwgYmVjYXVzZSBzb21lb25lIHdpbGwgY2FsbCBwY2FwX2ZyZWVhbGxkZXZzKCkgdG8gZW1wdHkgdGhlIG1hbGxvYydlZCBzdHVmZiAqLworCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKCkgcmV0dXJuaW5nIFpFUk8gT0tcbiIpOwkJCQkvLyBmdWxrbworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmFkLXdpbjMyLmMgYi9mYWQtd2luMzIuYwppbmRleCA0ZDJjMDFlLi42NTM2Njk1IDEwMDY0NAotLS0gYS9mYWQtd2luMzIuYworKysgYi9mYWQtd2luMzIuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9mYWQtd2luMzIuYyx2IDEuMTEuMi4zIDIwMDYvMDIvMjIgMTc6MDk6MzIgZ2lhbmx1Y2EgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2ZhZC13aW4zMi5jLHYgMS4xNSAyMDA3LTA5LTI1IDIwOjM0OjM2IGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKQEAgLTIxNiw3ICsyMTYsNyBAQAogICogV2luMzIgaW1wbGVtZW50YXRpb24sIGJhc2VkIG9uIFdpblBjYXAKICAqLwogaW50Ci1wY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCitwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKIHsKIAlwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMjI1LDYgKzIyNSwyNCBAQAogCVVMT05HIE5hbWVMZW5ndGg7CiAJY2hhciAqbmFtZTsKIAkKKwkvKgorCSAqIEZpbmQgb3V0IGhvdyBiaWcgYSBidWZmZXIgd2UgbmVlZC4KKwkgKgorCSAqIFRoaXMgY2FsbCBzaG91bGQgYWx3YXlzIHJldHVybiBGQUxTRTsgaWYgdGhlIGVycm9yIGlzCisJICogRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiwgTmFtZUxlbmd0aCB3aWxsIGJlIHNldCB0bworCSAqIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgd2UgbmVlZCwgb3RoZXJ3aXNlIHRoZXJlJ3MgYQorCSAqIHByb2JsZW0sIGFuZCBOYW1lTGVuZ3RoIHNob3VsZCBiZSBzZXQgdG8gMC4KKwkgKgorCSAqIEl0IHNob3VsZG4ndCByZXF1aXJlIE5hbWVMZW5ndGggdG8gYmUgc2V0LCBidXQsCisJICogYXQgbGVhc3QgYXMgb2YgV2luUGNhcCA0LjEuMywgaXQgY2hlY2tzIHdoZXRoZXIKKwkgKiBOYW1lTGVuZ3RoIGlzIGJpZyBlbm91Z2ggYmVmb3JlIGl0IGNoZWNrcyBmb3IgYQorCSAqIE5VTEwgYnVmZmVyIGFyZ3VtZW50LCBzbywgd2hpbGUgaXQnbGwgc3RpbGwgZG8KKwkgKiB0aGUgcmlnaHQgdGhpbmcgaWYgTmFtZUxlbmd0aCBpcyB1bmluaXRpYWxpemVkIGFuZAorCSAqIHdoYXRldmVyIGp1bmsgaGFwcGVucyB0byBiZSB0aGVyZSBpcyBiaWcgZW5vdWdoCisJICogKGJlY2F1c2UgdGhlIHBvaW50ZXIgYXJndW1lbnQgd2lsbCBiZSBudWxsKSwgaXQncworCSAqIHN0aWxsIHJlYWRpbmcgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKwkgKi8KKwlOYW1lTGVuZ3RoID0gMDsKIAlpZiAoIVBhY2tldEdldEFkYXB0ZXJOYW1lcyhOVUxMLCAmTmFtZUxlbmd0aCkpCiAJewogCQlEV09SRCBsYXN0X2Vycm9yID0gR2V0TGFzdEVycm9yKCk7CkBAIC0zMDEsNiArMzE5LDE1IEBACiAJCW5hbWUgKz0gc3RybGVuKG5hbWUpICsgMTsKIAkJZGVzYyArPSBzdHJsZW4oZGVzYykgKyAxOwogCX0KKworCWlmIChyZXQgIT0gLTEpIHsKKwkJLyoKKwkJICogV2UgaGF2ZW4ndCBoYWQgYW55IGVycm9ycyB5ZXQ7IGRvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYworCQkgKiBvcGVyYXRpb25zIHRvIGFkZCBkZXZpY2VzLgorCQkgKi8KKwkJaWYgKHBjYXBfcGxhdGZvcm1fZmluZGRldnMoJmRldmxpc3QsIGVycmJ1ZikgPCAwKQorCQkJcmV0ID0gLTE7CisJfQogCQogCWlmIChyZXQgPT0gLTEpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2Zmcy5oIGIvZmZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTQwOWIuLjAwMDAwMDAKLS0tIGEvZmZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaWZuZGVmIF9GRlNfSF8KLSNkZWZpbmUgX0ZGU19IXwotCi0vKgotICogQSByZWFsbHkgaGFja3kgaW1wbGVtZW50YXRpb24gY29waWVkIGZyb20gYXNtL2JpdG9wcy5oCi0gKiB0byBtYWtlIGl0IGNvbXBpbGUKLSAqLwotaW5saW5lIGludCBmZnMoaW50IHgpCi17Ci0JaW50IHIgPSAxOwotCi0JaWYgKCF4KQotCQlyZXR1cm4gMDsKLQlpZiAoISh4ICYgMHhmZmZmKSkgewotCQl4ID4+PSAxNjsKLQkJciArPSAxNjsKLQl9Ci0JaWYgKCEoeCAmIDB4ZmYpKSB7Ci0JCXggPj49IDg7Ci0JCXIgKz0gODsKLQl9Ci0JaWYgKCEoeCAmIDB4ZikpIHsKLQkJeCA+Pj0gNDsKLQkJciArPSA0OwotCX0KLQlpZiAoISh4ICYgMykpIHsKLQkJeCA+Pj0gMjsKLQkJciArPSAyOwotCX0KLQlpZiAoISh4ICYgMSkpIHsKLQkJeCA+Pj0gMTsKLQkJciArPSAxOwotCX0KLQlyZXR1cm4gcjsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nZW5jb2RlLmMgYi9nZW5jb2RlLmMKaW5kZXggZDJjYWUyMS4uN2JiMDdmYiAxMDA2NDQKLS0tIGEvZ2VuY29kZS5jCisrKyBiL2dlbmNvZGUuYwpAQCAtMjEsNyArMjEsNyBAQAogICovCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9nZW5jb2RlLmMsdiAxLjIyMS4yLjUzIDIwMDcvMDkvMTIgMTk6MTc6MjQgZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9nZW5jb2RlLmMsdiAxLjMwOSAyMDA4LTEyLTIzIDIwOjEzOjI5IGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKQEAgLTMxLDYgKzMxLDE0IEBACiAjaWZkZWYgV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgogI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZiAvKiBXSU4zMiAqLwpAQCAtMzksNyArNDcsNyBAQAogICogWFhYIC0gd2h5IHdhcyB0aGlzIGluY2x1ZGVkIGV2ZW4gb24gVU5JWD8KICAqLwogI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSAiSVA2X21pc2MuaCIKKyNpbmNsdWRlICJpcDZfbWlzYy5oIgogI2VuZGlmCiAKICNpZm5kZWYgV0lOMzIKQEAgLTQ5LDYgKzU3LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCiAjZW5kaWYgLyogV0lOMzIgKi8KIApAQCAtNjgsMTEgKzc3LDE4IEBACiAjaW5jbHVkZSAibmxwaWQuaCIKICNpbmNsdWRlICJsbGMuaCIKICNpbmNsdWRlICJnZW5jb2RlLmgiCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAjaW5jbHVkZSAiYXRtdW5pMzEuaCIKICNpbmNsdWRlICJzdW5hdG1wb3MuaCIKICNpbmNsdWRlICJwcHAuaCIKLSNpbmNsdWRlICJzbGwuaCIKKyNpbmNsdWRlICJwY2FwL3NsbC5oIgorI2luY2x1ZGUgInBjYXAvaXBuZXQuaCIKICNpbmNsdWRlICJhcmNuZXQuaCIKKyNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKFBGX1BBQ0tFVCkgJiYgZGVmaW5lZChTT19BVFRBQ0hfRklMVEVSKQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjZW5kaWYKICNpZmRlZiBIQVZFX05FVF9QRlZBUl9ICiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPG5ldC9pZi5oPgpAQCAtODcsMTAgKzEwMywyMiBAQAogI2luY2x1ZGUgPG5ldGRiLmg+CS8qIGZvciAic3RydWN0IGFkZHJpbmZvIiAqLwogI2VuZGlmIC8qIFdJTjMyICovCiAjZW5kaWYgLypJTkVUNiovCi0jaW5jbHVkZSA8cGNhcC1uYW1lZGIuaD4KKyNpbmNsdWRlIDxwY2FwL25hbWVkYi5oPgogCiAjZGVmaW5lIEVUSEVSTVRVCTE1MDAKIAorI2lmbmRlZiBJUFBST1RPX0hPUE9QVFMKKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTIDAKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX1JPVVRJTkcKKyNkZWZpbmUgSVBQUk9UT19ST1VUSU5HIDQzCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19GUkFHTUVOVAorI2RlZmluZSBJUFBST1RPX0ZSQUdNRU5UIDQ0CisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19EU1RPUFRTCisjZGVmaW5lIElQUFJPVE9fRFNUT1BUUyA2MAorI2VuZGlmCiAjaWZuZGVmIElQUFJPVE9fU0NUUAogI2RlZmluZSBJUFBST1RPX1NDVFAgMTMyCiAjZW5kaWYKQEAgLTEwNSwxNyArMTMzLDE1IEBACiBzdGF0aWMgam1wX2J1ZiB0b3BfY3R4Owogc3RhdGljIHBjYXBfdCAqYnBmX3BjYXA7CiAKLSNpZmRlZiBXSU4zMgogLyogSGFjayBmb3IgdXBkYXRpbmcgVkxBTiwgTVBMUywgYW5kIFBQUG9FIG9mZnNldHMuICovCisjaWZkZWYgV0lOMzIKIHN0YXRpYyB1X2ludAlvcmlnX2xpbmt0eXBlID0gKHVfaW50KS0xLCBvcmlnX25sID0gKHVfaW50KS0xLCBsYWJlbF9zdGFja19kZXB0aCA9ICh1X2ludCktMTsKICNlbHNlCiBzdGF0aWMgdV9pbnQJb3JpZ19saW5rdHlwZSA9IC0xVSwgb3JpZ19ubCA9IC0xVSwgbGFiZWxfc3RhY2tfZGVwdGggPSAtMVU7CiAjZW5kaWYKIAogLyogWFhYICovCi0jaWZkZWYgUENBUF9GRERJUEFECiBzdGF0aWMgaW50CXBjYXBfZmRkaXBhZDsKLSNlbmRpZgogCiAvKiBWQVJBUkdTICovCiB2b2lkCkBAIC0xMzQsNiArMTYwLDcgQEAKIAogc3RhdGljIHZvaWQgaW5pdF9saW5rdHlwZShwY2FwX3QgKik7CiAKK3N0YXRpYyB2b2lkIGluaXRfcmVncyh2b2lkKTsKIHN0YXRpYyBpbnQgYWxsb2NfcmVnKHZvaWQpOwogc3RhdGljIHZvaWQgZnJlZV9yZWcoaW50KTsKIApAQCAtMTQ1LDEzICsxNzIsMjUgQEAKICAqLwogZW51bSBlX29mZnJlbCB7CiAJT1JfUEFDS0VULAkvKiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KLQlPUl9MSU5LLAkvKiByZWxhdGl2ZSB0byB0aGUgbGluay1sYXllciBoZWFkZXIgKi8KKwlPUl9MSU5LLAkvKiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rLWxheWVyIGhlYWRlciAqLworCU9SX01BQ1BMLAkvKiByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBNQUMtbGF5ZXIgaGVhZGVyICovCiAJT1JfTkVULAkJLyogcmVsYXRpdmUgdG8gdGhlIG5ldHdvcmstbGF5ZXIgaGVhZGVyICovCiAJT1JfTkVUX05PU05BUCwJLyogcmVsYXRpdmUgdG8gdGhlIG5ldHdvcmstbGF5ZXIgaGVhZGVyLCB3aXRoIG5vIFNOQVAgaGVhZGVyIGF0IHRoZSBsaW5rIGxheWVyICovCiAJT1JfVFJBTl9JUFY0LAkvKiByZWxhdGl2ZSB0byB0aGUgdHJhbnNwb3J0LWxheWVyIGhlYWRlciwgd2l0aCBJUHY0IG5ldHdvcmsgbGF5ZXIgKi8KIAlPUl9UUkFOX0lQVjYJLyogcmVsYXRpdmUgdG8gdGhlIHRyYW5zcG9ydC1sYXllciBoZWFkZXIsIHdpdGggSVB2NiBuZXR3b3JrIGxheWVyICovCiB9OwogCisjaWZkZWYgSU5FVDYKKy8qCisgKiBBcyBlcnJvcnMgYXJlIGhhbmRsZWQgYnkgYSBsb25nam1wLCBhbnl0aGluZyBhbGxvY2F0ZWQgbXVzdCBiZSBmcmVlZAorICogaW4gdGhlIGxvbmdqbXAgaGFuZGxlciwgc28gaXQgbXVzdCBiZSByZWFjaGFibGUgZnJvbSB0aGF0IGhhbmRsZXIuCisgKiBPbmUgdGhpbmcgdGhhdCdzIGFsbG9jYXRlZCBpcyB0aGUgcmVzdWx0IG9mIHBjYXBfbmFtZXRvYWRkcmluZm8oKTsKKyAqIGl0IG11c3QgYmUgZnJlZWQgd2l0aCBmcmVlYWRkcmluZm8oKS4gIFRoaXMgdmFyaWFibGUgcG9pbnRzIHRvIGFueQorICogYWRkcmluZm8gc3RydWN0dXJlIHRoYXQgd291bGQgbmVlZCB0byBiZSBmcmVlZC4KKyAqLworc3RhdGljIHN0cnVjdCBhZGRyaW5mbyAqYWk7CisjZW5kaWYKKwogLyoKICAqIFdlIGRpdnkgb3V0IGNodW5rcyBvZiBtZW1vcnkgcmF0aGVyIHRoYW4gY2FsbCBtYWxsb2MgZWFjaCB0aW1lIHNvCiAgKiB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGxlYWtpbmcgbWVtb3J5LiAgSXQncyBwcm9iYWJseQpAQCAtMTkwLDE5ICsyMjksMjUgQEAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9uY21wKGVudW0gZV9vZmZyZWwsIGJwZl91X2ludDMyLCBicGZfdV9pbnQzMiwKICAgICBicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIsIGludCwgYnBmX2ludDMyKTsKIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX2xscmVsKHVfaW50LCB1X2ludCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9tYWNwbHJlbCh1X2ludCwgdV9pbnQpOwogc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfYShlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQpOwogc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWR4X2lwaGRybGVuKHZvaWQpOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3VuY29uZChpbnQpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKmdlbl90cnVlKHZvaWQpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKmdlbl9mYWxzZSh2b2lkKTsKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ldGhlcl9saW5rdHlwZShpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2lwbmV0X2xpbmt0eXBlKGludCk7CiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbGludXhfc2xsX2xpbmt0eXBlKGludCk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmFkaW90YXBfbG9hZF9sbHByZWZpeGxlbihzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcHBpX2xvYWRfbGxwcmVmaXhsZW4oc3RydWN0IGJsb2NrICopOwotc3RhdGljIHZvaWQgaW5zZXJ0X2xvYWRfbGxwcmVmaXhsZW4oc3RydWN0IGJsb2NrICopOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfcHJpc21fbGxwcmVmaXhsZW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9hdnNfbGxwcmVmaXhsZW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9yYWRpb3RhcF9sbHByZWZpeGxlbih2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX3BwaV9sbHByZWZpeGxlbih2b2lkKTsKK3N0YXRpYyB2b2lkIGluc2VydF9jb21wdXRlX3Zsb2Zmc2V0cyhzdHJ1Y3QgYmxvY2sgKik7CiBzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbGxwcmVmaXhsZW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fb2ZmX21hY3BsKHZvaWQpOworc3RhdGljIGludCBldGhlcnR5cGVfdG9fcHBwdHlwZShpbnQpOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2xpbmt0eXBlKGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fc25hcChicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIsIHVfaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9zbmFwKGJwZl91X2ludDMyLCBicGZfdV9pbnQzMik7CiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbGxjX2xpbmt0eXBlKGludCk7CiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faG9zdG9wKGJwZl91X2ludDMyLCBicGZfdV9pbnQzMiwgaW50LCBpbnQsIHVfaW50LCB1X2ludCk7CiAjaWZkZWYgSU5FVDYKQEAgLTIyNiwyMCArMjcxLDE2IEBACiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faXBmcmFnKHZvaWQpOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRhdG9tKGludCwgYnBmX2ludDMyKTsKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VhdG9tKGludCwgYnBmX2ludDMyLCBicGZfaW50MzIpOwotI2lmZGVmIElORVQ2CiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydGF0b202KGludCwgYnBmX2ludDMyKTsKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VhdG9tNihpbnQsIGJwZl9pbnQzMiwgYnBmX2ludDMyKTsKLSNlbmRpZgogc3RydWN0IGJsb2NrICpnZW5fcG9ydG9wKGludCwgaW50LCBpbnQpOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnQoaW50LCBpbnQsIGludCk7CiBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VvcChpbnQsIGludCwgaW50LCBpbnQpOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRyYW5nZShpbnQsIGludCwgaW50LCBpbnQpOwotI2lmZGVmIElORVQ2CiBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0b3A2KGludCwgaW50LCBpbnQpOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnQ2KGludCwgaW50LCBpbnQpOwogc3RydWN0IGJsb2NrICpnZW5fcG9ydHJhbmdlb3A2KGludCwgaW50LCBpbnQsIGludCk7CiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydHJhbmdlNihpbnQsIGludCwgaW50LCBpbnQpOwotI2VuZGlmCiBzdGF0aWMgaW50IGxvb2t1cF9wcm90byhjb25zdCBjaGFyICosIGludCk7CiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcHJvdG9jaGFpbihpbnQsIGludCwgaW50KTsKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wcm90byhpbnQsIGludCwgaW50KTsKQEAgLTI0Nyw2ICsyODgsNyBAQAogc3RhdGljIHN0cnVjdCBzbGlzdCAqeGZlcl90b19hKHN0cnVjdCBhcnRoICopOwogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX21hY19tdWx0aWNhc3QoaW50KTsKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9sZW4oaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2NoZWNrXzgwMl8xMV9kYXRhX2ZyYW1lKHZvaWQpOwogCiBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcHBpX2RsdF9jaGVjayh2b2lkKTsKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9tc2dfYWJicmV2KGludCB0eXBlKTsKQEAgLTM1NiwyMCArMzk4LDYwIEBACiBzdGF0aWMgYnBmX3VfaW50MzIgbmV0bWFzazsKIHN0YXRpYyBpbnQgc25hcGxlbjsKIGludCBub19vcHRpbWl6ZTsKKyNpZmRlZiBXSU4zMgorc3RhdGljIGludAorcGNhcF9jb21waWxlX3Vuc2FmZShwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZ3JhbSwKKwkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG9wdGltaXplLCBicGZfdV9pbnQzMiBtYXNrKTsKIAogaW50CiBwY2FwX2NvbXBpbGUocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2dyYW0sCiAJICAgICBjb25zdCBjaGFyICpidWYsIGludCBvcHRpbWl6ZSwgYnBmX3VfaW50MzIgbWFzaykKIHsKKwlpbnQgcmVzdWx0OworCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oJmdfUGNhcENvbXBpbGVDcml0aWNhbFNlY3Rpb24pOworCisJcmVzdWx0ID0gcGNhcF9jb21waWxlX3Vuc2FmZShwLCBwcm9ncmFtLCBidWYsIG9wdGltaXplLCBtYXNrKTsKKworCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCZnX1BjYXBDb21waWxlQ3JpdGljYWxTZWN0aW9uKTsKKwkKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitwY2FwX2NvbXBpbGVfdW5zYWZlKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9ncmFtLAorCSAgICAgY29uc3QgY2hhciAqYnVmLCBpbnQgb3B0aW1pemUsIGJwZl91X2ludDMyIG1hc2spCisjZWxzZSAvKiBXSU4zMiAqLworaW50CitwY2FwX2NvbXBpbGUocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2dyYW0sCisJICAgICBjb25zdCBjaGFyICpidWYsIGludCBvcHRpbWl6ZSwgYnBmX3VfaW50MzIgbWFzaykKKyNlbmRpZiAvKiBXSU4zMiAqLworewogCWV4dGVybiBpbnQgbl9lcnJvcnM7CiAJY29uc3QgY2hhciAqIHZvbGF0aWxlIHhidWYgPSBidWY7Ci0JaW50IGxlbjsKKwl1X2ludCBsZW47CiAKKwkvKgorCSAqIElmIHRoaXMgcGNhcF90IGhhc24ndCBiZWVuIGFjdGl2YXRlZCwgaXQgZG9lc24ndCBoYXZlIGEKKwkgKiBsaW5rLWxheWVyIHR5cGUsIHNvIHdlIGNhbid0IHVzZSBpdC4KKwkgKi8KKwlpZiAoIXAtPmFjdGl2YXRlZCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAibm90LXlldC1hY3RpdmF0ZWQgcGNhcF90IHBhc3NlZCB0byBwY2FwX2NvbXBpbGUiKTsKKwkJcmV0dXJuICgtMSk7CisJfQogCW5vX29wdGltaXplID0gMDsKIAluX2Vycm9ycyA9IDA7CiAJcm9vdCA9IE5VTEw7CiAJYnBmX3BjYXAgPSBwOworCWluaXRfcmVncygpOwogCWlmIChzZXRqbXAodG9wX2N0eCkpIHsKKyNpZmRlZiBJTkVUNgorCQlpZiAoYWkgIT0gTlVMTCkgeworCQkJZnJlZWFkZHJpbmZvKGFpKTsKKwkJCWFpID0gTlVMTDsKKwkJfQorI2VuZGlmCiAJCWxleF9jbGVhbnVwKCk7CiAJCWZyZWVjaHVua3MoKTsKIAkJcmV0dXJuICgtMSk7CkBAIC00ODQsMjQgKzU2NiwxMSBAQAogCSpwID0gYjE7CiB9CiAKLQogdm9pZAogZmluaXNoX3BhcnNlKHApCiAJc3RydWN0IGJsb2NrICpwOwogewogCXN0cnVjdCBibG9jayAqcHBpX2RsdF9jaGVjazsKLQkKLQlwcGlfZGx0X2NoZWNrID0gZ2VuX3BwaV9kbHRfY2hlY2soKTsKLQotCWlmIChwcGlfZGx0X2NoZWNrICE9IE5VTEwpCi0JewotCQlnZW5fYW5kKHBwaV9kbHRfY2hlY2ssIHApOwotCX0KLQotCWJhY2twYXRjaChwLCBnZW5fcmV0YmxrKHNuYXBsZW4pKTsKLQlwLT5zZW5zZSA9ICFwLT5zZW5zZTsKLQliYWNrcGF0Y2gocCwgZ2VuX3JldGJsaygwKSk7Ci0Jcm9vdCA9IHAtPmhlYWQ7CiAKIAkvKgogCSAqIEluc2VydCBiZWZvcmUgdGhlIHN0YXRlbWVudHMgb2YgdGhlIGZpcnN0IChyb290KSBibG9jayBhbnkKQEAgLTUxMiwxNCArNTgxLDMwIEBACiAJICogc3RhdGVtZW50cyBvZiBhbGwgYmxvY2tzIHRoYXQgdXNlIHRob3NlIGxlbmd0aHMgYW5kIHRoYXQKIAkgKiBoYXZlIG5vIHByZWRlY2Vzc29ycyB0aGF0IHVzZSB0aGVtLCBzbyB0aGF0IHdlIG9ubHkgY29tcHV0ZQogCSAqIHRoZSBsZW5ndGhzIGlmIHdlIG5lZWQgdGhlbS4gIFRoZXJlIG1pZ2h0IGJlIGV2ZW4gYmV0dGVyCi0JICogYXBwcm9hY2hlcyB0aGFuIHRoYXQuICBIb3dldmVyLCBhcyB3ZSdyZSBjdXJyZW50bHkgb25seQotCSAqIGhhbmRsaW5nIHZhcmlhYmxlLWxlbmd0aCByYWRpb3RhcCBoZWFkZXJzLCBhbmQgYXMgYWxsCi0JICogZmlsdGVyaW5nIGV4cHJlc3Npb25zIG90aGVyIHRoYW4gcmF3IGxpbmtbTTpOXSB0ZXN0cwotCSAqIHJlcXVpcmUgdGhlIGxlbmd0aCBvZiB0aGF0IGhlYWRlciwgZG9pbmcgbW9yZSBmb3IgdGhhdAotCSAqIGhlYWRlciBsZW5ndGggaXNuJ3QgcmVhbGx5IHdvcnRoIHRoZSBlZmZvcnQuCisJICogYXBwcm9hY2hlcyB0aGFuIHRoYXQuCisJICoKKwkgKiBIb3dldmVyLCB0aG9zZSBzdHJhdGVnaWVzIHdvdWxkIGJlIG1vcmUgY29tcGxpY2F0ZWQsIGFuZAorCSAqIGFzIHdlIGRvbid0IGdlbmVyYXRlIGNvZGUgdG8gY29tcHV0ZSBhIGxlbmd0aCBpZiB0aGUKKwkgKiBwcm9ncmFtIGhhcyBubyB0ZXN0cyB0aGF0IHVzZSB0aGUgbGVuZ3RoLCBhbmQgYXMgbW9zdAorCSAqIHRlc3RzIHdpbGwgcHJvYmFibHkgdXNlIHRob3NlIGxlbmd0aHMsIHdlIHdvdWxkIGp1c3QKKwkgKiBwb3N0cG9uZSBjb21wdXRpbmcgdGhlIGxlbmd0aHMgc28gdGhhdCBpdCdzIG5vdCBkb25lCisJICogZm9yIHRlc3RzIHRoYXQgZmFpbCBlYXJseSwgYW5kIGl0J3Mgbm90IGNsZWFyIHRoYXQncworCSAqIHdvcnRoIHRoZSBlZmZvcnQuCiAJICovCisJaW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKHAtPmhlYWQpOworCQorCS8qCisJICogRm9yIERMVF9QUEkgY2FwdHVyZXMsIGdlbmVyYXRlIGEgY2hlY2sgb2YgdGhlIHBlci1wYWNrZXQKKwkgKiBETFQgdmFsdWUgdG8gbWFrZSBzdXJlIGl0J3MgRExUX0lFRUU4MDJfMTEuCisJICovCisJcHBpX2RsdF9jaGVjayA9IGdlbl9wcGlfZGx0X2NoZWNrKCk7CisJaWYgKHBwaV9kbHRfY2hlY2sgIT0gTlVMTCkKKwkJZ2VuX2FuZChwcGlfZGx0X2NoZWNrLCBwKTsKIAotCWluc2VydF9sb2FkX2xscHJlZml4bGVuKHJvb3QpOworCWJhY2twYXRjaChwLCBnZW5fcmV0YmxrKHNuYXBsZW4pKTsKKwlwLT5zZW5zZSA9ICFwLT5zZW5zZTsKKwliYWNrcGF0Y2gocCwgZ2VuX3JldGJsaygwKSk7CisJcm9vdCA9IHAtPmhlYWQ7CiB9CiAKIHZvaWQKQEAgLTY4MiwxMyArNzY3LDcgQEAKICAqIFZhcmlvdXMgY29kZSBjb25zdHJ1Y3RzIG5lZWQgdG8ga25vdyB0aGUgbGF5b3V0IG9mIHRoZSBkYXRhIGxpbmsKICAqIGxheWVyLiAgVGhlc2UgdmFyaWFibGVzIGdpdmUgdGhlIG5lY2Vzc2FyeSBvZmZzZXRzIGZyb20gdGhlIGJlZ2lubmluZwogICogb2YgdGhlIHBhY2tldCBkYXRhLgotICoKLSAqIElmIHRoZSBsaW5rIGxheWVyIGhhcyB2YXJpYWJsZV9sZW5ndGggaGVhZGVycywgdGhlIG9mZnNldHMgYXJlIG9mZnNldHMKLSAqIGZyb20gdGhlIGVuZCBvZiB0aGUgbGluay1saW5rLWxheWVyIGhlYWRlciwgYW5kICJyZWdfbGxfc2l6ZSIgaXMKLSAqIHRoZSByZWdpc3RlciBudW1iZXIgZm9yIGEgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHRoZQotICogbGluay1sYXllciBoZWFkZXIuICBPdGhlcndpc2UsICJyZWdfbGxfc2l6ZSIgaXMgLTEuCiAgKi8KLXN0YXRpYyBpbnQgcmVnX2xsX3NpemU7CiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgZnJvbQpAQCAtNzAxLDEzICs3ODAsNTAgQEAKIHN0YXRpYyB1X2ludCBvZmZfbGw7CiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFDLWxheWVyIGhlYWRlci4KKyAqIElmIHRoZXJlJ3MgYSB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUgbGluay1sYXllciBoZWFkZXIsCisgKiAicmVnX29mZl9sbCIgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciBmb3IgYSByZWdpc3RlciBjb250YWluaW5nIHRoZQorICogbGVuZ3RoIG9mIHRoYXQgaGVhZGVyLCBhbmQgdGhlcmVmb3JlIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIKKyAqIGhlYWRlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhdyBwYWNrZXQgZGF0YS4gIE90aGVyd2lzZSwKKyAqICJyZWdfb2ZmX2xsIiBpcyAtMS4KKyAqLworc3RhdGljIGludCByZWdfb2ZmX2xsOworCisvKgorICogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BQy1sYXllciBoZWFkZXIgZnJvbQorICogdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluay1sYXllciBoZWFkZXIuCiAgKiBJdCdzIHVzdWFsbHkgMCwgZXhjZXB0IGZvciBBVE0gTEFORSwgd2hlcmUgaXQncyB0aGUgb2Zmc2V0LCByZWxhdGl2ZQotICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmF3IHBhY2tldCBkYXRhLCBvZiB0aGUgRXRoZXJuZXQgaGVhZGVyLgorICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmF3IHBhY2tldCBkYXRhLCBvZiB0aGUgRXRoZXJuZXQgaGVhZGVyLCBhbmQKKyAqIGZvciBFdGhlcm5ldCB3aXRoIHZhcmlvdXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KICAqLwogc3RhdGljIHVfaW50IG9mZl9tYWM7CiAKIC8qCisgKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQsCisgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhdyBwYWNrZXQgZGF0YS4KKyAqCisgKiBJLmUuLCBpdCdzIHRoZSBzdW0gb2YgdGhlIGxlbmd0aCBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgKHdpdGhvdXQsCisgKiBmb3IgZXhhbXBsZSwgYW55IDgwMi4yIExMQyBoZWFkZXIsIHNvIGl0J3MgdGhlIE1BQy1sYXllcgorICogcG9ydGlvbiBvZiB0aGF0IGhlYWRlciksIHBsdXMgYW55IHByZWZpeCBwcmVjZWRpbmcgdGhlCisgKiBsaW5rLWxheWVyIGhlYWRlci4KKyAqLworc3RhdGljIHVfaW50IG9mZl9tYWNwbDsKKworLyoKKyAqIFRoaXMgaXMgMSBpZiB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkCisgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aC4KKyAqLworc3RhdGljIGludCBvZmZfbWFjcGxfaXNfdmFyaWFibGU7CisKKy8qCisgKiBJZiB0aGUgbGluayBsYXllciBoYXMgdmFyaWFibGVfbGVuZ3RoIGhlYWRlcnMsICJyZWdfb2ZmX21hY3BsIgorICogaXMgdGhlIHJlZ2lzdGVyIG51bWJlciBmb3IgYSByZWdpc3RlciBjb250YWluaW5nIHRoZSBsZW5ndGggb2YgdGhlCisgKiBsaW5rLWxheWVyIGhlYWRlciBwbHVzIHRoZSBsZW5ndGggb2YgYW55IHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIKKyAqIHByZWNlZGluZyB0aGUgbGluay1sYXllciBoZWFkZXIuICBPdGhlcndpc2UsICJyZWdfb2ZmX21hY3BsIgorICogaXMgLTEuCisgKi8KK3N0YXRpYyBpbnQgcmVnX29mZl9tYWNwbDsKKworLyoKICAqICJvZmZfbGlua3R5cGUiIGlzIHRoZSBvZmZzZXQgdG8gaW5mb3JtYXRpb24gaW4gdGhlIGxpbmstbGF5ZXIgaGVhZGVyCiAgKiBnaXZpbmcgdGhlIHBhY2tldCB0eXBlLiAgVGhpcyBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwogICogb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIChpLmUuLCBpdCBkb2Vzbid0IGluY2x1ZGUgb2ZmX2xsKS4KQEAgLTczMCw2ICs4NDYsMTMgQEAKIHN0YXRpYyB1X2ludCBvZmZfbGlua3R5cGU7CiAKIC8qCisgKiBUUlVFIGlmICJwcHBvZXMiIGFwcGVhcmVkIGluIHRoZSBmaWx0ZXI7IGl0IGNhdXNlcyBsaW5rLWxheWVyIHR5cGUKKyAqIGNoZWNrcyB0byBjaGVjayB0aGUgUFBQIGhlYWRlciwgYXNzdW1lZCB0byBmb2xsb3cgYSBMQU4tc3R5bGUgbGluay0KKyAqIGxheWVyIGhlYWRlciBhbmQgYSBQUFBvRSBzZXNzaW9uIGhlYWRlci4KKyAqLworc3RhdGljIGludCBpc19wcHBvZXMgPSAwOworCisvKgogICogVFJVRSBpZiB0aGUgbGluayBsYXllciBpbmNsdWRlcyBhbiBBVE0gcHNldWRvLWhlYWRlci4KICAqLwogc3RhdGljIGludCBpc19hdG0gPSAwOwpAQCAtNzUxLDYgKzg3NCw3IEBACiAgKiBUaGVzZSBhcmUgb2Zmc2V0cyBmb3IgdGhlIE1UUDIgZmllbGRzLgogICovCiBzdGF0aWMgdV9pbnQgb2ZmX2xpOworc3RhdGljIHVfaW50IG9mZl9saV9oc2w7CiAKIC8qCiAgKiBUaGVzZSBhcmUgb2Zmc2V0cyBmb3IgdGhlIE1UUDMgZmllbGRzLgpAQCAtNzY4LDggKzg5Miw4IEBACiAKIC8qCiAgKiBUaGVzZSBhcmUgb2Zmc2V0cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KLSAqIFRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIChpLmUuLAotICogdGhleSBkb24ndCBpbmNsdWRlIG9mZl9sbCkuCisgKiBUaGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCAoaS5lLiwKKyAqIHRoZXkgZG9uJ3QgaW5jbHVkZSBvZmZfbGwgb3Igb2ZmX21hY3BsKS4KICAqCiAgKiBJZiB0aGUgbGluayBsYXllciBuZXZlciB1c2VzIDgwMi4yIExMQzoKICAqCkBAIC04MDAsOSArOTI0LDcgQEAKIAlwY2FwX3QgKnA7CiB7CiAJbGlua3R5cGUgPSBwY2FwX2RhdGFsaW5rKHApOwotI2lmZGVmIFBDQVBfRkRESVBBRAogCXBjYXBfZmRkaXBhZCA9IHAtPmZkZGlwYWQ7Ci0jZW5kaWYKIAogCS8qCiAJICogQXNzdW1lIGl0J3Mgbm90IHJhdyBBVE0gd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBub3cuCkBAIC04MTYsNDMgKzkzOCw1NSBAQAogCW9mZl9wYXlsb2FkID0gLTE7CiAKIAkvKgorCSAqIEFuZCB0aGF0IHdlJ3JlIG5vdCBkb2luZyBQUFBvRS4KKwkgKi8KKwlpc19wcHBvZXMgPSAwOworCisJLyoKIAkgKiBBbmQgYXNzdW1lIHdlJ3JlIG5vdCBkb2luZyBTUzcuCiAJICovCiAJb2ZmX2xpID0gLTE7CisJb2ZmX2xpX2hzbCA9IC0xOwogCW9mZl9zaW8gPSAtMTsKIAlvZmZfb3BjID0gLTE7CiAJb2ZmX2RwYyA9IC0xOwogCW9mZl9zbHMgPSAtMTsKIAogCS8qCi0JICogQWxzbyBhc3N1bWUgaXQncyBub3QgODAyLjExIHdpdGggYSBmaXhlZC1sZW5ndGggcmFkaW8gaGVhZGVyLgorCSAqIEFsc28gYXNzdW1lIGl0J3Mgbm90IDgwMi4xMS4KIAkgKi8KIAlvZmZfbGwgPSAwOworCW9mZl9tYWNwbCA9IDA7CisJb2ZmX21hY3BsX2lzX3ZhcmlhYmxlID0gMDsKIAogCW9yaWdfbGlua3R5cGUgPSAtMTsKIAlvcmlnX25sID0gLTE7CiAgICAgICAgIGxhYmVsX3N0YWNrX2RlcHRoID0gMDsKIAotCXJlZ19sbF9zaXplID0gLTE7CisJcmVnX29mZl9sbCA9IC0xOworCXJlZ19vZmZfbWFjcGwgPSAtMTsKIAogCXN3aXRjaCAobGlua3R5cGUpIHsKIAogCWNhc2UgRExUX0FSQ05FVDoKIAkJb2ZmX2xpbmt0eXBlID0gMjsKLQkJb2ZmX25sID0gNjsJCS8qIFhYWCBpbiByZWFsaXR5LCB2YXJpYWJsZSEgKi8KLQkJb2ZmX25sX25vc25hcCA9IDY7CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSA2OworCQlvZmZfbmwgPSAwOwkJLyogWFhYIGluIHJlYWxpdHksIHZhcmlhYmxlISAqLworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0FSQ05FVF9MSU5VWDoKIAkJb2ZmX2xpbmt0eXBlID0gNDsKLQkJb2ZmX25sID0gODsJCS8qIFhYWCBpbiByZWFsaXR5LCB2YXJpYWJsZSEgKi8KLQkJb2ZmX25sX25vc25hcCA9IDg7CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSA4OworCQlvZmZfbmwgPSAwOwkJLyogWFhYIGluIHJlYWxpdHksIHZhcmlhYmxlISAqLworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0VOMTBNQjoKIAkJb2ZmX2xpbmt0eXBlID0gMTI7Ci0JCW9mZl9ubCA9IDE0OwkJLyogRXRoZXJuZXQgSUkgKi8KLQkJb2ZmX25sX25vc25hcCA9IDE3OwkvKiA4MDIuMys4MDIuMiAqLworCQlvZmZfbWFjcGwgPSAxNDsJCS8qIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKi8KKwkJb2ZmX25sID0gMDsJCS8qIEV0aGVybmV0IElJICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9TTElQOgpAQCAtODYxLDI5ICs5OTUsMzMgQEAKIAkJICogaGVhZGVyIGlzIGhhY2tlZCBpbnRvIG91ciBTTElQIGRyaXZlci4KIAkJICovCiAJCW9mZl9saW5rdHlwZSA9IC0xOwotCQlvZmZfbmwgPSAxNjsKLQkJb2ZmX25sX25vc25hcCA9IDE2OwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJb2ZmX21hY3BsID0gMTY7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJcmV0dXJuOwogCiAJY2FzZSBETFRfU0xJUF9CU0RPUzoKIAkJLyogWFhYIHRoaXMgbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBETFRfUFBQX0JTRE9TIGNhc2UgKi8KIAkJb2ZmX2xpbmt0eXBlID0gLTE7CiAJCS8qIFhYWCBlbmQgKi8KLQkJb2ZmX25sID0gMjQ7Ci0JCW9mZl9ubF9ub3NuYXAgPSAyNDsJLyogbm8gODAyLjIgTExDICovCisJCW9mZl9tYWNwbCA9IDI0OworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX05VTEw6CiAJY2FzZSBETFRfTE9PUDoKIAkJb2ZmX2xpbmt0eXBlID0gMDsKLQkJb2ZmX25sID0gNDsKLQkJb2ZmX25sX25vc25hcCA9IDQ7CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSA0OworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0VOQzoKIAkJb2ZmX2xpbmt0eXBlID0gMDsKLQkJb2ZmX25sID0gMTI7Ci0JCW9mZl9ubF9ub3NuYXAgPSAxMjsJLyogbm8gODAyLjIgTExDICovCisJCW9mZl9tYWNwbCA9IDEyOworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX1BQUDoKQEAgLTg5MSw4ICsxMDI5LDkgQEAKIAljYXNlIERMVF9DX0hETEM6CQkvKiBCU0QvT1MgQ2lzY28gSERMQyAqLwogCWNhc2UgRExUX1BQUF9TRVJJQUw6CQkvKiBOZXRCU0Qgc3luYy9hc3luYyBzZXJpYWwgUFBQICovCiAJCW9mZl9saW5rdHlwZSA9IDI7Ci0JCW9mZl9ubCA9IDQ7Ci0JCW9mZl9ubF9ub3NuYXAgPSA0OwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJb2ZmX21hY3BsID0gNDsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9QUFBfRVRIRVI6CkBAIC05MDEsMTQgKzEwNDAsMTYgQEAKIAkJICogb25seSBjb3ZlcnMgc2Vzc2lvbiBzdGF0ZS4KIAkJICovCiAJCW9mZl9saW5rdHlwZSA9IDY7Ci0JCW9mZl9ubCA9IDg7Ci0JCW9mZl9ubF9ub3NuYXAgPSA4OwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJb2ZmX21hY3BsID0gODsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9QUFBfQlNET1M6CiAJCW9mZl9saW5rdHlwZSA9IDU7Ci0JCW9mZl9ubCA9IDI0OwotCQlvZmZfbmxfbm9zbmFwID0gMjQ7CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSAyNDsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9GRERJOgpAQCAtOTIxLDE1ICsxMDYyLDExIEBACiAJCSAqIFhYWCAtIHNob3VsZCB3ZSBnZW5lcmF0ZSBjb2RlIHRvIGNoZWNrIGZvciBTTkFQPwogCQkgKi8KIAkJb2ZmX2xpbmt0eXBlID0gMTM7Ci0jaWZkZWYgUENBUF9GRERJUEFECiAJCW9mZl9saW5rdHlwZSArPSBwY2FwX2ZkZGlwYWQ7Ci0jZW5kaWYKLQkJb2ZmX25sID0gMjE7CQkvKiBGRERJKzgwMi4yK1NOQVAgKi8KLQkJb2ZmX25sX25vc25hcCA9IDE2OwkvKiBGRERJKzgwMi4yICovCi0jaWZkZWYgUENBUF9GRERJUEFECi0JCW9mZl9ubCArPSBwY2FwX2ZkZGlwYWQ7Ci0JCW9mZl9ubF9ub3NuYXAgKz0gcGNhcF9mZGRpcGFkOwotI2VuZGlmCisJCW9mZl9tYWNwbCA9IDEzOwkJLyogRkRESSBNQUMgaGVhZGVyIGxlbmd0aCAqLworCQlvZmZfbWFjcGwgKz0gcGNhcF9mZGRpcGFkOworCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KIAkJcmV0dXJuOwogCiAJY2FzZSBETFRfSUVFRTgwMjoKQEAgLTk1NywxMSArMTA5NCwxNSBAQAogCQkgKiA4IC0gZmlndXJlIG91dCB3aGljaCBieXRlIHRoYXQgaXMpLgogCQkgKi8KIAkJb2ZmX2xpbmt0eXBlID0gMTQ7Ci0JCW9mZl9ubCA9IDIyOwkJLyogVG9rZW4gUmluZys4MDIuMitTTkFQICovCi0JCW9mZl9ubF9ub3NuYXAgPSAxNzsJLyogVG9rZW4gUmluZys4MDIuMiAqLworCQlvZmZfbWFjcGwgPSAxNDsJCS8qIFRva2VuIFJpbmcgTUFDIGhlYWRlciBsZW5ndGggKi8KKwkJb2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KKwkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CiAJCS8qCiAJCSAqIDgwMi4xMSBkb2Vzbid0IHJlYWxseSBoYXZlIGEgbGluay1sZXZlbCB0eXBlIGZpZWxkLgogCQkgKiBXZSBzZXQgIm9mZl9saW5rdHlwZSIgdG8gdGhlIG9mZnNldCBvZiB0aGUgTExDIGhlYWRlci4KQEAgLTk3MCw5MCArMTExMSwzNyBAQAogCQkgKiBpcyBiZWluZyB1c2VkIGFuZCBwaWNrIG91dCB0aGUgZW5jYXBzdWxhdGVkIEV0aGVybmV0IHR5cGUuCiAJCSAqIFhYWCAtIHNob3VsZCB3ZSBnZW5lcmF0ZSBjb2RlIHRvIGNoZWNrIGZvciBTTkFQPwogCQkgKgotCQkgKiBYWFggLSB0aGUgaGVhZGVyIGlzIGFjdHVhbGx5IHZhcmlhYmxlLWxlbmd0aC4gIFdlCi0JCSAqIGFzc3VtZSBhIDI0LWJ5dGUgbGluay1sYXllciBoZWFkZXIsIGFzIGFwcGVhcnMgaW4KLQkJICogZGF0YSBmcmFtZXMgaW4gbmV0d29ya3Mgd2l0aCBubyBicmlkZ2VzLiAgSWYgdGhlCi0JCSAqIGZyb21kcyBhbmQgdG9kcyA4MDIuMTEgaGVhZGVyIGJpdHMgYXJlIGJvdGggc2V0LAotCQkgKiBpdCdzIGFjdHVhbGx5IHN1cHBvc2VkIHRvIGJlIDMwIGJ5dGVzLgorCQkgKiBXZSBhbHNvIGhhbmRsZSB2YXJpYWJsZS1sZW5ndGggcmFkaW8gaGVhZGVycyBoZXJlLgorCQkgKiBUaGUgUHJpc20gaGVhZGVyIGlzIGluIHRoZW9yeSB2YXJpYWJsZS1sZW5ndGgsIGJ1dCBpbgorCQkgKiBwcmFjdGljZSBpdCdzIGFsd2F5cyAxNDQgYnl0ZXMgbG9uZy4gIEhvd2V2ZXIsIHNvbWUKKwkJICogZHJpdmVycyBvbiBMaW51eCB1c2UgQVJQSFJEX0lFRUU4MDIxMV9QUklTTSwgYnV0CisJCSAqIHNvbWV0aW1lcyBvciBhbHdheXMgc3VwcGx5IGFuIEFWUyBoZWFkZXIsIHNvIHdlCisJCSAqIGhhdmUgdG8gY2hlY2sgd2hldGhlciB0aGUgcmFkaW8gaGVhZGVyIGlzIGEgUHJpc20KKwkJICogaGVhZGVyIG9yIGFuIEFWUyBoZWFkZXIsIHNvLCBpbiBwcmFjdGljZSwgaXQncworCQkgKiB2YXJpYWJsZS1sZW5ndGguCiAJCSAqLwogCQlvZmZfbGlua3R5cGUgPSAyNDsKLQkJb2ZmX25sID0gMzI7CQkvKiA4MDIuMTErODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gMjc7CS8qIDgwMi4xMSs4MDIuMiAqLworCQlvZmZfbWFjcGwgPSAwOwkJLyogbGluay1sYXllciBoZWFkZXIgaXMgdmFyaWFibGUtbGVuZ3RoICovCisJCW9mZl9tYWNwbF9pc192YXJpYWJsZSA9IDE7CisJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLwogCQlyZXR1cm47CiAKLQljYXNlIERMVF9QUklTTV9IRUFERVI6Ci0JCS8qCi0JCSAqIFNhbWUgYXMgODAyLjExLCBidXQgd2l0aCBhbiBhZGRpdGlvbmFsIGhlYWRlciBiZWZvcmUKLQkJICogdGhlIDgwMi4xMSBoZWFkZXIsIGNvbnRhaW5pbmcgYSBidW5jaCBvZiBhZGRpdGlvbmFsCi0JCSAqIGluZm9ybWF0aW9uIGluY2x1ZGluZyByYWRpby1sZXZlbCBpbmZvcm1hdGlvbi4KLQkJICoKLQkJICogVGhlIGhlYWRlciBpcyAxNDQgYnl0ZXMgbG9uZy4KLQkJICoKLQkJICogWFhYIC0gc2FtZSB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByb2JsZW07IGF0IGxlYXN0Ci0JCSAqIHRoZSBQcmlzbSBoZWFkZXIgaXMgZml4ZWQtbGVuZ3RoLgotCQkgKi8KLQkJb2ZmX2xsID0gMTQ0OwotCQlvZmZfbGlua3R5cGUgPSAyNDsKLQkJb2ZmX25sID0gMzI7CS8qIFByaXNtKzgwMi4xMSs4MDIuMitTTkFQICovCi0JCW9mZl9ubF9ub3NuYXAgPSAyNzsJLyogUHJpc20rODAyLjExKzgwMi4yICovCi0JCXJldHVybjsKLQotCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgotCQkvKgotCQkgKiBTYW1lIGFzIDgwMi4xMSwgYnV0IHdpdGggYW4gYWRkaXRpb25hbCBoZWFkZXIgYmVmb3JlCi0JCSAqIHRoZSA4MDIuMTEgaGVhZGVyLCBjb250YWluaW5nIGEgYnVuY2ggb2YgYWRkaXRpb25hbAotCQkgKiBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgcmFkaW8tbGV2ZWwgaW5mb3JtYXRpb24uCi0JCSAqCi0JCSAqIFRoZSBoZWFkZXIgaXMgNjQgYnl0ZXMgbG9uZywgYXQgbGVhc3QgaW4gaXRzCi0JCSAqIGN1cnJlbnQgaW5jYXJuYXRpb24uCi0JCSAqCi0JCSAqIFhYWCAtIHNhbWUgdmFyaWFibGUtbGVuZ3RoIGhlYWRlciBwcm9ibGVtLCBvbmx5Ci0JCSAqIG1vcmUgc287IHRoaXMgaGVhZGVyIGlzIGFsc28gdmFyaWFibGUtbGVuZ3RoLAotCQkgKiB3aXRoIHRoZSBsZW5ndGggYmVpbmcgdGhlIDMyLWJpdCBiaWctZW5kaWFuCi0JCSAqIG51bWJlciBhdCBhbiBvZmZzZXQgb2YgNCBmcm9tIHRoZSBiZWdpbm5pbmcKLQkJICogb2YgdGhlIHJhZGlvIGhlYWRlci4gIFdlIHNob3VsZCBoYW5kbGUgdGhhdCB0aGUKLQkJICogc2FtZSB3YXkgd2UgaGFuZGxlIHRoZSBsZW5ndGggYXQgdGhlIGJlZ2lubmluZwotCQkgKiBvZiB0aGUgcmFkaW90YXAgaGVhZGVyLgotCQkgKgotCQkgKiBYWFggLSBpbiBMaW51eCwgZG8gYW55IGRyaXZlcnMgdGhhdCBzdXBwbHkgYW4gQVZTCi0JCSAqIGhlYWRlciBzdXBwbHkgYSBsaW5rLWxheWVyIHR5cGUgb3RoZXIgdGhhbgotCQkgKiBBUlBIUkRfSUVFRTgwMjExX1BSSVNNPyAgSWYgc28sIHdlIHNob3VsZCBtYXAgdGhhdAotCQkgKiB0byBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM7IGlmIG5vdCwgb3IgaWYgdGhlcmUgYXJlCi0JCSAqIGFueSBkcml2ZXJzIHRoYXQgc3VwcGx5IGFuIEFWUyBoZWFkZXIgYnV0IHN1cHBseQotCQkgKiBhbiBBUlBIUkQgdmFsdWUgb2YgQVJQSFJEX0lFRUU4MDIxMV9QUklTTSwgd2UnbGwKLQkJICogaGF2ZSB0byBjaGVjayB0aGUgaGVhZGVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB0bwotCQkgKiBkZXRlcm1pbmUgd2hldGhlciBpdCdzIFByaXNtIG9yIEFWUy4KLQkJICovCi0JCW9mZl9sbCA9IDY0OwotCQlvZmZfbGlua3R5cGUgPSAyNDsKLQkJb2ZmX25sID0gMzI7CQkvKiBSYWRpbys4MDIuMTErODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gMjc7CS8qIFJhZGlvKzgwMi4xMSs4MDIuMiAqLwotCQlyZXR1cm47Ci0KLQkJCi0JCS8qIAotCQkgKiBBdCB0aGUgbW9tZW50IHdlIHRyZWF0IFBQSSBhcyBub3JtYWwgUmFkaW90YXAgZW5jb2RlZAotCQkgKiBwYWNrZXRzLiBUaGUgZGlmZmVyZW5jZSBpcyBpbiB0aGUgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMKLQkJICogdGhlIGNvZGUgYXQgdGhlIGJlZ2lubmluZyB0byBjb21wdXRlIHRoZSBoZWFkZXIgbGVuZ3RoLgotCQkgKiBTaW5jZSB0aGlzIGNvZGUgZ2VuZXJhdG9yIG9mIFBQSSBzdXBwb3J0cyBiYXJlIDgwMi4xMQotCQkgKiBlbmNhcHN1bGF0aW9uIG9ubHkgKGkuZS4gdGhlIGVuY2Fwc3VsYXRlZCBETFQgc2hvdWxkIGJlCi0JCSAqIERMVF9JRUVFODAyXzExKSB3ZSBnZW5lcmF0ZSBjb2RlIHRvIGNoZWNrIGZvciB0aGlzIHRvby4KLQkJICovCiAJY2FzZSBETFRfUFBJOgotCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86Ci0JCS8qCi0JCSAqIFNhbWUgYXMgODAyLjExLCBidXQgd2l0aCBhbiBhZGRpdGlvbmFsIGhlYWRlciBiZWZvcmUKLQkJICogdGhlIDgwMi4xMSBoZWFkZXIsIGNvbnRhaW5pbmcgYSBidW5jaCBvZiBhZGRpdGlvbmFsCi0JCSAqIGluZm9ybWF0aW9uIGluY2x1ZGluZyByYWRpby1sZXZlbCBpbmZvcm1hdGlvbi4KLQkJICoKLQkJICogVGhlIHJhZGlvdGFwIGhlYWRlciBpcyB2YXJpYWJsZSBsZW5ndGgsIGFuZCB3ZQotCQkgKiBnZW5lcmF0ZSBjb2RlIHRvIGNvbXB1dGUgaXRzIGxlbmd0aCBhbmQgc3RvcmUgaXQKLQkJICogaW4gYSByZWdpc3Rlci4gIFRoZXNlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZQotCQkgKiBiZWdpbm5pbmcgb2YgdGhlIDgwMi4xMSBoZWFkZXIuCisJCS8qIAorCQkgKiBBdCB0aGUgbW9tZW50IHdlIHRyZWF0IFBQSSB0aGUgc2FtZSB3YXkgdGhhdCB3ZSB0cmVhdAorCQkgKiBub3JtYWwgUmFkaW90YXAgZW5jb2RlZCBwYWNrZXRzLiBUaGUgZGlmZmVyZW5jZSBpcyBpbgorCQkgKiB0aGUgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIGNvZGUgYXQgdGhlIGJlZ2lubmluZworCQkgKiB0byBjb21wdXRlIHRoZSBoZWFkZXIgbGVuZ3RoLiAgU2luY2UgdGhpcyBjb2RlIGdlbmVyYXRvcgorCQkgKiBvZiBQUEkgc3VwcG9ydHMgYmFyZSA4MDIuMTEgZW5jYXBzdWxhdGlvbiBvbmx5IChpLmUuCisJCSAqIHRoZSBlbmNhcHN1bGF0ZWQgRExUIHNob3VsZCBiZSBETFRfSUVFRTgwMl8xMSkgd2UKKwkJICogZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgdGhpcyB0b28uCiAJCSAqLwogCQlvZmZfbGlua3R5cGUgPSAyNDsKLQkJb2ZmX25sID0gMzI7CQkvKiA4MDIuMTErODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gMjc7CS8qIDgwMi4xMSs4MDIuMiAqLworCQlvZmZfbWFjcGwgPSAwOwkJLyogbGluay1sYXllciBoZWFkZXIgaXMgdmFyaWFibGUtbGVuZ3RoICovCisJCW9mZl9tYWNwbF9pc192YXJpYWJsZSA9IDE7CisJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9BVE1fUkZDMTQ4MzoKQEAgLTEwNzAsNiArMTE1OCw3IEBACiAJCSAqIFBQUG97QSxFfSBhbmQgYSBQUFAgcHJvdG9jb2wgb2YgSVAgYW5kLi4uLgogCQkgKi8KIAkJb2ZmX2xpbmt0eXBlID0gMDsKKwkJb2ZmX21hY3BsID0gMDsJCS8qIHBhY2tldCBiZWdpbnMgd2l0aCBMTEMgaGVhZGVyICovCiAJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCiAJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLwogCQlyZXR1cm47CkBAIC0xMDgzLDIzICsxMTcyLDI4IEBACiAJCW9mZl92cGkgPSBTVU5BVE1fVlBJX1BPUzsKIAkJb2ZmX3ZjaSA9IFNVTkFUTV9WQ0lfUE9TOwogCQlvZmZfcHJvdG8gPSBQUk9UT19QT1M7Ci0JCW9mZl9tYWMgPSAtMTsJLyogTExDLWVuY2Fwc3VsYXRlZCwgc28gbm8gTUFDLWxheWVyIGhlYWRlciAqLworCQlvZmZfbWFjID0gLTE7CS8qIGFzc3VtZSBMTEMtZW5jYXBzdWxhdGVkLCBzbyBubyBNQUMtbGF5ZXIgaGVhZGVyICovCiAJCW9mZl9wYXlsb2FkID0gU1VOQVRNX1BLVF9CRUdJTl9QT1M7CiAJCW9mZl9saW5rdHlwZSA9IG9mZl9wYXlsb2FkOwotCQlvZmZfbmwgPSBvZmZfcGF5bG9hZCs4OwkJLyogODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gb2ZmX3BheWxvYWQrMzsJLyogODAyLjIgKi8KKwkJb2ZmX21hY3BsID0gb2ZmX3BheWxvYWQ7CS8qIGlmIExMQy1lbmNhcHN1bGF0ZWQgKi8KKwkJb2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KKwkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX1JBVzoKKwljYXNlIERMVF9JUFY0OgorCWNhc2UgRExUX0lQVjY6CiAJCW9mZl9saW5rdHlwZSA9IC0xOworCQlvZmZfbWFjcGwgPSAwOwogCQlvZmZfbmwgPSAwOwogCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0xJTlVYX1NMTDoJLyogZmFrZSBoZWFkZXIgZm9yIExpbnV4IGNvb2tlZCBzb2NrZXQgKi8KIAkJb2ZmX2xpbmt0eXBlID0gMTQ7Ci0JCW9mZl9ubCA9IDE2OwotCQlvZmZfbmxfbm9zbmFwID0gMTY7CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSAxNjsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9MVEFMSzoKQEAgLTExMDksNiArMTIwMyw3IEBACiAJCSAqICJsb25nIiBERFAgcGFja2V0IGZvbGxvd2luZy4KIAkJICovCiAJCW9mZl9saW5rdHlwZSA9IC0xOworCQlvZmZfbWFjcGwgPSAwOwogCQlvZmZfbmwgPSAwOwogCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKQEAgLTExMjUsOCArMTIyMCw5IEBACiAJCSAqIDI2MjUgc2F5cyBTTkFQIHNob3VsZCBiZSB1c2VkLgogCQkgKi8KIAkJb2ZmX2xpbmt0eXBlID0gMTY7Ci0JCW9mZl9ubCA9IDI0OwkJLyogSVBGQys4MDIuMitTTkFQICovCi0JCW9mZl9ubF9ub3NuYXAgPSAxOTsJLyogSVBGQys4MDIuMiAqLworCQlvZmZfbWFjcGwgPSAxNjsKKwkJb2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KKwkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0ZSRUxBWToKQEAgLTExMzUsNiArMTIzMSw3IEBACiAJCSAqIGZyYW1lcyAoTkxQSUQgb2YgMHg4MCkuCiAJCSAqLwogCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gMDsKIAkJb2ZmX25sID0gMDsKIAkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlyZXR1cm47CkBAIC0xMTQ2LDQ1ICsxMjQzLDMxIEBACiAgICAgICAgICAgICAgICAgICovCiAJY2FzZSBETFRfTUZSOgogCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gMDsKIAkJb2ZmX25sID0gNDsKIAkJb2ZmX25sX25vc25hcCA9IDA7CS8qIFhYWCAtIGZvciBub3cgLT4gbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQ6CiAJCW9mZl9saW5rdHlwZSA9IDE2OwotCQlvZmZfbmwgPSAxODsKLQkJb2ZmX25sX25vc25hcCA9IDE4OwkvKiBubyA4MDIuMiBMTEMgKi8KLQkJcmV0dXJuOwotCi0JY2FzZSBETFRfTElOVVhfSVJEQToKLQkJLyoKLQkJICogQ3VycmVudGx5LCBvbmx5IHJhdyAibGlua1tOOk1dIiBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkLgotCQkgKi8KLQkJb2ZmX2xpbmt0eXBlID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7Ci0JCXJldHVybjsKLQotCWNhc2UgRExUX0RPQ1NJUzoKLQkJLyoKLQkJICogQ3VycmVudGx5LCBvbmx5IHJhdyAibGlua1tOOk1dIiBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkLgotCQkgKi8KLQkJb2ZmX2xpbmt0eXBlID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCW9mZl9tYWNwbCA9IDE4OworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX1NZTUFOVEVDX0ZJUkVXQUxMOgogCQlvZmZfbGlua3R5cGUgPSA2OwotCQlvZmZfbmwgPSA0NDsJCS8qIEV0aGVybmV0IElJICovCi0JCW9mZl9ubF9ub3NuYXAgPSA0NDsJLyogWFhYIC0gd2hhdCBkb2VzIGl0IGRvIHdpdGggODAyLjMgcGFja2V0cz8gKi8KKwkJb2ZmX21hY3BsID0gNDQ7CisJCW9mZl9ubCA9IDA7CQkvKiBFdGhlcm5ldCBJSSAqLworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogWFhYIC0gd2hhdCBkb2VzIGl0IGRvIHdpdGggODAyLjMgcGFja2V0cz8gKi8KIAkJcmV0dXJuOwogCiAjaWZkZWYgSEFWRV9ORVRfUEZWQVJfSAogCWNhc2UgRExUX1BGTE9HOgogCQlvZmZfbGlua3R5cGUgPSAwOwotCQlvZmZfbmwgPSBQRkxPR19IRFJMRU47Ci0JCW9mZl9ubF9ub3NuYXAgPSBQRkxPR19IRFJMRU47CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSBQRkxPR19IRFJMRU47CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJcmV0dXJuOwogI2VuZGlmCiAKQEAgLTExOTUsMjYgKzEyNzgsMzAgQEAKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9DSERMQzoKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9GUkVMQVk6CiAgICAgICAgICAgICAgICAgb2ZmX2xpbmt0eXBlID0gNDsKLQkJb2ZmX25sID0gNDsKKwkJb2ZmX21hY3BsID0gNDsKKwkJb2ZmX25sID0gMDsKIAkJb2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KICAgICAgICAgICAgICAgICByZXR1cm47CiAKIAljYXNlIERMVF9KVU5JUEVSX0FUTTE6Ci0JCW9mZl9saW5rdHlwZSA9IDQ7IC8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA0LTggKi8KLQkJb2ZmX25sID0gNDsKLQkJb2ZmX25sX25vc25hcCA9IDE0OworCQlvZmZfbGlua3R5cGUgPSA0OwkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gNC04ICovCisJCW9mZl9tYWNwbCA9IDQ7CS8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA0LTggKi8KKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDEwOwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9KVU5JUEVSX0FUTTI6Ci0JCW9mZl9saW5rdHlwZSA9IDg7IC8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA4LTEyICovCi0JCW9mZl9ubCA9IDg7Ci0JCW9mZl9ubF9ub3NuYXAgPSAxODsKKwkJb2ZmX2xpbmt0eXBlID0gODsJLyogaW4gcmVhbGl0eSB2YXJpYWJsZSBiZXR3ZWVuIDgtMTIgKi8KKwkJb2ZmX21hY3BsID0gODsJLyogaW4gcmVhbGl0eSB2YXJpYWJsZSBiZXR3ZWVuIDgtMTIgKi8KKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDEwOwogCQlyZXR1cm47CiAKIAkJLyogZnJhbWVzIGNhcHR1cmVkIG9uIGEgSnVuaXBlciBQUFBvRSBzZXJ2aWNlIFBJQwogCQkgKiBjb250YWluIHJhdyBldGhlcm5ldCBmcmFtZXMgKi8KIAljYXNlIERMVF9KVU5JUEVSX1BQUE9FOgogICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0VUSEVSOgorICAgICAgICAJb2ZmX21hY3BsID0gMTQ7CiAJCW9mZl9saW5rdHlwZSA9IDE2OwogCQlvZmZfbmwgPSAxODsJCS8qIEV0aGVybmV0IElJICovCiAJCW9mZl9ubF9ub3NuYXAgPSAyMTsJLyogODAyLjMrODAyLjIgKi8KQEAgLTEyMjIsOTYgKzEzMDksMTcxIEBACiAKIAljYXNlIERMVF9KVU5JUEVSX1BQUE9FX0FUTToKIAkJb2ZmX2xpbmt0eXBlID0gNDsKLQkJb2ZmX25sID0gNjsKLQkJb2ZmX25sX25vc25hcCA9IC0xOwkgLyogbm8gODAyLjIgTExDICovCisJCW9mZl9tYWNwbCA9IDY7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0pVTklQRVJfR0dTTjoKIAkJb2ZmX2xpbmt0eXBlID0gNjsKLQkJb2ZmX25sID0gMTI7Ci0JCW9mZl9ubF9ub3NuYXAgPSAtMTsJIC8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjcGwgPSAxMjsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJcmV0dXJuOwogCiAJY2FzZSBETFRfSlVOSVBFUl9FUzoKIAkJb2ZmX2xpbmt0eXBlID0gNjsKLQkJb2ZmX25sID0gLTE7CQkvKiBub3QgcmVhbGx5IGEgbmV0d29yayBsYXllciBidXQgcmF3IElQIGFkcmVzc2VzICovCisJCW9mZl9tYWNwbCA9IC0xOwkJLyogbm90IHJlYWxseSBhIG5ldHdvcmsgbGF5ZXIgYnV0IHJhdyBJUCBhZGRyZXNzZXMgKi8KKwkJb2ZmX25sID0gLTE7CQkvKiBub3QgcmVhbGx5IGEgbmV0d29yayBsYXllciBidXQgcmF3IElQIGFkZHJlc3NlcyAqLwogCQlvZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlyZXR1cm47CiAKIAljYXNlIERMVF9KVU5JUEVSX01PTklUT1I6CiAJCW9mZl9saW5rdHlwZSA9IDEyOwotCQlvZmZfbmwgPSAxMjsJCS8qIHJhdyBJUC9JUDYgaGVhZGVyICovCisJCW9mZl9tYWNwbCA9IDEyOworCQlvZmZfbmwgPSAwOwkJLyogcmF3IElQL0lQNiBoZWFkZXIgKi8KIAkJb2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJcmV0dXJuOwogCisJY2FzZSBETFRfQkFDTkVUX01TX1RQOgorCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gLTE7CisJCW9mZl9ubCA9IC0xOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCXJldHVybjsKKwogCWNhc2UgRExUX0pVTklQRVJfU0VSVklDRVM6CiAJCW9mZl9saW5rdHlwZSA9IDEyOworCQlvZmZfbWFjcGwgPSAtMTsJCS8qIEwzIHByb3RvIGxvY2F0aW9uIGRlcC4gb24gY29va2llIHR5cGUgKi8KIAkJb2ZmX25sID0gLTE7CQkvKiBMMyBwcm90byBsb2NhdGlvbiBkZXAuIG9uIGNvb2tpZSB0eXBlICovCiAJCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCiAJCXJldHVybjsKIAogCWNhc2UgRExUX0pVTklQRVJfVlA6CiAJCW9mZl9saW5rdHlwZSA9IDE4OworCQlvZmZfbWFjcGwgPSAtMTsKKwkJb2ZmX25sID0gLTE7CisJCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJcmV0dXJuOworCisJY2FzZSBETFRfSlVOSVBFUl9TVDoKKwkJb2ZmX2xpbmt0eXBlID0gMTg7CisJCW9mZl9tYWNwbCA9IC0xOworCQlvZmZfbmwgPSAtMTsKKwkJb2ZmX25sX25vc25hcCA9IC0xOworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX0lTTToKKwkJb2ZmX2xpbmt0eXBlID0gODsKKwkJb2ZmX21hY3BsID0gLTE7CisJCW9mZl9ubCA9IC0xOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCXJldHVybjsKKworCWNhc2UgRExUX0pVTklQRVJfVlM6CisJY2FzZSBETFRfSlVOSVBFUl9TUlhfRTJFOgorCWNhc2UgRExUX0pVTklQRVJfRklCUkVDSEFOTkVMOgorCWNhc2UgRExUX0pVTklQRVJfQVRNX0NFTUlDOgorCQlvZmZfbGlua3R5cGUgPSA4OworCQlvZmZfbWFjcGwgPSAtMTsKIAkJb2ZmX25sID0gLTE7CiAJCW9mZl9ubF9ub3NuYXAgPSAtMTsKIAkJcmV0dXJuOwogCiAJY2FzZSBETFRfTVRQMjoKIAkJb2ZmX2xpID0gMjsKKwkJb2ZmX2xpX2hzbCA9IDQ7CiAJCW9mZl9zaW8gPSAzOwogCQlvZmZfb3BjID0gNDsKIAkJb2ZmX2RwYyA9IDQ7CiAJCW9mZl9zbHMgPSA3OwogCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gLTE7CiAJCW9mZl9ubCA9IC0xOwogCQlvZmZfbmxfbm9zbmFwID0gLTE7CiAJCXJldHVybjsKIAogCWNhc2UgRExUX01UUDJfV0lUSF9QSERSOgogCQlvZmZfbGkgPSA2OworCQlvZmZfbGlfaHNsID0gODsKIAkJb2ZmX3NpbyA9IDc7CiAJCW9mZl9vcGMgPSA4OwogCQlvZmZfZHBjID0gODsKIAkJb2ZmX3NscyA9IDExOwogCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gLTE7CiAJCW9mZl9ubCA9IC0xOwogCQlvZmZfbmxfbm9zbmFwID0gLTE7CiAJCXJldHVybjsKIAotI2lmZGVmIERMVF9QRlNZTkMKKwljYXNlIERMVF9FUkY6CisJCW9mZl9saSA9IDIyOworCQlvZmZfbGlfaHNsID0gMjQ7CisJCW9mZl9zaW8gPSAyMzsKKwkJb2ZmX29wYyA9IDI0OworCQlvZmZfZHBjID0gMjQ7CisJCW9mZl9zbHMgPSAyNzsKKwkJb2ZmX2xpbmt0eXBlID0gLTE7CisJCW9mZl9tYWNwbCA9IC0xOworCQlvZmZfbmwgPSAtMTsKKwkJb2ZmX25sX25vc25hcCA9IC0xOworCQlyZXR1cm47CisKIAljYXNlIERMVF9QRlNZTkM6CiAJCW9mZl9saW5rdHlwZSA9IC0xOwotCQlvZmZfbmwgPSA0OwotCQlvZmZfbmxfbm9zbmFwID0gNDsKKwkJb2ZmX21hY3BsID0gNDsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CiAJCXJldHVybjsKLSNlbmRpZgogCi0JY2FzZSBETFRfTElOVVhfTEFQRDoKKwljYXNlIERMVF9BWDI1X0tJU1M6CiAJCS8qCiAJCSAqIEN1cnJlbnRseSwgb25seSByYXcgImxpbmtbTjpNXSIgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZC4KIAkJICovCi0JCW9mZl9saW5rdHlwZSA9IC0xOwotCQlvZmZfbmwgPSAtMTsKKwkJb2ZmX2xpbmt0eXBlID0gLTE7CS8qIHZhcmlhYmxlLCBtaW4gMTUsIG1heCA3MSBzdGVwcyBvZiA3ICovCisJCW9mZl9tYWNwbCA9IC0xOworCQlvZmZfbmwgPSAtMTsJCS8qIHZhcmlhYmxlLCBtaW4gMTYsIG1heCA3MSBzdGVwcyBvZiA3ICovCisJCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisJCW9mZl9tYWMgPSAxOwkJLyogc3RlcCBvdmVyIHRoZSBraXNzIGxlbmd0aCBieXRlICovCisJCXJldHVybjsKKworCWNhc2UgRExUX0lQTkVUOgorCQlvZmZfbGlua3R5cGUgPSAxOworCQlvZmZfbWFjcGwgPSAyNDsJCS8qIGlwbmV0IGhlYWRlciBsZW5ndGggKi8KKwkJb2ZmX25sID0gMDsKIAkJb2ZmX25sX25vc25hcCA9IC0xOwogCQlyZXR1cm47CiAKLQljYXNlIERMVF9VU0I6Ci0JCS8qCi0JCSAqIEN1cnJlbnRseSwgb25seSByYXcgImxpbmtbTjpNXSIgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZC4KLQkJICovCi0JCW9mZl9saW5rdHlwZSA9IC0xOwotCQlvZmZfbmwgPSAtMTsKLQkJb2ZmX25sX25vc25hcCA9IC0xOworCWNhc2UgRExUX05FVEFOQUxZWkVSOgorCQlvZmZfbWFjID0gNDsJCS8qIE1BQyBoZWFkZXIgaXMgcGFzdCA0LWJ5dGUgcHNldWRvLWhlYWRlciAqLworCQlvZmZfbGlua3R5cGUgPSAxNjsJLyogaW5jbHVkZXMgNC1ieXRlIHBzZXVkby1oZWFkZXIgKi8KKwkJb2ZmX21hY3BsID0gMTg7CQkvKiBwc2V1ZG8taGVhZGVyK0V0aGVybmV0IGhlYWRlciBsZW5ndGggKi8KKwkJb2ZmX25sID0gMDsJCS8qIEV0aGVybmV0IElJICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLwogCQlyZXR1cm47CiAKLQljYXNlIERMVF9CTFVFVE9PVEhfSENJX0g0OgotCQkvKgotCQkgKiBDdXJyZW50bHksIG9ubHkgcmF3ICJsaW5rW046TV0iIGZpbHRlcmluZyBpcyBzdXBwb3J0ZWQuCi0JCSAqLwotCQlvZmZfbGlua3R5cGUgPSAtMTsKLQkJb2ZmX25sID0gLTE7Ci0JCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKKwkJb2ZmX21hYyA9IDEyOwkJLyogTUFDIGhlYWRlciBpcyBwYXN0IDQtYnl0ZSBwc2V1ZG8taGVhZGVyLCBwcmVhbWJsZSwgYW5kIFNGRCAqLworCQlvZmZfbGlua3R5cGUgPSAyNDsJLyogaW5jbHVkZXMgNC1ieXRlIHBzZXVkby1oZWFkZXIrcHJlYW1ibGUrU0ZEICovCisJCW9mZl9tYWNwbCA9IDI2OwkJLyogcHNldWRvLWhlYWRlcitwcmVhbWJsZStTRkQrRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAqLworCQlvZmZfbmwgPSAwOwkJLyogRXRoZXJuZXQgSUkgKi8KKwkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4zKzgwMi4yICovCiAJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIEZvciB2YWx1ZXMgaW4gdGhlIHJhbmdlIGluIHdoaWNoIHdlJ3ZlIGFzc2lnbmVkIG5ldworCQkgKiBETFRfIHZhbHVlcywgb25seSByYXcgImxpbmtbTjpNXSIgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZC4KKwkJICovCisJCWlmIChsaW5rdHlwZSA+PSBETFRfTUFUQ0hJTkdfTUlOICYmCisJCSAgICBsaW5rdHlwZSA8PSBETFRfTUFUQ0hJTkdfTUFYKSB7CisJCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJCW9mZl9tYWNwbCA9IC0xOworCQkJb2ZmX25sID0gLTE7CisJCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCQlyZXR1cm47CisJCX0KKwogCX0KIAlicGZfZXJyb3IoInVua25vd24gZGF0YSBsaW5rIHR5cGUgJWQiLCBsaW5rdHlwZSk7CiAJLyogTk9UUkVBQ0hFRCAqLwpAQCAtMTM2Miw2ICsxNTI0LDQ1IEBACiAJcmV0dXJuIHM7CiB9CiAKKy8qCisgKiBMb2FkIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgorZ2VuX2xvYWRfbWFjcGxyZWwob2Zmc2V0LCBzaXplKQorCXVfaW50IG9mZnNldCwgc2l6ZTsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMsICpzMjsKKworCXMgPSBnZW5fb2ZmX21hY3BsKCk7CisKKwkvKgorCSAqIElmIHMgaXMgbm9uLW51bGwsIHRoZSBvZmZzZXQgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkIGlzCisJICogdmFyaWFibGUsIGFuZCBzIHBvaW50cyB0byBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQKKwkgKiBhcnJhbmdlIHRoYXQgdGhlIFggcmVnaXN0ZXIgY29udGFpbnMgdGhhdCBvZmZzZXQuCisJICoKKwkgKiBPdGhlcndpc2UsIHRoZSBvZmZzZXQgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkIGlzIGNvbnN0YW50LAorCSAqIGFuZCBpcyBpbiBvZmZfbWFjcGwuCisJICovCisJaWYgKHMgIT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBpcyBpbiB0aGUgWAorCQkgKiByZWdpc3Rlci4gIERvIGFuIGluZGlyZWN0IGxvYWQsIHRvIHVzZSB0aGUgWCByZWdpc3RlcgorCQkgKiBhcyBhbiBvZmZzZXQuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOworCQlzMi0+cy5rID0gb2Zmc2V0OworCQlzYXBwZW5kKHMsIHMyKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBpcyBjb25zdGFudCwKKwkJICogYW5kIGlzIGluIG9mZl9tYWNwbDsgbG9hZCB0aGUgdmFsdWUgYXQgdGhhdCBvZmZzZXQKKwkJICogcGx1cyB0aGUgc3BlY2lmaWVkIG9mZnNldC4KKwkJICovCisJCXMgPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xzaXplKTsKKwkJcy0+cy5rID0gb2ZmX21hY3BsICsgb2Zmc2V0OworCX0KKwlyZXR1cm4gczsKK30KIAogLyoKICAqIExvYWQgYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyLgpAQCAtMTM4NCwxMiArMTU4NSwxNiBAQAogCQlzID0gZ2VuX2xvYWRfbGxyZWwob2Zmc2V0LCBzaXplKTsKIAkJYnJlYWs7CiAKKwljYXNlIE9SX01BQ1BMOgorCQlzID0gZ2VuX2xvYWRfbWFjcGxyZWwob2Zmc2V0LCBzaXplKTsKKwkJYnJlYWs7CisKIAljYXNlIE9SX05FVDoKLQkJcyA9IGdlbl9sb2FkX2xscmVsKG9mZl9ubCArIG9mZnNldCwgc2l6ZSk7CisJCXMgPSBnZW5fbG9hZF9tYWNwbHJlbChvZmZfbmwgKyBvZmZzZXQsIHNpemUpOwogCQlicmVhazsKIAogCWNhc2UgT1JfTkVUX05PU05BUDoKLQkJcyA9IGdlbl9sb2FkX2xscmVsKG9mZl9ubF9ub3NuYXAgKyBvZmZzZXQsIHNpemUpOworCQlzID0gZ2VuX2xvYWRfbWFjcGxyZWwob2ZmX25sX25vc25hcCArIG9mZnNldCwgc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBPUl9UUkFOX0lQVjQ6CkBAIC0xNDAyLDIxICsxNjA3LDIyIEBACiAJCXMgPSBnZW5fbG9hZHhfaXBoZHJsZW4oKTsKIAogCQkvKgotCQkgKiBMb2FkIHRoZSBpdGVtIGF0IHtvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyfSArCi0JCSAqIHtvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluay1sYXllcgotCQkgKiBoZWFkZXIsIG9mIHRoZSBJUHY0IGhlYWRlcn0gKyB7bGVuZ3RoIG9mIHRoZSBJUHY0IGhlYWRlcn0gKworCQkgKiBMb2FkIHRoZSBpdGVtIGF0IHtvZmZzZXQgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkfSArCisJCSAqIHtvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgTUFDLWxheWVyCisJCSAqIHBheWxvZCwgb2YgdGhlIElQdjQgaGVhZGVyfSArIHtsZW5ndGggb2YgdGhlIElQdjQgaGVhZGVyfSArCiAJCSAqIHtzcGVjaWZpZWQgb2Zmc2V0fS4KIAkJICoKLQkJICogKElmIHRoZSBsaW5rLWxheWVyIGlzIHZhcmlhYmxlLWxlbmd0aCwgaXQncyBpbmNsdWRlZAotCQkgKiBpbiB0aGUgdmFsdWUgaW4gdGhlIFggcmVnaXN0ZXIsIGFuZCBvZmZfbGwgaXMgMC4pCisJCSAqIChJZiB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBpcyB2YXJpYWJsZSwKKwkJICogaXQncyBpbmNsdWRlZCBpbiB0aGUgdmFsdWUgaW4gdGhlIFggcmVnaXN0ZXIsIGFuZAorCQkgKiBvZmZfbWFjcGwgaXMgMC4pCiAJCSAqLwogCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOwotCQlzMi0+cy5rID0gb2ZmX2xsICsgb2ZmX25sICsgb2Zmc2V0OworCQlzMi0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sICsgb2Zmc2V0OwogCQlzYXBwZW5kKHMsIHMyKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9SX1RSQU5fSVBWNjoKLQkJcyA9IGdlbl9sb2FkX2xscmVsKG9mZl9ubCArIDQwICsgb2Zmc2V0LCBzaXplKTsKKwkJcyA9IGdlbl9sb2FkX21hY3BscmVsKG9mZl9ubCArIDQwICsgb2Zmc2V0LCBzaXplKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTQzNiwxMiArMTY0MiwxNSBAQAogewogCXN0cnVjdCBzbGlzdCAqcywgKnMyOwogCi0JcyA9IGdlbl9sbHByZWZpeGxlbigpOworCXMgPSBnZW5fb2ZmX21hY3BsKCk7CiAJaWYgKHMgIT0gTlVMTCkgewogCQkvKgogCQkgKiBUaGVyZSdzIGEgdmFyaWFibGUtbGVuZ3RoIHByZWZpeCBwcmVjZWRpbmcgdGhlCi0JCSAqIGxpbmstbGF5ZXIgaGVhZGVyLiAgInMiIHBvaW50cyB0byBhIGxpc3Qgb2Ygc3RhdGVtZW50cwotCQkgKiB0aGF0IHB1dCB0aGUgbGVuZ3RoIG9mIHRoYXQgcHJlZml4IGludG8gdGhlIFggcmVnaXN0ZXIuCisJCSAqIGxpbmstbGF5ZXIgaGVhZGVyLCBvciB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgaXRzZWxmCisJCSAqIHZhcmlhYmxlLWxlbmd0aC4gICJzIiBwb2ludHMgdG8gYSBsaXN0IG9mIHN0YXRlbWVudHMKKwkJICogdGhhdCBwdXQgdGhlIG9mZnNldCBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQgaW50bworCQkgKiB0aGUgWCByZWdpc3Rlci4KKwkJICoKIAkJICogVGhlIDQqKFtrXSYweGYpIGFkZHJlc3NpbmcgbW9kZSBjYW4ndCBiZSB1c2VkLCBhcyB3ZQogCQkgKiBkb24ndCBoYXZlIGEgY29uc3RhbnQgb2Zmc2V0LCBzbyB3ZSBoYXZlIHRvIGxvYWQgdGhlCiAJCSAqIHZhbHVlIGluIHF1ZXN0aW9uIGludG8gdGhlIEEgcmVnaXN0ZXIgYW5kIGFkZCB0byBpdApAQCAtMTQ1OSwyMiArMTY2OCwyNCBAQAogCiAJCS8qCiAJCSAqIFRoZSBBIHJlZ2lzdGVyIG5vdyBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZQotCQkgKiBJUCBoZWFkZXIuICBXZSBuZWVkIHRvIGFkZCB0byBpdCB0aGUgbGVuZ3RoCi0JCSAqIG9mIHRoZSBwcmVmaXggcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyCi0JCSAqIGhlYWRlciwgd2hpY2ggaXMgc3RpbGwgaW4gdGhlIFggcmVnaXN0ZXIsIGFuZAotCQkgKiBtb3ZlIHRoZSByZXN1bHQgaW50byB0aGUgWCByZWdpc3Rlci4KKwkJICogSVAgaGVhZGVyLiAgV2UgbmVlZCB0byBhZGQgdG8gaXQgdGhlIG9mZnNldCBvZgorCQkgKiB0aGUgTUFDLWxheWVyIHBheWxvYWQsIHdoaWNoIGlzIHN0aWxsIGluIHRoZSBYCisJCSAqIHJlZ2lzdGVyLCBhbmQgbW92ZSB0aGUgcmVzdWx0IGludG8gdGhlIFggcmVnaXN0ZXIuCiAJCSAqLwogCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfWCkpOwogCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBUaGVyZSBpcyBubyB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUKLQkJICogbGluay1sYXllciBoZWFkZXI7IGFkZCBpbiBvZmZfbGwsIHdoaWNoLCBpZiB0aGVyZSdzCi0JCSAqIGEgZml4ZWQtbGVuZ3RoIGhlYWRlciBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLAotCQkgKiBpcyB0aGUgbGVuZ3RoIG9mIHRoYXQgaGVhZGVyLgorCQkgKiBsaW5rLWxheWVyIGhlYWRlciwgYW5kIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpcworCQkgKiBmaXhlZC1sZW5ndGg7IGxvYWQgdGhlIGxlbmd0aCBvZiB0aGUgSVB2NCBoZWFkZXIsCisJCSAqIHdoaWNoIGlzIGF0IGFuIG9mZnNldCBvZiBvZmZfbmwgZnJvbSB0aGUgYmVnaW5uaW5nCisJCSAqIG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCwgYW5kIHRodXMgYXQgYW4gb2Zmc2V0CisJCSAqIG9mIG9mZl9tYWNfcGwgKyBvZmZfbmwgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCQkgKiByYXcgcGFja2V0IGRhdGEuCiAJCSAqLwogCQlzID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfTVNIfEJQRl9CKTsKLQkJcy0+cy5rID0gb2ZmX2xsICsgb2ZmX25sOworCQlzLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmw7CiAJfQogCXJldHVybiBzOwogfQpAQCAtMTU0OCw3ICsxNzU5LDcgQEAKIAkJICovCiAJCWIwID0gZ2VuX2NtcF9ndChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCBFVEhFUk1UVSk7CiAJCWdlbl9ub3QoYjApOwotCQliMSA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlICsgMiwgQlBGX0gsIChicGZfaW50MzIpCisJCWIxID0gZ2VuX2NtcChPUl9NQUNQTCwgMCwgQlBGX0gsIChicGZfaW50MzIpCiAJCQkgICAgICgocHJvdG8gPDwgOCkgfCBwcm90bykpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKQEAgLTE1ODYsMTcgKzE3OTcsMTUgQEAKIAkJICogVGhpcyBnZW5lcmF0ZXMgY29kZSB0byBjaGVjayBib3RoIGZvciB0aGUKIAkJICogSVBYIExTQVAgKEV0aGVybmV0XzgwMi4yKSBhbmQgZm9yIEV0aGVybmV0XzgwMi4zLgogCQkgKi8KLQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSArIDIsIEJQRl9CLAotCQkgICAgKGJwZl9pbnQzMilMTENTQVBfSVBYKTsKLQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSArIDIsIEJQRl9ILAotCQkgICAgKGJwZl9pbnQzMikweEZGRkYpOworCQliMCA9IGdlbl9jbXAoT1JfTUFDUEwsIDAsIEJQRl9CLCAoYnBmX2ludDMyKUxMQ1NBUF9JUFgpOworCQliMSA9IGdlbl9jbXAoT1JfTUFDUEwsIDAsIEJQRl9ILCAoYnBmX2ludDMyKTB4RkZGRik7CiAJCWdlbl9vcihiMCwgYjEpOwogCiAJCS8qCiAJCSAqIE5vdyB3ZSBhZGQgY29kZSB0byBjaGVjayBmb3IgU05BUCBmcmFtZXMgd2l0aAogCQkgKiBFVEhFUlRZUEVfSVBYLCBpLmUuIEV0aGVybmV0X1NOQVAuCiAJCSAqLwotCQliMCA9IGdlbl9zbmFwKDB4MDAwMDAwLCBFVEhFUlRZUEVfSVBYLCAxNCk7CisJCWIwID0gZ2VuX3NuYXAoMHgwMDAwMDAsIEVUSEVSVFlQRV9JUFgpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAogCQkvKgpAQCAtMTY1MSw5ICsxODYwLDkgQEAKIAkJICogdHlwZSBvZiBFVEhFUlRZUEVfQUFSUCAoQXBwbGV0YWxrIEFSUCkuCiAJCSAqLwogCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0FUQUxLKQotCQkJYjEgPSBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLLCAxNCk7CisJCQliMSA9IGdlbl9zbmFwKDB4MDgwMDA3LCBFVEhFUlRZUEVfQVRBTEspOwogCQllbHNlCS8qIHByb3RvID09IEVUSEVSVFlQRV9BQVJQICovCi0JCQliMSA9IGdlbl9zbmFwKDB4MDAwMDAwLCBFVEhFUlRZUEVfQUFSUCwgMTQpOworCQkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0FBUlApOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAKIAkJLyoKQEAgLTE2OTksNiArMTkwOCwzMyBAQAogfQogCiAvKgorICogInByb3RvIiBpcyBhbiBFdGhlcm5ldCB0eXBlIHZhbHVlIGFuZCBmb3IgSVBORVQsIGlmIGl0IGlzIG5vdCBJUHY0CisgKiBvciBJUHY2IHRoZW4gd2UgaGF2ZSBhbiBlcnJvci4KKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5faXBuZXRfbGlua3R5cGUocHJvdG8pCisJcmVnaXN0ZXIgaW50IHByb3RvOworeworCXN3aXRjaCAocHJvdG8pIHsKKworCWNhc2UgRVRIRVJUWVBFX0lQOgorCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9CLAorCQkgICAgKGJwZl9pbnQzMilJUEhfQUZfSU5FVCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCXJldHVybiBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCisJCSAgICAoYnBmX2ludDMyKUlQSF9BRl9JTkVUNik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBnZW5fZmFsc2UoKTsKK30KKworLyoKICAqIEdlbmVyYXRlIGNvZGUgdG8gbWF0Y2ggYSBwYXJ0aWN1bGFyIHBhY2tldCB0eXBlLgogICoKICAqICJwcm90byIgaXMgYW4gRXRoZXJuZXQgdHlwZSB2YWx1ZSwgaWYgPiBFVEhFUk1UVSwgb3IgYW4gTExDIFNBUApAQCAtMTczMCw3ICsxOTY2LDcgQEAKIAkJICogKGkuZS4sIG90aGVyIFNBUCB2YWx1ZXMpPwogCQkgKi8KIAkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIExJTlVYX1NMTF9QXzgwMl8yKTsKLQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSArIDIsIEJQRl9ILCAoYnBmX2ludDMyKQorCQliMSA9IGdlbl9jbXAoT1JfTUFDUEwsIDAsIEJQRl9ILCAoYnBmX2ludDMyKQogCQkJICAgICAoKHByb3RvIDw8IDgpIHwgcHJvdG8pKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CkBAIC0xNzYxLDEwICsxOTk3LDggQEAKIAkJICogdGhlbiBwdXQgYSBjaGVjayBmb3IgTElOVVhfU0xMX1BfODAyXzIgZnJhbWVzCiAJCSAqIGJlZm9yZSBpdC4KIAkJICovCi0JCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUgKyAyLCBCUEZfQiwKLQkJICAgIChicGZfaW50MzIpTExDU0FQX0lQWCk7Ci0JCWIxID0gZ2VuX3NuYXAoMHgwMDAwMDAsIEVUSEVSVFlQRV9JUFgsCi0JCSAgICBvZmZfbGlua3R5cGUgKyAyKTsKKwkJYjAgPSBnZW5fY21wKE9SX01BQ1BMLCAwLCBCUEZfQiwgKGJwZl9pbnQzMilMTENTQVBfSVBYKTsKKwkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0lQWCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQliMCA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwgTElOVVhfU0xMX1BfODAyXzIpOwogCQlnZW5fYW5kKGIwLCBiMSk7CkBAIC0xODEyLDExICsyMDQ2LDkgQEAKIAkJICogdHlwZSBvZiBFVEhFUlRZUEVfQUFSUCAoQXBwbGV0YWxrIEFSUCkuCiAJCSAqLwogCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0FUQUxLKQotCQkJYjEgPSBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLLAotCQkJICAgIG9mZl9saW5rdHlwZSArIDIpOworCQkJYjEgPSBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKIAkJZWxzZQkvKiBwcm90byA9PSBFVEhFUlRZUEVfQUFSUCAqLwotCQkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0FBUlAsCi0JCQkgICAgb2ZmX2xpbmt0eXBlICsgMik7CisJCQliMSA9IGdlbl9zbmFwKDB4MDAwMDAwLCBFVEhFUlRZUEVfQUFSUCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAogCQkvKgpAQCAtMTg0MCw3ICsyMDcyLDcgQEAKIAkJCSAqLwogCQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsCiAJCQkgICAgTElOVVhfU0xMX1BfODAyXzIpOwotCQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSArIDIsIEJQRl9CLAorCQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9tYWNwbCwgQlBGX0IsCiAJCQkgICAgIChicGZfaW50MzIpcHJvdG8pOwogCQkJZ2VuX2FuZChiMCwgYjEpOwogCQkJcmV0dXJuIGIxOwpAQCAtMTg2MCwxOCArMjA5MiwxNjkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1pbnNlcnRfcmFkaW90YXBfbG9hZF9sbHByZWZpeGxlbihiKQotCXN0cnVjdCBibG9jayAqYjsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgorZ2VuX2xvYWRfcHJpc21fbGxwcmVmaXhsZW4oKQoreworCXN0cnVjdCBzbGlzdCAqczEsICpzMjsKKwlzdHJ1Y3Qgc2xpc3QgKnNqZXFfYXZzX2Nvb2tpZTsKKwlzdHJ1Y3Qgc2xpc3QgKnNqY29tbW9uOworCisJLyoKKwkgKiBUaGlzIGNvZGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW1pemVyLCBhcworCSAqIHdlIGFyZSBnZW5lcmF0aW5nIGptcCBpbnN0cnVjdGlvbnMgd2l0aGluIGEgbm9ybWFsCisJICogc2xpc3Qgb2YgaW5zdHJ1Y3Rpb25zCisJICovCisJbm9fb3B0aW1pemUgPSAxOworCisJLyoKKwkgKiBHZW5lcmF0ZSBjb2RlIHRvIGxvYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmFkaW8gaGVhZGVyIGludG8KKwkgKiB0aGUgcmVnaXN0ZXIgYXNzaWduZWQgdG8gaG9sZCB0aGF0IGxlbmd0aCwgaWYgb25lIGhhcyBiZWVuCisJICogYXNzaWduZWQuICAoSWYgb25lIGhhc24ndCBiZWVuIGFzc2lnbmVkLCBubyBjb2RlIHdlJ3ZlCisJICogZ2VuZXJhdGVkIHVzZXMgdGhhdCBwcmVmaXgsIHNvIHdlIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYW55CisJICogY29kZSB0byBsb2FkIGl0LikKKwkgKgorCSAqIFNvbWUgTGludXggZHJpdmVycyB1c2UgQVJQSFJEX0lFRUU4MDIxMV9QUklTTSBidXQgc29tZXRpbWVzCisJICogb3IgYWx3YXlzIHVzZSB0aGUgQVZTIGhlYWRlciByYXRoZXIgdGhhbiB0aGUgUHJpc20gaGVhZGVyLgorCSAqIFdlIGxvYWQgYSA0LWJ5dGUgYmlnLWVuZGlhbiB2YWx1ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAqIHJhdyBwYWNrZXQgZGF0YSwgYW5kIHNlZSB3aGV0aGVyLCB3aGVuIG1hc2tlZCB3aXRoIDB4RkZGRkYwMDAsCisJICogaXQncyBlcXVhbCB0byAweDgwMjExMDAwLiAgSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQncworCSAqIGFuIEFWUyBoZWFkZXIgKHRoZSBtYXNrZWQtb3V0IGJpdHMgYXJlIHRoZSB2ZXJzaW9uIG51bWJlcikuCisJICogT3RoZXJ3aXNlLCBpdCdzIGEgUHJpc20gaGVhZGVyLgorCSAqCisJICogWFhYIC0gdGhlIFByaXNtIGhlYWRlciBpcyBhbHNvLCBpbiB0aGVvcnksIHZhcmlhYmxlLWxlbmd0aCwKKwkgKiBidXQgbm8ga25vd24gc29mdHdhcmUgZ2VuZXJhdGVzIGhlYWRlcnMgdGhhdCBhcmVuJ3QgMTQ0CisJICogYnl0ZXMgbG9uZy4KKwkgKi8KKwlpZiAocmVnX29mZl9sbCAhPSAtMSkgeworCQkvKgorCQkgKiBMb2FkIHRoZSBjb29raWUuCisJCSAqLworCQlzMSA9IG5ld19zdG10KEJQRl9MRHxCUEZfV3xCUEZfQUJTKTsKKwkJczEtPnMuayA9IDA7CisKKwkJLyoKKwkJICogQU5EIGl0IHdpdGggMHhGRkZGRjAwMC4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQU5EfEJQRl9LKTsKKwkJczItPnMuayA9IDB4RkZGRkYwMDA7CisJCXNhcHBlbmQoczEsIHMyKTsKKworCQkvKgorCQkgKiBDb21wYXJlIHdpdGggMHg4MDIxMTAwMC4KKwkJICovCisJCXNqZXFfYXZzX2Nvb2tpZSA9IG5ld19zdG10KEpNUChCUEZfSkVRKSk7CisJCXNqZXFfYXZzX2Nvb2tpZS0+cy5rID0gMHg4MDIxMTAwMDsKKwkJc2FwcGVuZChzMSwgc2plcV9hdnNfY29va2llKTsKKworCQkvKgorCQkgKiBJZiBpdCdzIEFWUzoKKwkJICoKKwkJICogVGhlIDQgYnl0ZXMgYXQgYW4gb2Zmc2V0IG9mIDQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJCSAqIHRoZSBBVlMgaGVhZGVyIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSBBVlMgaGVhZGVyLgorCQkgKiBUaGF0IGZpZWxkIGlzIGJpZy1lbmRpYW4uCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfV3xCUEZfQUJTKTsKKwkJczItPnMuayA9IDQ7CisJCXNhcHBlbmQoczEsIHMyKTsKKwkJc2plcV9hdnNfY29va2llLT5zLmp0ID0gczI7CisKKwkJLyoKKwkJICogTm93IGp1bXAgdG8gdGhlIGNvZGUgdG8gYWxsb2NhdGUgYSByZWdpc3RlcgorCQkgKiBpbnRvIHdoaWNoIHRvIHNhdmUgdGhlIGhlYWRlciBsZW5ndGggYW5kCisJCSAqIHN0b3JlIHRoZSBsZW5ndGggdGhlcmUuICAoVGhlICJqdW1wIGFsd2F5cyIKKwkJICogaW5zdHJ1Y3Rpb24gbmVlZHMgdG8gaGF2ZSB0aGUgayBmaWVsZCBzZXQ7CisJCSAqIGl0J3MgYWRkZWQgdG8gdGhlIFBDLCBzbywgYXMgd2UncmUganVtcGluZworCQkgKiBvdmVyIGEgc2luZ2xlIGluc3RydWN0aW9uLCBpdCBzaG91bGQgYmUgMS4pCisJCSAqLworCQlzamNvbW1vbiA9IG5ld19zdG10KEpNUChCUEZfSkEpKTsKKwkJc2pjb21tb24tPnMuayA9IDE7CisJCXNhcHBlbmQoczEsIHNqY29tbW9uKTsKKworCQkvKgorCQkgKiBOb3cgZm9yIHRoZSBjb2RlIHRoYXQgaGFuZGxlcyB0aGUgUHJpc20gaGVhZGVyLgorCQkgKiBKdXN0IGxvYWQgdGhlIGxlbmd0aCBvZiB0aGUgUHJpc20gaGVhZGVyICgxNDQpCisJCSAqIGludG8gdGhlIEEgcmVnaXN0ZXIuICBIYXZlIHRoZSB0ZXN0IGZvciBhbiBBVlMKKwkJICogaGVhZGVyIGJyYW5jaCBoZXJlIGlmIHdlIGRvbid0IGhhdmUgYW4gQVZTIGhlYWRlci4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9XfEJQRl9JTU0pOworCQlzMi0+cy5rID0gMTQ0OworCQlzYXBwZW5kKHMxLCBzMik7CisJCXNqZXFfYXZzX2Nvb2tpZS0+cy5qZiA9IHMyOworCisJCS8qCisJCSAqIE5vdyBhbGxvY2F0ZSBhIHJlZ2lzdGVyIHRvIGhvbGQgdGhhdCB2YWx1ZSBhbmQgc3RvcmUKKwkJICogaXQuICBUaGUgY29kZSBmb3IgdGhlIEFWUyBoZWFkZXIgd2lsbCBqdW1wIGhlcmUgYWZ0ZXIKKwkJICogbG9hZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBBVlMgaGVhZGVyLgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfU1QpOworCQlzMi0+cy5rID0gcmVnX29mZl9sbDsKKwkJc2FwcGVuZChzMSwgczIpOworCQlzamNvbW1vbi0+cy5qZiA9IHMyOworCisJCS8qCisJCSAqIE5vdyBtb3ZlIGl0IGludG8gdGhlIFggcmVnaXN0ZXIuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpOworCQlzYXBwZW5kKHMxLCBzMik7CisKKwkJcmV0dXJuIChzMSk7CisJfSBlbHNlCisJCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgorZ2VuX2xvYWRfYXZzX2xscHJlZml4bGVuKCkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnMxLCAqczI7CiAKIAkvKgotCSAqIFByZXBlbmQgdG8gdGhlIHN0YXRlbWVudHMgaW4gdGhpcyBibG9jayBjb2RlIHRvIGxvYWQgdGhlCi0JICogbGVuZ3RoIG9mIHRoZSByYWRpb3RhcCBoZWFkZXIgaW50byB0aGUgcmVnaXN0ZXIgYXNzaWduZWQKLQkgKiB0byBob2xkIHRoYXQgbGVuZ3RoLCBpZiBvbmUgaGFzIGJlZW4gYXNzaWduZWQuCisJICogR2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBsZW5ndGggb2YgdGhlIEFWUyBoZWFkZXIgaW50bworCSAqIHRoZSByZWdpc3RlciBhc3NpZ25lZCB0byBob2xkIHRoYXQgbGVuZ3RoLCBpZiBvbmUgaGFzIGJlZW4KKwkgKiBhc3NpZ25lZC4gIChJZiBvbmUgaGFzbid0IGJlZW4gYXNzaWduZWQsIG5vIGNvZGUgd2UndmUKKwkgKiBnZW5lcmF0ZWQgdXNlcyB0aGF0IHByZWZpeCwgc28gd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhbnkKKwkgKiBjb2RlIHRvIGxvYWQgaXQuKQogCSAqLwotCWlmIChyZWdfbGxfc2l6ZSAhPSAtMSkgeworCWlmIChyZWdfb2ZmX2xsICE9IC0xKSB7CisJCS8qCisJCSAqIFRoZSA0IGJ5dGVzIGF0IGFuIG9mZnNldCBvZiA0IGZyb20gdGhlIGJlZ2lubmluZyBvZgorCQkgKiB0aGUgQVZTIGhlYWRlciBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgQVZTIGhlYWRlci4KKwkJICogVGhhdCBmaWVsZCBpcyBiaWctZW5kaWFuLgorCQkgKi8KKwkJczEgPSBuZXdfc3RtdChCUEZfTER8QlBGX1d8QlBGX0FCUyk7CisJCXMxLT5zLmsgPSA0OworCisJCS8qCisJCSAqIE5vdyBhbGxvY2F0ZSBhIHJlZ2lzdGVyIHRvIGhvbGQgdGhhdCB2YWx1ZSBhbmQgc3RvcmUKKwkJICogaXQuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9TVCk7CisJCXMyLT5zLmsgPSByZWdfb2ZmX2xsOworCQlzYXBwZW5kKHMxLCBzMik7CisKKwkJLyoKKwkJICogTm93IG1vdmUgaXQgaW50byB0aGUgWCByZWdpc3Rlci4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCXNhcHBlbmQoczEsIHMyKTsKKworCQlyZXR1cm4gKHMxKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fbG9hZF9yYWRpb3RhcF9sbHByZWZpeGxlbigpCit7CisJc3RydWN0IHNsaXN0ICpzMSwgKnMyOworCisJLyoKKwkgKiBHZW5lcmF0ZSBjb2RlIHRvIGxvYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmFkaW90YXAgaGVhZGVyIGludG8KKwkgKiB0aGUgcmVnaXN0ZXIgYXNzaWduZWQgdG8gaG9sZCB0aGF0IGxlbmd0aCwgaWYgb25lIGhhcyBiZWVuCisJICogYXNzaWduZWQuICAoSWYgb25lIGhhc24ndCBiZWVuIGFzc2lnbmVkLCBubyBjb2RlIHdlJ3ZlCisJICogZ2VuZXJhdGVkIHVzZXMgdGhhdCBwcmVmaXgsIHNvIHdlIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYW55CisJICogY29kZSB0byBsb2FkIGl0LikKKwkgKi8KKwlpZiAocmVnX29mZl9sbCAhPSAtMSkgewogCQkvKgogCQkgKiBUaGUgMiBieXRlcyBhdCBvZmZzZXRzIG9mIDIgYW5kIDMgZnJvbSB0aGUgYmVnaW5uaW5nCiAJCSAqIG9mIHRoZSByYWRpb3RhcCBoZWFkZXIgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHJhZGlvdGFwCkBAIC0xOTA2LDcgKzIyODksNyBAQAogCQkgKiBpdC4KIAkJICovCiAJCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKLQkJczItPnMuayA9IHJlZ19sbF9zaXplOworCQlzMi0+cy5rID0gcmVnX29mZl9sbDsKIAkJc2FwcGVuZChzMSwgczIpOwogCiAJCS8qCkBAIC0xOTE1LDEzICsyMjk4LDkgQEAKIAkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCi0JCS8qCi0JCSAqIE5vdyBhcHBlbmQgYWxsIHRoZSBleGlzdGluZyBzdGF0ZW1lbnRzIGluIHRoaXMKLQkJICogYmxvY2sgdG8gdGhlc2Ugc3RhdGVtZW50cy4KLQkJICovCi0JCXNhcHBlbmQoczEsIGItPnN0bXRzKTsKLQkJYi0+c3RtdHMgPSBzMTsKLQl9CisJCXJldHVybiAoczEpOworCX0gZWxzZQorCQlyZXR1cm4gKE5VTEwpOwogfQogCiAvKiAKQEAgLTE5MzAsMjEgKzIzMDksMjEgQEAKICAqIHRoZSBjb2RlIGF0IHRoZSBiZWdpbm5pbmcgdG8gY29tcHV0ZSB0aGUgaGVhZGVyIGxlbmd0aC4KICAqIFNpbmNlIHRoaXMgY29kZSBnZW5lcmF0b3Igb2YgUFBJIHN1cHBvcnRzIGJhcmUgODAyLjExCiAgKiBlbmNhcHN1bGF0aW9uIG9ubHkgKGkuZS4gdGhlIGVuY2Fwc3VsYXRlZCBETFQgc2hvdWxkIGJlCi0gKiBETFRfSUVFRTgwMl8xMSkgd2UgZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgdGhpcyB0b28uCisgKiBETFRfSUVFRTgwMl8xMSkgd2UgZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgdGhpcyB0b287CisgKiB0aGF0J3MgZG9uZSBpbiBmaW5pc2hfcGFyc2UoKS4KICAqLwotc3RhdGljIHZvaWQKLWluc2VydF9wcGlfbG9hZF9sbHByZWZpeGxlbihiKQotCXN0cnVjdCBibG9jayAqYjsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgorZ2VuX2xvYWRfcHBpX2xscHJlZml4bGVuKCkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnMxLCAqczI7CiAJCiAJLyoKLQkgKiBQcmVwZW5kIHRvIHRoZSBzdGF0ZW1lbnRzIGluIHRoaXMgYmxvY2sgY29kZSB0byBsb2FkIHRoZQotCSAqIGxlbmd0aCBvZiB0aGUgcmFkaW90YXAgaGVhZGVyIGludG8gdGhlIHJlZ2lzdGVyIGFzc2lnbmVkCi0JICogdG8gaG9sZCB0aGF0IGxlbmd0aCwgaWYgb25lIGhhcyBiZWVuIGFzc2lnbmVkLgorCSAqIEdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgbGVuZ3RoIG9mIHRoZSByYWRpb3RhcCBoZWFkZXIKKwkgKiBpbnRvIHRoZSByZWdpc3RlciBhc3NpZ25lZCB0byBob2xkIHRoYXQgbGVuZ3RoLCBpZiBvbmUgaGFzCisJICogYmVlbiBhc3NpZ25lZC4KIAkgKi8KLQlpZiAocmVnX2xsX3NpemUgIT0gLTEpIHsKLQkgICAgLyoKKwlpZiAocmVnX29mZl9sbCAhPSAtMSkgeworCQkvKgogCQkgKiBUaGUgMiBieXRlcyBhdCBvZmZzZXRzIG9mIDIgYW5kIDMgZnJvbSB0aGUgYmVnaW5uaW5nCiAJCSAqIG9mIHRoZSByYWRpb3RhcCBoZWFkZXIgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHJhZGlvdGFwCiAJCSAqIGhlYWRlcjsgdW5mb3J0dW5hdGVseSwgaXQncyBsaXR0bGUtZW5kaWFuLCBzbyB3ZSBoYXZlCkBAIC0xOTc4LDcgKzIzNTcsNyBAQAogCQkgKiBpdC4KIAkJICovCiAJCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKLQkJczItPnMuayA9IHJlZ19sbF9zaXplOworCQlzMi0+cy5rID0gcmVnX29mZl9sbDsKIAkJc2FwcGVuZChzMSwgczIpOwogCiAJCS8qCkBAIC0xOTg3LDE2ICsyMzY2LDI5NSBAQAogCQlzMiA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKLQkJLyoKLQkJICogTm93IGFwcGVuZCBhbGwgdGhlIGV4aXN0aW5nIHN0YXRlbWVudHMgaW4gdGhpcwotCQkgKiBibG9jayB0byB0aGVzZSBzdGF0ZW1lbnRzLgotCQkgKi8KLQkJc2FwcGVuZChzMSwgYi0+c3RtdHMpOwotCQliLT5zdG10cyA9IHMxOworCQlyZXR1cm4gKHMxKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChOVUxMKTsKK30KIAorLyoKKyAqIExvYWQgYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rLWxheWVyIGhlYWRlciBhZnRlciB0aGUgODAyLjExCisgKiBoZWFkZXIsIGkuZS4gTExDX1NOQVAuCisgKiBUaGUgbGluay1sYXllciBoZWFkZXIgZG9lc24ndCBuZWNlc3NhcmlseSBiZWdpbiBhdCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgcGFja2V0IGRhdGE7IHRoZXJlIG1pZ2h0IGJlIGEgdmFyaWFibGUtbGVuZ3RoIHByZWZpeCBjb250YWluaW5nCisgKiByYWRpbyBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fbG9hZF84MDJfMTFfaGVhZGVyX2xlbihzdHJ1Y3Qgc2xpc3QgKnMsIHN0cnVjdCBzbGlzdCAqc25leHQpCit7CisJc3RydWN0IHNsaXN0ICpzMjsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X2RhdGFfZnJhbWVfMTsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X2RhdGFfZnJhbWVfMjsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3FvczsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3JhZGlvdGFwX2ZsYWdzOworCXN0cnVjdCBzbGlzdCAqc2pzZXRfcmFkaW90YXBfdHNmdDsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3RzZnRfZGF0YXBhZCwgKnNqc2V0X25vdHNmdF9kYXRhcGFkOworCXN0cnVjdCBzbGlzdCAqc19yb3VuZHVwOworCisJaWYgKHJlZ19vZmZfbWFjcGwgPT0gLTEpIHsKKwkJLyoKKwkJICogTm8gcmVnaXN0ZXIgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIG9mZnNldCBvZgorCQkgKiB0aGUgTUFDLWxheWVyIHBheWxvYWQsIHdoaWNoIG1lYW5zIG5vYm9keSBuZWVkcworCQkgKiBpdDsgZG9uJ3QgYm90aGVyIGNvbXB1dGluZyBpdCAtIGp1c3QgcmV0dXJuCisJCSAqIHdoYXQgd2UgYWxyZWFkeSBoYXZlLgorCQkgKi8KKwkJcmV0dXJuIChzKTsKKwl9CisKKwkvKgorCSAqIFRoaXMgY29kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvcHRpbWl6ZXIsIGFzCisJICogd2UgYXJlIGdlbmVyYXRpbmcgam1wIGluc3RydWN0aW9ucyB3aXRoaW4gYSBub3JtYWwKKwkgKiBzbGlzdCBvZiBpbnN0cnVjdGlvbnMKKwkgKi8KKwlub19vcHRpbWl6ZSA9IDE7CisJCisJLyoKKwkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUgWCByZWdpc3RlcgorCSAqIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIKKwkgKiBoZWFkZXIuCisJICoKKwkgKiBPdGhlcndpc2UsIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIKKwkgKiBoZWFkZXIgaXMgIm9mZl9sbCIuCisJICovCisJaWYgKHMgPT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUKKwkJICogbGluay1sYXllciBoZWFkZXIuCisJCSAqCisJCSAqIExvYWQgdGhlIGxlbmd0aCBvZiB0aGUgZml4ZWQtbGVuZ3RoIHByZWZpeCBwcmVjZWRpbmcKKwkJICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyIChpZiBhbnkpIGludG8gdGhlIFggcmVnaXN0ZXIsCisJCSAqIGFuZCBzdG9yZSBpdCBpbiB0aGUgcmVnX29mZl9tYWNwbCByZWdpc3Rlci4KKwkJICogVGhhdCBsZW5ndGggaXMgb2ZmX2xsLgorCQkgKi8KKwkJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX0lNTSk7CisJCXMtPnMuayA9IG9mZl9sbDsKKwl9CisKKwkvKgorCSAqIFRoZSBYIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkgKiBsaW5rLWxheWVyIGhlYWRlcjsgYWRkIDI0LCB3aGljaCBpcyB0aGUgbWluaW11bSBsZW5ndGgKKwkgKiBvZiB0aGUgTUFDIGhlYWRlciBmb3IgYSBkYXRhIGZyYW1lLCB0byB0aGF0LCBhbmQgc3RvcmUgaXQKKwkgKiBpbiByZWdfb2ZmX21hY3BsLCBhbmQgdGhlbiBsb2FkIHRoZSBGcmFtZSBDb250cm9sIGZpZWxkLAorCSAqIHdoaWNoIGlzIGF0IHRoZSBvZmZzZXQgaW4gdGhlIFggcmVnaXN0ZXIsIHdpdGggYW4gaW5kZXhlZCBsb2FkLgorCSAqLworCXMyID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RYQSk7CisJc2FwcGVuZChzLCBzMik7CisJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0spOworCXMyLT5zLmsgPSAyNDsKKwlzYXBwZW5kKHMsIHMyKTsKKwlzMiA9IG5ld19zdG10KEJQRl9TVCk7CisJczItPnMuayA9IHJlZ19vZmZfbWFjcGw7CisJc2FwcGVuZChzLCBzMik7CisKKwlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKKwlzMi0+cy5rID0gMDsKKwlzYXBwZW5kKHMsIHMyKTsKKworCS8qCisJICogQ2hlY2sgdGhlIEZyYW1lIENvbnRyb2wgZmllbGQgdG8gc2VlIGlmIHRoaXMgaXMgYSBkYXRhIGZyYW1lOworCSAqIGEgZGF0YSBmcmFtZSBoYXMgdGhlIDB4MDggYml0IChiMykgaW4gdGhhdCBmaWVsZCBzZXQgYW5kIHRoZQorCSAqIDB4MDQgYml0IChiMikgY2xlYXIuCisJICovCisJc2pzZXRfZGF0YV9mcmFtZV8xID0gbmV3X3N0bXQoSk1QKEJQRl9KU0VUKSk7CisJc2pzZXRfZGF0YV9mcmFtZV8xLT5zLmsgPSAweDA4OworCXNhcHBlbmQocywgc2pzZXRfZGF0YV9mcmFtZV8xKTsKKwkJCisJLyoKKwkgKiBJZiBiMyBpcyBzZXQsIHRlc3QgYjIsIG90aGVyd2lzZSBnbyB0byB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mCisJICogdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uCisJICovCisJc2pzZXRfZGF0YV9mcmFtZV8xLT5zLmp0ID0gc2pzZXRfZGF0YV9mcmFtZV8yID0gbmV3X3N0bXQoSk1QKEJQRl9KU0VUKSk7CisJc2pzZXRfZGF0YV9mcmFtZV8yLT5zLmsgPSAweDA0OworCXNhcHBlbmQocywgc2pzZXRfZGF0YV9mcmFtZV8yKTsKKwlzanNldF9kYXRhX2ZyYW1lXzEtPnMuamYgPSBzbmV4dDsKKworCS8qCisJICogSWYgYjIgaXMgbm90IHNldCwgdGhpcyBpcyBhIGRhdGEgZnJhbWU7IHRlc3QgdGhlIFFvUyBiaXQuCisJICogT3RoZXJ3aXNlLCBnbyB0byB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIHRoZSByZXN0IG9mIHRoZQorCSAqIHByb2dyYW0uCisJICovCisJc2pzZXRfZGF0YV9mcmFtZV8yLT5zLmp0ID0gc25leHQ7CisJc2pzZXRfZGF0YV9mcmFtZV8yLT5zLmpmID0gc2pzZXRfcW9zID0gbmV3X3N0bXQoSk1QKEJQRl9KU0VUKSk7CisJc2pzZXRfcW9zLT5zLmsgPSAweDgwOwkvKiBRb1MgYml0ICovCisJc2FwcGVuZChzLCBzanNldF9xb3MpOworCQkKKwkvKgorCSAqIElmIGl0J3Mgc2V0LCBhZGQgMiB0byByZWdfb2ZmX21hY3BsLCB0byBza2lwIHRoZSBRb1MKKwkgKiBmaWVsZC4KKwkgKiBPdGhlcndpc2UsIGdvIHRvIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgdGhlIHJlc3Qgb2YgdGhlCisJICogcHJvZ3JhbS4KKwkgKi8KKwlzanNldF9xb3MtPnMuanQgPSBzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfTUVNKTsKKwlzMi0+cy5rID0gcmVnX29mZl9tYWNwbDsKKwlzYXBwZW5kKHMsIHMyKTsKKwlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSU1NKTsKKwlzMi0+cy5rID0gMjsKKwlzYXBwZW5kKHMsIHMyKTsKKwlzMiA9IG5ld19zdG10KEJQRl9TVCk7CisJczItPnMuayA9IHJlZ19vZmZfbWFjcGw7CisJc2FwcGVuZChzLCBzMik7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSByYWRpb3RhcCBoZWFkZXIsIGxvb2sgYXQgaXQgdG8gc2VlIHdoZXRoZXIKKwkgKiB0aGVyZSdzIEF0aGVyb3MgcGFkZGluZyBiZXR3ZWVuIHRoZSBNQUMtbGF5ZXIgaGVhZGVyCisJICogYW5kIHRoZSBwYXlsb2FkLgorCSAqCisJICogTm90ZTogYWxsIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHJhZGlvdGFwIGhlYWRlciBhcmUKKwkgKiBsaXR0bGUtZW5kaWFuLCBzbyB3ZSBieXRlLXN3YXAgYWxsIG9mIHRoZSB2YWx1ZXMKKwkgKiB3ZSB0ZXN0IGFnYWluc3QsIGFzIHRoZXkgd2lsbCBiZSBsb2FkZWQgYXMgYmlnLWVuZGlhbgorCSAqIHZhbHVlcy4KKwkgKi8KKwlpZiAobGlua3R5cGUgPT0gRExUX0lFRUU4MDJfMTFfUkFESU8pIHsKKwkJLyoKKwkJICogSXMgdGhlIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyBiaXQgKDB4MDAwMDAwMikgc2V0CisJCSAqIGluIHRoZSBwcmVzZW5jZSBmbGFnPworCQkgKi8KKwkJc2pzZXRfcW9zLT5zLmpmID0gczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xCUEZfVyk7CisJCXMyLT5zLmsgPSA0OworCQlzYXBwZW5kKHMsIHMyKTsKKworCQlzanNldF9yYWRpb3RhcF9mbGFncyA9IG5ld19zdG10KEpNUChCUEZfSlNFVCkpOworCQlzanNldF9yYWRpb3RhcF9mbGFncy0+cy5rID0gU1dBUExPTkcoMHgwMDAwMDAwMik7CisJCXNhcHBlbmQocywgc2pzZXRfcmFkaW90YXBfZmxhZ3MpOworCisJCS8qCisJCSAqIElmIG5vdCwgc2tpcCBhbGwgb2YgdGhpcy4KKwkJICovCisJCXNqc2V0X3JhZGlvdGFwX2ZsYWdzLT5zLmpmID0gc25leHQ7CisKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBpcyB0aGUgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgYml0IHNldD8KKwkJICovCisJCXNqc2V0X3JhZGlvdGFwX3RzZnQgPSBzanNldF9yYWRpb3RhcF9mbGFncy0+cy5qdCA9CisJCSAgICBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwkJc2pzZXRfcmFkaW90YXBfdHNmdC0+cy5rID0gU1dBUExPTkcoMHgwMDAwMDAwMSk7CisJCXNhcHBlbmQocywgc2pzZXRfcmFkaW90YXBfdHNmdCk7CisKKwkJLyoKKwkJICogSWYgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgaXMgc2V0LCB0aGUgZmxhZ3MgZmllbGQgaXMKKwkJICogYXQgYW4gb2Zmc2V0IG9mIDE2IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmF3IHBhY2tldAorCQkgKiBkYXRhICg4IGJ5dGVzIGZvciB0aGUgcmFkaW90YXAgaGVhZGVyIGFuZCA4IGJ5dGVzIGZvcgorCQkgKiB0aGUgVFNGVCBmaWVsZCkuCisJCSAqCisJCSAqIFRlc3Qgd2hldGhlciB0aGUgSUVFRTgwMjExX1JBRElPVEFQX0ZfREFUQVBBRCBiaXQgKDB4MjApCisJCSAqIGlzIHNldC4KKwkJICovCisJCXNqc2V0X3JhZGlvdGFwX3RzZnQtPnMuanQgPSBzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfEJQRl9CKTsKKwkJczItPnMuayA9IDE2OworCQlzYXBwZW5kKHMsIHMyKTsKKworCQlzanNldF90c2Z0X2RhdGFwYWQgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwkJc2pzZXRfdHNmdF9kYXRhcGFkLT5zLmsgPSAweDIwOworCQlzYXBwZW5kKHMsIHNqc2V0X3RzZnRfZGF0YXBhZCk7CisKKwkJLyoKKwkJICogSWYgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgaXMgbm90IHNldCwgdGhlIGZsYWdzIGZpZWxkIGlzCisJCSAqIGF0IGFuIG9mZnNldCBvZiA4IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmF3IHBhY2tldAorCQkgKiBkYXRhICg4IGJ5dGVzIGZvciB0aGUgcmFkaW90YXAgaGVhZGVyKS4KKwkJICoKKwkJICogVGVzdCB3aGV0aGVyIHRoZSBJRUVFODAyMTFfUkFESU9UQVBfRl9EQVRBUEFEIGJpdCAoMHgyMCkKKwkJICogaXMgc2V0LgorCQkgKi8KKwkJc2pzZXRfcmFkaW90YXBfdHNmdC0+cy5qZiA9IHMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8QlBGX0IpOworCQlzMi0+cy5rID0gODsKKwkJc2FwcGVuZChzLCBzMik7CisKKwkJc2pzZXRfbm90c2Z0X2RhdGFwYWQgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwkJc2pzZXRfbm90c2Z0X2RhdGFwYWQtPnMuayA9IDB4MjA7CisJCXNhcHBlbmQocywgc2pzZXRfbm90c2Z0X2RhdGFwYWQpOworCisJCS8qCisJCSAqIEluIGVpdGhlciBjYXNlLCBpZiBJRUVFODAyMTFfUkFESU9UQVBfRl9EQVRBUEFEIGlzCisJCSAqIHNldCwgcm91bmQgdGhlIGxlbmd0aCBvZiB0aGUgODAyLjExIGhlYWRlciB0bworCQkgKiBhIG11bHRpcGxlIG9mIDQuICBEbyB0aGF0IGJ5IGFkZGluZyAzIGFuZCB0aGVuCisJCSAqIGRpdmlkaW5nIGJ5IGFuZCBtdWx0aXBseWluZyBieSA0LCB3aGljaCB3ZSBkbyBieQorCQkgKiBBTkRpbmcgd2l0aCB+My4KKwkJICovCisJCXNfcm91bmR1cCA9IG5ld19zdG10KEJQRl9MRHxCUEZfTUVNKTsKKwkJc19yb3VuZHVwLT5zLmsgPSByZWdfb2ZmX21hY3BsOworCQlzYXBwZW5kKHMsIHNfcm91bmR1cCk7CisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9JTU0pOworCQlzMi0+cy5rID0gMzsKKwkJc2FwcGVuZChzLCBzMik7CisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQU5EfEJQRl9JTU0pOworCQlzMi0+cy5rID0gfjM7CisJCXNhcHBlbmQocywgczIpOworCQlzMiA9IG5ld19zdG10KEJQRl9TVCk7CisJCXMyLT5zLmsgPSByZWdfb2ZmX21hY3BsOworCQlzYXBwZW5kKHMsIHMyKTsKKworCQlzanNldF90c2Z0X2RhdGFwYWQtPnMuanQgPSBzX3JvdW5kdXA7CisJCXNqc2V0X3RzZnRfZGF0YXBhZC0+cy5qZiA9IHNuZXh0OworCQlzanNldF9ub3RzZnRfZGF0YXBhZC0+cy5qdCA9IHNfcm91bmR1cDsKKwkJc2pzZXRfbm90c2Z0X2RhdGFwYWQtPnMuamYgPSBzbmV4dDsKKwl9IGVsc2UKKwkJc2pzZXRfcW9zLT5zLmpmID0gc25leHQ7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQKK2luc2VydF9jb21wdXRlX3Zsb2Zmc2V0cyhiKQorCXN0cnVjdCBibG9jayAqYjsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwkvKgorCSAqIEZvciBsaW5rLWxheWVyIHR5cGVzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIKKwkgKiBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLCBnZW5lcmF0ZSBjb2RlIHRvIGxvYWQKKwkgKiB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpbnRvIHRoZSByZWdpc3RlcgorCSAqIGFzc2lnbmVkIHRvIHRoYXQgb2Zmc2V0LCBpZiBhbnkuCisJICovCisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCQlzID0gZ2VuX2xvYWRfcHJpc21fbGxwcmVmaXhsZW4oKTsKKwkJYnJlYWs7CisKKwljYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKKwkJcyA9IGdlbl9sb2FkX2F2c19sbHByZWZpeGxlbigpOworCQlicmVhazsKKworCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCXMgPSBnZW5fbG9hZF9yYWRpb3RhcF9sbHByZWZpeGxlbigpOworCQlicmVhazsKKworCWNhc2UgRExUX1BQSToKKwkJcyA9IGdlbl9sb2FkX3BwaV9sbHByZWZpeGxlbigpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXMgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIEZvciBsaW5rLWxheWVyIHR5cGVzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlLWxlbmd0aCBsaW5rLWxheWVyCisJICogaGVhZGVyLCBnZW5lcmF0ZSBjb2RlIHRvIGxvYWQgdGhlIG9mZnNldCBvZiB0aGUgTUFDLWxheWVyCisJICogcGF5bG9hZCBpbnRvIHRoZSByZWdpc3RlciBhc3NpZ25lZCB0byB0aGF0IG9mZnNldCwgaWYgYW55LgorCSAqLworCXN3aXRjaCAobGlua3R5cGUpIHsKKworCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJY2FzZSBETFRfUFBJOgorCQlzID0gZ2VuX2xvYWRfODAyXzExX2hlYWRlcl9sZW4ocywgYi0+c3RtdHMpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYW55IG9mZnNldC1sb2FkaW5nIGNvZGUsIGFwcGVuZCBhbGwgdGhlCisJICogZXhpc3Rpbmcgc3RhdGVtZW50cyBpbiB0aGUgYmxvY2sgdG8gdGhvc2Ugc3RhdGVtZW50cywKKwkgKiBhbmQgbWFrZSB0aGUgcmVzdWx0aW5nIGxpc3QgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50cworCSAqIGZvciB0aGUgYmxvY2suCisJICovCisJaWYgKHMgIT0gTlVMTCkgeworCQlzYXBwZW5kKHMsIGItPnN0bXRzKTsKKwkJYi0+c3RtdHMgPSBzOwogCX0KIH0KLQkKKwogc3RhdGljIHN0cnVjdCBibG9jayAqCiBnZW5fcHBpX2RsdF9jaGVjayh2b2lkKQogewpAQCAtMjAyMyw0MiArMjY4MSw2MSBAQAogCXJldHVybiBiOwogfQogCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2xvYWRfbGxwcmVmaXhsZW4oYikKLQlzdHJ1Y3QgYmxvY2sgKmI7CitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9wcmlzbV9sbHByZWZpeGxlbih2b2lkKQogewotCXN3aXRjaCAobGlua3R5cGUpIHsKKwlzdHJ1Y3Qgc2xpc3QgKnM7CiAKLQkvKiAKLQkgKiBBdCB0aGUgbW9tZW50IHdlIHRyZWF0IFBQSSBhcyBub3JtYWwgUmFkaW90YXAgZW5jb2RlZAotCSAqIHBhY2tldHMuIFRoZSBkaWZmZXJlbmNlIGlzIGluIHRoZSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcwotCSAqIHRoZSBjb2RlIGF0IHRoZSBiZWdpbm5pbmcgdG8gY29tcHV0ZSB0aGUgaGVhZGVyIGxlbmd0aC4KLQkgKiBTaW5jZSB0aGlzIGNvZGUgZ2VuZXJhdG9yIG9mIFBQSSBzdXBwb3J0cyBiYXJlIDgwMi4xMQotCSAqIGVuY2Fwc3VsYXRpb24gb25seSAoaS5lLiB0aGUgZW5jYXBzdWxhdGVkIERMVCBzaG91bGQgYmUKLQkgKiBETFRfSUVFRTgwMl8xMSkgd2UgZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgdGhpcyB0b28uCi0JICovCi0JY2FzZSBETFRfUFBJOgotCQlpbnNlcnRfcHBpX2xvYWRfbGxwcmVmaXhsZW4oYik7Ci0JCWJyZWFrOwotCi0JY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKLQkJaW5zZXJ0X3JhZGlvdGFwX2xvYWRfbGxwcmVmaXhsZW4oYik7Ci0JCWJyZWFrOworCWlmIChyZWdfb2ZmX2xsID09IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhdmVuJ3QgeWV0IGFzc2lnbmVkIGEgcmVnaXN0ZXIgZm9yIHRoZSBsZW5ndGgKKwkJICogb2YgdGhlIHJhZGlvIGhlYWRlcjsgYWxsb2NhdGUgb25lLgorCQkgKi8KKwkJcmVnX29mZl9sbCA9IGFsbG9jX3JlZygpOwogCX0KKworCS8qCisJICogTG9hZCB0aGUgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgcmFkaW8gbGVuZ3RoCisJICogaW50byB0aGUgWCByZWdpc3Rlci4KKwkgKi8KKwlzID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfTUVNKTsKKwlzLT5zLmsgPSByZWdfb2ZmX2xsOworCXJldHVybiBzOwogfQogCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9hdnNfbGxwcmVmaXhsZW4odm9pZCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlpZiAocmVnX29mZl9sbCA9PSAtMSkgeworCQkvKgorCQkgKiBXZSBoYXZlbid0IHlldCBhc3NpZ25lZCBhIHJlZ2lzdGVyIGZvciB0aGUgbGVuZ3RoCisJCSAqIG9mIHRoZSBBVlMgaGVhZGVyOyBhbGxvY2F0ZSBvbmUuCisJCSAqLworCQlyZWdfb2ZmX2xsID0gYWxsb2NfcmVnKCk7CisJfQorCisJLyoKKwkgKiBMb2FkIHRoZSByZWdpc3RlciBjb250YWluaW5nIHRoZSBBVlMgbGVuZ3RoCisJICogaW50byB0aGUgWCByZWdpc3Rlci4KKwkgKi8KKwlzID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfTUVNKTsKKwlzLT5zLmsgPSByZWdfb2ZmX2xsOworCXJldHVybiBzOworfQogCiBzdGF0aWMgc3RydWN0IHNsaXN0ICoKIGdlbl9yYWRpb3RhcF9sbHByZWZpeGxlbih2b2lkKQogewogCXN0cnVjdCBzbGlzdCAqczsKIAotCWlmIChyZWdfbGxfc2l6ZSA9PSAtMSkgeworCWlmIChyZWdfb2ZmX2xsID09IC0xKSB7CiAJCS8qCiAJCSAqIFdlIGhhdmVuJ3QgeWV0IGFzc2lnbmVkIGEgcmVnaXN0ZXIgZm9yIHRoZSBsZW5ndGgKIAkJICogb2YgdGhlIHJhZGlvdGFwIGhlYWRlcjsgYWxsb2NhdGUgb25lLgogCQkgKi8KLQkJcmVnX2xsX3NpemUgPSBhbGxvY19yZWcoKTsKKwkJcmVnX29mZl9sbCA9IGFsbG9jX3JlZygpOwogCX0KIAogCS8qCkBAIC0yMDY2LDcgKzI3NDMsNyBAQAogCSAqIGludG8gdGhlIFggcmVnaXN0ZXIuCiAJICovCiAJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7Ci0Jcy0+cy5rID0gcmVnX2xsX3NpemU7CisJcy0+cy5rID0gcmVnX29mZl9sbDsKIAlyZXR1cm4gczsKIH0KIApAQCAtMjA4MywyNSArMjc2MCwyMyBAQAogewogCXN0cnVjdCBzbGlzdCAqczsKIAotCWlmIChyZWdfbGxfc2l6ZSA9PSAtMSkgeworCWlmIChyZWdfb2ZmX2xsID09IC0xKSB7CiAJCS8qCiAJCSAqIFdlIGhhdmVuJ3QgeWV0IGFzc2lnbmVkIGEgcmVnaXN0ZXIgZm9yIHRoZSBsZW5ndGgKIAkJICogb2YgdGhlIHJhZGlvdGFwIGhlYWRlcjsgYWxsb2NhdGUgb25lLgogCQkgKi8KLQkJcmVnX2xsX3NpemUgPSBhbGxvY19yZWcoKTsKKwkJcmVnX29mZl9sbCA9IGFsbG9jX3JlZygpOwogCX0KIAogCS8qCi0JICogTG9hZCB0aGUgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgcmFkaW90YXAgbGVuZ3RoCisJICogTG9hZCB0aGUgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgUFBJIGxlbmd0aAogCSAqIGludG8gdGhlIFggcmVnaXN0ZXIuCiAJICovCiAJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7Ci0Jcy0+cy5rID0gcmVnX2xsX3NpemU7CisJcy0+cy5rID0gcmVnX29mZl9sbDsKIAlyZXR1cm4gczsKIH0KIAotCi0KIC8qCiAgKiBHZW5lcmF0ZSBjb2RlIHRvIGNvbXB1dGUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGxlbmd0aCwgaWYgbmVjZXNzYXJ5LAogICogcHV0dGluZyBpdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLCBhbmQgdG8gcmV0dXJuIGVpdGhlciBhIHBvaW50ZXIgdG8gYQpAQCAtMjExMywxOSArMjc4OCwxMDggQEAKIHsKIAlzd2l0Y2ggKGxpbmt0eXBlKSB7CiAKLQljYXNlIERMVF9QUEk6Ci0JCXJldHVybiBnZW5fcHBpX2xscHJlZml4bGVuKCk7CisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCQlyZXR1cm4gZ2VuX3ByaXNtX2xscHJlZml4bGVuKCk7CiAKLQkKKwljYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKKwkJcmV0dXJuIGdlbl9hdnNfbGxwcmVmaXhsZW4oKTsKKwogCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CiAJCXJldHVybiBnZW5fcmFkaW90YXBfbGxwcmVmaXhsZW4oKTsKIAorCWNhc2UgRExUX1BQSToKKwkJcmV0dXJuIGdlbl9wcGlfbGxwcmVmaXhsZW4oKTsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwogCX0KIH0KIAogLyoKKyAqIEdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgb2Zmc2V0IG9mIHRoZQorICogTUFDLWxheWVyIHBheWxvYWQgaW50byB0aGUgWCByZWdpc3RlcjsgaWYgbm8gcmVnaXN0ZXIgZm9yIHRoYXQgb2Zmc2V0CisgKiBoYXMgYmVlbiBhbGxvY2F0ZWQsIGFsbG9jYXRlIGl0IGZpcnN0LgorICovCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9vZmZfbWFjcGwodm9pZCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlpZiAob2ZmX21hY3BsX2lzX3ZhcmlhYmxlKSB7CisJCWlmIChyZWdfb2ZmX21hY3BsID09IC0xKSB7CisJCQkvKgorCQkJICogV2UgaGF2ZW4ndCB5ZXQgYXNzaWduZWQgYSByZWdpc3RlciBmb3IgdGhlIG9mZnNldAorCQkJICogb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkOyBhbGxvY2F0ZSBvbmUuCisJCQkgKi8KKwkJCXJlZ19vZmZfbWFjcGwgPSBhbGxvY19yZWcoKTsKKwkJfQorCisJCS8qCisJCSAqIExvYWQgdGhlIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIG9mZnNldCBvZiB0aGUgTUFDLWxheWVyCisJCSAqIHBheWxvYWQgaW50byB0aGUgWCByZWdpc3Rlci4KKwkJICovCisJCXMgPSBuZXdfc3RtdChCUEZfTERYfEJQRl9NRU0pOworCQlzLT5zLmsgPSByZWdfb2ZmX21hY3BsOworCQlyZXR1cm4gczsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGF0IG9mZnNldCBpc24ndCB2YXJpYWJsZSwgc28gd2UgZG9uJ3QgbmVlZCB0bworCQkgKiBnZW5lcmF0ZSBhbnkgY29kZS4KKwkJICovCisJCXJldHVybiBOVUxMOworCX0KK30KKworLyoKKyAqIE1hcCBhbiBFdGhlcm5ldCB0eXBlIHRvIHRoZSBlcXVpdmFsZW50IFBQUCB0eXBlLgorICovCitzdGF0aWMgaW50CitldGhlcnR5cGVfdG9fcHBwdHlwZShwcm90bykKKwlpbnQgcHJvdG87Cit7CisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBFVEhFUlRZUEVfSVA6CisJCXByb3RvID0gUFBQX0lQOworCQlicmVhazsKKworCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCXByb3RvID0gUFBQX0lQVjY7CisJCWJyZWFrOworCisJY2FzZSBFVEhFUlRZUEVfRE46CisJCXByb3RvID0gUFBQX0RFQ05FVDsKKwkJYnJlYWs7CisKKwljYXNlIEVUSEVSVFlQRV9BVEFMSzoKKwkJcHJvdG8gPSBQUFBfQVBQTEU7CisJCWJyZWFrOworCisJY2FzZSBFVEhFUlRZUEVfTlM6CisJCXByb3RvID0gUFBQX05TOworCQlicmVhazsKKworCWNhc2UgTExDU0FQX0lTT05TOgorCQlwcm90byA9IFBQUF9PU0k7CisJCWJyZWFrOworCisJY2FzZSBMTENTQVBfODAyMUQ6CisJCS8qCisJCSAqIEknbSBhc3N1bWluZyB0aGUgIkJyaWRnaW5nIFBEVSJzIHRoYXQgZ28KKwkJICogb3ZlciBQUFAgYXJlIFNwYW5uaW5nIFRyZWUgUHJvdG9jb2wKKwkJICogQnJpZGdpbmcgUERVcy4KKwkJICovCisJCXByb3RvID0gUFBQX0JSUERVOworCQlicmVhazsKKworCWNhc2UgTExDU0FQX0lQWDoKKwkJcHJvdG8gPSBQUFBfSVBYOworCQlicmVhazsKKwl9CisJcmV0dXJuIChwcm90byk7Cit9CisKKy8qCiAgKiBHZW5lcmF0ZSBjb2RlIHRvIG1hdGNoIGEgcGFydGljdWxhciBwYWNrZXQgdHlwZSBieSBtYXRjaGluZyB0aGUKICAqIGxpbmstbGF5ZXIgdHlwZSBmaWVsZCBvciBmaWVsZHMgaW4gdGhlIDgwMi4yIExMQyBoZWFkZXIuCiAgKgpAQCAtMjE0MywxMiArMjkwNywxMiBAQAogCQlzd2l0Y2ggKHByb3RvKSB7CiAJCWNhc2UgRVRIRVJUWVBFX0lQOgogCQljYXNlIFBQUF9JUDoKLQkJLyogRklYTUUgYWRkIG90aGVyIEwzIHByb3RvIElEcyAqLworCQkJLyogRklYTUUgYWRkIG90aGVyIEwzIHByb3RvIElEcyAqLwogCQkJcmV0dXJuIGdlbl9tcGxzX2xpbmt0eXBlKFFfSVApOyAKIAogCQljYXNlIEVUSEVSVFlQRV9JUFY2OgogCQljYXNlIFBQUF9JUFY2OgotCQkvKiBGSVhNRSBhZGQgb3RoZXIgTDMgcHJvdG8gSURzICovCisJCQkvKiBGSVhNRSBhZGQgb3RoZXIgTDMgcHJvdG8gSURzICovCiAJCQlyZXR1cm4gZ2VuX21wbHNfbGlua3R5cGUoUV9JUFY2KTsgCiAKIAkJZGVmYXVsdDoKQEAgLTIxNTcsOSArMjkyMSwzMCBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBBcmUgd2UgdGVzdGluZyBQUFBvRSBwYWNrZXRzPworCSAqLworCWlmIChpc19wcHBvZXMpIHsKKwkJLyoKKwkJICogVGhlIFBQUG9FIHNlc3Npb24gaGVhZGVyIGlzIHBhcnQgb2YgdGhlCisJCSAqIE1BQy1sYXllciBwYXlsb2FkLCBzbyBhbGwgcmVmZXJlbmNlcworCQkgKiBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgorCQkgKiB0aGF0IHBheWxvYWQuCisJCSAqLworCisJCS8qCisJCSAqIFdlIHVzZSBFdGhlcm5ldCBwcm90b2NvbCB0eXBlcyBpbnNpZGUgbGlicGNhcDsKKwkJICogbWFwIHRoZW0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgUFBQIHByb3RvY29sIHR5cGVzLgorCQkgKi8KKwkJcHJvdG8gPSBldGhlcnR5cGVfdG9fcHBwdHlwZShwcm90byk7CisJCXJldHVybiBnZW5fY21wKE9SX01BQ1BMLCBvZmZfbGlua3R5cGUsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKKwl9CisKIAlzd2l0Y2ggKGxpbmt0eXBlKSB7CiAKIAljYXNlIERMVF9FTjEwTUI6CisJY2FzZSBETFRfTkVUQU5BTFlaRVI6CisJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CiAJCXJldHVybiBnZW5fZXRoZXJfbGlua3R5cGUocHJvdG8pOwogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKQEAgLTIxNzksMTMgKzI5NjQsNDEgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgRExUX1BQSToKLQljYXNlIERMVF9GRERJOgotCWNhc2UgRExUX0lFRUU4MDI6CiAJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CiAJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CiAJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKLQljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfUFBJOgorCQkvKgorCQkgKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBkYXRhIGZyYW1lLgorCQkgKi8KKwkJYjAgPSBnZW5fY2hlY2tfODAyXzExX2RhdGFfZnJhbWUoKTsKKworCQkvKgorCQkgKiBOb3cgY2hlY2sgZm9yIHRoZSBzcGVjaWZpZWQgbGluay1sYXllciB0eXBlLgorCQkgKi8KKwkJYjEgPSBnZW5fbGxjX2xpbmt0eXBlKHByb3RvKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlyZXR1cm4gYjE7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfRkRESToKKwkJLyoKKwkJICogWFhYIC0gY2hlY2sgZm9yIGFzeW5jaHJvbm91cyBmcmFtZXMsIGFzIHBlciBSRkMgMTEwMy4KKwkJICovCisJCXJldHVybiBnZW5fbGxjX2xpbmt0eXBlKHByb3RvKTsKKwkJLypOT1RSRUFDSEVEKi8KKwkJYnJlYWs7CisKKwljYXNlIERMVF9JRUVFODAyOgorCQkvKgorCQkgKiBYWFggLSBjaGVjayBmb3IgTExDIFBEVXMsIGFzIHBlciBJRUVFIDgwMi41LgorCQkgKi8KKwkJcmV0dXJuIGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQkvKk5PVFJFQUNIRUQqLworCQlicmVhazsKKwogCWNhc2UgRExUX0FUTV9SRkMxNDgzOgogCWNhc2UgRExUX0FUTV9DTElQOgogCWNhc2UgRExUX0lQX09WRVJfRkM6CkBAIC0yMjUwLDExICszMDYzLDEwIEBACiAJCWNhc2UgRVRIRVJUWVBFX0lQOgogCQkJLyogQ2hlY2sgZm9yIGEgdmVyc2lvbiBudW1iZXIgb2YgNC4gKi8KIAkJCXJldHVybiBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgMHg0MCwgMHhGMCk7Ci0jaWZkZWYgSU5FVDYKKwogCQljYXNlIEVUSEVSVFlQRV9JUFY2OgogCQkJLyogQ2hlY2sgZm9yIGEgdmVyc2lvbiBudW1iZXIgb2YgNi4gKi8KIAkJCXJldHVybiBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgMHg2MCwgMHhGMCk7Ci0jZW5kaWYKIAogCQlkZWZhdWx0OgogCQkJcmV0dXJuIGdlbl9mYWxzZSgpOwkJLyogYWx3YXlzIGZhbHNlICovCkBAIC0yMjYyLDYgKzMwNzQsMzAgQEAKIAkJLypOT1RSRUFDSEVEKi8KIAkJYnJlYWs7CiAKKwljYXNlIERMVF9JUFY0OgorCQkvKgorCQkgKiBSYXcgSVB2NCwgc28gbm8gdHlwZSBmaWVsZC4KKwkJICovCisJCWlmIChwcm90byA9PSBFVEhFUlRZUEVfSVApCisJCQlyZXR1cm4gZ2VuX3RydWUoKTsJCS8qIGFsd2F5cyB0cnVlICovCisKKwkJLyogQ2hlY2tpbmcgZm9yIHNvbWV0aGluZyBvdGhlciB0aGFuIElQdjQ7IGFsd2F5cyBmYWxzZSAqLworCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfSVBWNjoKKwkJLyoKKwkJICogUmF3IElQdjYsIHNvIG5vIHR5cGUgZmllbGQuCisJCSAqLworCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0lQVjYpCisJCQlyZXR1cm4gZ2VuX3RydWUoKTsJCS8qIGFsd2F5cyB0cnVlICovCisKKwkJLyogQ2hlY2tpbmcgZm9yIHNvbWV0aGluZyBvdGhlciB0aGFuIElQdjY7IGFsd2F5cyBmYWxzZSAqLworCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCiAJY2FzZSBETFRfUFBQOgogCWNhc2UgRExUX1BQUF9QUFBEOgogCWNhc2UgRExUX1BQUF9TRVJJQUw6CkBAIC0yMjcwLDQ3ICszMTA2LDkgQEAKIAkJICogV2UgdXNlIEV0aGVybmV0IHByb3RvY29sIHR5cGVzIGluc2lkZSBsaWJwY2FwOwogCQkgKiBtYXAgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBQUFAgcHJvdG9jb2wgdHlwZXMuCiAJCSAqLwotCQlzd2l0Y2ggKHByb3RvKSB7Ci0KLQkJY2FzZSBFVEhFUlRZUEVfSVA6Ci0JCQlwcm90byA9IFBQUF9JUDsKLQkJCWJyZWFrOwotCi0jaWZkZWYgSU5FVDYKLQkJY2FzZSBFVEhFUlRZUEVfSVBWNjoKLQkJCXByb3RvID0gUFBQX0lQVjY7Ci0JCQlicmVhazsKLSNlbmRpZgotCi0JCWNhc2UgRVRIRVJUWVBFX0ROOgotCQkJcHJvdG8gPSBQUFBfREVDTkVUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFVEhFUlRZUEVfQVRBTEs6Ci0JCQlwcm90byA9IFBQUF9BUFBMRTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRVRIRVJUWVBFX05TOgotCQkJcHJvdG8gPSBQUFBfTlM7Ci0JCQlicmVhazsKLQotCQljYXNlIExMQ1NBUF9JU09OUzoKLQkJCXByb3RvID0gUFBQX09TSTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTExDU0FQXzgwMjFEOgotCQkJLyoKLQkJCSAqIEknbSBhc3N1bWluZyB0aGUgIkJyaWRnaW5nIFBEVSJzIHRoYXQgZ28KLQkJCSAqIG92ZXIgUFBQIGFyZSBTcGFubmluZyBUcmVlIFByb3RvY29sCi0JCQkgKiBCcmlkZ2luZyBQRFVzLgotCQkJICovCi0JCQlwcm90byA9IFBQUF9CUlBEVTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTExDU0FQX0lQWDoKLQkJCXByb3RvID0gUFBQX0lQWDsKLQkJCWJyZWFrOwotCQl9CisJCXByb3RvID0gZXRoZXJ0eXBlX3RvX3BwcHR5cGUocHJvdG8pOworCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKKwkJLypOT1RSRUFDSEVEKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9QUFBfQlNET1M6CkBAIC0yMzIxLDYgKzMxMTksMTAgQEAKIAkJc3dpdGNoIChwcm90bykgewogCiAJCWNhc2UgRVRIRVJUWVBFX0lQOgorCQkJLyoKKwkJCSAqIEFsc28gY2hlY2sgZm9yIFZhbiBKYWNvYnNvbi1jb21wcmVzc2VkIElQLgorCQkJICogWFhYIC0gZG8gdGhpcyBmb3Igb3RoZXIgZm9ybXMgb2YgUFBQPworCQkJICovCiAJCQliMCA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwgUFBQX0lQKTsKIAkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCBQUFBfVkpDKTsKIAkJCWdlbl9vcihiMCwgYjEpOwpAQCAtMjMyOCw0MiArMzEzMCwxMiBAQAogCQkJZ2VuX29yKGIxLCBiMCk7CiAJCQlyZXR1cm4gYjA7CiAKLSNpZmRlZiBJTkVUNgotCQljYXNlIEVUSEVSVFlQRV9JUFY2OgotCQkJcHJvdG8gPSBQUFBfSVBWNjsKLQkJCS8qIG1vcmUgdG8gZ28/ICovCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCWNhc2UgRVRIRVJUWVBFX0ROOgotCQkJcHJvdG8gPSBQUFBfREVDTkVUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFVEhFUlRZUEVfQVRBTEs6Ci0JCQlwcm90byA9IFBQUF9BUFBMRTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRVRIRVJUWVBFX05TOgotCQkJcHJvdG8gPSBQUFBfTlM7Ci0JCQlicmVhazsKLQotCQljYXNlIExMQ1NBUF9JU09OUzoKLQkJCXByb3RvID0gUFBQX09TSTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTExDU0FQXzgwMjFEOgotCQkJLyoKLQkJCSAqIEknbSBhc3N1bWluZyB0aGUgIkJyaWRnaW5nIFBEVSJzIHRoYXQgZ28KLQkJCSAqIG92ZXIgUFBQIGFyZSBTcGFubmluZyBUcmVlIFByb3RvY29sCi0JCQkgKiBCcmlkZ2luZyBQRFVzLgotCQkJICovCi0JCQlwcm90byA9IFBQUF9CUlBEVTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTExDU0FQX0lQWDoKLQkJCXByb3RvID0gUFBQX0lQWDsKLQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJvdG8gPSBldGhlcnR5cGVfdG9fcHBwdHlwZShwcm90byk7CisJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkJCShicGZfaW50MzIpcHJvdG8pOwogCQl9CisJCS8qTk9UUkVBQ0hFRCovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfTlVMTDoKQEAgLTI0MjUsOCArMzE5Nyw3IEBACiAJCQkgKiBUaGVuIHdlIHJ1biBpdCB0aHJvdWdoICJodG9ubCgpIiwgYW5kCiAJCQkgKiBnZW5lcmF0ZSBjb2RlIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcmVzdWx0LgogCQkJICovCi0JCQlpZiAoYnBmX3BjYXAtPnNmLnJmaWxlICE9IE5VTEwgJiYKLQkJCSAgICBicGZfcGNhcC0+c2Yuc3dhcHBlZCkKKwkJCWlmIChicGZfcGNhcC0+cmZpbGUgIT0gTlVMTCAmJiBicGZfcGNhcC0+c3dhcHBlZCkKIAkJCQlwcm90byA9IFNXQVBMT05HKHByb3RvKTsKIAkJCXByb3RvID0gaHRvbmwocHJvdG8pOwogCQl9CkBAIC0yNDQxLDExICszMjEyLDkgQEAKIAkJaWYgKHByb3RvID09IEVUSEVSVFlQRV9JUCkKIAkJCXJldHVybiAoZ2VuX2NtcChPUl9MSU5LLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIGFmKSwKIAkJCSAgICBCUEZfQiwgKGJwZl9pbnQzMilBRl9JTkVUKSk7Ci0jaWZkZWYgSU5FVDYKIAkJZWxzZSBpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0lQVjYpCiAJCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBhZiksCiAJCQkgICAgQlBGX0IsIChicGZfaW50MzIpQUZfSU5FVDYpKTsKLSNlbmRpZiAvKiBJTkVUNiAqLwogCQllbHNlCiAJCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CiAJCS8qTk9UUkVBQ0hFRCovCkBAIC0yNDYzLDExICszMjMyLDkgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBnZW5fZmFsc2UoKTsKIAotI2lmZGVmIElORVQ2CiAJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CiAJCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfQiwKIAkJCQkoYnBmX2ludDMyKUFSQ1RZUEVfSU5FVDYpKTsKLSNlbmRpZiAvKiBJTkVUNiAqLwogCiAJCWNhc2UgRVRIRVJUWVBFX0lQOgogCQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCkBAIC0yNTE5LDEzICszMjg2LDExIEBACiAJCQkgKi8KIAkJCXJldHVybiBnZW5fY21wKE9SX0xJTkssIDIsIEJQRl9ILCAoMHgwMzw8OCkgfCAweGNjKTsKIAotI2lmZGVmIElORVQ2CiAJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CiAJCQkvKgogCQkJICogQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIE5MUElEIGZvciBJUHY2LgogCQkJICovCiAJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCAyLCBCUEZfSCwgKDB4MDM8PDgpIHwgMHg4ZSk7Ci0jZW5kaWYKIAogCQljYXNlIExMQ1NBUF9JU09OUzoKIAkJCS8qCkBAIC0yNTUyLDYgKzMzMTcsOSBAQAogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIAorCWNhc2UgRExUX01GUjoKKwkJYnBmX2Vycm9yKCJNdWx0aS1saW5rIEZyYW1lIFJlbGF5IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NRlI6CiAgICAgICAgIGNhc2UgRExUX0pVTklQRVJfTUxGUjoKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NTFBQUDoKQEAgLTI1NjgsNiArMzMzNiwxMyBAQAogICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0ZSRUxBWToKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9DSERMQzoKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9WUDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9TVDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9JU006CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfVlM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfU1JYX0UyRToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUw6CisJY2FzZSBETFRfSlVOSVBFUl9BVE1fQ0VNSUM6CisKIAkJLyoganVzdCBsZXRzIHZlcmlmeSB0aGUgbWFnaWMgbnVtYmVyIGZvciBub3cgLQogCQkgKiBvbiBBVE0gd2UgbWF5IGhhdmUgdXAgdG8gNiBkaWZmZXJlbnQgZW5jYXBzdWxhdGlvbnMgb24gdGhlIHdpcmUKIAkJICogYW5kIG5lZWQgYSBsb3Qgb2YgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHRoYXQgdGhlIHBheWxvYWQKQEAgLTI1NzcsMTQgKzMzNTIsNjQgQEAKIAkJICovCiAJCXJldHVybiBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfVywgMHg0ZDQ3NDMwMCwgMHhmZmZmZmYwMCk7IC8qIGNvbXBhcmUgdGhlIG1hZ2ljIG51bWJlciAqLwogCisJY2FzZSBETFRfQkFDTkVUX01TX1RQOgorCQlyZXR1cm4gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX1csIDB4NTVGRjAwMDAsIDB4ZmZmZjAwMDApOworCisJY2FzZSBETFRfSVBORVQ6CisJCXJldHVybiBnZW5faXBuZXRfbGlua3R5cGUocHJvdG8pOworCiAJY2FzZSBETFRfTElOVVhfSVJEQToKIAkJYnBmX2Vycm9yKCJJckRBIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIERMVF9ET0NTSVM6CiAJCWJwZl9lcnJvcigiRE9DU0lTIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKKwljYXNlIERMVF9NVFAyOgorCWNhc2UgRExUX01UUDJfV0lUSF9QSERSOgorCQlicGZfZXJyb3IoIk1UUDIgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX0VSRjoKKwkJYnBmX2Vycm9yKCJFUkYgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX1BGU1lOQzoKKwkJYnBmX2Vycm9yKCJQRlNZTkMgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwogCWNhc2UgRExUX0xJTlVYX0xBUEQ6CiAJCWJwZl9lcnJvcigiTEFQRCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfVVNCOgorCWNhc2UgRExUX1VTQl9MSU5VWDoKKwljYXNlIERMVF9VU0JfTElOVVhfTU1BUFBFRDoKKwkJYnBmX2Vycm9yKCJVU0IgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX0JMVUVUT09USF9IQ0lfSDQ6CisJY2FzZSBETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFI6CisJCWJwZl9lcnJvcigiQmx1ZXRvb3RoIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9DQU4yMEI6CisJY2FzZSBETFRfQ0FOX1NPQ0tFVENBTjoKKwkJYnBmX2Vycm9yKCJDQU4gbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX0lFRUU4MDJfMTVfNDoKKwljYXNlIERMVF9JRUVFODAyXzE1XzRfTElOVVg6CisJY2FzZSBETFRfSUVFRTgwMl8xNV80X05PTkFTS19QSFk6CisJY2FzZSBETFRfSUVFRTgwMl8xNV80X05PRkNTOgorCQlicGZfZXJyb3IoIklFRUUgODAyLjE1LjQgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX0lFRUU4MDJfMTZfTUFDX0NQU19SQURJTzoKKwkJYnBmX2Vycm9yKCJJRUVFIDgwMi4xNiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfU0lUQToKKwkJYnBmX2Vycm9yKCJTSVRBIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9SQUlGMToKKwkJYnBmX2Vycm9yKCJSQUlGMSBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfSVBNQjoKKwkJYnBmX2Vycm9yKCJJUE1CIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9BWDI1X0tJU1M6CisJCWJwZl9lcnJvcigiQVguMjUgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAl9CiAKIAkvKgpAQCAtMjYwMiwxMiArMzQyNyw3IEBACiAKIAkvKgogCSAqIEFueSB0eXBlIG5vdCBoYW5kbGVkIGFib3ZlIHNob3VsZCBhbHdheXMgaGF2ZSBhbiBFdGhlcm5ldAotCSAqIHR5cGUgYXQgYW4gb2Zmc2V0IG9mICJvZmZfbGlua3R5cGUiLiAgKFBQUCBpcyBwYXJ0aWFsbHkKLQkgKiBoYW5kbGVkIGFib3ZlIC0gdGhlIHByb3RvY29sIHR5cGUgaXMgbWFwcGVkIGZyb20gdGhlCi0JICogRXRoZXJuZXQgYW5kIExMQyB0eXBlcyB3ZSB1c2UgaW50ZXJuYWxseSB0byB0aGUgY29ycmVzcG9uZGluZwotCSAqIFBQUCB0eXBlIC0gYnV0IHRoZSBQUFAgdHlwZSBpcyBhbHdheXMgc3BlY2lmaWVkIGJ5IGEgdmFsdWUKLQkgKiBhdCAib2ZmX2xpbmt0eXBlIiwgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgY29kZSBnZW5lcmF0aW9uCi0JICogYWJvdmUuKQorCSAqIHR5cGUgYXQgYW4gb2Zmc2V0IG9mICJvZmZfbGlua3R5cGUiLgogCSAqLwogCXJldHVybiBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOwogfQpAQCAtMjYyMCwxMCArMzQ0MCw5IEBACiAgKiBjb2RlIGFuZCBwcm90b2NvbCB0eXBlIGluIHRoZSBTTkFQIGhlYWRlci4KICAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fc25hcChvcmdjb2RlLCBwdHlwZSwgb2Zmc2V0KQorZ2VuX3NuYXAob3JnY29kZSwgcHR5cGUpCiAJYnBmX3VfaW50MzIgb3JnY29kZTsKIAlicGZfdV9pbnQzMiBwdHlwZTsKLQl1X2ludCBvZmZzZXQ7CiB7CiAJdV9jaGFyIHNuYXBibG9ja1s4XTsKIApAQCAtMjYzNSw3ICszNDU0LDcgQEAKIAlzbmFwYmxvY2tbNV0gPSAob3JnY29kZSA+PiAwKTsJLyogbG93ZXIgOCBiaXRzIG9mIG9yZ2FuaXphdGlvbiBjb2RlICovCiAJc25hcGJsb2NrWzZdID0gKHB0eXBlID4+IDgpOwkvKiB1cHBlciA4IGJpdHMgb2YgcHJvdG9jb2wgdHlwZSAqLwogCXNuYXBibG9ja1s3XSA9IChwdHlwZSA+PiAwKTsJLyogbG93ZXIgOCBiaXRzIG9mIHByb3RvY29sIHR5cGUgKi8KLQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgb2Zmc2V0LCA4LCBzbmFwYmxvY2spOworCXJldHVybiBnZW5fYmNtcChPUl9NQUNQTCwgMCwgOCwgc25hcGJsb2NrKTsKIH0KIAogLyoKQEAgLTI2NjgsNyArMzQ4Nyw3IEBACiAJCSAqIERTQVAsIGFzIHdlIGRvIGZvciBvdGhlciB0eXBlcyA8PSBFVEhFUk1UVQogCQkgKiAoaS5lLiwgb3RoZXIgU0FQIHZhbHVlcyk/CiAJCSAqLwotCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCAoYnBmX3VfaW50MzIpCisJCXJldHVybiBnZW5fY21wKE9SX01BQ1BMLCAwLCBCUEZfSCwgKGJwZl91X2ludDMyKQogCQkJICAgICAoKHByb3RvIDw8IDgpIHwgcHJvdG8pKTsKIAogCWNhc2UgTExDU0FQX0lQWDoKQEAgLTI2NzYsNyArMzQ5NSw3IEBACiAJCSAqIFhYWCAtIGFyZSB0aGVyZSBldmVyIFNOQVAgZnJhbWVzIGZvciBJUFggb24KIAkJICogbm9uLUV0aGVybmV0IDgwMi54IG5ldHdvcmtzPwogCQkgKi8KLQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfQiwKKwkJcmV0dXJuIGdlbl9jbXAoT1JfTUFDUEwsIDAsIEJQRl9CLAogCQkgICAgKGJwZl9pbnQzMilMTENTQVBfSVBYKTsKIAogCWNhc2UgRVRIRVJUWVBFX0FUQUxLOgpAQCAtMjY4OSw3ICszNTA4LDcgQEAKIAkJICogWFhYIC0gY2hlY2sgZm9yIGFuIG9yZ2FuaXphdGlvbiBjb2RlIG9mCiAJCSAqIGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCBhcyB3ZWxsPwogCQkgKi8KLQkJcmV0dXJuIGdlbl9zbmFwKDB4MDgwMDA3LCBFVEhFUlRZUEVfQVRBTEssIG9mZl9saW5rdHlwZSk7CisJCXJldHVybiBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKIAogCWRlZmF1bHQ6CiAJCS8qCkBAIC0yNzAxLDggKzM1MjAsNyBAQAogCQkJICogVGhpcyBpcyBhbiBMTEMgU0FQIHZhbHVlLCBzbyBjaGVjawogCQkJICogdGhlIERTQVAuCiAJCQkgKi8KLQkJCXJldHVybiBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCi0JCQkgICAgKGJwZl9pbnQzMilwcm90byk7CisJCQlyZXR1cm4gZ2VuX2NtcChPUl9NQUNQTCwgMCwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYW4gRXRoZXJuZXQgdHlwZTsgd2UgYXNzdW1lIHRoYXQgaXQncwpAQCAtMjcxNywxNSArMzUzNSwxMyBAQAogCQkJICogb3JnYW5pemF0aW9uIGNvZGUgb2YgMHgwMDAwMDAgKGVuY2Fwc3VsYXRlZAogCQkJICogRXRoZXJuZXQpLCB3ZSdkIGRvCiAJCQkgKgotCQkJICoJcmV0dXJuIGdlbl9zbmFwKDB4MDAwMDAwLCBwcm90bywKLQkJCSAqCSAgICBvZmZfbGlua3R5cGUpOworCQkJICoJcmV0dXJuIGdlbl9zbmFwKDB4MDAwMDAwLCBwcm90byk7CiAJCQkgKgogCQkJICogaGVyZTsgZm9yIG5vdywgd2UgZG9uJ3QsIGFzIHBlciB0aGUgYWJvdmUuCiAJCQkgKiBJIGRvbid0IGtub3cgd2hldGhlciBpdCdzIHdvcnRoIHRoZSBleHRyYSBDUFUKIAkJCSAqIHRpbWUgdG8gZG8gdGhlIHJpZ2h0IGNoZWNrIG9yIG5vdC4KIAkJCSAqLwotCQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlKzYsIEJQRl9ILAotCQkJICAgIChicGZfaW50MzIpcHJvdG8pOworCQkJcmV0dXJuIGdlbl9jbXAoT1JfTUFDUEwsIDYsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKIAkJfQogCX0KIH0KQEAgLTI4MjQsNyArMzY0MCw3IEBACiAJZ2VuX2FuZChiMCwgYjEpOwogCXJldHVybiBiMTsKIH0KLSNlbmRpZiAvKklORVQ2Ki8KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKIGdlbl9laG9zdG9wKGVhZGRyLCBkaXIpCkBAIC0yODUyLDYgKzM2NjgsMzAgQEAKIAkJYjEgPSBnZW5fZWhvc3RvcChlYWRkciwgUV9EU1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOworCisJY2FzZSBRX0FERFIxOgorCQlicGZfZXJyb3IoIidhZGRyMScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjI6CisJCWJwZl9lcnJvcigiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMzoKKwkJYnBmX2Vycm9yKCInYWRkcjMnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFI0OgorCQlicGZfZXJyb3IoIidhZGRyNCcgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfUkE6CisJCWJwZl9lcnJvcigiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQlicmVhazsKKworCWNhc2UgUV9UQToKKwkJYnBmX2Vycm9yKCIndGEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJyZWFrOwogCX0KIAlhYm9ydCgpOwogCS8qIE5PVFJFQUNIRUQgKi8KQEAgLTI4NjksMTggKzM3MDksMTAgQEAKIAogCXN3aXRjaCAoZGlyKSB7CiAJY2FzZSBRX1NSQzoKLSNpZmRlZiBQQ0FQX0ZERElQQUQKIAkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTkssIDYgKyAxICsgcGNhcF9mZGRpcGFkLCA2LCBlYWRkcik7Ci0jZWxzZQotCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgNiArIDEsIDYsIGVhZGRyKTsKLSNlbmRpZgogCiAJY2FzZSBRX0RTVDoKLSNpZmRlZiBQQ0FQX0ZERElQQUQKIAkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTkssIDAgKyAxICsgcGNhcF9mZGRpcGFkLCA2LCBlYWRkcik7Ci0jZWxzZQotCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgMCArIDEsIDYsIGVhZGRyKTsKLSNlbmRpZgogCiAJY2FzZSBRX0FORDoKIAkJYjAgPSBnZW5fZmhvc3RvcChlYWRkciwgUV9TUkMpOwpAQCAtMjg5NCw2ICszNzI2LDMwIEBACiAJCWIxID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfRFNUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKKworCWNhc2UgUV9BRERSMToKKwkJYnBmX2Vycm9yKCInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMjoKKwkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMzoKKwkJYnBmX2Vycm9yKCInYWRkcjMnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSNDoKKwkJYnBmX2Vycm9yKCInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9SQToKKwkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9UQToKKwkJYnBmX2Vycm9yKCIndGEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKIAl9CiAJYWJvcnQoKTsKIAkvKiBOT1RSRUFDSEVEICovCkBAIC0yOTI4LDEzICszNzg0LDM4IEBACiAJCWIxID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfRFNUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKKworCWNhc2UgUV9BRERSMToKKwkJYnBmX2Vycm9yKCInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMjoKKwkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMzoKKwkJYnBmX2Vycm9yKCInYWRkcjMnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSNDoKKwkJYnBmX2Vycm9yKCInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9SQToKKwkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9UQToKKwkJYnBmX2Vycm9yKCIndGEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKIAl9CiAJYWJvcnQoKTsKIAkvKiBOT1RSRUFDSEVEICovCiB9CiAKIC8qCi0gKiBMaWtlIGdlbl9laG9zdG9wLCBidXQgZm9yIERMVF9JRUVFODAyXzExICg4MDIuMTEgd2lyZWxlc3MgTEFOKQorICogTGlrZSBnZW5fZWhvc3RvcCwgYnV0IGZvciBETFRfSUVFRTgwMl8xMSAoODAyLjExIHdpcmVsZXNzIExBTikgYW5kCisgKiB2YXJpb3VzIDgwMi4xMSArIHJhZGlvIGhlYWRlcnMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgogZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIGRpcikKQEAgLTI5NDQsNiArMzgyNSwxNiBAQAogCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjAsICpiMSwgKmIyOwogCXJlZ2lzdGVyIHN0cnVjdCBzbGlzdCAqczsKIAorI2lmZGVmIEVOQUJMRV9XTEFOX0ZJTFRFUklOR19QQVRDSAorCS8qCisJICogVE9ETyBHViAyMDA3MDYxMworCSAqIFdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgb3B0aW1pemVyIGJlY2F1c2UgdGhlIG9wdGltaXplciBpcyBidWdneQorCSAqIGFuZCB3aXBlcyBvdXQgc29tZSBMRCBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBiZWxvdworCSAqIGNvZGUgdG8gdmFsaWRhdGUgdGhlIEZyYW1lIENvbnRyb2wgYml0cworCSAqLworCW5vX29wdGltaXplID0gMTsKKyNlbmRpZiAvKiBFTkFCTEVfV0xBTl9GSUxURVJJTkdfUEFUQ0ggKi8KKwogCXN3aXRjaCAoZGlyKSB7CiAJY2FzZSBRX1NSQzoKIAkJLyoKQEAgLTMwNDEsNyArMzkzMiw3IEBACiAJCSAqIE5vdyBjaGVjayBmb3IgYSBkYXRhIGZyYW1lLgogCQkgKiBJLmUsIGNoZWNrICJsaW5rWzBdICYgMHgwOCIuCiAJCSAqLwotCQlnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOwogCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKIAkJYjEtPnMuayA9IDB4MDg7CiAJCWIxLT5zdG10cyA9IHM7CkBAIC0zMjEwLDYgKzQxMDEsMTI2IEBACiAJCWdlbl9hbmQoYjEsIGIwKTsKIAkJcmV0dXJuIGIwOwogCisJY2FzZSBRX1JBOgorCQkvKgorCQkgKiBOb3QgcHJlc2VudCBpbiBtYW5hZ2VtZW50IGZyYW1lczsgYWRkcjEgaW4gb3RoZXIKKwkJICogZnJhbWVzLgorCQkgKi8KKworCQkvKgorCQkgKiBJZiB0aGUgaGlnaC1vcmRlciBiaXQgb2YgdGhlIHR5cGUgdmFsdWUgaXMgMCwgdGhpcworCQkgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCisJCSAqIEkuZSwgY2hlY2sgIihsaW5rWzBdICYgMHgwOCkiLgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjEtPnMuayA9IDB4MDg7CisJCWIxLT5zdG10cyA9IHM7CisKKwkJLyoKKwkJICogQ2hlY2sgYWRkcjEuCisJCSAqLworCQliMCA9IGdlbl9iY21wKE9SX0xJTkssIDQsIDYsIGVhZGRyKTsKKworCQkvKgorCQkgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVjayBvZiBhZGRyMS4KKwkJICovCisJCWdlbl9hbmQoYjEsIGIwKTsKKwkJcmV0dXJuIChiMCk7CisKKwljYXNlIFFfVEE6CisJCS8qCisJCSAqIE5vdCBwcmVzZW50IGluIG1hbmFnZW1lbnQgZnJhbWVzOyBhZGRyMiwgaWYgcHJlc2VudCwKKwkJICogaW4gb3RoZXIgZnJhbWVzLgorCQkgKi8KKworCQkvKgorCQkgKiBOb3QgcHJlc2VudCBpbiBDVFMgb3IgQUNLIGNvbnRyb2wgZnJhbWVzLgorCQkgKi8KKwkJYjAgPSBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwKKwkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLKTsKKwkJZ2VuX25vdChiMCk7CisJCWIxID0gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMsCisJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CisJCWdlbl9ub3QoYjEpOworCQliMiA9IGdlbl9tY21wKE9SX0xJTkssIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLLAorCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOworCQlnZW5fbm90KGIyKTsKKwkJZ2VuX2FuZChiMSwgYjIpOworCQlnZW5fb3IoYjAsIGIyKTsKKworCQkvKgorCQkgKiBJZiB0aGUgaGlnaC1vcmRlciBiaXQgb2YgdGhlIHR5cGUgdmFsdWUgaXMgMCwgdGhpcworCQkgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCisJCSAqIEkuZSwgY2hlY2sgIihsaW5rWzBdICYgMHgwOCkiLgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjEtPnMuayA9IDB4MDg7CisJCWIxLT5zdG10cyA9IHM7CisKKwkJLyoKKwkJICogQU5EIHRoYXQgd2l0aCB0aGUgY2hlY2sgZm9yIGZyYW1lcyBvdGhlciB0aGFuCisJCSAqIENUUyBhbmQgQUNLIGZyYW1lcy4KKwkJICovCisJCWdlbl9hbmQoYjEsIGIyKTsKKworCQkvKgorCQkgKiBDaGVjayBhZGRyMi4KKwkJICovCisJCWIxID0gZ2VuX2JjbXAoT1JfTElOSywgMTAsIDYsIGVhZGRyKTsKKwkJZ2VuX2FuZChiMiwgYjEpOworCQlyZXR1cm4gYjE7CisKKwkvKgorCSAqIFhYWCAtIGFkZCBCU1NJRCBrZXl3b3JkPworCSAqLworCWNhc2UgUV9BRERSMToKKwkJcmV0dXJuIChnZW5fYmNtcChPUl9MSU5LLCA0LCA2LCBlYWRkcikpOworCisJY2FzZSBRX0FERFIyOgorCQkvKgorCQkgKiBOb3QgcHJlc2VudCBpbiBDVFMgb3IgQUNLIGNvbnRyb2wgZnJhbWVzLgorCQkgKi8KKwkJYjAgPSBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwKKwkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLKTsKKwkJZ2VuX25vdChiMCk7CisJCWIxID0gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMsCisJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CisJCWdlbl9ub3QoYjEpOworCQliMiA9IGdlbl9tY21wKE9SX0xJTkssIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLLAorCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOworCQlnZW5fbm90KGIyKTsKKwkJZ2VuX2FuZChiMSwgYjIpOworCQlnZW5fb3IoYjAsIGIyKTsKKwkJYjEgPSBnZW5fYmNtcChPUl9MSU5LLCAxMCwgNiwgZWFkZHIpOworCQlnZW5fYW5kKGIyLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9BRERSMzoKKwkJLyoKKwkJICogTm90IHByZXNlbnQgaW4gY29udHJvbCBmcmFtZXMuCisJCSAqLworCQliMCA9IGdlbl9tY21wKE9SX0xJTkssIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLAorCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spOworCQlnZW5fbm90KGIwKTsKKwkJYjEgPSBnZW5fYmNtcChPUl9MSU5LLCAxNiwgNiwgZWFkZHIpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9BRERSNDoKKwkJLyoKKwkJICogUHJlc2VudCBvbmx5IGlmIHRoZSBkaXJlY3Rpb24gbWFzayBoYXMgYm90aCAiRnJvbSBEUyIKKwkJICogYW5kICJUbyBEUyIgc2V0LiAgTmVpdGhlciBjb250cm9sIGZyYW1lcyBub3IgbWFuYWdlbWVudAorCQkgKiBmcmFtZXMgc2hvdWxkIGhhdmUgYm90aCBvZiB0aG9zZSBzZXQsIHNvIHdlIGRvbid0CisJCSAqIGNoZWNrIHRoZSBmcmFtZSB0eXBlLgorCQkgKi8KKwkJYjAgPSBnZW5fbWNtcChPUl9MSU5LLCAxLCBCUEZfQiwKKwkJCUlFRUU4MDIxMV9GQzFfRElSX0RTVE9EUywgSUVFRTgwMjExX0ZDMV9ESVJfTUFTSyk7CisJCWIxID0gZ2VuX2JjbXAoT1JfTElOSywgMjQsIDYsIGVhZGRyKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKIAljYXNlIFFfQU5EOgogCQliMCA9IGdlbl93bGFuaG9zdG9wKGVhZGRyLCBRX1NSQyk7CiAJCWIxID0gZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIFFfRFNUKTsKQEAgLTMyNTgsNiArNDI2OSwzMCBAQAogCQliMSA9IGdlbl9pcGZjaG9zdG9wKGVhZGRyLCBRX0RTVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlyZXR1cm4gYjE7CisKKwljYXNlIFFfQUREUjE6CisJCWJwZl9lcnJvcigiJ2FkZHIxJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjI6CisJCWJwZl9lcnJvcigiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjM6CisJCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjQ6CisJCWJwZl9lcnJvcigiJ2FkZHI0JyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfUkE6CisJCWJwZl9lcnJvcigiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfVEE6CisJCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CiAJfQogCWFib3J0KCk7CiAJLyogTk9UUkVBQ0hFRCAqLwpAQCAtMzQ1MSw2ICs0NDg2LDkgQEAKIAljYXNlIFFfVlJSUDoKIAkJYnBmX2Vycm9yKCIndnJycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCisJY2FzZSBRX0NBUlA6CisJCWJwZl9lcnJvcigiJ2NhcnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwogCWNhc2UgUV9BVEFMSzoKIAkJYnBmX2Vycm9yKCJBVEFMSyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIApAQCAtMzQ3MiwxMyArNDUxMCwxMSBAQAogCWNhc2UgUV9NT1BSQzoKIAkJYnBmX2Vycm9yKCJNT1BSQyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAotI2lmZGVmIElORVQ2CiAJY2FzZSBRX0lQVjY6CiAJCWJwZl9lcnJvcigiJ2lwNicgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAKIAljYXNlIFFfSUNNUFY2OgogCQlicGZfZXJyb3IoIidpY21wNicgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwotI2VuZGlmIC8qIElORVQ2ICovCiAKIAljYXNlIFFfQUg6CiAJCWJwZl9lcnJvcigiJ2FoJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CkBAIC0zNTM3LDYgKzQ1NzMsOSBAQAogCWNhc2UgUV9ERUZBVUxUOgogCQlyZXR1cm4gZ2VuX2hvc3Q2KGFkZHIsIG1hc2ssIFFfSVBWNiwgZGlyLCB0eXBlKTsKIAorCWNhc2UgUV9MSU5LOgorCQlicGZfZXJyb3IoImxpbmstbGF5ZXIgbW9kaWZpZXIgYXBwbGllZCB0byBpcDYgJXMiLCB0eXBlc3RyKTsKKwogCWNhc2UgUV9JUDoKIAkJYnBmX2Vycm9yKCInaXAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXA2ICVzIiwgdHlwZXN0cik7CiAKQEAgLTM1NzAsNiArNDYwOSw5IEBACiAJY2FzZSBRX1ZSUlA6CiAJCWJwZl9lcnJvcigiJ3ZycnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAorCWNhc2UgUV9DQVJQOgorCQlicGZfZXJyb3IoIidjYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKIAljYXNlIFFfQVRBTEs6CiAJCWJwZl9lcnJvcigiQVRBTEsgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKQEAgLTM2MzIsNyArNDY3NCw3IEBACiAJfQogCS8qIE5PVFJFQUNIRUQgKi8KIH0KLSNlbmRpZiAvKklORVQ2Ki8KKyNlbmRpZgogCiAjaWZuZGVmIElORVQ2CiBzdGF0aWMgc3RydWN0IGJsb2NrICoKQEAgLTM2NTIsMzIgKzQ2OTQsMzYgQEAKIAljYXNlIFFfSVA6CiAJY2FzZSBRX0FSUDoKIAljYXNlIFFfUkFSUDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpbmt0eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfRU4xME1COgotICAgICAgICAgICAgICAgICAgICBiMCA9IGdlbl9laG9zdG9wKGVhZGRyLCBRX09SKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfRkRESToKLSAgICAgICAgICAgICAgICAgICAgYjAgPSBnZW5fZmhvc3RvcChlYWRkciwgUV9PUik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJCWNhc2UgRExUX0VOMTBNQjoKKwkJY2FzZSBETFRfTkVUQU5BTFlaRVI6CisJCWNhc2UgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UOgorCQkJYjAgPSBnZW5fZWhvc3RvcChlYWRkciwgUV9PUik7CisJCQlicmVhazsKKwkJY2FzZSBETFRfRkRESToKKwkJCWIwID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYnJlYWs7CiAJCWNhc2UgRExUX0lFRUU4MDI6Ci0gICAgICAgICAgICAgICAgICAgIGIwID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfT1IpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCWIwID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYnJlYWs7CiAJCWNhc2UgRExUX0lFRUU4MDJfMTE6Ci0JCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgotCQljYXNlIERMVF9QUEk6Ci0JCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CiAJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKLSAgICAgICAgICAgICAgICAgICAgYjAgPSBnZW5fd2xhbmhvc3RvcChlYWRkciwgUV9PUik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRExUX1NVTkFUTToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2xhbmUpIHsKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWNhc2UgRExUX1BQSToKKwkJCWIwID0gZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYnJlYWs7CisJCWNhc2UgRExUX1NVTkFUTToKKwkJCWlmICghaXNfbGFuZSkKKwkJCQlicGZfZXJyb3IoCisJCQkJICAgICInZ2F0ZXdheScgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nLzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIik7CiAJCQkvKgogCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgogCQkJICogTEUgQ29udHJvbCBtYXJrZXIuICAoV2UndmUgYWxyZWFkeSBnZW5lcmF0ZWQKIAkJCSAqIGEgdGVzdCBmb3IgTEFORS4pCiAJCQkgKi8KLQkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywgQlBGX0gsCi0JCQkgICAgMHhGRjAwKTsKKwkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywKKwkJCSAgICBCUEZfSCwgMHhGRjAwKTsKIAkJCWdlbl9ub3QoYjEpOwogCiAJCQkvKgpAQCAtMzY4NSwxNSArNDczMSwxNCBAQAogCQkJICovCiAJCQliMCA9IGdlbl9laG9zdG9wKGVhZGRyLCBRX09SKTsKIAkJCWdlbl9hbmQoYjEsIGIwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCWJyZWFrOwogCQljYXNlIERMVF9JUF9PVkVSX0ZDOgotICAgICAgICAgICAgICAgICAgICBiMCA9IGdlbl9pcGZjaG9zdG9wKGVhZGRyLCBRX09SKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnBmX2Vycm9yKAotCQkJICAgICInZ2F0ZXdheScgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nLzgwMi4xMS9GaWJyZSBDaGFubmVsIik7Ci0gICAgICAgICAgICAgICAgfQorCQkJYjAgPSBnZW5faXBmY2hvc3RvcChlYWRkciwgUV9PUik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJwZl9lcnJvcigKKwkJCSAgICAiJ2dhdGV3YXknIHN1cHBvcnRlZCBvbmx5IG9uIGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOworCQl9CiAJCWIxID0gZ2VuX2hvc3QoKiphbGlzdCsrLCAweGZmZmZmZmZmLCBwcm90bywgUV9PUiwgUV9IT1NUKTsKIAkJd2hpbGUgKCphbGlzdCkgewogCQkJdG1wID0gZ2VuX2hvc3QoKiphbGlzdCsrLCAweGZmZmZmZmZmLCBwcm90bywgUV9PUiwKQEAgLTM3MjEsMjYgKzQ3NjYsMjAgQEAKIAogCWNhc2UgUV9TQ1RQOgogCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1NDVFAsIFFfSVAsIFFfREVGQVVMVCk7Ci0jaWZkZWYgSU5FVDYKIAkJYjAgPSBnZW5fcHJvdG8oSVBQUk9UT19TQ1RQLCBRX0lQVjYsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwotI2VuZGlmCiAJCWJyZWFrOwogCiAJY2FzZSBRX1RDUDoKIAkJYjEgPSBnZW5fcHJvdG8oSVBQUk9UT19UQ1AsIFFfSVAsIFFfREVGQVVMVCk7Ci0jaWZkZWYgSU5FVDYKIAkJYjAgPSBnZW5fcHJvdG8oSVBQUk9UT19UQ1AsIFFfSVBWNiwgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0jZW5kaWYKIAkJYnJlYWs7CiAKIAljYXNlIFFfVURQOgogCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1VEUCwgUV9JUCwgUV9ERUZBVUxUKTsKLSNpZmRlZiBJTkVUNgogCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1VEUCwgUV9JUFY2LCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKLSNlbmRpZgogCQlicmVhazsKIAogCWNhc2UgUV9JQ01QOgpAQCAtMzc2OCwxMCArNDgwNyw4IEBACiAKIAljYXNlIFFfUElNOgogCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1BJTSwgUV9JUCwgUV9ERUZBVUxUKTsKLSNpZmRlZiBJTkVUNgogCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1BJTSwgUV9JUFY2LCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKLSNlbmRpZgogCQlicmVhazsKIAogI2lmbmRlZiBJUFBST1RPX1ZSUlAKQEAgLTM3ODIsNiArNDgxOSwxNCBAQAogCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1ZSUlAsIFFfSVAsIFFfREVGQVVMVCk7CiAJCWJyZWFrOwogCisjaWZuZGVmIElQUFJPVE9fQ0FSUAorI2RlZmluZSBJUFBST1RPX0NBUlAJMTEyCisjZW5kaWYKKworCWNhc2UgUV9DQVJQOgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0NBUlAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWJyZWFrOworCiAJY2FzZSBRX0lQOgogCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQKTsKIAkJYnJlYWs7CkBAIC0zODI1LDcgKzQ4NzAsNiBAQAogCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX01PUFJDKTsKIAkJYnJlYWs7CiAKLSNpZmRlZiBJTkVUNgogCWNhc2UgUV9JUFY2OgogCQliMSA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVBWNik7CiAJCWJyZWFrOwpAQCAtMzgzNiwxNyArNDg4MCwxNCBAQAogCWNhc2UgUV9JQ01QVjY6CiAJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fSUNNUFY2LCBRX0lQVjYsIFFfREVGQVVMVCk7CiAJCWJyZWFrOwotI2VuZGlmIC8qIElORVQ2ICovCiAKICNpZm5kZWYgSVBQUk9UT19BSAogI2RlZmluZSBJUFBST1RPX0FICTUxCiAjZW5kaWYKIAljYXNlIFFfQUg6CiAJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fQUgsIFFfSVAsIFFfREVGQVVMVCk7Ci0jaWZkZWYgSU5FVDYKIAkJYjAgPSBnZW5fcHJvdG8oSVBQUk9UT19BSCwgUV9JUFY2LCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKLSNlbmRpZgogCQlicmVhazsKIAogI2lmbmRlZiBJUFBST1RPX0VTUApAQCAtMzg1NCwxMCArNDg5NSw4IEBACiAjZW5kaWYKIAljYXNlIFFfRVNQOgogCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0VTUCwgUV9JUCwgUV9ERUZBVUxUKTsKLSNpZmRlZiBJTkVUNgogCQliMCA9IGdlbl9wcm90byhJUFBST1RPX0VTUCwgUV9JUFY2LCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKLSNlbmRpZgogCQlicmVhazsKIAogCWNhc2UgUV9JU086CkBAIC0zOTYzLDcgKzUwMDIsNyBAQAogCXN0cnVjdCBzbGlzdCAqczsKIAlzdHJ1Y3QgYmxvY2sgKmI7CiAKLQkvKiBub3QgaXAgZnJhZyAqLworCS8qIG5vdCBJUHY0IGZyYWcgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZnJhZyAqLwogCXMgPSBnZW5fbG9hZF9hKE9SX05FVCwgNiwgQlBGX0gpOwogCWIgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CiAJYi0+cy5rID0gMHgxZmZmOwpAQCAtMzk5MCw3ICs1MDI5LDYgQEAKIAlyZXR1cm4gZ2VuX2NtcChPUl9UUkFOX0lQVjQsIG9mZiwgQlBGX0gsIHYpOwogfQogCi0jaWZkZWYgSU5FVDYKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgogZ2VuX3BvcnRhdG9tNihvZmYsIHYpCiAJaW50IG9mZjsKQEAgLTM5OTgsNyArNTAzNiw2IEBACiB7CiAJcmV0dXJuIGdlbl9jbXAoT1JfVFJBTl9JUFY2LCBvZmYsIEJQRl9ILCB2KTsKIH0KLSNlbmRpZi8qSU5FVDYqLwogCiBzdHJ1Y3QgYmxvY2sgKgogZ2VuX3BvcnRvcChwb3J0LCBwcm90bywgZGlyKQpAQCAtNDAwNiw3ICs1MDQzLDcgQEAKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CiAKLQkvKiBpcCBwcm90byAncHJvdG8nICovCisJLyogaXAgcHJvdG8gJ3Byb3RvJyBhbmQgbm90IGEgZnJhZ21lbnQgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KIAl0bXAgPSBnZW5fY21wKE9SX05FVCwgOSwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOwogCWIwID0gZ2VuX2lwZnJhZygpOwogCWdlbl9hbmQodG1wLCBiMCk7CkBAIC00MDkwLDcgKzUxMjcsNiBAQAogCXJldHVybiBiMTsKIH0KIAotI2lmZGVmIElORVQ2CiBzdHJ1Y3QgYmxvY2sgKgogZ2VuX3BvcnRvcDYocG9ydCwgcHJvdG8sIGRpcikKIAlpbnQgcG9ydCwgcHJvdG8sIGRpcjsKQEAgLTQwOTgsNiArNTEzNCw3IEBACiAJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOwogCiAJLyogaXA2IHByb3RvICdwcm90bycgKi8KKwkvKiBYWFggLSBjYXRjaCB0aGUgZmlyc3QgZnJhZ21lbnQgb2YgYSBmcmFnbWVudGVkIHBhY2tldD8gKi8KIAliMCA9IGdlbl9jbXAoT1JfTkVULCA2LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CiAKIAlzd2l0Y2ggKGRpcikgewpAQCAtNDE2Miw3ICs1MTk5LDYgQEAKIAlnZW5fYW5kKGIwLCBiMSk7CiAJcmV0dXJuIGIxOwogfQotI2VuZGlmIC8qIElORVQ2ICovCiAKIC8qIGdlbl9wb3J0cmFuZ2UgY29kZSAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCkBAIC00MTk5LDcgKzUyMzUsNyBAQAogewogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKIAotCS8qIGlwIHByb3RvICdwcm90bycgKi8KKwkvKiBpcCBwcm90byAncHJvdG8nIGFuZCBub3QgYSBmcmFnbWVudCBvdGhlciB0aGFuIHRoZSBmaXJzdCBmcmFnbWVudCAqLwogCXRtcCA9IGdlbl9jbXAoT1JfTkVULCA5LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CiAJYjAgPSBnZW5faXBmcmFnKCk7CiAJZ2VuX2FuZCh0bXAsIGIwKTsKQEAgLTQyNjcsNyArNTMwMyw2IEBACiAJcmV0dXJuIGIxOwogfQogCi0jaWZkZWYgSU5FVDYKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgogZ2VuX3BvcnRyYW5nZWF0b202KG9mZiwgdjEsIHYyKQogCWludCBvZmY7CkBAIC00MzAzLDYgKzUzMzgsNyBAQAogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKIAogCS8qIGlwNiBwcm90byAncHJvdG8nICovCisJLyogWFhYIC0gY2F0Y2ggdGhlIGZpcnN0IGZyYWdtZW50IG9mIGEgZnJhZ21lbnRlZCBwYWNrZXQ/ICovCiAJYjAgPSBnZW5fY21wKE9SX05FVCwgNiwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOwogCiAJc3dpdGNoIChkaXIpIHsKQEAgLTQzNjcsNyArNTQwMyw2IEBACiAJZ2VuX2FuZChiMCwgYjEpOwogCXJldHVybiBiMTsKIH0KLSNlbmRpZiAvKiBJTkVUNiAqLwogCiBzdGF0aWMgaW50CiBsb29rdXBfcHJvdG8obmFtZSwgcHJvdG8pCkBAIC00NDU4LDcgKzU0OTMsOCBAQAogCX0KIAogCS8qCi0JICogV2UgZG9uJ3QgaGFuZGxlIHZhcmlhYmxlLWxlbmd0aCByYWRpb3RhcCBoZXJlIGhlYWRlcnMgeWV0LgorCSAqIFdlIGRvbid0IGhhbmRsZSB2YXJpYWJsZS1sZW5ndGggcHJlZml4ZXMgYmVmb3JlIHRoZSBsaW5rLWxheWVyCisJICogaGVhZGVyLCBvciB2YXJpYWJsZS1sZW5ndGggbGluay1sYXllciBoZWFkZXJzLCBoZXJlIHlldC4KIAkgKiBXZSBtaWdodCB3YW50IHRvIGFkZCBCUEYgaW5zdHJ1Y3Rpb25zIHRvIGRvIHRoZSBwcm90b2NoYWluCiAJICogd29yaywgdG8gc2ltcGxpZnkgdGhhdCBhbmQsIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgYSBCUEYKIAkgKiBpbnRlcnByZXRlciB3aXRoIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLCBsZXQgdGhlIGZpbHRlcmluZwpAQCAtNDQ2NywxMSArNTUwMywxNSBAQAogCSAqIGJyYW5jaGVzLCBhbmQgYmFja3dhcmQgYnJhbmNoIHN1cHBvcnQgaXMgdW5saWtlbHkgdG8gYXBwZWFyCiAJICogaW4ga2VybmVsIEJQRiBlbmdpbmVzLikKIAkgKi8KLQlpZiAobGlua3R5cGUgPT0gRExUX0lFRUU4MDJfMTFfUkFESU8pCi0JCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG5vdCBzdXBwb3J0ZWQgd2l0aCByYWRpb3RhcCBoZWFkZXJzIik7CisJc3dpdGNoIChsaW5rdHlwZSkgewogCi0JaWYgKGxpbmt0eXBlID09IERMVF9QUEkpCi0JCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG5vdCBzdXBwb3J0ZWQgd2l0aCBQUEkgaGVhZGVycyIpOworCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJY2FzZSBETFRfUFBJOgorCQlicGZfZXJyb3IoIidwcm90b2NoYWluJyBub3Qgc3VwcG9ydGVkIHdpdGggODAyLjExIik7CisJfQogCiAJbm9fb3B0aW1pemUgPSAxOyAvKnRoaXMgY29kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9wdGltemVyIHlldCAqLwogCkBAIC00NDkwLDI3ICs1NTMwLDI3IEBACiAKIAkJLyogQSA9IGlwLT5pcF9wICovCiAJCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xCUEZfQik7Ci0JCXNbaV0tPnMuayA9IG9mZl9sbCArIG9mZl9ubCArIDk7CisJCXNbaV0tPnMuayA9IG9mZl9tYWNwbCArIG9mZl9ubCArIDk7CiAJCWkrKzsKIAkJLyogWCA9IGlwLT5pcF9obCA8PCAyICovCiAJCXNbaV0gPSBuZXdfc3RtdChCUEZfTERYfEJQRl9NU0h8QlBGX0IpOwotCQlzW2ldLT5zLmsgPSBvZmZfbGwgKyBvZmZfbmw7CisJCXNbaV0tPnMuayA9IG9mZl9tYWNwbCArIG9mZl9ubDsKIAkJaSsrOwogCQlicmVhazsKLSNpZmRlZiBJTkVUNgorCiAJY2FzZSBRX0lQVjY6CiAJCWIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKIAogCQkvKiBBID0gaXA2LT5pcF9ueHQgKi8KIAkJc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfEJQRl9CKTsKLQkJc1tpXS0+cy5rID0gb2ZmX2xsICsgb2ZmX25sICsgNjsKKwkJc1tpXS0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sICsgNjsKIAkJaSsrOwogCQkvKiBYID0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKSAqLwogCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfSU1NKTsKIAkJc1tpXS0+cy5rID0gNDA7CiAJCWkrKzsKIAkJYnJlYWs7Ci0jZW5kaWYKKwogCWRlZmF1bHQ6CiAJCWJwZl9lcnJvcigidW5zdXBwb3J0ZWQgcHJvdG8gdG8gZ2VuX3Byb3RvY2hhaW4iKTsKIAkJLypOT1RSRUFDSEVEKi8KQEAgLTQ1MzcsNyArNTU3Nyw2IEBACiAJZml4MiA9IGk7CiAJaSsrOwogCi0jaWZkZWYgSU5FVDYKIAlpZiAocHJvdG8gPT0gUV9JUFY2KSB7CiAJCWludCB2NnN0YXJ0LCB2NmVuZCwgdjZhZHZhbmNlLCBqOwogCkBAIC00NTc1LDMzICs1NjE0LDIwIEBACiAKIAkJLyoKIAkJICogaW4gc2hvcnQsCi0JCSAqIEEgPSBQW1hdOwotCQkgKiBYID0gWCArIChQW1ggKyAxXSArIDEpICogODsKKwkJICogQSA9IFBbWCArIHBhY2tldCBoZWFkXTsKKwkJICogWCA9IFggKyAoUFtYICsgcGFja2V0IGhlYWQgKyAxXSArIDEpICogODsKIAkJICovCi0JCS8qIEEgPSBYICovCi0JCXNbaV0gPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVFhBKTsKLQkJaSsrOwogCQkvKiBBID0gUFtYICsgcGFja2V0IGhlYWRdICovCiAJCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7Ci0JCXNbaV0tPnMuayA9IG9mZl9sbCArIG9mZl9ubDsKKwkJc1tpXS0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sOwogCQlpKys7CiAJCS8qIE1FTVtyZWcyXSA9IEEgKi8KIAkJc1tpXSA9IG5ld19zdG10KEJQRl9TVCk7CiAJCXNbaV0tPnMuayA9IHJlZzI7CiAJCWkrKzsKLQkJLyogQSA9IFggKi8KLQkJc1tpXSA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UWEEpOwotCQlpKys7Ci0JCS8qIEEgKz0gMSAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKLQkJc1tpXS0+cy5rID0gMTsKLQkJaSsrOwotCQkvKiBYID0gQSAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7Ci0JCWkrKzsKLQkJLyogQSA9IFBbWCArIHBhY2tldCBoZWFkXTsgKi8KKwkJLyogQSA9IFBbWCArIHBhY2tldCBoZWFkICsgMV07ICovCiAJCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7Ci0JCXNbaV0tPnMuayA9IG9mZl9sbCArIG9mZl9ubDsKKwkJc1tpXS0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sICsgMTsKIAkJaSsrOwogCQkvKiBBICs9IDEgKi8KIAkJc1tpXSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CkBAIC00NjExLDYgKzU2MzcsMTAgQEAKIAkJc1tpXSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX01VTHxCUEZfSyk7CiAJCXNbaV0tPnMuayA9IDg7CiAJCWkrKzsKKwkJLyogQSArPSBYICovCisJCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpOworCQlzW2ldLT5zLmsgPSAwOworCQlpKys7CiAJCS8qIFggPSBBOyAqLwogCQlzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CiAJCWkrKzsKQEAgLTQ2MjgsOSArNTY1OCw3IEBACiAJCS8qIGZpeHVwICovCiAJCWZvciAoaiA9IHY2c3RhcnQ7IGogPD0gdjZlbmQ7IGorKykKIAkJCXNbal0tPnMuanQgPSBzW3Y2YWR2YW5jZV07Ci0JfSBlbHNlCi0jZW5kaWYKLQl7CisJfSBlbHNlIHsKIAkJLyogbm9wICovCiAJCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0spOwogCQlzW2ldLT5zLmsgPSAwOwpAQCAtNDY2MCw3ICs1Njg4LDcgQEAKIAlpKys7CiAJLyogQSA9IFBbWCArIHBhY2tldCBoZWFkXTsgKi8KIAlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0IpOwotCXNbaV0tPnMuayA9IG9mZl9sbCArIG9mZl9ubDsKKwlzW2ldLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmw7CiAJaSsrOwogCS8qIE1FTVtyZWcyXSA9IEEgKi8KIAlzW2ldID0gbmV3X3N0bXQoQlBGX1NUKTsKQEAgLTQ2NzgsNyArNTcwNiw3IEBACiAJaSsrOwogCS8qIEEgPSBQW1ggKyBwYWNrZXQgaGVhZF0gKi8KIAlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0IpOwotCXNbaV0tPnMuayA9IG9mZl9sbCArIG9mZl9ubDsKKwlzW2ldLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmw7CiAJaSsrOwogCS8qIEEgKz0gMiAqLwogCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0spOwpAQCAtNDczMiw2ICs1NzYwLDMxIEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fY2hlY2tfODAyXzExX2RhdGFfZnJhbWUoKQoreworCXN0cnVjdCBzbGlzdCAqczsKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CisKKwkvKgorCSAqIEEgZGF0YSBmcmFtZSBoYXMgdGhlIDB4MDggYml0IChiMykgaW4gdGhlIGZyYW1lIGNvbnRyb2wgZmllbGQgc2V0CisJICogYW5kIHRoZSAweDA0IGJpdCAoYjIpIGNsZWFyLgorCSAqLworCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKKwliMCA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwliMC0+cy5rID0gMHgwODsKKwliMC0+c3RtdHMgPSBzOworCQorCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKKwliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwliMS0+cy5rID0gMHgwNDsKKwliMS0+c3RtdHMgPSBzOworCWdlbl9ub3QoYjEpOworCisJZ2VuX2FuZChiMSwgYjApOworCisJcmV0dXJuIGIwOworfQogCiAvKgogICogR2VuZXJhdGUgY29kZSB0aGF0IGNoZWNrcyB3aGV0aGVyIHRoZSBwYWNrZXQgaXMgYSBwYWNrZXQgZm9yIHByb3RvY29sCkBAIC00NzQ5LDIwICs1ODAyLDIwIEBACiAJaW50IGRpcjsKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CisjaWZuZGVmIENIQVNFX0NIQUlOCisJc3RydWN0IGJsb2NrICpiMjsKKyNlbmRpZgogCiAJaWYgKGRpciAhPSBRX0RFRkFVTFQpCiAJCWJwZl9lcnJvcigiZGlyZWN0aW9uIGFwcGxpZWQgdG8gJ3Byb3RvJyIpOwogCiAJc3dpdGNoIChwcm90bykgewogCWNhc2UgUV9ERUZBVUxUOgotI2lmZGVmIElORVQ2CiAJCWIwID0gZ2VuX3Byb3RvKHYsIFFfSVAsIGRpcik7CiAJCWIxID0gZ2VuX3Byb3RvKHYsIFFfSVBWNiwgZGlyKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKLSNlbHNlCi0JCS8qRkFMTFRIUk9VR0gqLwotI2VuZGlmCisKIAljYXNlIFFfSVA6CiAJCS8qCiAJCSAqIEZvciBGRERJLCBSRkMgMTE4OCBzYXlzIHRoYXQgU05BUCBlbmNhcHN1bGF0aW9uIGlzIHVzZWQsCkBAIC00OTA5LDExICs1OTYyLDIyIEBACiAJCWJwZl9lcnJvcigiJ3ZycnAgcHJvdG8nIGlzIGJvZ3VzIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAotI2lmZGVmIElORVQ2CisJY2FzZSBRX0NBUlA6CisJCWJwZl9lcnJvcigiJ2NhcnAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwogCWNhc2UgUV9JUFY2OgogCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVBWNik7CiAjaWZuZGVmIENIQVNFX0NIQUlOCi0JCWIxID0gZ2VuX2NtcChPUl9ORVQsIDYsIEJQRl9CLCAoYnBmX2ludDMyKXYpOworCQkvKgorCQkgKiBBbHNvIGNoZWNrIGZvciBhIGZyYWdtZW50IGhlYWRlciBiZWZvcmUgdGhlIGZpbmFsCisJCSAqIGhlYWRlci4KKwkJICovCisJCWIyID0gZ2VuX2NtcChPUl9ORVQsIDYsIEJQRl9CLCBJUFBST1RPX0ZSQUdNRU5UKTsKKwkJYjEgPSBnZW5fY21wKE9SX05FVCwgNDAsIEJQRl9CLCAoYnBmX2ludDMyKXYpOworCQlnZW5fYW5kKGIyLCBiMSk7CisJCWIyID0gZ2VuX2NtcChPUl9ORVQsIDYsIEJQRl9CLCAoYnBmX2ludDMyKXYpOworCQlnZW5fb3IoYjIsIGIxKTsKICNlbHNlCiAJCWIxID0gZ2VuX3Byb3RvY2hhaW4odiwgUV9JUFY2KTsKICNlbmRpZgpAQCAtNDkyMiw3ICs1OTg2LDYgQEAKIAogCWNhc2UgUV9JQ01QVjY6CiAJCWJwZl9lcnJvcigiJ2ljbXA2IHByb3RvJyBpcyBib2d1cyIpOwotI2VuZGlmIC8qIElORVQ2ICovCiAKIAljYXNlIFFfQUg6CiAJCWJwZl9lcnJvcigiJ2FoIHByb3RvJyBpcyBib2d1cyIpOwpAQCAtNDk5Miw2ICs2MDU1LDggQEAKIAkJCXN3aXRjaCAobGlua3R5cGUpIHsKIAogCQkJY2FzZSBETFRfRU4xME1COgorCQkJY2FzZSBETFRfTkVUQU5BTFlaRVI6CisJCQljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKIAkJCQllYWRkciA9IHBjYXBfZXRoZXJfaG9zdHRvbihuYW1lKTsKIAkJCQlpZiAoZWFkZHIgPT0gTlVMTCkKIAkJCQkJYnBmX2Vycm9yKApAQCAtNTAxOSw5ICs2MDg0LDkgQEAKIAkJCQlyZXR1cm4gYjsKIAogCQkJY2FzZSBETFRfSUVFRTgwMl8xMToKKwkJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKIAkJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgogCQkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKLQkJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKIAkJCWNhc2UgRExUX1BQSToKIAkJCQllYWRkciA9IHBjYXBfZXRoZXJfaG9zdHRvbihuYW1lKTsKIAkJCQlpZiAoZWFkZHIgPT0gTlVMTCkKQEAgLTUwOTIsNiArNjE1Nyw3IEBACiAJCQlyZXMwID0gcmVzID0gcGNhcF9uYW1ldG9hZGRyaW5mbyhuYW1lKTsKIAkJCWlmIChyZXMgPT0gTlVMTCkKIAkJCQlicGZfZXJyb3IoInVua25vd24gaG9zdCAnJXMnIiwgbmFtZSk7CisJCQlhaSA9IHJlczsKIAkJCWIgPSB0bXAgPSBOVUxMOwogCQkJdHByb3RvID0gdHByb3RvNiA9IHByb3RvOwogCQkJaWYgKG9mZl9saW5rdHlwZSA9PSAtMSAmJiB0cHJvdG8gPT0gUV9ERUZBVUxUKSB7CkBAIC01MTI1LDYgKzYxOTEsNyBAQAogCQkJCQlnZW5fb3IoYiwgdG1wKTsKIAkJCQliID0gdG1wOwogCQkJfQorCQkJYWkgPSBOVUxMOwogCQkJZnJlZWFkZHJpbmZvKHJlczApOwogCQkJaWYgKGIgPT0gTlVMTCkgewogCQkJCWJwZl9lcnJvcigidW5rbm93biBob3N0ICclcyclcyIsIG5hbWUsCkBAIC01MTcxLDEzICs2MjM4LDEzIEBACiAJCQkJLyogb3ZlcnJpZGUgUFJPVE9fVU5ERUYgKi8KIAkJCQlyZWFsX3Byb3RvID0gSVBQUk9UT19TQ1RQOwogCQl9Ci0jaWZuZGVmIElORVQ2Ci0JCXJldHVybiBnZW5fcG9ydChwb3J0LCByZWFsX3Byb3RvLCBkaXIpOwotI2Vsc2UKKwkJaWYgKHBvcnQgPCAwKQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQpOworCQlpZiAocG9ydCA+IDY1NTM1KQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0KTsKIAkJYiA9IGdlbl9wb3J0KHBvcnQsIHJlYWxfcHJvdG8sIGRpcik7CiAJCWdlbl9vcihnZW5fcG9ydDYocG9ydCwgcmVhbF9wcm90bywgZGlyKSwgYik7CiAJCXJldHVybiBiOwotI2VuZGlmIC8qIElORVQ2ICovCiAKIAljYXNlIFFfUE9SVFJBTkdFOgogCQlpZiAocHJvdG8gIT0gUV9ERUZBVUxUICYmCkBAIC01MjEyLDEzICs2Mjc5LDE4IEBACiAJCQkJLyogb3ZlcnJpZGUgUFJPVE9fVU5ERUYgKi8KIAkJCQlyZWFsX3Byb3RvID0gSVBQUk9UT19TQ1RQOwkKIAkJfQotI2lmbmRlZiBJTkVUNgotCQlyZXR1cm4gZ2VuX3BvcnRyYW5nZShwb3J0MSwgcG9ydDIsIHJlYWxfcHJvdG8sIGRpcik7Ci0jZWxzZQorCQlpZiAocG9ydDEgPCAwKQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQxKTsKKwkJaWYgKHBvcnQxID4gNjU1MzUpCisJCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJWQgPiA2NTUzNSIsIHBvcnQxKTsKKwkJaWYgKHBvcnQyIDwgMCkKKwkJCWJwZl9lcnJvcigiaWxsZWdhbCBwb3J0IG51bWJlciAlZCA8IDAiLCBwb3J0Mik7CisJCWlmIChwb3J0MiA+IDY1NTM1KQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0Mik7CisKIAkJYiA9IGdlbl9wb3J0cmFuZ2UocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpOwogCQlnZW5fb3IoZ2VuX3BvcnRyYW5nZTYocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpLCBiKTsKIAkJcmV0dXJuIGI7Ci0jZW5kaWYgLyogSU5FVDYgKi8KIAogCWNhc2UgUV9HQVRFV0FZOgogI2lmbmRlZiBJTkVUNgpAQCAtNTI1MCw3ICs2MzIyLDYgQEAKIAkJZWxzZQogCQkJYnBmX2Vycm9yKCJ1bmtub3duIHByb3RvY29sOiAlcyIsIG5hbWUpOwogCi0KIAljYXNlIFFfVU5ERUY6CiAJCXN5bnRheCgpOwogCQkvKiBOT1RSRUFDSEVEICovCkBAIC01MzY0LDE2ICs2NDM1LDE1IEBACiAJCWVsc2UKIAkJCWJwZl9lcnJvcigiaWxsZWdhbCBxdWFsaWZpZXIgb2YgJ3BvcnQnIik7CiAKLSNpZm5kZWYgSU5FVDYKLQkJcmV0dXJuIGdlbl9wb3J0KChpbnQpdiwgcHJvdG8sIGRpcik7Ci0jZWxzZQorCQlpZiAodiA+IDY1NTM1KQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICV1ID4gNjU1MzUiLCB2KTsKKwogCSAgICB7CiAJCXN0cnVjdCBibG9jayAqYjsKIAkJYiA9IGdlbl9wb3J0KChpbnQpdiwgcHJvdG8sIGRpcik7CiAJCWdlbl9vcihnZW5fcG9ydDYoKGludCl2LCBwcm90bywgZGlyKSwgYik7CiAJCXJldHVybiBiOwogCSAgICB9Ci0jZW5kaWYgLyogSU5FVDYgKi8KIAogCWNhc2UgUV9QT1JUUkFOR0U6CiAJCWlmIChwcm90byA9PSBRX1VEUCkKQEAgLTUzODcsMTYgKzY0NTcsMTUgQEAKIAkJZWxzZQogCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydHJhbmdlJyIpOwogCi0jaWZuZGVmIElORVQ2Ci0JCXJldHVybiBnZW5fcG9ydHJhbmdlKChpbnQpdiwgKGludCl2LCBwcm90bywgZGlyKTsKLSNlbHNlCisJCWlmICh2ID4gNjU1MzUpCisJCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJXUgPiA2NTUzNSIsIHYpOworCiAJICAgIHsKIAkJc3RydWN0IGJsb2NrICpiOwogCQliID0gZ2VuX3BvcnRyYW5nZSgoaW50KXYsIChpbnQpdiwgcHJvdG8sIGRpcik7CiAJCWdlbl9vcihnZW5fcG9ydHJhbmdlNigoaW50KXYsIChpbnQpdiwgcHJvdG8sIGRpciksIGIpOwogCQlyZXR1cm4gYjsKIAkgICAgfQotI2VuZGlmIC8qIElORVQ2ICovCiAKIAljYXNlIFFfR0FURVdBWToKIAkJYnBmX2Vycm9yKCInZ2F0ZXdheScgcmVxdWlyZXMgYSBuYW1lIik7CkBAIC01NDM4LDYgKzY1MDcsNyBAQAogCXJlcyA9IHBjYXBfbmFtZXRvYWRkcmluZm8oczEpOwogCWlmICghcmVzKQogCQlicGZfZXJyb3IoImludmFsaWQgaXA2IGFkZHJlc3MgJXMiLCBzMSk7CisJYWkgPSByZXM7CiAJaWYgKHJlcy0+YWlfbmV4dCkKIAkJYnBmX2Vycm9yKCIlcyByZXNvbHZlZCB0byBtdWx0aXBsZSBhZGRyZXNzIiwgczEpOwogCWFkZHIgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopcmVzLT5haV9hZGRyKS0+c2luNl9hZGRyOwpAQCAtNTQ2OCw2ICs2NTM4LDcgQEAKIAogCWNhc2UgUV9ORVQ6CiAJCWIgPSBnZW5faG9zdDYoYWRkciwgJm1hc2ssIHEucHJvdG8sIHEuZGlyLCBxLmFkZHIpOworCQlhaSA9IE5VTEw7CiAJCWZyZWVhZGRyaW5mbyhyZXMpOwogCQlyZXR1cm4gYjsKIApAQCAtNTQ4Nyw0NCArNjU1OCw0NiBAQAogCXN0cnVjdCBibG9jayAqYiwgKnRtcDsKIAogCWlmICgocS5hZGRyID09IFFfSE9TVCB8fCBxLmFkZHIgPT0gUV9ERUZBVUxUKSAmJiBxLnByb3RvID09IFFfTElOSykgewotICAgICAgICAgICAgc3dpdGNoIChsaW5rdHlwZSkgewotICAgICAgICAgICAgY2FzZSBETFRfRU4xME1COgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5fZWhvc3RvcChlYWRkciwgKGludClxLmRpcik7Ci0gICAgICAgICAgICBjYXNlIERMVF9GRERJOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5fZmhvc3RvcChlYWRkciwgKGludClxLmRpcik7Ci0gICAgICAgICAgICBjYXNlIERMVF9JRUVFODAyOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5fdGhvc3RvcChlYWRkciwgKGludClxLmRpcik7Ci0JCQljYXNlIERMVF9JRUVFODAyXzExOgotCQkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6Ci0JCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgotCQkJY2FzZSBETFRfUFJJU01fSEVBREVSOgotCQkJY2FzZSBETFRfUFBJOgotCQkJCXJldHVybiBnZW5fd2xhbmhvc3RvcChlYWRkciwgKGludClxLmRpcik7Ci0JCQljYXNlIERMVF9TVU5BVE06Ci0JCQkJaWYgKGlzX2xhbmUpIHsKLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgotCQkJCQkgKiBMRSBDb250cm9sIG1hcmtlci4gIChXZSd2ZSBhbHJlYWR5IGdlbmVyYXRlZAotCQkJCQkgKiBhIHRlc3QgZm9yIExBTkUuKQotCQkJCQkgKi8KLQkJCQkJdG1wID0gZ2VuX2NtcChPUl9MSU5LLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywgQlBGX0gsCi0JCQkJCQkweEZGMDApOwotCQkJCQlnZW5fbm90KHRtcCk7CisJCXN3aXRjaCAobGlua3R5cGUpIHsKKwkJY2FzZSBETFRfRU4xME1COgorCQljYXNlIERMVF9ORVRBTkFMWVpFUjoKKwkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisJCQlyZXR1cm4gZ2VuX2Vob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpOworCQljYXNlIERMVF9GRERJOgorCQkJcmV0dXJuIGdlbl9maG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwkJY2FzZSBETFRfSUVFRTgwMjoKKwkJCXJldHVybiBnZW5fdGhvc3RvcChlYWRkciwgKGludClxLmRpcik7CisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWNhc2UgRExUX1BQSToKKwkJCXJldHVybiBnZW5fd2xhbmhvc3RvcChlYWRkciwgKGludClxLmRpcik7CisJCWNhc2UgRExUX1NVTkFUTToKKwkJCWlmIChpc19sYW5lKSB7CisJCQkJLyoKKwkJCQkgKiBDaGVjayB0aGF0IHRoZSBwYWNrZXQgZG9lc24ndCBiZWdpbiB3aXRoIGFuCisJCQkJICogTEUgQ29udHJvbCBtYXJrZXIuICAoV2UndmUgYWxyZWFkeSBnZW5lcmF0ZWQKKwkJCQkgKiBhIHRlc3QgZm9yIExBTkUuKQorCQkJCSAqLworCQkJCXRtcCA9IGdlbl9jbXAoT1JfTElOSywgU1VOQVRNX1BLVF9CRUdJTl9QT1MsIEJQRl9ILAorCQkJCQkweEZGMDApOworCQkJCWdlbl9ub3QodG1wKTsKIAotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgdGhlIE1BQyBhZGRyZXNzLgotCQkJCQkgKi8KLQkJCQkJYiA9IGdlbl9laG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKLQkJCQkJZ2VuX2FuZCh0bXAsIGIpOwotCQkJCQlyZXR1cm4gYjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERMVF9JUF9PVkVSX0ZDOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5faXBmY2hvc3RvcChlYWRkciwgKGludClxLmRpcik7Ci0gICAgICAgICAgICBkZWZhdWx0OgotCQkJCWJwZl9lcnJvcigiZXRoZXJuZXQgYWRkcmVzc2VzIHN1cHBvcnRlZCBvbmx5IG9uIGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorCQkJCS8qCisJCQkJICogTm93IGNoZWNrIHRoZSBNQUMgYWRkcmVzcy4KKwkJCQkgKi8KKwkJCQliID0gZ2VuX2Vob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpOworCQkJCWdlbl9hbmQodG1wLCBiKTsKKwkJCQlyZXR1cm4gYjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERMVF9JUF9PVkVSX0ZDOgorCQkJcmV0dXJuIGdlbl9pcGZjaG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwkJZGVmYXVsdDoKKwkJCWJwZl9lcnJvcigiZXRoZXJuZXQgYWRkcmVzc2VzIHN1cHBvcnRlZCBvbmx5IG9uIGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOworCQkJYnJlYWs7CisJCX0KIAl9CiAJYnBmX2Vycm9yKCJldGhlcm5ldCBhZGRyZXNzIHVzZWQgaW4gbm9uLWV0aGVyIGV4cHJlc3Npb24iKTsKIAkvKiBOT1RSRUFDSEVEICovCkBAIC01NjE4LDcgKzY2OTEsNyBAQAogCiAJCS8qCiAJCSAqIExvYWQgaW50byB0aGUgWCByZWdpc3RlciB0aGUgb2Zmc2V0IGNvbXB1dGVkIGludG8gdGhlCi0JCSAqIHJlZ2lzdGVyIHNwZWNpZmVkIGJ5ICJpbmRleCIuCisJCSAqIHJlZ2lzdGVyIHNwZWNpZmllZCBieSAiaW5kZXgiLgogCQkgKi8KIAkJcyA9IHhmZXJfdG9feChpbnN0KTsKIApAQCAtNTY1MCw3ICs2NzIzLDcgQEAKIAkJICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyLiAgQWRkIHRvIGl0IHRoZSBvZmZzZXQgY29tcHV0ZWQKIAkJICogaW50byB0aGUgcmVnaXN0ZXIgc3BlY2lmaWVkIGJ5ICJpbmRleCIsIGFuZCBtb3ZlIHRoYXQKIAkJICogaW50byB0aGUgWCByZWdpc3Rlci4gIE90aGVyd2lzZSwganVzdCBsb2FkIGludG8gdGhlIFgKLQkJICogcmVnaXN0ZXIgdGhlIG9mZnNldCBjb21wdXRlZCBpbnRvIHRoZSByZWdpc3RlciBzcGVjaWZlZAorCQkgKiByZWdpc3RlciB0aGUgb2Zmc2V0IGNvbXB1dGVkIGludG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAogCQkgKiBieSAiaW5kZXgiLgogCQkgKi8KIAkJaWYgKHMgIT0gTlVMTCkgewpAQCAtNTY4MiwyNCArNjc1NSwyMiBAQAogCWNhc2UgUV9MQVQ6CiAJY2FzZSBRX01PUFJDOgogCWNhc2UgUV9NT1BETDoKLSNpZmRlZiBJTkVUNgogCWNhc2UgUV9JUFY2OgotI2VuZGlmCiAJCS8qCiAJCSAqIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgogCQkgKiB0aGUgbmV0d29yay1sYXllciBoZWFkZXIuCiAJCSAqIFhYWCAtIGFyZSB0aGVyZSBhbnkgY2FzZXMgd2hlcmUgd2Ugd2FudAogCQkgKiBvZmZfbmxfbm9zbmFwPwogCQkgKi8KLQkJcyA9IGdlbl9sbHByZWZpeGxlbigpOworCQlzID0gZ2VuX29mZl9tYWNwbCgpOwogCiAJCS8qCiAJCSAqIElmICJzIiBpcyBub24tbnVsbCwgaXQgaGFzIGNvZGUgdG8gYXJyYW5nZSB0aGF0IHRoZQotCQkgKiBYIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBwcmVjZWRpbmcKLQkJICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyLiAgQWRkIHRvIGl0IHRoZSBvZmZzZXQgY29tcHV0ZWQKLQkJICogaW50byB0aGUgcmVnaXN0ZXIgc3BlY2lmaWVkIGJ5ICJpbmRleCIsIGFuZCBtb3ZlIHRoYXQKLQkJICogaW50byB0aGUgWCByZWdpc3Rlci4gIE90aGVyd2lzZSwganVzdCBsb2FkIGludG8gdGhlIFgKLQkJICogcmVnaXN0ZXIgdGhlIG9mZnNldCBjb21wdXRlZCBpbnRvIHRoZSByZWdpc3RlciBzcGVjaWZlZAorCQkgKiBYIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBvZmZzZXQgb2YgdGhlIE1BQy1sYXllcgorCQkgKiBwYXlsb2FkLiAgQWRkIHRvIGl0IHRoZSBvZmZzZXQgY29tcHV0ZWQgaW50byB0aGUKKwkJICogcmVnaXN0ZXIgc3BlY2lmaWVkIGJ5ICJpbmRleCIsIGFuZCBtb3ZlIHRoYXQgaW50bworCQkgKiB0aGUgWCByZWdpc3Rlci4gIE90aGVyd2lzZSwganVzdCBsb2FkIGludG8gdGhlIFgKKwkJICogcmVnaXN0ZXIgdGhlIG9mZnNldCBjb21wdXRlZCBpbnRvIHRoZSByZWdpc3RlciBzcGVjaWZpZWQKIAkJICogYnkgImluZGV4Ii4KIAkJICovCiAJCWlmIChzICE9IE5VTEwpIHsKQEAgLTU3MTIsMTMgKzY3ODMsMTcgQEAKIAkJLyoKIAkJICogTG9hZCB0aGUgaXRlbSBhdCB0aGUgc3VtIG9mIHRoZSBvZmZzZXQgd2UndmUgcHV0IGluIHRoZQogCQkgKiBYIHJlZ2lzdGVyLCB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgbmV0d29yawotCQkgKiBsYXllciBoZWFkZXIsIGFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgbGluawotCQkgKiBsYXllciBoZWFkZXIgKHdoaWNoIGlzIDAgaWYgdGhlIHJhZGlvIGhlYWRlciBpcwotCQkgKiB2YXJpYWJsZS1sZW5ndGg7IHRoYXQgaGVhZGVyIGxlbmd0aCBpcyB3aGF0IHdlIHB1dAotCQkgKiBpbnRvIHRoZSBYIHJlZ2lzdGVyIGFuZCB0aGVuIGFkZGVkIHRvIHRoZSBpbmRleCkuCisJCSAqIGxheWVyIGhlYWRlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BQy1sYXllcgorCQkgKiBwYXlsb2FkLCBhbmQgdGhlIHB1cnBvcnRlZCBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZQorCQkgKiBNQUMtbGF5ZXIgcGF5bG9hZCAod2hpY2ggbWlnaHQgYmUgMCBpZiB0aGVyZSdzIGEKKwkJICogdmFyaWFibGUtbGVuZ3RoIHByZWZpeCBiZWZvcmUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyCisJCSAqIG9yIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpdHNlbGYgaXMgdmFyaWFibGUtbGVuZ3RoOworCQkgKiB0aGUgdmFyaWFibGUtbGVuZ3RoIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlCisJCSAqIE1BQy1sYXllciBwYXlsb2FkIGlzIHdoYXQgd2UgcHV0IGludG8gdGhlIFggcmVnaXN0ZXIKKwkJICogYW5kIHRoZW4gYWRkZWQgdG8gdGhlIGluZGV4KS4KIAkJICovCiAJCXRtcCA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOwotCQl0bXAtPnMuayA9IG9mZl9sbCArIG9mZl9ubDsKKwkJdG1wLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmw7CiAJCXNhcHBlbmQocywgdG1wKTsKIAkJc2FwcGVuZChpbnN0LT5zLCBzKTsKIApAQCAtNTc0MCw2ICs2ODE1LDcgQEAKIAljYXNlIFFfSUdSUDoKIAljYXNlIFFfUElNOgogCWNhc2UgUV9WUlJQOgorCWNhc2UgUV9DQVJQOgogCQkvKgogCQkgKiBUaGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YKIAkJICogdGhlIHRyYW5zcG9ydC1sYXllciBoZWFkZXIuCkBAIC01NzU5LDIyICs2ODM1LDI0IEBACiAJCS8qCiAJCSAqIFRoZSBYIHJlZ2lzdGVyIG5vdyBjb250YWlucyB0aGUgc3VtIG9mIHRoZSBsZW5ndGgKIAkJICogb2YgYW55IHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIgcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyCi0JCSAqIGhlYWRlciBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmV0d29yay1sYXllciBoZWFkZXIuCisJCSAqIGhlYWRlciwgYW55IHZhcmlhYmxlLWxlbmd0aCBsaW5rLWxheWVyIGhlYWRlciwgYW5kIHRoZQorCQkgKiBsZW5ndGggb2YgdGhlIG5ldHdvcmstbGF5ZXIgaGVhZGVyLgorCQkgKgogCQkgKiBMb2FkIGludG8gdGhlIEEgcmVnaXN0ZXIgdGhlIG9mZnNldCByZWxhdGl2ZSB0bwogCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc3BvcnQgbGF5ZXIgaGVhZGVyLAogCQkgKiBhZGQgdGhlIFggcmVnaXN0ZXIgdG8gdGhhdCwgbW92ZSB0aGF0IHRvIHRoZQogCQkgKiBYIHJlZ2lzdGVyLCBhbmQgbG9hZCB3aXRoIGFuIG9mZnNldCBmcm9tIHRoZQogCQkgKiBYIHJlZ2lzdGVyIGVxdWFsIHRvIHRoZSBvZmZzZXQgb2YgdGhlIG5ldHdvcmsKIAkJICogbGF5ZXIgaGVhZGVyIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YKLQkJICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHBsdXMgdGhlIGxlbmd0aCBvZiBhbnkKLQkJICogZml4ZWQtbGVuZ3RoIGhlYWRlciBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIKLQkJICogaGVhZGVyLgorCQkgKiB0aGUgTUFDLWxheWVyIHBheWxvYWQgcGx1cyB0aGUgZml4ZWQtbGVuZ3RoCisJCSAqIHBvcnRpb24gb2YgdGhlIG9mZnNldCBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQKKwkJICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYXcgcGFja2V0IGRhdGEuCiAJCSAqLwogCQlzYXBwZW5kKHMsIHhmZXJfdG9fYShpbnN0KSk7CiAJCXNhcHBlbmQocywgbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9YKSk7CiAJCXNhcHBlbmQocywgbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCkpOwogCQlzYXBwZW5kKHMsIHRtcCA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpKTsKLQkJdG1wLT5zLmsgPSBvZmZfbGwgKyBvZmZfbmw7CisJCXRtcC0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sOwogCQlzYXBwZW5kKGluc3QtPnMsIHMpOwogCiAJCS8qCkBAIC01Nzg2LDE2ICs2ODY0LDEyIEBACiAJCWdlbl9hbmQoZ2VuX3Byb3RvX2FiYnJldihwcm90byksIGIgPSBnZW5faXBmcmFnKCkpOwogCQlpZiAoaW5zdC0+YikKIAkJCWdlbl9hbmQoaW5zdC0+YiwgYik7Ci0jaWZkZWYgSU5FVDYKIAkJZ2VuX2FuZChnZW5fcHJvdG9fYWJicmV2KFFfSVApLCBiKTsKLSNlbmRpZgogCQlpbnN0LT5iID0gYjsKIAkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKIAljYXNlIFFfSUNNUFY2OgogCQlicGZfZXJyb3IoIklQdjYgdXBwZXItbGF5ZXIgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBieSBwcm90b1t4XSIpOwogCQkvKk5PVFJFQUNIRUQqLwotI2VuZGlmCiAJfQogCWluc3QtPnJlZ25vID0gcmVnbm87CiAJcyA9IG5ld19zdG10KEJQRl9TVCk7CkBAIC01OTQxLDYgKzcwMTUsMTYgQEAKIHN0YXRpYyBpbnQgY3VycmVnOwogCiAvKgorICogSW5pdGlhbGl6ZSB0aGUgdGFibGUgb2YgdXNlZCByZWdpc3RlcnMgYW5kIHRoZSBjdXJyZW50IHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZAoraW5pdF9yZWdzKCkKK3sKKwljdXJyZWcgPSAwOworCW1lbXNldChyZWd1c2VkLCAwLCBzaXplb2YgcmVndXNlZCk7Cit9CisKKy8qCiAgKiBSZXR1cm4gdGhlIG5leHQgZnJlZSByZWdpc3Rlci4KICAqLwogc3RhdGljIGludApAQCAtNjA3MSw0OSArNzE1NSw1OCBAQAogCiAJY2FzZSBRX0RFRkFVTFQ6CiAJY2FzZSBRX0xJTks6Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChsaW5rdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRExUX0FSQ05FVDoKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9BUkNORVRfTElOVVg6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5fYWhvc3RvcChhYnJvYWRjYXN0LCBRX0RTVCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfRU4xME1COiAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbl9laG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9GRERJOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuX2Zob3N0b3AoZWJyb2FkY2FzdCwgUV9EU1QpOwotICAgICAgICAgICAgICAgIGNhc2UgRExUX0lFRUU4MDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5fdGhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfSUVFRTgwMl8xMToKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgotCQkJCWNhc2UgRExUX1BQSToKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9QUklTTV9IRUFERVI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5fd2xhbmhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfSVBfT1ZFUl9GQzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbl9pcGZjaG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9TVU5BVE06Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc19sYW5lKSB7Ci0JCQkvKgotCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgotCQkJICogTEUgQ29udHJvbCBtYXJrZXIuICAoV2UndmUgYWxyZWFkeSBnZW5lcmF0ZWQKLQkJCSAqIGEgdGVzdCBmb3IgTEFORS4pCi0JCQkgKi8KLQkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywgQlBGX0gsCi0JCQkgICAgMHhGRjAwKTsKLQkJCWdlbl9ub3QoYjEpOworCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJCWNhc2UgRExUX0FSQ05FVDoKKwkJY2FzZSBETFRfQVJDTkVUX0xJTlVYOgorCQkJcmV0dXJuIGdlbl9haG9zdG9wKGFicm9hZGNhc3QsIFFfRFNUKTsKKwkJY2FzZSBETFRfRU4xME1COgorCQljYXNlIERMVF9ORVRBTkFMWVpFUjoKKwkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisJCQlyZXR1cm4gZ2VuX2Vob3N0b3AoZWJyb2FkY2FzdCwgUV9EU1QpOworCQljYXNlIERMVF9GRERJOgorCQkJcmV0dXJuIGdlbl9maG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKKwkJY2FzZSBETFRfSUVFRTgwMjoKKwkJCXJldHVybiBnZW5fdGhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7CisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWNhc2UgRExUX1BQSToKKwkJCXJldHVybiBnZW5fd2xhbmhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7CisJCWNhc2UgRExUX0lQX09WRVJfRkM6CisJCQlyZXR1cm4gZ2VuX2lwZmNob3N0b3AoZWJyb2FkY2FzdCwgUV9EU1QpOworCQljYXNlIERMVF9TVU5BVE06CisJCQlpZiAoaXNfbGFuZSkgeworCQkJCS8qCisJCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgorCQkJCSAqIExFIENvbnRyb2wgbWFya2VyLiAgKFdlJ3ZlIGFscmVhZHkgZ2VuZXJhdGVkCisJCQkJICogYSB0ZXN0IGZvciBMQU5FLikKKwkJCQkgKi8KKwkJCQliMSA9IGdlbl9jbXAoT1JfTElOSywgU1VOQVRNX1BLVF9CRUdJTl9QT1MsCisJCQkJICAgIEJQRl9ILCAweEZGMDApOworCQkJCWdlbl9ub3QoYjEpOwogCi0JCQkvKgotCQkJICogTm93IGNoZWNrIHRoZSBNQUMgYWRkcmVzcy4KLQkJCSAqLwotCQkJYjAgPSBnZW5fZWhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7Ci0JCQlnZW5fYW5kKGIxLCBiMCk7Ci0JCQlyZXR1cm4gYjA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnBmX2Vycm9yKCJub3QgYSBicm9hZGNhc3QgbGluayIpOwotICAgICAgICAgICAgICAgIH0KKwkJCQkvKgorCQkJCSAqIE5vdyBjaGVjayB0aGUgTUFDIGFkZHJlc3MuCisJCQkJICovCisJCQkJYjAgPSBnZW5fZWhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7CisJCQkJZ2VuX2FuZChiMSwgYjApOworCQkJCXJldHVybiBiMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnBmX2Vycm9yKCJub3QgYSBicm9hZGNhc3QgbGluayIpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBRX0lQOgorCQkvKgorCQkgKiBXZSB0cmVhdCBhIG5ldG1hc2sgb2YgUENBUF9ORVRNQVNLX1VOS05PV04gKDB4ZmZmZmZmZmYpCisJCSAqIGFzIGFuIGluZGljYXRpb24gdGhhdCB3ZSBkb24ndCBrbm93IHRoZSBuZXRtYXNrLCBhbmQgZmFpbAorCQkgKiBpbiB0aGF0IGNhc2UuCisJCSAqLworCQlpZiAobmV0bWFzayA9PSBQQ0FQX05FVE1BU0tfVU5LTk9XTikKKwkJCWJwZl9lcnJvcigibmV0bWFzayBub3Qga25vd24sIHNvICdpcCBicm9hZGNhc3QnIG5vdCBzdXBwb3J0ZWQiKTsKIAkJYjAgPSBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQKTsKIAkJaG9zdG1hc2sgPSB+bmV0bWFzazsKIAkJYjEgPSBnZW5fbWNtcChPUl9ORVQsIDE2LCBCUEZfVywgKGJwZl9pbnQzMikwLCBob3N0bWFzayk7CkBAIC02MTU4LDE2NyArNzI1MSwxNjkgQEAKIAogCWNhc2UgUV9ERUZBVUxUOgogCWNhc2UgUV9MSU5LOgotICAgICAgICAgICAgICAgIHN3aXRjaCAobGlua3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9BUkNORVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfQVJDTkVUX0xJTlVYOgotICAgICAgICAgICAgICAgICAgICAvKiBhbGwgQVJDbmV0IG11bHRpY2FzdHMgdXNlIHRoZSBzYW1lIGFkZHJlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbl9haG9zdG9wKGFicm9hZGNhc3QsIFFfRFNUKTsKLSAgICAgICAgICAgICAgICBjYXNlICBETFRfRU4xME1COgotICAgICAgICAgICAgICAgICAgICAvKiBldGhlclswXSAmIDEgIT0gMCAqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuX21hY19tdWx0aWNhc3QoMCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfRkRESToKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogWFhYIFRFU1QgVEhJUzogTUlHSFQgTk9UIFBPUlQgUFJPUEVSTFkgWFhYCi0gICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAqIFhYWCAtIHdhcyB0aGF0IHJlZmVycmluZyB0byBiaXQtb3JkZXIgaXNzdWVzPwotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZmRkaVsxXSAmIDEgIT0gMCAqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuX21hY19tdWx0aWNhc3QoMSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfSUVFRTgwMjoKLSAgICAgICAgICAgICAgICAgICAgLyogdHJbMl0gJiAxICE9IDAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbl9tYWNfbXVsdGljYXN0KDIpOwotICAgICAgICAgICAgICAgIGNhc2UgRExUX0lFRUU4MDJfMTE6Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6Ci0JCQkJY2FzZSBETFRfUFBJOgotICAgICAgICAgICAgICAgIGNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfUFJJU01fSEVBREVSOgotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBPaCwgeXVrLgotICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgKglGb3IgY29udHJvbCBmcmFtZXMsIHRoZXJlIGlzIG5vIERBLgotICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgKglGb3IgbWFuYWdlbWVudCBmcmFtZXMsIERBIGlzIGF0IGFuCi0gICAgICAgICAgICAgICAgICAgICAqCW9mZnNldCBvZiA0IGZyb20gdGhlIGJlZ2lubmluZyBvZgotICAgICAgICAgICAgICAgICAgICAgKgl0aGUgcGFja2V0LgotICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgKglGb3IgZGF0YSBmcmFtZXMsIERBIGlzIGF0IGFuIG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgKglvZiA0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgICAqCWlmIFRvIERTIGlzIGNsZWFyIGFuZCBhdCBhbiBvZmZzZXQgb2YKLSAgICAgICAgICAgICAgICAgICAgICoJMTYgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQKLSAgICAgICAgICAgICAgICAgICAgICoJaWYgVG8gRFMgaXMgc2V0LgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIEdlbmVyYXRlIHRoZSB0ZXN0cyB0byBiZSBkb25lIGZvciBkYXRhIGZyYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICogRmlyc3QsIGNoZWNrIGZvciBUbyBEUyBzZXQsIGkuZS4gImxpbmtbMV0gJiAweDAxIi4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDEsIEJQRl9CKTsKLSAgICAgICAgICAgICAgICAgICAgYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7Ci0gICAgICAgICAgICAgICAgICAgIGIxLT5zLmsgPSAweDAxOwkvKiBUbyBEUyAqLwotICAgICAgICAgICAgICAgICAgICBiMS0+c3RtdHMgPSBzOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogSWYgVG8gRFMgaXMgc2V0LCB0aGUgREEgaXMgYXQgMTYuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBiMCA9IGdlbl9tYWNfbXVsdGljYXN0KDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuX2FuZChiMSwgYjApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogTm93LCBjaGVjayBmb3IgVG8gRFMgbm90IHNldCwgaS5lLiBjaGVjawotICAgICAgICAgICAgICAgICAgICAgKiAiIShsaW5rWzFdICYgMHgwMSkiLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMSwgQlBGX0IpOwotICAgICAgICAgICAgICAgICAgICBiMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKLSAgICAgICAgICAgICAgICAgICAgYjItPnMuayA9IDB4MDE7CS8qIFRvIERTICovCi0gICAgICAgICAgICAgICAgICAgIGIyLT5zdG10cyA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIGdlbl9ub3QoYjIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogSWYgVG8gRFMgaXMgbm90IHNldCwgdGhlIERBIGlzIGF0IDQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBiMSA9IGdlbl9tYWNfbXVsdGljYXN0KDQpOwotICAgICAgICAgICAgICAgICAgICBnZW5fYW5kKGIyLCBiMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBOb3cgT1IgdG9nZXRoZXIgdGhlIGxhc3QgdHdvIGNoZWNrcy4gIFRoYXQgZ2l2ZXMKLSAgICAgICAgICAgICAgICAgICAgICogdGhlIGNvbXBsZXRlIHNldCBvZiBjaGVja3MgZm9yIGRhdGEgZnJhbWVzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2VuX29yKGIxLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBOb3cgY2hlY2sgZm9yIGEgZGF0YSBmcmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICogSS5lLCBjaGVjayAibGlua1swXSAmIDB4MDgiLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOwotICAgICAgICAgICAgICAgICAgICBiMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKLSAgICAgICAgICAgICAgICAgICAgYjEtPnMuayA9IDB4MDg7Ci0gICAgICAgICAgICAgICAgICAgIGIxLT5zdG10cyA9IHM7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVja3MgZG9uZSBmb3IgZGF0YSBmcmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBnZW5fYW5kKGIxLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgaGlnaC1vcmRlciBiaXQgb2YgdGhlIHR5cGUgdmFsdWUgaXMgMCwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCi0gICAgICAgICAgICAgICAgICAgICAqIEkuZSwgY2hlY2sgIiEobGlua1swXSAmIDB4MDgpIi4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKLSAgICAgICAgICAgICAgICAgICAgYjIgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7Ci0gICAgICAgICAgICAgICAgICAgIGIyLT5zLmsgPSAweDA4OwotICAgICAgICAgICAgICAgICAgICBiMi0+c3RtdHMgPSBzOwotICAgICAgICAgICAgICAgICAgICBnZW5fbm90KGIyKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBtYW5hZ2VtZW50IGZyYW1lcywgdGhlIERBIGlzIGF0IDQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBiMSA9IGdlbl9tYWNfbXVsdGljYXN0KDQpOwotICAgICAgICAgICAgICAgICAgICBnZW5fYW5kKGIyLCBiMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBPUiB0aGF0IHdpdGggdGhlIGNoZWNrcyBkb25lIGZvciBkYXRhIGZyYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICogVGhhdCBnaXZlcyB0aGUgY2hlY2tzIGRvbmUgZm9yIG1hbmFnZW1lbnQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAqIGRhdGEgZnJhbWVzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2VuX29yKGIxLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgbG93LW9yZGVyIGJpdCBvZiB0aGUgdHlwZSB2YWx1ZSBpcyAxLAotICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGVpdGhlciBhIGNvbnRyb2wgZnJhbWUgb3IgYSBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGEgcmVzZXJ2ZWQgdHlwZSwgYW5kIHRodXMgbm90IGEKLSAgICAgICAgICAgICAgICAgICAgICogZnJhbWUgd2l0aCBhbiBTQS4KLSAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICogSS5lLiwgY2hlY2sgIiEobGlua1swXSAmIDB4MDQpIi4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKLSAgICAgICAgICAgICAgICAgICAgYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7Ci0gICAgICAgICAgICAgICAgICAgIGIxLT5zLmsgPSAweDA0OwotICAgICAgICAgICAgICAgICAgICBiMS0+c3RtdHMgPSBzOwotICAgICAgICAgICAgICAgICAgICBnZW5fbm90KGIxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIEFORCB0aGF0IHdpdGggdGhlIGNoZWNrcyBmb3IgZGF0YSBhbmQgbWFuYWdlbWVudAotICAgICAgICAgICAgICAgICAgICAgKiBmcmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBnZW5fYW5kKGIxLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBiMDsKLSAgICAgICAgICAgICAgICBjYXNlIERMVF9JUF9PVkVSX0ZDOgotICAgICAgICAgICAgICAgICAgICBiMCA9IGdlbl9tYWNfbXVsdGljYXN0KDIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjA7Ci0gICAgICAgICAgICAgICAgY2FzZSBETFRfU1VOQVRNOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbGFuZSkgeworCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJCWNhc2UgRExUX0FSQ05FVDoKKwkJY2FzZSBETFRfQVJDTkVUX0xJTlVYOgorCQkJLyogYWxsIEFSQ25ldCBtdWx0aWNhc3RzIHVzZSB0aGUgc2FtZSBhZGRyZXNzICovCisJCQlyZXR1cm4gZ2VuX2Fob3N0b3AoYWJyb2FkY2FzdCwgUV9EU1QpOworCQljYXNlIERMVF9FTjEwTUI6CisJCWNhc2UgRExUX05FVEFOQUxZWkVSOgorCQljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKKwkJCS8qIGV0aGVyWzBdICYgMSAhPSAwICovCisJCQlyZXR1cm4gZ2VuX21hY19tdWx0aWNhc3QoMCk7CisJCWNhc2UgRExUX0ZEREk6CiAJCQkvKgotCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgotCQkJICogTEUgQ29udHJvbCBtYXJrZXIuICAoV2UndmUgYWxyZWFkeSBnZW5lcmF0ZWQKLQkJCSAqIGEgdGVzdCBmb3IgTEFORS4pCisJCQkgKiBYWFggVEVTVCBUSElTOiBNSUdIVCBOT1QgUE9SVCBQUk9QRVJMWSBYWFgKKwkJCSAqCisJCQkgKiBYWFggLSB3YXMgdGhhdCByZWZlcnJpbmcgdG8gYml0LW9yZGVyIGlzc3Vlcz8KIAkJCSAqLwotCQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIFNVTkFUTV9QS1RfQkVHSU5fUE9TLCBCUEZfSCwKLQkJCSAgICAweEZGMDApOworCQkJLyogZmRkaVsxXSAmIDEgIT0gMCAqLworCQkJcmV0dXJuIGdlbl9tYWNfbXVsdGljYXN0KDEpOworCQljYXNlIERMVF9JRUVFODAyOgorCQkJLyogdHJbMl0gJiAxICE9IDAgKi8KKwkJCXJldHVybiBnZW5fbWFjX211bHRpY2FzdCgyKTsKKwkJY2FzZSBETFRfSUVFRTgwMl8xMToKKwkJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJY2FzZSBETFRfUFBJOgorCQkJLyoKKwkJCSAqIE9oLCB5dWsuCisJCQkgKgorCQkJICoJRm9yIGNvbnRyb2wgZnJhbWVzLCB0aGVyZSBpcyBubyBEQS4KKwkJCSAqCisJCQkgKglGb3IgbWFuYWdlbWVudCBmcmFtZXMsIERBIGlzIGF0IGFuCisJCQkgKglvZmZzZXQgb2YgNCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKwkJCSAqCXRoZSBwYWNrZXQuCisJCQkgKgorCQkJICoJRm9yIGRhdGEgZnJhbWVzLCBEQSBpcyBhdCBhbiBvZmZzZXQKKwkJCSAqCW9mIDQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQKKwkJCSAqCWlmIFRvIERTIGlzIGNsZWFyIGFuZCBhdCBhbiBvZmZzZXQgb2YKKwkJCSAqCTE2IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0CisJCQkgKglpZiBUbyBEUyBpcyBzZXQuCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIEdlbmVyYXRlIHRoZSB0ZXN0cyB0byBiZSBkb25lIGZvciBkYXRhIGZyYW1lcy4KKwkJCSAqCisJCQkgKiBGaXJzdCwgY2hlY2sgZm9yIFRvIERTIHNldCwgaS5lLiAibGlua1sxXSAmIDB4MDEiLgorCQkJICovCisJCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAxLCBCUEZfQik7CisJCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJCWIxLT5zLmsgPSAweDAxOwkvKiBUbyBEUyAqLworCQkJYjEtPnN0bXRzID0gczsKKworCQkJLyoKKwkJCSAqIElmIFRvIERTIGlzIHNldCwgdGhlIERBIGlzIGF0IDE2LgorCQkJICovCisJCQliMCA9IGdlbl9tYWNfbXVsdGljYXN0KDE2KTsKKwkJCWdlbl9hbmQoYjEsIGIwKTsKKworCQkJLyoKKwkJCSAqIE5vdywgY2hlY2sgZm9yIFRvIERTIG5vdCBzZXQsIGkuZS4gY2hlY2sKKwkJCSAqICIhKGxpbmtbMV0gJiAweDAxKSIuCisJCQkgKi8KKwkJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDEsIEJQRl9CKTsKKwkJCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQkJYjItPnMuayA9IDB4MDE7CS8qIFRvIERTICovCisJCQliMi0+c3RtdHMgPSBzOworCQkJZ2VuX25vdChiMik7CisKKwkJCS8qCisJCQkgKiBJZiBUbyBEUyBpcyBub3Qgc2V0LCB0aGUgREEgaXMgYXQgNC4KKwkJCSAqLworCQkJYjEgPSBnZW5fbWFjX211bHRpY2FzdCg0KTsKKwkJCWdlbl9hbmQoYjIsIGIxKTsKKworCQkJLyoKKwkJCSAqIE5vdyBPUiB0b2dldGhlciB0aGUgbGFzdCB0d28gY2hlY2tzLiAgVGhhdCBnaXZlcworCQkJICogdGhlIGNvbXBsZXRlIHNldCBvZiBjaGVja3MgZm9yIGRhdGEgZnJhbWVzLgorCQkJICovCisJCQlnZW5fb3IoYjEsIGIwKTsKKworCQkJLyoKKwkJCSAqIE5vdyBjaGVjayBmb3IgYSBkYXRhIGZyYW1lLgorCQkJICogSS5lLCBjaGVjayAibGlua1swXSAmIDB4MDgiLgorCQkJICovCisJCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7CisJCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJCWIxLT5zLmsgPSAweDA4OworCQkJYjEtPnN0bXRzID0gczsKKworCQkJLyoKKwkJCSAqIEFORCB0aGF0IHdpdGggdGhlIGNoZWNrcyBkb25lIGZvciBkYXRhIGZyYW1lcy4KKwkJCSAqLworCQkJZ2VuX2FuZChiMSwgYjApOworCisJCQkvKgorCQkJICogSWYgdGhlIGhpZ2gtb3JkZXIgYml0IG9mIHRoZSB0eXBlIHZhbHVlIGlzIDAsIHRoaXMKKwkJCSAqIGlzIGEgbWFuYWdlbWVudCBmcmFtZS4KKwkJCSAqIEkuZSwgY2hlY2sgIiEobGlua1swXSAmIDB4MDgpIi4KKwkJCSAqLworCQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQkJYjIgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCQliMi0+cy5rID0gMHgwODsKKwkJCWIyLT5zdG10cyA9IHM7CisJCQlnZW5fbm90KGIyKTsKKworCQkJLyoKKwkJCSAqIEZvciBtYW5hZ2VtZW50IGZyYW1lcywgdGhlIERBIGlzIGF0IDQuCisJCQkgKi8KKwkJCWIxID0gZ2VuX21hY19tdWx0aWNhc3QoNCk7CisJCQlnZW5fYW5kKGIyLCBiMSk7CisKKwkJCS8qCisJCQkgKiBPUiB0aGF0IHdpdGggdGhlIGNoZWNrcyBkb25lIGZvciBkYXRhIGZyYW1lcy4KKwkJCSAqIFRoYXQgZ2l2ZXMgdGhlIGNoZWNrcyBkb25lIGZvciBtYW5hZ2VtZW50IGFuZAorCQkJICogZGF0YSBmcmFtZXMuCisJCQkgKi8KKwkJCWdlbl9vcihiMSwgYjApOworCisJCQkvKgorCQkJICogSWYgdGhlIGxvdy1vcmRlciBiaXQgb2YgdGhlIHR5cGUgdmFsdWUgaXMgMSwKKwkJCSAqIHRoaXMgaXMgZWl0aGVyIGEgY29udHJvbCBmcmFtZSBvciBhIGZyYW1lCisJCQkgKiB3aXRoIGEgcmVzZXJ2ZWQgdHlwZSwgYW5kIHRodXMgbm90IGEKKwkJCSAqIGZyYW1lIHdpdGggYW4gU0EuCisJCQkgKgorCQkJICogSS5lLiwgY2hlY2sgIiEobGlua1swXSAmIDB4MDQpIi4KKwkJCSAqLworCQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCQliMS0+cy5rID0gMHgwNDsKKwkJCWIxLT5zdG10cyA9IHM7CiAJCQlnZW5fbm90KGIxKTsKIAotCQkJLyogZXRoZXJbb2ZmX21hY10gJiAxICE9IDAgKi8KLQkJCWIwID0gZ2VuX21hY19tdWx0aWNhc3Qob2ZmX21hYyk7CisJCQkvKgorCQkJICogQU5EIHRoYXQgd2l0aCB0aGUgY2hlY2tzIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50CisJCQkgKiBmcmFtZXMuCisJCQkgKi8KIAkJCWdlbl9hbmQoYjEsIGIwKTsKIAkJCXJldHVybiBiMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogTGluayBub3Qga25vd24gdG8gc3VwcG9ydCBtdWx0aWNhc3RzICovCi0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgRExUX0lQX09WRVJfRkM6CisJCQliMCA9IGdlbl9tYWNfbXVsdGljYXN0KDIpOworCQkJcmV0dXJuIGIwOworCQljYXNlIERMVF9TVU5BVE06CisJCQlpZiAoaXNfbGFuZSkgeworCQkJCS8qCisJCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgorCQkJCSAqIExFIENvbnRyb2wgbWFya2VyLiAgKFdlJ3ZlIGFscmVhZHkgZ2VuZXJhdGVkCisJCQkJICogYSB0ZXN0IGZvciBMQU5FLikKKwkJCQkgKi8KKwkJCQliMSA9IGdlbl9jbXAoT1JfTElOSywgU1VOQVRNX1BLVF9CRUdJTl9QT1MsCisJCQkJICAgIEJQRl9ILCAweEZGMDApOworCQkJCWdlbl9ub3QoYjEpOworCisJCQkJLyogZXRoZXJbb2ZmX21hY10gJiAxICE9IDAgKi8KKwkJCQliMCA9IGdlbl9tYWNfbXVsdGljYXN0KG9mZl9tYWMpOworCQkJCWdlbl9hbmQoYjEsIGIwKTsKKwkJCQlyZXR1cm4gYjA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCS8qIExpbmsgbm90IGtub3duIHRvIHN1cHBvcnQgbXVsdGljYXN0cyAqLworCQlicmVhazsKIAogCWNhc2UgUV9JUDoKIAkJYjAgPSBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQKTsKQEAgLTYzMjYsMTMgKzc0MjEsMTEgQEAKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CiAKLSNpZmRlZiBJTkVUNgogCWNhc2UgUV9JUFY2OgogCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVBWNik7CiAJCWIxID0gZ2VuX2NtcChPUl9ORVQsIDI0LCBCUEZfQiwgKGJwZl9pbnQzMikyNTUpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKLSNlbmRpZiAvKiBJTkVUNiAqLwogCX0KIAlicGZfZXJyb3IoImxpbmstbGF5ZXIgbXVsdGljYXN0IGZpbHRlcnMgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nL0FSQ05FVC84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOwogCS8qIE5PVFJFQUNIRUQgKi8KQEAgLTYzNDAsOSArNzQzMywxMyBAQAogfQogCiAvKgotICogZ2VuZXJhdGUgY29tbWFuZCBmb3IgaW5ib3VuZC9vdXRib3VuZC4gIEl0J3MgaGVyZSBzbyB3ZSBjYW4KLSAqIG1ha2UgaXQgbGluay10eXBlIHNwZWNpZmljLiAgJ2RpcicgPSAwIGltcGxpZXMgImluYm91bmQiLAotICogPSAxIGltcGxpZXMgIm91dGJvdW5kIi4KKyAqIEZpbHRlciBvbiBpbmJvdW5kIChkaXIgPT0gMCkgb3Igb3V0Ym91bmQgKGRpciA9PSAxKSB0cmFmZmljLgorICogT3V0Ym91bmQgdHJhZmZpYyBpcyBzZW50IGJ5IHRoaXMgbWFjaGluZSwgd2hpbGUgaW5ib3VuZCB0cmFmZmljIGlzCisgKiBzZW50IGJ5IGEgcmVtb3RlIG1hY2hpbmUgKGFuZCBtYXkgaW5jbHVkZSBwYWNrZXRzIGRlc3RpbmVkIGZvciBhCisgKiB1bmljYXN0IG9yIG11bHRpY2FzdCBsaW5rLWxheWVyIGFkZHJlc3Mgd2UgYXJlIG5vdCBzdWJzY3JpYmluZyB0bykuCisgKiBUaGVzZSBhcmUgdGhlIHNhbWUgZGVmaW5pdGlvbnMgaW1wbGVtZW50ZWQgYnkgcGNhcF9zZXRkaXJlY3Rpb24oKS4KKyAqIENhcHR1cmluZyBvbmx5IHVuaWNhc3QgdHJhZmZpYyBkZXN0aW5lZCBmb3IgdGhpcyBob3N0IGlzIHByb2JhYmx5CisgKiBiZXR0ZXIgYWNjb21wbGlzaGVkIHVzaW5nIGEgaGlnaGVyLWxheWVyIGZpbHRlci4KICAqLwogc3RydWN0IGJsb2NrICoKIGdlbl9pbmJvdW5kKGRpcikKQEAgLTYzNjEsMjQgKzc0NTgsMjIgQEAKIAkJCSAgZGlyKTsKIAkJYnJlYWs7CiAKLQljYXNlIERMVF9MSU5VWF9TTEw6CisJY2FzZSBETFRfSVBORVQ6CiAJCWlmIChkaXIpIHsKLQkJCS8qCi0JCQkgKiBNYXRjaCBwYWNrZXRzIHNlbnQgYnkgdGhpcyBtYWNoaW5lLgotCQkJICovCi0JCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMCwgQlBGX0gsIExJTlVYX1NMTF9PVVRHT0lORyk7CisJCQkvKiBtYXRjaCBvdXRnb2luZyBwYWNrZXRzICovCisJCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMiwgQlBGX0gsIElQTkVUX09VVEJPVU5EKTsKIAkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBNYXRjaCBwYWNrZXRzIHNlbnQgdG8gdGhpcyBtYWNoaW5lLgotCQkJICogKE5vIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgcGFja2V0cywgb3IKLQkJCSAqIHBhY2tldHMgc2VudCB0byBzb21lIG90aGVyIG1hY2hpbmUgYW5kCi0JCQkgKiByZWNlaXZlZCBwcm9taXNjdW91c2x5LikKLQkJCSAqCi0JCQkgKiBYWFggLSBwYWNrZXRzIHNlbnQgdG8gb3RoZXIgbWFjaGluZXMgcHJvYmFibHkKLQkJCSAqIHNob3VsZG4ndCBiZSBtYXRjaGVkLCBidXQgd2hhdCBhYm91dCBicm9hZGNhc3QKLQkJCSAqIG9yIG11bHRpY2FzdCBwYWNrZXRzIHdlIHJlY2VpdmVkPwotCQkJICovCi0JCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMCwgQlBGX0gsIExJTlVYX1NMTF9IT1NUKTsKKwkJCS8qIG1hdGNoIGluY29taW5nIHBhY2tldHMgKi8KKwkJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCAyLCBCUEZfSCwgSVBORVRfSU5CT1VORCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIERMVF9MSU5VWF9TTEw6CisJCS8qIG1hdGNoIG91dGdvaW5nIHBhY2tldHMgKi8KKwkJYjAgPSBnZW5fY21wKE9SX0xJTkssIDAsIEJQRl9ILCBMSU5VWF9TTExfT1VUR09JTkcpOworCQlpZiAoIWRpcikgeworCQkJLyogdG8gZmlsdGVyIG9uIGluYm91bmQgdHJhZmZpYywgaW52ZXJ0IHRoZSBtYXRjaCAqLworCQkJZ2VuX25vdChiMCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTY0MTUsNiArNzUxMCwxMyBAQAogICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0ZSRUxBWToKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9DSERMQzoKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9WUDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9TVDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9JU006CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfVlM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfU1JYX0UyRToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUw6CisJY2FzZSBETFRfSlVOSVBFUl9BVE1fQ0VNSUM6CisKIAkJLyoganVuaXBlciBmbGFncyAoaW5jbHVkaW5nIGRpcmVjdGlvbikgYXJlIHN0b3JlZAogCQkgKiB0aGUgYnl0ZSBhZnRlciB0aGUgMy1ieXRlIG1hZ2ljIG51bWJlciAqLwogCQlpZiAoZGlyKSB7CkBAIC02NDI0LDEzICs3NTI2LDQxIEBACiAJCQkvKiBtYXRjaCBpbmNvbWluZyBwYWNrZXRzICovCiAJCQliMCA9IGdlbl9tY21wKE9SX0xJTkssIDMsIEJQRl9CLCAxLCAweDAxKTsKIAkJfQotCSAgICBicmVhazsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgorCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHBhY2tldCBtZXRhLWRhdGEgaW5kaWNhdGluZyBhIGRpcmVjdGlvbiwKKwkJICogY2hlY2sgaXQsIG90aGVyd2lzZSBnaXZlIHVwIGFzIHRoaXMgbGluay1sYXllciB0eXBlCisJCSAqIGhhcyBub3RoaW5nIGluIHRoZSBwYWNrZXQgZGF0YS4KKwkJICovCisjaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChQRl9QQUNLRVQpICYmIGRlZmluZWQoU09fQVRUQUNIX0ZJTFRFUikKKwkJLyoKKwkJICogVGhpcyBpcyBMaW51eCB3aXRoIFBGX1BBQ0tFVCBzdXBwb3J0LgorCQkgKiBJZiB0aGlzIGlzIGEgKmxpdmUqIGNhcHR1cmUsIHdlIGNhbiBsb29rIGF0CisJCSAqIHNwZWNpYWwgbWV0YS1kYXRhIGluIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbjsKKwkJICogaWYgaXQncyBhIHNhdmVmaWxlLCB3ZSBjYW4ndC4KKwkJICovCisJCWlmIChicGZfcGNhcC0+cmZpbGUgIT0gTlVMTCkgeworCQkJLyogV2UgaGF2ZSBhIEZJTEUgKiwgc28gdGhpcyBpcyBhIHNhdmVmaWxlICovCisJCQlicGZfZXJyb3IoImluYm91bmQvb3V0Ym91bmQgbm90IHN1cHBvcnRlZCBvbiBsaW5rdHlwZSAlZCB3aGVuIHJlYWRpbmcgc2F2ZWZpbGVzIiwKKwkJCSAgICBsaW5rdHlwZSk7CisJCQliMCA9IE5VTEw7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJLyogbWF0Y2ggb3V0Z29pbmcgcGFja2V0cyAqLworCQliMCA9IGdlbl9jbXAoT1JfTElOSywgU0tGX0FEX09GRiArIFNLRl9BRF9QS1RUWVBFLCBCUEZfSCwKKwkJICAgICAgICAgICAgIFBBQ0tFVF9PVVRHT0lORyk7CisJCWlmICghZGlyKSB7CisJCQkvKiB0byBmaWx0ZXIgb24gaW5ib3VuZCB0cmFmZmljLCBpbnZlcnQgdGhlIG1hdGNoICovCisJCQlnZW5fbm90KGIwKTsKKwkJfQorI2Vsc2UgLyogZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChQRl9QQUNLRVQpICYmIGRlZmluZWQoU09fQVRUQUNIX0ZJTFRFUikgKi8KIAkJYnBmX2Vycm9yKCJpbmJvdW5kL291dGJvdW5kIG5vdCBzdXBwb3J0ZWQgb24gbGlua3R5cGUgJWQiLAogCQkgICAgbGlua3R5cGUpOwogCQliMCA9IE5VTEw7CiAJCS8qIE5PVFJFQUNIRUQgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKFBGX1BBQ0tFVCkgJiYgZGVmaW5lZChTT19BVFRBQ0hfRklMVEVSKSAqLwogCX0KIAlyZXR1cm4gKGIwKTsKIH0KQEAgLTY0NDMsMTMgKzc1NzMsMTIgQEAKIAlzdHJ1Y3QgYmxvY2sgKmIwOwogCXVfaW50IGxlbiwgb2ZmOwogCi0JaWYgKGxpbmt0eXBlID09IERMVF9QRkxPRykgewotCQlsZW4gPSBzaXplb2YoKChzdHJ1Y3QgcGZsb2doZHIgKikwKS0+aWZuYW1lKTsKLQkJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBpZm5hbWUpOwotCX0gZWxzZSB7Ci0JCWJwZl9lcnJvcigiaWZuYW1lIG5vdCBzdXBwb3J0ZWQgb24gbGlua3R5cGUgMHgleCIsIGxpbmt0eXBlKTsKKwlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcigiaWZuYW1lIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CisJbGVuID0gc2l6ZW9mKCgoc3RydWN0IHBmbG9naGRyICopMCktPmlmbmFtZSk7CisJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBpZm5hbWUpOwogCWlmIChzdHJsZW4oaWZuYW1lKSA+PSBsZW4pIHsKIAkJYnBmX2Vycm9yKCJpZm5hbWUgaW50ZXJmYWNlIG5hbWVzIGNhbiBvbmx5IGJlICVkIGNoYXJhY3RlcnMiLAogCQkgICAgbGVuLTEpOwpAQCAtNjQ2NiwxNCArNzU5NSwxNiBAQAogCXN0cnVjdCBibG9jayAqYjA7CiAKIAlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7Ci0JCWJwZl9lcnJvcigicnVsZXNldCBub3Qgc3VwcG9ydGVkIG9uIGxpbmt0eXBlIDB4JXgiLCBsaW5rdHlwZSk7CisJCWJwZl9lcnJvcigicnVsZXNldCBzdXBwb3J0ZWQgb25seSBvbiBQRiBsaW5rdHlwZSIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQorCiAJaWYgKHN0cmxlbihydWxlc2V0KSA+PSBzaXplb2YoKChzdHJ1Y3QgcGZsb2doZHIgKikwKS0+cnVsZXNldCkpIHsKIAkJYnBmX2Vycm9yKCJydWxlc2V0IG5hbWVzIGNhbiBvbmx5IGJlICVsZCBjaGFyYWN0ZXJzIiwKIAkJICAgIChsb25nKShzaXplb2YoKChzdHJ1Y3QgcGZsb2doZHIgKikwKS0+cnVsZXNldCkgLSAxKSk7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CisKIAliMCA9IGdlbl9iY21wKE9SX0xJTkssIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgcnVsZXNldCksCiAJICAgIHN0cmxlbihydWxlc2V0KSwgKGNvbnN0IHVfY2hhciAqKXJ1bGVzZXQpOwogCXJldHVybiAoYjApOwpAQCAtNjQ4NSwxNCArNzYxNiwxMyBAQAogewogCXN0cnVjdCBibG9jayAqYjA7CiAKLQlpZiAobGlua3R5cGUgPT0gRExUX1BGTE9HKSB7Ci0JCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIHJ1bGVuciksIEJQRl9XLAotCQkJIChicGZfaW50MzIpcm5yKTsKLQl9IGVsc2UgewotCQlicGZfZXJyb3IoInJuciBub3Qgc3VwcG9ydGVkIG9uIGxpbmt0eXBlIDB4JXgiLCBsaW5rdHlwZSk7CisJaWYgKGxpbmt0eXBlICE9IERMVF9QRkxPRykgeworCQlicGZfZXJyb3IoInJuciBzdXBwb3J0ZWQgb25seSBvbiBQRiBsaW5rdHlwZSIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCisJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgcnVsZW5yKSwgQlBGX1csCisJCSAoYnBmX2ludDMyKXJucik7CiAJcmV0dXJuIChiMCk7CiB9CiAKQEAgLTY1MDMsNyArNzYzMyw3IEBACiAJc3RydWN0IGJsb2NrICpiMDsKIAogCWlmIChsaW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKLQkJYnBmX2Vycm9yKCJzcm5yIG5vdCBzdXBwb3J0ZWQgb24gbGlua3R5cGUgMHgleCIsIGxpbmt0eXBlKTsKKwkJYnBmX2Vycm9yKCJzcm5yIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CiAKQEAgLTY1MTgsMTQgKzc2NDgsMTMgQEAKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwOwogCi0JaWYgKGxpbmt0eXBlID09IERMVF9QRkxPRykgewotCQliMCA9IGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCByZWFzb24pLCBCUEZfQiwKLQkJICAgIChicGZfaW50MzIpcmVhc29uKTsKLQl9IGVsc2UgewotCQlicGZfZXJyb3IoInJlYXNvbiBub3Qgc3VwcG9ydGVkIG9uIGxpbmt0eXBlIDB4JXgiLCBsaW5rdHlwZSk7CisJaWYgKGxpbmt0eXBlICE9IERMVF9QRkxPRykgeworCQlicGZfZXJyb3IoInJlYXNvbiBzdXBwb3J0ZWQgb25seSBvbiBQRiBsaW5rdHlwZSIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCisJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgcmVhc29uKSwgQlBGX0IsCisJICAgIChicGZfaW50MzIpcmVhc29uKTsKIAlyZXR1cm4gKGIwKTsKIH0KIApAQCAtNjUzNSwxNCArNzY2NCwxMyBAQAogewogCXN0cnVjdCBibG9jayAqYjA7CiAKLQlpZiAobGlua3R5cGUgPT0gRExUX1BGTE9HKSB7Ci0JCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIGFjdGlvbiksIEJQRl9CLAotCQkgICAgKGJwZl9pbnQzMilhY3Rpb24pOwotCX0gZWxzZSB7Ci0JCWJwZl9lcnJvcigiYWN0aW9uIG5vdCBzdXBwb3J0ZWQgb24gbGlua3R5cGUgMHgleCIsIGxpbmt0eXBlKTsKKwlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcigiYWN0aW9uIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CiAKKwliMCA9IGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBhY3Rpb24pLCBCUEZfQiwKKwkgICAgKGJwZl9pbnQzMilhY3Rpb24pOwogCXJldHVybiAoYjApOwogfQogI2Vsc2UgLyogIUhBVkVfTkVUX1BGVkFSX0ggKi8KQEAgLTY1OTUsMTQgKzc3MjMsNzUgQEAKIH0KICNlbmRpZiAvKiBIQVZFX05FVF9QRlZBUl9IICovCiAKKy8qIElFRUUgODAyLjExIHdpcmVsZXNzIGhlYWRlciAqLworc3RydWN0IGJsb2NrICoKK2dlbl9wODAyMTFfdHlwZShpbnQgdHlwZSwgaW50IG1hc2spCit7CisJc3RydWN0IGJsb2NrICpiMDsKKworCXN3aXRjaCAobGlua3R5cGUpIHsKKworCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWIwID0gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX0IsIChicGZfaW50MzIpdHlwZSwKKwkJICAgIChicGZfaW50MzIpbWFzayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnBmX2Vycm9yKCI4MDIuMTEgbGluay1sYXllciB0eXBlcyBzdXBwb3J0ZWQgb25seSBvbiA4MDIuMTEiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCXJldHVybiAoYjApOworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3A4MDIxMV9mY2RpcihpbnQgZmNkaXIpCit7CisJc3RydWN0IGJsb2NrICpiMDsKKworCXN3aXRjaCAobGlua3R5cGUpIHsKKworCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnBmX2Vycm9yKCJmcmFtZSBkaXJlY3Rpb24gc3VwcG9ydGVkIG9ubHkgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJYjAgPSBnZW5fbWNtcChPUl9MSU5LLCAxLCBCUEZfQiwgKGJwZl9pbnQzMilmY2RpciwKKwkJKGJwZl91X2ludDMyKUlFRUU4MDIxMV9GQzFfRElSX01BU0spOworCisJcmV0dXJuIChiMCk7Cit9CisKIHN0cnVjdCBibG9jayAqCiBnZW5fYWNvZGUoZWFkZHIsIHEpCiAJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplYWRkcjsKIAlzdHJ1Y3QgcXVhbCBxOwogewotCWlmICgocS5hZGRyID09IFFfSE9TVCB8fCBxLmFkZHIgPT0gUV9ERUZBVUxUKSAmJiBxLnByb3RvID09IFFfTElOSykgewotCQlpZiAobGlua3R5cGUgPT0gRExUX0FSQ05FVCB8fCBsaW5rdHlwZSA9PSBETFRfQVJDTkVUX0xJTlVYKQotCQkJcmV0dXJuIGdlbl9haG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwlzd2l0Y2ggKGxpbmt0eXBlKSB7CisKKwljYXNlIERMVF9BUkNORVQ6CisJY2FzZSBETFRfQVJDTkVUX0xJTlVYOgorCQlpZiAoKHEuYWRkciA9PSBRX0hPU1QgfHwgcS5hZGRyID09IFFfREVGQVVMVCkgJiYKKwkJICAgIHEucHJvdG8gPT0gUV9MSU5LKQorCQkJcmV0dXJuIChnZW5fYWhvc3RvcChlYWRkciwgKGludClxLmRpcikpOworCQllbHNlIHsKKwkJCWJwZl9lcnJvcigiQVJDbmV0IGFkZHJlc3MgdXNlZCBpbiBub24tYXJjIGV4cHJlc3Npb24iKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJwZl9lcnJvcigiYWlkIHN1cHBvcnRlZCBvbmx5IG9uIEFSQ25ldCIpOworCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCWJwZl9lcnJvcigiQVJDbmV0IGFkZHJlc3MgdXNlZCBpbiBub24tYXJjIGV4cHJlc3Npb24iKTsKIAkvKiBOT1RSRUFDSEVEICovCkBAIC02NjM2LDYgKzc4MjUsMzAgQEAKIAkJYjEgPSBnZW5fYWhvc3RvcChlYWRkciwgUV9EU1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOworCisJY2FzZSBRX0FERFIxOgorCQlicGZfZXJyb3IoIidhZGRyMScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFIyOgorCQlicGZfZXJyb3IoIidhZGRyMicgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFIzOgorCQlicGZfZXJyb3IoIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFI0OgorCQlicGZfZXJyb3IoIidhZGRyNCcgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX1JBOgorCQlicGZfZXJyb3IoIidyYScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX1RBOgorCQlicGZfZXJyb3IoIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOwogCX0KIAlhYm9ydCgpOwogCS8qIE5PVFJFQUNIRUQgKi8KQEAgLTY2NTUsMTAgKzc4NjgsMTEgQEAKIAkJYnBmX2Vycm9yKCJubyBWTEFOIG1hdGNoIGFmdGVyIE1QTFMiKTsKIAogCS8qCi0JICogQ2hhbmdlIHRoZSBvZmZzZXRzIHRvIHBvaW50IHRvIHRoZSB0eXBlIGFuZCBkYXRhIGZpZWxkcyB3aXRoaW4KLQkgKiB0aGUgVkxBTiBwYWNrZXQuICBKdXN0IGluY3JlbWVudCB0aGUgb2Zmc2V0cywgc28gdGhhdCB3ZQotCSAqIGNhbiBzdXBwb3J0IGEgaGllcmFyY2h5LCBlLmcuICJ2bGFuIDMwMCAmJiB2bGFuIDIwMCIgdG8KLQkgKiBjYXB0dXJlIFZMQU4gMjAwIGVuY2Fwc3VsYXRlZCB3aXRoaW4gVkxBTiAxMDAuCisJICogQ2hlY2sgZm9yIGEgVkxBTiBwYWNrZXQsIGFuZCB0aGVuIGNoYW5nZSB0aGUgb2Zmc2V0cyB0byBwb2ludAorCSAqIHRvIHRoZSB0eXBlIGFuZCBkYXRhIGZpZWxkcyB3aXRoaW4gdGhlIFZMQU4gcGFja2V0LiAgSnVzdAorCSAqIGluY3JlbWVudCB0aGUgb2Zmc2V0cywgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCBhIGhpZXJhcmNoeSwgZS5nLgorCSAqICJ2bGFuIDMwMCAmJiB2bGFuIDIwMCIgdG8gY2FwdHVyZSBWTEFOIDIwMCBlbmNhcHN1bGF0ZWQgd2l0aGluCisJICogVkxBTiAxMDAuCiAJICoKIAkgKiBYWFggLSB0aGlzIGlzIGEgYml0IG9mIGEga2x1ZGdlLiAgSWYgd2Ugd2VyZSB0byBzcGxpdCB0aGUKIAkgKiBjb21waWxlciBpbnRvIGEgcGFyc2VyIHRoYXQgcGFyc2VzIGFuIGV4cHJlc3Npb24gYW5kCkBAIC02Njg0LDE1ICs3ODk4LDM1IEBACiAJICogYmUgZG9uZSBhc3N1bWluZyBhIFZMQU4sIGV2ZW4gdGhvdWdoIHRoZSAib3IiIGNvdWxkIGJlIHZpZXdlZAogCSAqIGFzIG1lYW5pbmcgIm9yLCBpZiB0aGlzIGlzbid0IGEgVkxBTiBwYWNrZXQuLi4iLgogCSAqLwotCW9yaWdfbGlua3R5cGUgPSBvZmZfbGlua3R5cGU7CS8qIHNhdmUgb3JpZ2luYWwgdmFsdWVzICovCiAJb3JpZ19ubCA9IG9mZl9ubDsKIAogCXN3aXRjaCAobGlua3R5cGUpIHsKIAogCWNhc2UgRExUX0VOMTBNQjoKKwljYXNlIERMVF9ORVRBTkFMWVpFUjoKKwljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKKwkJLyogY2hlY2sgZm9yIFZMQU4sIGluY2x1ZGluZyBRaW5RICovCisJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkgICAgKGJwZl9pbnQzMilFVEhFUlRZUEVfODAyMVEpOworCQliMSA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwKKwkJICAgIChicGZfaW50MzIpRVRIRVJUWVBFXzgwMjFRSU5RKTsKKwkJZ2VuX29yKGIwLGIxKTsKKwkJYjAgPSBiMTsKKworCQkvKiBJZiBhIHNwZWNpZmljIFZMQU4gaXMgcmVxdWVzdGVkLCBjaGVjayBWTEFOIGlkICovCisJCWlmICh2bGFuX251bSA+PSAwKSB7CisJCQliMSA9IGdlbl9tY21wKE9SX01BQ1BMLCAwLCBCUEZfSCwKKwkJCSAgICAoYnBmX2ludDMyKXZsYW5fbnVtLCAweDBmZmYpOworCQkJZ2VuX2FuZChiMCwgYjEpOworCQkJYjAgPSBiMTsKKwkJfQorCisJCW9mZl9tYWNwbCArPSA0OwogCQlvZmZfbGlua3R5cGUgKz0gNDsKKyNpZiAwCiAJCW9mZl9ubF9ub3NuYXAgKz0gNDsKIAkJb2ZmX25sICs9IDQ7CisjZW5kaWYKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNjcwMSwxNyArNzkzNSw2IEBACiAJCS8qTk9UUkVBQ0hFRCovCiAJfQogCi0JLyogY2hlY2sgZm9yIFZMQU4gKi8KLQliMCA9IGdlbl9jbXAoT1JfTElOSywgb3JpZ19saW5rdHlwZSwgQlBGX0gsIChicGZfaW50MzIpRVRIRVJUWVBFXzgwMjFRKTsKLQotCS8qIElmIGEgc3BlY2lmaWMgVkxBTiBpcyByZXF1ZXN0ZWQsIGNoZWNrIFZMQU4gaWQgKi8KLQlpZiAodmxhbl9udW0gPj0gMCkgewotCQliMSA9IGdlbl9tY21wKE9SX0xJTkssIG9yaWdfbmwsIEJQRl9ILCAoYnBmX2ludDMyKXZsYW5fbnVtLAotCQkgICAgMHgwZmZmKTsKLQkJZ2VuX2FuZChiMCwgYjEpOwotCQliMCA9IGIxOwotCX0KLQogCXJldHVybiAoYjApOwogfQogCkBAIC02NzM3LDcgKzc5NjAsNyBAQAogCiAgICAgICAgIGlmIChsYWJlbF9zdGFja19kZXB0aCA+IDApIHsKICAgICAgICAgICAgIC8qIGp1c3QgbWF0Y2ggdGhlIGJvdHRvbS1vZi1zdGFjayBiaXQgY2xlYXIgKi8KLSAgICAgICAgICAgIGIwID0gZ2VuX21jbXAoT1JfTElOSywgb3JpZ19ubC0yLCBCUEZfQiwgMCwgMHgwMSk7CisgICAgICAgICAgICBiMCA9IGdlbl9tY21wKE9SX01BQ1BMLCBvcmlnX25sLTIsIEJQRl9CLCAwLCAweDAxKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBJbmRpY2F0ZSB0aGF0IHdlJ3JlIGNoZWNraW5nIE1QTFMtZW5jYXBzdWxhdGVkIGhlYWRlcnMsCkBAIC02NzQ5LDYgKzc5NzIsOCBAQAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBETFRfQ19IRExDOiAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgICAgICAgIGNhc2UgRExUX0VOMTBNQjoKKyAgICAgICAgICAgIGNhc2UgRExUX05FVEFOQUxZWkVSOgorICAgICAgICAgICAgY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CiAgICAgICAgICAgICAgICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9NUExTKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCkBAIC02NzcyLDcgKzc5OTcsNyBAQAogCS8qIElmIGEgc3BlY2lmaWMgTVBMUyBsYWJlbCBpcyByZXF1ZXN0ZWQsIGNoZWNrIGl0ICovCiAJaWYgKGxhYmVsX251bSA+PSAwKSB7CiAJCWxhYmVsX251bSA9IGxhYmVsX251bSA8PCAxMjsgLyogbGFiZWwgaXMgc2hpZnRlZCAxMiBiaXRzIG9uIHRoZSB3aXJlICovCi0JCWIxID0gZ2VuX21jbXAoT1JfTElOSywgb3JpZ19ubCwgQlBGX1csIChicGZfaW50MzIpbGFiZWxfbnVtLAorCQliMSA9IGdlbl9tY21wKE9SX01BQ1BMLCBvcmlnX25sLCBCUEZfVywgKGJwZl9pbnQzMilsYWJlbF9udW0sCiAJCSAgICAweGZmZmZmMDAwKTsgLyogb25seSBjb21wYXJlIHRoZSBmaXJzdCAyMCBiaXRzICovCiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJYjAgPSBiMTsKQEAgLTY3OTUsOSArODAyMCwxMCBAQAogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BwcG9lcygpCitnZW5fcHBwb2VzKHNlc3NfbnVtKQorCWludCBzZXNzX251bTsKIHsKLQlzdHJ1Y3QgYmxvY2sgKmIwOworCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAogCS8qCiAJICogVGVzdCBhZ2FpbnN0IHRoZSBQUFBvRSBzZXNzaW9uIGxpbmstbGF5ZXIgdHlwZS4KQEAgLTY4MDYsNyArODAzMiw4IEBACiAKIAkvKgogCSAqIENoYW5nZSB0aGUgb2Zmc2V0cyB0byBwb2ludCB0byB0aGUgdHlwZSBhbmQgZGF0YSBmaWVsZHMgd2l0aGluCi0JICogdGhlIFBQUCBwYWNrZXQuCisJICogdGhlIFBQUCBwYWNrZXQsIGFuZCBub3RlIHRoYXQgdGhpcyBpcyBQUFBvRSByYXRoZXIgdGhhbgorCSAqIHJhdyBQUFAuCiAJICoKIAkgKiBYWFggLSB0aGlzIGlzIGEgYml0IG9mIGEga2x1ZGdlLiAgSWYgd2Ugd2VyZSB0byBzcGxpdCB0aGUKIAkgKiBjb21waWxlciBpbnRvIGEgcGFyc2VyIHRoYXQgcGFyc2VzIGFuIGV4cHJlc3Npb24gYW5kCkBAIC02ODM0LDI0ICs4MDYxLDM2IEBACiAJICovCiAJb3JpZ19saW5rdHlwZSA9IG9mZl9saW5rdHlwZTsJLyogc2F2ZSBvcmlnaW5hbCB2YWx1ZXMgKi8KIAlvcmlnX25sID0gb2ZmX25sOworCWlzX3BwcG9lcyA9IDE7CisKKwkvKiBJZiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcmVxdWVzdGVkLCBjaGVjayBQUFBvRSBzZXNzaW9uIGlkICovCisJaWYgKHNlc3NfbnVtID49IDApIHsKKwkJYjEgPSBnZW5fbWNtcChPUl9NQUNQTCwgb3JpZ19ubCwgQlBGX1csCisJCSAgICAoYnBmX2ludDMyKXNlc3NfbnVtLCAweDAwMDBmZmZmKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQliMCA9IGIxOworCX0KIAogCS8qCiAJICogVGhlICJuZXR3b3JrLWxheWVyIiBwcm90b2NvbCBpcyBQUFBvRSwgd2hpY2ggaGFzIGEgNi1ieXRlCi0JICogUFBQb0UgaGVhZGVyLCBmb2xsb3dlZCBieSBQUFAgcGF5bG9hZCwgc28gd2Ugc2V0IHRoZQotCSAqIG9mZnNldHMgdG8gdGhlIG5ldHdvcmsgbGF5ZXIgb2Zmc2V0IHBsdXMgNiBieXRlcyBmb3IKLQkgKiB0aGUgUFBQb0UgaGVhZGVyIHBsdXMgdGhlIHZhbHVlcyBhcHByb3ByaWF0ZSBmb3IgUFBQIHdoZW4KLQkgKiBlbmNhcHN1bGF0ZWQgaW4gRXRoZXJuZXQgKHdoaWNoIG1lYW5zIHRoZXJlJ3Mgbm8gSERMQwotCSAqIGVuY2Fwc3VsYXRpb24pLgorCSAqIFBQUG9FIGhlYWRlciwgZm9sbG93ZWQgYnkgYSBQUFAgcGFja2V0LgorCSAqCisJICogVGhlcmUgaXMgbm8gSERMQyBlbmNhcHN1bGF0aW9uIGZvciB0aGUgUFBQIHBhY2tldCAoaXQncworCSAqIGVuY2Fwc3VsYXRlZCBpbiBQUFBvRVMgaW5zdGVhZCksIHNvIHRoZSBsaW5rLWxheWVyIHR5cGUKKwkgKiBzdGFydHMgYXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFBQUCBwYWNrZXQuICBGb3IgUFBQb0UsCisJICogdGhhdCBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdG90YWwKKwkgKiBsaW5rLWxheWVyIHBheWxvYWQsIGluY2x1ZGluZyBhbnkgODAyLjIgTExDIGhlYWRlciwgc28KKwkgKiBpdCdzIDYgYnl0ZXMgcGFzdCBvZmZfbmwuCiAJICovCi0Jb2ZmX2xpbmt0eXBlID0gb3JpZ19ubCArIDY7Ci0Jb2ZmX25sID0gb3JpZ19ubCArIDYgKyAyOwotCW9mZl9ubF9ub3NuYXAgPSBvcmlnX25sICsgNiArIDI7CisJb2ZmX2xpbmt0eXBlID0gb2ZmX25sICsgNjsKIAogCS8qCi0JICogU2V0IHRoZSBsaW5rLWxheWVyIHR5cGUgdG8gUFBQLCBhcyBhbGwgc3Vic2VxdWVudCB0ZXN0cyB3aWxsCi0JICogYmUgb24gdGhlIGVuY2Fwc3VsYXRlZCBQUFAgaGVhZGVyLgorCSAqIFRoZSBuZXR3b3JrLWxheWVyIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKwkgKiBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQ7IHRoYXQncyBwYXN0IHRoZSA2LWJ5dGUKKwkgKiBQUFBvRSBoZWFkZXIgYW5kIHRoZSAyLWJ5dGUgUFBQIGhlYWRlci4KIAkgKi8KLQlsaW5rdHlwZSA9IERMVF9QUFA7CisJb2ZmX25sID0gNisyOworCW9mZl9ubF9ub3NuYXAgPSA2KzI7CiAKIAlyZXR1cm4gYjA7CiB9CkBAIC02OTk3LDggKzgyMzYsOSBAQAogCQlpc19sYW5lID0gMTsKIAkJb2ZmX21hYyA9IG9mZl9wYXlsb2FkICsgMjsJLyogTUFDIGhlYWRlciAqLwogCQlvZmZfbGlua3R5cGUgPSBvZmZfbWFjICsgMTI7Ci0JCW9mZl9ubCA9IG9mZl9tYWMgKyAxNDsJCS8qIEV0aGVybmV0IElJICovCi0JCW9mZl9ubF9ub3NuYXAgPSBvZmZfbWFjICsgMTc7CS8qIDgwMi4zKzgwMi4yICovCisJCW9mZl9tYWNwbCA9IG9mZl9tYWMgKyAxNDsJLyogRXRoZXJuZXQgKi8KKwkJb2ZmX25sID0gMDsJCQkvKiBFdGhlcm5ldCBJSSAqLworCQlvZmZfbmxfbm9zbmFwID0gMzsJCS8qIDgwMi4zKzgwMi4yICovCiAJCWJyZWFrOwogCiAJY2FzZSBBX0xMQzoKQEAgLTcwMjAsNiArODI2MCw3IEBACiAgKiBGSVNVLCBsZW5ndGggaXMgbnVsbAogICogTFNTVSwgbGVuZ3RoIGlzIDEgb3IgMgogICogTVNVLCBsZW5ndGggaXMgMyBvciBtb3JlCisgKiBGb3IgTVRQMl9IU0wsIHNlcXVlbmNlcyBhcmUgb24gMiBieXRlcywgYW5kIGxlbmd0aCBvbiA5IGJpdHMKICAqLwogc3RydWN0IGJsb2NrICoKIGdlbl9tdHAydHlwZV9hYmJyZXYodHlwZSkKQEAgLTcwMzEsNiArODI3Miw3IEBACiAKIAljYXNlIE1fRklTVToKIAkJaWYgKCAobGlua3R5cGUgIT0gRExUX01UUDIpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9FUkYpICYmCiAJCSAgICAgKGxpbmt0eXBlICE9IERMVF9NVFAyX1dJVEhfUEhEUikgKQogCQkJYnBmX2Vycm9yKCInZmlzdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMiIpOwogCQkvKiBnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgbWFzaywganR5cGUsIHJldmVyc2UsIHZhbHVlKSAqLwpAQCAtNzAzOSw2ICs4MjgxLDcgQEAKIAogCWNhc2UgTV9MU1NVOgogCQlpZiAoIChsaW5rdHlwZSAhPSBETFRfTVRQMikgJiYKKwkJICAgICAobGlua3R5cGUgIT0gRExUX0VSRikgJiYKIAkJICAgICAobGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCiAJCQlicGZfZXJyb3IoIidsc3N1JyBzdXBwb3J0ZWQgb25seSBvbiBNVFAyIik7CiAJCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfbGksIEJQRl9CLCAweDNmLCBCUEZfSkdULCAxLCAyKTsKQEAgLTcwNDgsMTEgKzgyOTEsMzkgQEAKIAogCWNhc2UgTV9NU1U6CiAJCWlmICggKGxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgorCQkgICAgIChsaW5rdHlwZSAhPSBETFRfRVJGKSAmJgogCQkgICAgIChsaW5rdHlwZSAhPSBETFRfTVRQMl9XSVRIX1BIRFIpICkKIAkJCWJwZl9lcnJvcigiJ21zdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMiIpOwogCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgb2ZmX2xpLCBCUEZfQiwgMHgzZiwgQlBGX0pHVCwgMCwgMik7CiAJCWJyZWFrOwogCisJY2FzZSBNSF9GSVNVOgorCQlpZiAoIChsaW5rdHlwZSAhPSBETFRfTVRQMikgJiYKKwkJICAgICAobGlua3R5cGUgIT0gRExUX0VSRikgJiYKKwkJICAgICAobGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCisJCQlicGZfZXJyb3IoIidoZmlzdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMl9IU0wiKTsKKwkJLyogZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIG1hc2ssIGp0eXBlLCByZXZlcnNlLCB2YWx1ZSkgKi8KKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saV9oc2wsIEJQRl9ILCAweGZmODAsIEJQRl9KRVEsIDAsIDApOworCQlicmVhazsKKworCWNhc2UgTUhfTFNTVToKKwkJaWYgKCAobGlua3R5cGUgIT0gRExUX01UUDIpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9NVFAyX1dJVEhfUEhEUikgKQorCQkJYnBmX2Vycm9yKCInaGxzc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDJfSFNMIik7CisJCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfbGlfaHNsLCBCUEZfSCwgMHhmZjgwLCBCUEZfSkdULCAxLCAweDAxMDApOworCQliMSA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgb2ZmX2xpX2hzbCwgQlBGX0gsIDB4ZmY4MCwgQlBGX0pHVCwgMCwgMCk7CisJCWdlbl9hbmQoYjEsIGIwKTsKKwkJYnJlYWs7CisKKwljYXNlIE1IX01TVToKKwkJaWYgKCAobGlua3R5cGUgIT0gRExUX01UUDIpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9NVFAyX1dJVEhfUEhEUikgKQorCQkJYnBmX2Vycm9yKCInaG1zdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMl9IU0wiKTsKKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saV9oc2wsIEJQRl9ILCAweGZmODAsIEJQRl9KR1QsIDAsIDB4MDEwMCk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYWJvcnQoKTsKIAl9CkBAIC03MDY4LDkgKzgzMzksMTcgQEAKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwOwogCWJwZl91X2ludDMyIHZhbDEgLCB2YWwyICwgdmFsMzsKKwl1X2ludCBuZXdvZmZfc2lvPW9mZl9zaW87CisJdV9pbnQgbmV3b2ZmX29wYz1vZmZfb3BjOworCXVfaW50IG5ld29mZl9kcGM9b2ZmX2RwYzsKKwl1X2ludCBuZXdvZmZfc2xzPW9mZl9zbHM7CiAKIAlzd2l0Y2ggKG10cDNmaWVsZCkgewogCisJY2FzZSBNSF9TSU86CisJCW5ld29mZl9zaW8gKz0gMzsgLyogb2Zmc2V0IGZvciBNVFAyX0hTTCAqLworCQkvKiBGQUxMVEhST1VHSCAqLworCiAJY2FzZSBNX1NJTzoKIAkJaWYgKG9mZl9zaW8gPT0gKHVfaW50KS0xKQogCQkJYnBmX2Vycm9yKCInc2lvJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKQEAgLTcwNzgsMTAgKzgzNTcsMTIgQEAKIAkJaWYoanZhbHVlID4gMjU1KQogCQkgICAgICAgIGJwZl9lcnJvcigic2lvIHZhbHVlICV1IHRvbyBiaWc7IG1heCB2YWx1ZSA9IDI1NSIsCiAJCSAgICAgICAgICAgIGp2YWx1ZSk7Ci0JCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfc2lvLCBCUEZfQiwgMHhmZmZmZmZmZiwKKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG5ld29mZl9zaW8sIEJQRl9CLCAweGZmZmZmZmZmLAogCQkgICAgKHVfaW50KWp0eXBlLCByZXZlcnNlLCAodV9pbnQpanZhbHVlKTsKIAkJYnJlYWs7CiAKKwljYXNlIE1IX09QQzoKKwkJbmV3b2ZmX29wYys9MzsKICAgICAgICAgY2FzZSBNX09QQzoKIAkgICAgICAgIGlmIChvZmZfb3BjID09ICh1X2ludCktMSkKIAkJCWJwZl9lcnJvcigiJ29wYycgc3VwcG9ydGVkIG9ubHkgb24gU1M3Iik7CkBAIC03MDk4LDEwICs4Mzc5LDE0IEBACiAJCXZhbDMgPSBqdmFsdWUgJiAweDAwMDAwMDAzOwogCQl2YWwzID0gdmFsMyA8PDIyOwogCQlqdmFsdWUgPSB2YWwxICsgdmFsMiArIHZhbDM7Ci0JCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfb3BjLCBCUEZfVywgMHgwMGMwZmYwZiwKKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG5ld29mZl9vcGMsIEJQRl9XLCAweDAwYzBmZjBmLAogCQkgICAgKHVfaW50KWp0eXBlLCByZXZlcnNlLCAodV9pbnQpanZhbHVlKTsKIAkJYnJlYWs7CiAKKwljYXNlIE1IX0RQQzoKKwkJbmV3b2ZmX2RwYyArPSAzOworCQkvKiBGQUxMVEhST1VHSCAqLworCiAJY2FzZSBNX0RQQzoKIAkgICAgICAgIGlmIChvZmZfZHBjID09ICh1X2ludCktMSkKIAkJCWJwZl9lcnJvcigiJ2RwYycgc3VwcG9ydGVkIG9ubHkgb24gU1M3Iik7CkBAIC03MTE2LDEwICs4NDAxLDEyIEBACiAJCXZhbDIgPSBqdmFsdWUgJiAweDAwMDAzZjAwOwogCQl2YWwyID0gdmFsMiA8PCA4OwogCQlqdmFsdWUgPSB2YWwxICsgdmFsMjsKLQkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9kcGMsIEJQRl9XLCAweGZmM2YwMDAwLAorCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgbmV3b2ZmX2RwYywgQlBGX1csIDB4ZmYzZjAwMDAsCiAJCSAgICAodV9pbnQpanR5cGUsIHJldmVyc2UsICh1X2ludClqdmFsdWUpOwogCQlicmVhazsKIAorCWNhc2UgTUhfU0xTOgorCSAgbmV3b2ZmX3Nscys9MzsKIAljYXNlIE1fU0xTOgogCSAgICAgICAgaWYgKG9mZl9zbHMgPT0gKHVfaW50KS0xKQogCQkJYnBmX2Vycm9yKCInc2xzJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKQEAgLTcxMzAsNyArODQxNyw3IEBACiAJCS8qIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gaXMgbWFkZSB0byBjb252ZXJ0IGp2YWx1ZQogCQkgKiB0byB0aGUgZm9ybWUgdXNlZCB0byB3cml0ZSBzbHMgaW4gYW4gc3M3IG1lc3NhZ2UqLwogCQlqdmFsdWUgPSBqdmFsdWUgPDwgNDsKLQkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9zbHMsIEJQRl9CLCAweGYwLAorCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgbmV3b2ZmX3NscywgQlBGX0IsIDB4ZjAsCiAJCSAgICAodV9pbnQpanR5cGUscmV2ZXJzZSwgKHVfaW50KWp2YWx1ZSk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9nZW5jb2RlLmggYi9nZW5jb2RlLmgKaW5kZXggZjRjNWNmNy4uYWZiNjkzMyAxMDA2NDQKLS0tIGEvZ2VuY29kZS5oCisrKyBiL2dlbmNvZGUuaApAQCAtMTgsNyArMTgsNyBAQAogICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9nZW5jb2RlLmgsdiAxLjYwLjIuMTEgMjAwNy8wNi8xMSAwOTo1MjowNCBndXkgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZ2VuY29kZS5oLHYgMS43MSAyMDA3LTExLTE4IDAyOjAzOjUyIGd1eSBFeHAgJCAoTEJMKQogICovCiAKIC8qCkBAIC0xMjYsMTIgKzEyNiwyMCBAQAogCiAjZGVmaW5lIFFfUkFESU8JCTQwCiAKKyNkZWZpbmUgUV9DQVJQCQk0MQorCiAvKiBEaXJlY3Rpb25hbCBxdWFsaWZpZXJzLiAqLwogCiAjZGVmaW5lIFFfU1JDCQkxCiAjZGVmaW5lIFFfRFNUCQkyCiAjZGVmaW5lIFFfT1IJCTMKICNkZWZpbmUgUV9BTkQJCTQKKyNkZWZpbmUgUV9BRERSMQkJNQorI2RlZmluZSBRX0FERFIyCQk2CisjZGVmaW5lIFFfQUREUjMJCTcKKyNkZWZpbmUgUV9BRERSNAkJOAorI2RlZmluZSBRX1JBCQk5CisjZGVmaW5lIFFfVEEJCTEwCiAKICNkZWZpbmUgUV9ERUZBVUxUCTAKICNkZWZpbmUgUV9VTkRFRgkJMjU1CkBAIC0xNzgsMTIgKzE4NiwyMyBAQAogI2RlZmluZSBNX0xTU1UJCTIzCS8qIExTU1UgKi8KICNkZWZpbmUgTV9NU1UJCTI0CS8qIE1TVSAqLwogCisvKiBNVFAyIEhTTCB0eXBlcyAqLworI2RlZmluZSBNSF9GSVNVCQkyNQkvKiBGSVNVIGZvciBIU0wgKi8KKyNkZWZpbmUgTUhfTFNTVQkJMjYJLyogTFNTVSAqLworI2RlZmluZSBNSF9NU1UJCTI3CS8qIE1TVSAqLworCiAvKiBNVFAzIGZpZWxkIHR5cGVzICovCiAjZGVmaW5lIE1fU0lPCQkxCiAjZGVmaW5lIE1fT1BDCQkyCiAjZGVmaW5lIE1fRFBDCQkzCiAjZGVmaW5lIE1fU0xTCQk0CiAKKy8qIE1UUDMgZmllbGQgdHlwZXMgaW4gY2FzZSBvZiBNVFAyIEhTTCAqLworI2RlZmluZSBNSF9TSU8JCTUKKyNkZWZpbmUgTUhfT1BDCQk2CisjZGVmaW5lIE1IX0RQQwkJNworI2RlZmluZSBNSF9TTFMJCTgKKwogCiBzdHJ1Y3Qgc2xpc3Q7CiAKQEAgLTIzMiw4ICsyNTEsOCBAQAogCXN0cnVjdCBzbGlzdCAqc3RtdHM7CS8qIHNpZGUgZWZmZWN0IHN0bXRzICovCiAJc3RydWN0IHN0bXQgczsJCS8qIGJyYW5jaCBzdG10ICovCiAJaW50IG1hcms7Ci0JaW50IGxvbmdqdDsJCS8qIGp0IGJyYW5jaCByZXF1aXJlcyBsb25nIGp1bXAgKi8KLQlpbnQgbG9uZ2pmOwkJLyogamYgYnJhbmNoIHJlcXVpcmVzIGxvbmcganVtcCAqLworCXVfaW50IGxvbmdqdDsJCS8qIGp0IGJyYW5jaCByZXF1aXJlcyBsb25nIGp1bXAgKi8KKwl1X2ludCBsb25namY7CQkvKiBqZiBicmFuY2ggcmVxdWlyZXMgbG9uZyBqdW1wICovCiAJaW50IGxldmVsOwogCWludCBvZmZzZXQ7CiAJaW50IHNlbnNlOwpAQCAtMjk1LDcgKzMxNCw3IEBACiBzdHJ1Y3QgYmxvY2sgKmdlbl9tcGxzKGludCk7CiAKIHN0cnVjdCBibG9jayAqZ2VuX3BwcG9lZCh2b2lkKTsKLXN0cnVjdCBibG9jayAqZ2VuX3BwcG9lcyh2b2lkKTsKK3N0cnVjdCBibG9jayAqZ2VuX3BwcG9lcyhpbnQpOwogCiBzdHJ1Y3QgYmxvY2sgKmdlbl9hdG1maWVsZF9jb2RlKGludCBhdG1maWVsZCwgYnBmX2ludDMyIGp2YWx1ZSwgYnBmX3VfaW50MzIganR5cGUsIGludCByZXZlcnNlKTsKIHN0cnVjdCBibG9jayAqZ2VuX2F0bXR5cGVfYWJicmV2KGludCB0eXBlKTsKQEAgLTMxMiwxNCArMzMxLDIxIEBACiBzdHJ1Y3QgYmxvY2sgKmdlbl9wZl9hY3Rpb24oaW50KTsKIHN0cnVjdCBibG9jayAqZ2VuX3BmX2RpcihpbnQpOwogCitzdHJ1Y3QgYmxvY2sgKmdlbl9wODAyMTFfdHlwZShpbnQsIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wODAyMTFfZmNkaXIoaW50KTsKKwogdm9pZCBicGZfb3B0aW1pemUoc3RydWN0IGJsb2NrICoqKTsKIHZvaWQgYnBmX2Vycm9yKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKyAgICBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjaWZkZWYgX19BVFRSSUJVVEVfX19GT1JNQVRfT0sKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQorI2VuZGlmIC8qIF9fQVRUUklCVVRFX19fRk9STUFUX09LICovCisgICAgOwogCiB2b2lkIGZpbmlzaF9wYXJzZShzdHJ1Y3QgYmxvY2sgKik7CiBjaGFyICpzZHVwKGNvbnN0IGNoYXIgKik7CiAKLXN0cnVjdCBicGZfaW5zbiAqaWNvZGVfdG9fZmNvZGUoc3RydWN0IGJsb2NrICosIGludCAqKTsKK3N0cnVjdCBicGZfaW5zbiAqaWNvZGVfdG9fZmNvZGUoc3RydWN0IGJsb2NrICosIHVfaW50ICopOwogaW50IHBjYXBfcGFyc2Uodm9pZCk7CiB2b2lkIGxleF9pbml0KGNvbnN0IGNoYXIgKik7CiB2b2lkIGxleF9jbGVhbnVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZ3JhbW1hci5jIGIvZ3JhbW1hci5jCmluZGV4IDk0Y2RkNjEuLmVhMzE2OWMgMTAwNjQ0Ci0tLSBhL2dyYW1tYXIuYworKysgYi9ncmFtbWFyLmMKQEAgLTEsMzAgKzEsMzcgQEAKLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjEuICAqLworLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNS4gICovCiAKLS8qIFNrZWxldG9uIHBhcnNlciBmb3IgWWFjYy1saWtlIHBhcnNpbmcgd2l0aCBCaXNvbiwKLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8qIEJpc29uIGltcGxlbWVudGF0aW9uIGZvciBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisgICAKKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCisgICAKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KIAotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKKyAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCisgICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKKyAgIHBhcnNlciBnZW5lcmF0b3IgdXNpbmcgdGhlIHNrZWxldG9uIG9yIGEgbW9kaWZpZWQgdmVyc2lvbiB0aGVyZW9mCisgICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCisgICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCisgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKKyAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KKyAgIAorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgorICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLwogCi0vKiBXcml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvIGNhbGxlZAotICAgYGBzZW1hbnRpYycnIHBhcnNlci4gICovCisvKiBDIExBTFIoMSkgcGFyc2VyIHNrZWxldG9uIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiwgYnkKKyAgIHNpbXBsaWZ5aW5nIHRoZSBvcmlnaW5hbCBzby1jYWxsZWQgInNlbWFudGljIiBwYXJzZXIuICAqLwogCiAvKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAogICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCkBAIC0zNyw3ICs0NCw3IEBACiAjZGVmaW5lIFlZQklTT04gMQogCiAvKiBCaXNvbiB2ZXJzaW9uLiAgKi8KLSNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjEiCisjZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi41IgogCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCkBAIC00NSwyMzUgKzUyLDI4IEBACiAvKiBQdXJlIHBhcnNlcnMuICAqLwogI2RlZmluZSBZWVBVUkUgMAogCisvKiBQdXNoIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVU0ggMAorCisvKiBQdWxsIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVTEwgMQorCiAvKiBVc2luZyBsb2NhdGlvbnMuICAqLwogI2RlZmluZSBZWUxTUF9ORUVERUQgMAogCiAvKiBTdWJzdGl0dXRlIHRoZSB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gbmFtZXMuICAqLwotI2RlZmluZSB5eXBhcnNlIHBjYXBfcGFyc2UKLSNkZWZpbmUgeXlsZXggICBwY2FwX2xleAotI2RlZmluZSB5eWVycm9yIHBjYXBfZXJyb3IKLSNkZWZpbmUgeXlsdmFsICBwY2FwX2x2YWwKLSNkZWZpbmUgeXljaGFyICBwY2FwX2NoYXIKLSNkZWZpbmUgeXlkZWJ1ZyBwY2FwX2RlYnVnCi0jZGVmaW5lIHl5bmVycnMgcGNhcF9uZXJycwotCi0KLS8qIFRva2Vucy4gICovCi0jaWZuZGVmIFlZVE9LRU5UWVBFCi0jIGRlZmluZSBZWVRPS0VOVFlQRQotICAgLyogUHV0IHRoZSB0b2tlbnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGF0IEdEQiBhbmQgb3RoZXIgZGVidWdnZXJzCi0gICAgICBrbm93IGFib3V0IHRoZW0uICAqLwotICAgZW51bSB5eXRva2VudHlwZSB7Ci0gICAgIERTVCA9IDI1OCwKLSAgICAgU1JDID0gMjU5LAotICAgICBIT1NUID0gMjYwLAotICAgICBHQVRFV0FZID0gMjYxLAotICAgICBORVQgPSAyNjIsCi0gICAgIE5FVE1BU0sgPSAyNjMsCi0gICAgIFBPUlQgPSAyNjQsCi0gICAgIFBPUlRSQU5HRSA9IDI2NSwKLSAgICAgTEVTUyA9IDI2NiwKLSAgICAgR1JFQVRFUiA9IDI2NywKLSAgICAgUFJPVE8gPSAyNjgsCi0gICAgIFBST1RPQ0hBSU4gPSAyNjksCi0gICAgIENCWVRFID0gMjcwLAotICAgICBBUlAgPSAyNzEsCi0gICAgIFJBUlAgPSAyNzIsCi0gICAgIElQID0gMjczLAotICAgICBTQ1RQID0gMjc0LAotICAgICBUQ1AgPSAyNzUsCi0gICAgIFVEUCA9IDI3NiwKLSAgICAgSUNNUCA9IDI3NywKLSAgICAgSUdNUCA9IDI3OCwKLSAgICAgSUdSUCA9IDI3OSwKLSAgICAgUElNID0gMjgwLAotICAgICBWUlJQID0gMjgxLAotICAgICBBVEFMSyA9IDI4MiwKLSAgICAgQUFSUCA9IDI4MywKLSAgICAgREVDTkVUID0gMjg0LAotICAgICBMQVQgPSAyODUsCi0gICAgIFNDQSA9IDI4NiwKLSAgICAgTU9QUkMgPSAyODcsCi0gICAgIE1PUERMID0gMjg4LAotICAgICBUS19CUk9BRENBU1QgPSAyODksCi0gICAgIFRLX01VTFRJQ0FTVCA9IDI5MCwKLSAgICAgTlVNID0gMjkxLAotICAgICBJTkJPVU5EID0gMjkyLAotICAgICBPVVRCT1VORCA9IDI5MywKLSAgICAgUEZfSUZOQU1FID0gMjk0LAotICAgICBQRl9SU0VUID0gMjk1LAotICAgICBQRl9STlIgPSAyOTYsCi0gICAgIFBGX1NSTlIgPSAyOTcsCi0gICAgIFBGX1JFQVNPTiA9IDI5OCwKLSAgICAgUEZfQUNUSU9OID0gMjk5LAotICAgICBMSU5LID0gMzAwLAotICAgICBHRVEgPSAzMDEsCi0gICAgIExFUSA9IDMwMiwKLSAgICAgTkVRID0gMzAzLAotICAgICBJRCA9IDMwNCwKLSAgICAgRUlEID0gMzA1LAotICAgICBISUQgPSAzMDYsCi0gICAgIEhJRDYgPSAzMDcsCi0gICAgIEFJRCA9IDMwOCwKLSAgICAgTFNIID0gMzA5LAotICAgICBSU0ggPSAzMTAsCi0gICAgIExFTiA9IDMxMSwKLSAgICAgSVBWNiA9IDMxMiwKLSAgICAgSUNNUFY2ID0gMzEzLAotICAgICBBSCA9IDMxNCwKLSAgICAgRVNQID0gMzE1LAotICAgICBWTEFOID0gMzE2LAotICAgICBNUExTID0gMzE3LAotICAgICBQUFBPRUQgPSAzMTgsCi0gICAgIFBQUE9FUyA9IDMxOSwKLSAgICAgSVNPID0gMzIwLAotICAgICBFU0lTID0gMzIxLAotICAgICBDTE5QID0gMzIyLAotICAgICBJU0lTID0gMzIzLAotICAgICBMMSA9IDMyNCwKLSAgICAgTDIgPSAzMjUsCi0gICAgIElJSCA9IDMyNiwKLSAgICAgTFNQID0gMzI3LAotICAgICBTTlAgPSAzMjgsCi0gICAgIENTTlAgPSAzMjksCi0gICAgIFBTTlAgPSAzMzAsCi0gICAgIFNUUCA9IDMzMSwKLSAgICAgSVBYID0gMzMyLAotICAgICBORVRCRVVJID0gMzMzLAotICAgICBMQU5FID0gMzM0LAotICAgICBMTEMgPSAzMzUsCi0gICAgIE1FVEFDID0gMzM2LAotICAgICBCQ0MgPSAzMzcsCi0gICAgIFNDID0gMzM4LAotICAgICBJTE1JQyA9IDMzOSwKLSAgICAgT0FNRjRFQyA9IDM0MCwKLSAgICAgT0FNRjRTQyA9IDM0MSwKLSAgICAgT0FNID0gMzQyLAotICAgICBPQU1GNCA9IDM0MywKLSAgICAgQ09OTkVDVE1TRyA9IDM0NCwKLSAgICAgTUVUQUNPTk5FQ1QgPSAzNDUsCi0gICAgIFZQSSA9IDM0NiwKLSAgICAgVkNJID0gMzQ3LAotICAgICBSQURJTyA9IDM0OCwKLSAgICAgRklTVSA9IDM0OSwKLSAgICAgTFNTVSA9IDM1MCwKLSAgICAgTVNVID0gMzUxLAotICAgICBTSU8gPSAzNTIsCi0gICAgIE9QQyA9IDM1MywKLSAgICAgRFBDID0gMzU0LAotICAgICBTTFMgPSAzNTUsCi0gICAgIEFORCA9IDM1NiwKLSAgICAgT1IgPSAzNTcsCi0gICAgIFVNSU5VUyA9IDM1OAotICAgfTsKLSNlbmRpZgotLyogVG9rZW5zLiAgKi8KLSNkZWZpbmUgRFNUIDI1OAotI2RlZmluZSBTUkMgMjU5Ci0jZGVmaW5lIEhPU1QgMjYwCi0jZGVmaW5lIEdBVEVXQVkgMjYxCi0jZGVmaW5lIE5FVCAyNjIKLSNkZWZpbmUgTkVUTUFTSyAyNjMKLSNkZWZpbmUgUE9SVCAyNjQKLSNkZWZpbmUgUE9SVFJBTkdFIDI2NQotI2RlZmluZSBMRVNTIDI2NgotI2RlZmluZSBHUkVBVEVSIDI2NwotI2RlZmluZSBQUk9UTyAyNjgKLSNkZWZpbmUgUFJPVE9DSEFJTiAyNjkKLSNkZWZpbmUgQ0JZVEUgMjcwCi0jZGVmaW5lIEFSUCAyNzEKLSNkZWZpbmUgUkFSUCAyNzIKLSNkZWZpbmUgSVAgMjczCi0jZGVmaW5lIFNDVFAgMjc0Ci0jZGVmaW5lIFRDUCAyNzUKLSNkZWZpbmUgVURQIDI3NgotI2RlZmluZSBJQ01QIDI3NwotI2RlZmluZSBJR01QIDI3OAotI2RlZmluZSBJR1JQIDI3OQotI2RlZmluZSBQSU0gMjgwCi0jZGVmaW5lIFZSUlAgMjgxCi0jZGVmaW5lIEFUQUxLIDI4MgotI2RlZmluZSBBQVJQIDI4MwotI2RlZmluZSBERUNORVQgMjg0Ci0jZGVmaW5lIExBVCAyODUKLSNkZWZpbmUgU0NBIDI4NgotI2RlZmluZSBNT1BSQyAyODcKLSNkZWZpbmUgTU9QREwgMjg4Ci0jZGVmaW5lIFRLX0JST0FEQ0FTVCAyODkKLSNkZWZpbmUgVEtfTVVMVElDQVNUIDI5MAotI2RlZmluZSBOVU0gMjkxCi0jZGVmaW5lIElOQk9VTkQgMjkyCi0jZGVmaW5lIE9VVEJPVU5EIDI5MwotI2RlZmluZSBQRl9JRk5BTUUgMjk0Ci0jZGVmaW5lIFBGX1JTRVQgMjk1Ci0jZGVmaW5lIFBGX1JOUiAyOTYKLSNkZWZpbmUgUEZfU1JOUiAyOTcKLSNkZWZpbmUgUEZfUkVBU09OIDI5OAotI2RlZmluZSBQRl9BQ1RJT04gMjk5Ci0jZGVmaW5lIExJTksgMzAwCi0jZGVmaW5lIEdFUSAzMDEKLSNkZWZpbmUgTEVRIDMwMgotI2RlZmluZSBORVEgMzAzCi0jZGVmaW5lIElEIDMwNAotI2RlZmluZSBFSUQgMzA1Ci0jZGVmaW5lIEhJRCAzMDYKLSNkZWZpbmUgSElENiAzMDcKLSNkZWZpbmUgQUlEIDMwOAotI2RlZmluZSBMU0ggMzA5Ci0jZGVmaW5lIFJTSCAzMTAKLSNkZWZpbmUgTEVOIDMxMQotI2RlZmluZSBJUFY2IDMxMgotI2RlZmluZSBJQ01QVjYgMzEzCi0jZGVmaW5lIEFIIDMxNAotI2RlZmluZSBFU1AgMzE1Ci0jZGVmaW5lIFZMQU4gMzE2Ci0jZGVmaW5lIE1QTFMgMzE3Ci0jZGVmaW5lIFBQUE9FRCAzMTgKLSNkZWZpbmUgUFBQT0VTIDMxOQotI2RlZmluZSBJU08gMzIwCi0jZGVmaW5lIEVTSVMgMzIxCi0jZGVmaW5lIENMTlAgMzIyCi0jZGVmaW5lIElTSVMgMzIzCi0jZGVmaW5lIEwxIDMyNAotI2RlZmluZSBMMiAzMjUKLSNkZWZpbmUgSUlIIDMyNgotI2RlZmluZSBMU1AgMzI3Ci0jZGVmaW5lIFNOUCAzMjgKLSNkZWZpbmUgQ1NOUCAzMjkKLSNkZWZpbmUgUFNOUCAzMzAKLSNkZWZpbmUgU1RQIDMzMQotI2RlZmluZSBJUFggMzMyCi0jZGVmaW5lIE5FVEJFVUkgMzMzCi0jZGVmaW5lIExBTkUgMzM0Ci0jZGVmaW5lIExMQyAzMzUKLSNkZWZpbmUgTUVUQUMgMzM2Ci0jZGVmaW5lIEJDQyAzMzcKLSNkZWZpbmUgU0MgMzM4Ci0jZGVmaW5lIElMTUlDIDMzOQotI2RlZmluZSBPQU1GNEVDIDM0MAotI2RlZmluZSBPQU1GNFNDIDM0MQotI2RlZmluZSBPQU0gMzQyCi0jZGVmaW5lIE9BTUY0IDM0MwotI2RlZmluZSBDT05ORUNUTVNHIDM0NAotI2RlZmluZSBNRVRBQ09OTkVDVCAzNDUKLSNkZWZpbmUgVlBJIDM0NgotI2RlZmluZSBWQ0kgMzQ3Ci0jZGVmaW5lIFJBRElPIDM0OAotI2RlZmluZSBGSVNVIDM0OQotI2RlZmluZSBMU1NVIDM1MAotI2RlZmluZSBNU1UgMzUxCi0jZGVmaW5lIFNJTyAzNTIKLSNkZWZpbmUgT1BDIDM1MwotI2RlZmluZSBEUEMgMzU0Ci0jZGVmaW5lIFNMUyAzNTUKLSNkZWZpbmUgQU5EIDM1NgotI2RlZmluZSBPUiAzNTcKLSNkZWZpbmUgVU1JTlVTIDM1OAotCi0KKyNkZWZpbmUgeXlwYXJzZSAgICAgICAgIHBjYXBfcGFyc2UKKyNkZWZpbmUgeXlsZXggICAgICAgICAgIHBjYXBfbGV4CisjZGVmaW5lIHl5ZXJyb3IgICAgICAgICBwY2FwX2Vycm9yCisjZGVmaW5lIHl5bHZhbCAgICAgICAgICBwY2FwX2x2YWwKKyNkZWZpbmUgeXljaGFyICAgICAgICAgIHBjYXBfY2hhcgorI2RlZmluZSB5eWRlYnVnICAgICAgICAgcGNhcF9kZWJ1ZworI2RlZmluZSB5eW5lcnJzICAgICAgICAgcGNhcF9uZXJycwogCiAKIC8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLworCisvKiBMaW5lIDI2OCBvZiB5YWNjLmMgICovCiAjbGluZSAxICJncmFtbWFyLnkiCiAKIC8qCkBAIC0yOTksNyArOTksNyBAQAogICovCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9ncmFtbWFyLnksdiAxLjg2LjIuOSAyMDA3LzA5LzEyIDE5OjE3OjI1IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZ3JhbW1hci55LHYgMS4xMDEgMjAwNy0xMS0xOCAwMjowMzo1MiBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC0zMjIsNiArMTIyLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2VuZGlmIC8qIFdJTjMyICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMzM0LDcgKzEzNSw4IEBACiAjaW5jbHVkZSA8bmV0L3BmdmFyLmg+CiAjaW5jbHVkZSA8bmV0L2lmX3BmbG9nLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxwY2FwLW5hbWVkYi5oPgorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CiAKICNpZmRlZiBIQVZFX09TX1BST1RPX0gKICNpbmNsdWRlICJvcy1wcm90by5oIgpAQCAtMzQ0LDYgKzE0Niw5MiBAQAogCQkJIChxKS5kaXIgPSAoZCksXAogCQkJIChxKS5hZGRyID0gKGEpCiAKK3N0cnVjdCB0b2sgeworCWludCB2OwkJCS8qIHZhbHVlICovCisJY29uc3QgY2hhciAqczsJCS8qIHN0cmluZyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgaWVlZTgwMjExX3R5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1RZUEVfREFUQSwgImRhdGEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfTUdULCAibWd0IiB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX01HVCwgIm1hbmFnZW1lbnQiIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLCAiY3RsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwgImNvbnRyb2wiIH0sCisJeyAwLCBOVUxMIH0KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBpZWVlODAyMTFfbWd0X3N1YnR5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVRLCAiYXNzb2NyZXEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVRLCAiYXNzb2MtcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFU1AsICJhc3NvY3Jlc3AiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVTUCwgImFzc29jLXJlc3AiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVEsICJyZWFzc29jcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVRLCAicmVhc3NvYy1yZXEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQLCAicmVhc3NvY3Jlc3AiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQLCAicmVhc3NvYy1yZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFUSwgInByb2JlcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFUSwgInByb2JlLXJlcSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QUk9CRV9SRVNQLCAicHJvYmVyZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFU1AsICJwcm9iZS1yZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0JFQUNPTiwgImJlYWNvbiIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BVElNLCAiYXRpbSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ESVNBU1NPQywgImRpc2Fzc29jIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RJU0FTU09DLCAiZGlzYXNzb2NpYXRpb24iIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVVUSCwgImF1dGgiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVVUSCwgImF1dGhlbnRpY2F0aW9uIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RFQVVUSCwgImRlYXV0aCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ERUFVVEgsICJkZWF1dGhlbnRpY2F0aW9uIiB9LAorCXsgMCwgTlVMTCB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgaWVlZTgwMjExX2N0bF9zdWJ0eXBlc1tdID0geworCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BTX1BPTEwsICJwcy1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JUUywgInJ0cyIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMsICJjdHMiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLLCAiYWNrIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0VORCwgImNmLWVuZCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9FTkRfQUNLLCAiY2YtZW5kLWFjayIgfSwKKwl7IDAsIE5VTEwgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGllZWU4MDIxMV9kYXRhX3N1YnR5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfREFUQSwgImRhdGEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNLLCAiZGF0YS1jZi1hY2siIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfUE9MTCwgImRhdGEtY2YtcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9BQ1BMLCAiZGF0YS1jZi1hY2stcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEEsICJudWxsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9BQ0ssICJjZi1hY2siIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBX0NGX1BPTEwsICJjZi1wb2xsIiAgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfQUNQTCwgImNmLWFjay1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfREFUQSwgInFvcy1kYXRhIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNLLCAicW9zLWRhdGEtY2YtYWNrIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfUE9MTCwgInFvcy1kYXRhLWNmLXBvbGwiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TfElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9BQ1BMLCAicW9zLWRhdGEtY2YtYWNrLXBvbGwiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TfElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEEsICJxb3MiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TfElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfUE9MTCwgInFvcy1jZi1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBX0NGX0FDUEwsICJxb3MtY2YtYWNrLXBvbGwiIH0sCisJeyAwLCBOVUxMIH0KK307CitzdHJ1Y3QgdHlwZTJ0b2sgeworCWludCB0eXBlOworCWNvbnN0IHN0cnVjdCB0b2sgKnRvazsKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGUydG9rIGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1RZUEVfTUdULCBpZWVlODAyMTFfbWd0X3N1YnR5cGVzIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLCBpZWVlODAyMTFfY3RsX3N1YnR5cGVzIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfREFUQSwgaWVlZTgwMjExX2RhdGFfc3VidHlwZXMgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGludAorc3RyMnRvayhjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCB0b2sgKnRva3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyB0b2tzW2ldLnMgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChwY2FwX3N0cmNhc2VjbXAodG9rc1tpXS5zLCBzdHIpID09IDApCisJCQlyZXR1cm4gKHRva3NbaV0udik7CisJfQorCXJldHVybiAoLTEpOworfQorCiBpbnQgbl9lcnJvcnMgPSAwOwogCiBzdGF0aWMgc3RydWN0IHF1YWwgcWVyciA9IHsgUV9VTkRFRiwgUV9VTkRFRiwgUV9VTkRFRiwgUV9VTkRFRiB9OwpAQCAtMzU2LDcgKzI0NCw3IEBACiAJLyogTk9UUkVBQ0hFRCAqLwogfQogCi0jaWZuZGVmIFlZQklTT04KKyNpZmRlZiBORUVEX1lZUEFSU0VfV1JBUFBFUgogaW50IHl5cGFyc2Uodm9pZCk7CiAKIGludApAQCAtMzkwLDYgKzI3OCwxNiBAQAogCWVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJkcm9wIikgPT0gMCB8fAogCQlwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAiYmxvY2siKSA9PSAwKQogCQlyZXR1cm4gKFBGX0RST1ApOworI2lmIEhBVkVfUEZfTkFUX1RIUk9VR0hfUEZfTk9SRFIKKwllbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAicmRyIikgPT0gMCkKKwkJcmV0dXJuIChQRl9SRFIpOworCWVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJuYXQiKSA9PSAwKQorCQlyZXR1cm4gKFBGX05BVCk7CisJZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgImJpbmF0IikgPT0gMCkKKwkJcmV0dXJuIChQRl9CSU5BVCk7CisJZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgIm5vcmRyIikgPT0gMCkKKwkJcmV0dXJuIChQRl9OT1JEUik7CisjZW5kaWYKIAllbHNlIHsKIAkJYnBmX2Vycm9yKCJ1bmtub3duIFBGIGFjdGlvbiIpOwogCQkvKk5PVFJFQUNIRUQqLwpAQCAtNDAxLDYgKzI5OSw5IEBACiB7CiAJYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CiAJLypOT1RSRUFDSEVEKi8KKworCS8qIHRoaXMgaXMgdG8gbWFrZSB0aGUgVkMgY29tcGlsZXIgaGFwcHkgKi8KKwlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQwOCwxMCArMzA5LDE2IEBACiB7CiAJYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CiAJLypOT1RSRUFDSEVEKi8KKworCS8qIHRoaXMgaXMgdG8gbWFrZSB0aGUgVkMgY29tcGlsZXIgaGFwcHkgKi8KKwlyZXR1cm4gLTE7CiB9CiAjZW5kaWYgLyogSEFWRV9ORVRfUEZWQVJfSCAqLwogCiAKKy8qIExpbmUgMjY4IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMyMSAieS50YWIuYyIKKwogLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KICNpZm5kZWYgWVlERUJVRwogIyBkZWZpbmUgWVlERUJVRyAwCkBAIC00MzAsOSArMzM3LDI2MyBAQAogIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCiAjZW5kaWYKIAotI2lmICEgZGVmaW5lZCAoWVlTVFlQRSkgJiYgISBkZWZpbmVkIChZWVNUWVBFX0lTX0RFQ0xBUkVEKQotI2xpbmUgMTM4ICJncmFtbWFyLnkiCi10eXBlZGVmIHVuaW9uIFlZU1RZUEUgeworCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBEU1QgPSAyNTgsCisgICAgIFNSQyA9IDI1OSwKKyAgICAgSE9TVCA9IDI2MCwKKyAgICAgR0FURVdBWSA9IDI2MSwKKyAgICAgTkVUID0gMjYyLAorICAgICBORVRNQVNLID0gMjYzLAorICAgICBQT1JUID0gMjY0LAorICAgICBQT1JUUkFOR0UgPSAyNjUsCisgICAgIExFU1MgPSAyNjYsCisgICAgIEdSRUFURVIgPSAyNjcsCisgICAgIFBST1RPID0gMjY4LAorICAgICBQUk9UT0NIQUlOID0gMjY5LAorICAgICBDQllURSA9IDI3MCwKKyAgICAgQVJQID0gMjcxLAorICAgICBSQVJQID0gMjcyLAorICAgICBJUCA9IDI3MywKKyAgICAgU0NUUCA9IDI3NCwKKyAgICAgVENQID0gMjc1LAorICAgICBVRFAgPSAyNzYsCisgICAgIElDTVAgPSAyNzcsCisgICAgIElHTVAgPSAyNzgsCisgICAgIElHUlAgPSAyNzksCisgICAgIFBJTSA9IDI4MCwKKyAgICAgVlJSUCA9IDI4MSwKKyAgICAgQ0FSUCA9IDI4MiwKKyAgICAgQVRBTEsgPSAyODMsCisgICAgIEFBUlAgPSAyODQsCisgICAgIERFQ05FVCA9IDI4NSwKKyAgICAgTEFUID0gMjg2LAorICAgICBTQ0EgPSAyODcsCisgICAgIE1PUFJDID0gMjg4LAorICAgICBNT1BETCA9IDI4OSwKKyAgICAgVEtfQlJPQURDQVNUID0gMjkwLAorICAgICBUS19NVUxUSUNBU1QgPSAyOTEsCisgICAgIE5VTSA9IDI5MiwKKyAgICAgSU5CT1VORCA9IDI5MywKKyAgICAgT1VUQk9VTkQgPSAyOTQsCisgICAgIFBGX0lGTkFNRSA9IDI5NSwKKyAgICAgUEZfUlNFVCA9IDI5NiwKKyAgICAgUEZfUk5SID0gMjk3LAorICAgICBQRl9TUk5SID0gMjk4LAorICAgICBQRl9SRUFTT04gPSAyOTksCisgICAgIFBGX0FDVElPTiA9IDMwMCwKKyAgICAgVFlQRSA9IDMwMSwKKyAgICAgU1VCVFlQRSA9IDMwMiwKKyAgICAgRElSID0gMzAzLAorICAgICBBRERSMSA9IDMwNCwKKyAgICAgQUREUjIgPSAzMDUsCisgICAgIEFERFIzID0gMzA2LAorICAgICBBRERSNCA9IDMwNywKKyAgICAgUkEgPSAzMDgsCisgICAgIFRBID0gMzA5LAorICAgICBMSU5LID0gMzEwLAorICAgICBHRVEgPSAzMTEsCisgICAgIExFUSA9IDMxMiwKKyAgICAgTkVRID0gMzEzLAorICAgICBJRCA9IDMxNCwKKyAgICAgRUlEID0gMzE1LAorICAgICBISUQgPSAzMTYsCisgICAgIEhJRDYgPSAzMTcsCisgICAgIEFJRCA9IDMxOCwKKyAgICAgTFNIID0gMzE5LAorICAgICBSU0ggPSAzMjAsCisgICAgIExFTiA9IDMyMSwKKyAgICAgSVBWNiA9IDMyMiwKKyAgICAgSUNNUFY2ID0gMzIzLAorICAgICBBSCA9IDMyNCwKKyAgICAgRVNQID0gMzI1LAorICAgICBWTEFOID0gMzI2LAorICAgICBNUExTID0gMzI3LAorICAgICBQUFBPRUQgPSAzMjgsCisgICAgIFBQUE9FUyA9IDMyOSwKKyAgICAgSVNPID0gMzMwLAorICAgICBFU0lTID0gMzMxLAorICAgICBDTE5QID0gMzMyLAorICAgICBJU0lTID0gMzMzLAorICAgICBMMSA9IDMzNCwKKyAgICAgTDIgPSAzMzUsCisgICAgIElJSCA9IDMzNiwKKyAgICAgTFNQID0gMzM3LAorICAgICBTTlAgPSAzMzgsCisgICAgIENTTlAgPSAzMzksCisgICAgIFBTTlAgPSAzNDAsCisgICAgIFNUUCA9IDM0MSwKKyAgICAgSVBYID0gMzQyLAorICAgICBORVRCRVVJID0gMzQzLAorICAgICBMQU5FID0gMzQ0LAorICAgICBMTEMgPSAzNDUsCisgICAgIE1FVEFDID0gMzQ2LAorICAgICBCQ0MgPSAzNDcsCisgICAgIFNDID0gMzQ4LAorICAgICBJTE1JQyA9IDM0OSwKKyAgICAgT0FNRjRFQyA9IDM1MCwKKyAgICAgT0FNRjRTQyA9IDM1MSwKKyAgICAgT0FNID0gMzUyLAorICAgICBPQU1GNCA9IDM1MywKKyAgICAgQ09OTkVDVE1TRyA9IDM1NCwKKyAgICAgTUVUQUNPTk5FQ1QgPSAzNTUsCisgICAgIFZQSSA9IDM1NiwKKyAgICAgVkNJID0gMzU3LAorICAgICBSQURJTyA9IDM1OCwKKyAgICAgRklTVSA9IDM1OSwKKyAgICAgTFNTVSA9IDM2MCwKKyAgICAgTVNVID0gMzYxLAorICAgICBIRklTVSA9IDM2MiwKKyAgICAgSExTU1UgPSAzNjMsCisgICAgIEhNU1UgPSAzNjQsCisgICAgIFNJTyA9IDM2NSwKKyAgICAgT1BDID0gMzY2LAorICAgICBEUEMgPSAzNjcsCisgICAgIFNMUyA9IDM2OCwKKyAgICAgSFNJTyA9IDM2OSwKKyAgICAgSE9QQyA9IDM3MCwKKyAgICAgSERQQyA9IDM3MSwKKyAgICAgSFNMUyA9IDM3MiwKKyAgICAgQU5EID0gMzczLAorICAgICBPUiA9IDM3NCwKKyAgICAgVU1JTlVTID0gMzc1CisgICB9OworI2VuZGlmCisvKiBUb2tlbnMuICAqLworI2RlZmluZSBEU1QgMjU4CisjZGVmaW5lIFNSQyAyNTkKKyNkZWZpbmUgSE9TVCAyNjAKKyNkZWZpbmUgR0FURVdBWSAyNjEKKyNkZWZpbmUgTkVUIDI2MgorI2RlZmluZSBORVRNQVNLIDI2MworI2RlZmluZSBQT1JUIDI2NAorI2RlZmluZSBQT1JUUkFOR0UgMjY1CisjZGVmaW5lIExFU1MgMjY2CisjZGVmaW5lIEdSRUFURVIgMjY3CisjZGVmaW5lIFBST1RPIDI2OAorI2RlZmluZSBQUk9UT0NIQUlOIDI2OQorI2RlZmluZSBDQllURSAyNzAKKyNkZWZpbmUgQVJQIDI3MQorI2RlZmluZSBSQVJQIDI3MgorI2RlZmluZSBJUCAyNzMKKyNkZWZpbmUgU0NUUCAyNzQKKyNkZWZpbmUgVENQIDI3NQorI2RlZmluZSBVRFAgMjc2CisjZGVmaW5lIElDTVAgMjc3CisjZGVmaW5lIElHTVAgMjc4CisjZGVmaW5lIElHUlAgMjc5CisjZGVmaW5lIFBJTSAyODAKKyNkZWZpbmUgVlJSUCAyODEKKyNkZWZpbmUgQ0FSUCAyODIKKyNkZWZpbmUgQVRBTEsgMjgzCisjZGVmaW5lIEFBUlAgMjg0CisjZGVmaW5lIERFQ05FVCAyODUKKyNkZWZpbmUgTEFUIDI4NgorI2RlZmluZSBTQ0EgMjg3CisjZGVmaW5lIE1PUFJDIDI4OAorI2RlZmluZSBNT1BETCAyODkKKyNkZWZpbmUgVEtfQlJPQURDQVNUIDI5MAorI2RlZmluZSBUS19NVUxUSUNBU1QgMjkxCisjZGVmaW5lIE5VTSAyOTIKKyNkZWZpbmUgSU5CT1VORCAyOTMKKyNkZWZpbmUgT1VUQk9VTkQgMjk0CisjZGVmaW5lIFBGX0lGTkFNRSAyOTUKKyNkZWZpbmUgUEZfUlNFVCAyOTYKKyNkZWZpbmUgUEZfUk5SIDI5NworI2RlZmluZSBQRl9TUk5SIDI5OAorI2RlZmluZSBQRl9SRUFTT04gMjk5CisjZGVmaW5lIFBGX0FDVElPTiAzMDAKKyNkZWZpbmUgVFlQRSAzMDEKKyNkZWZpbmUgU1VCVFlQRSAzMDIKKyNkZWZpbmUgRElSIDMwMworI2RlZmluZSBBRERSMSAzMDQKKyNkZWZpbmUgQUREUjIgMzA1CisjZGVmaW5lIEFERFIzIDMwNgorI2RlZmluZSBBRERSNCAzMDcKKyNkZWZpbmUgUkEgMzA4CisjZGVmaW5lIFRBIDMwOQorI2RlZmluZSBMSU5LIDMxMAorI2RlZmluZSBHRVEgMzExCisjZGVmaW5lIExFUSAzMTIKKyNkZWZpbmUgTkVRIDMxMworI2RlZmluZSBJRCAzMTQKKyNkZWZpbmUgRUlEIDMxNQorI2RlZmluZSBISUQgMzE2CisjZGVmaW5lIEhJRDYgMzE3CisjZGVmaW5lIEFJRCAzMTgKKyNkZWZpbmUgTFNIIDMxOQorI2RlZmluZSBSU0ggMzIwCisjZGVmaW5lIExFTiAzMjEKKyNkZWZpbmUgSVBWNiAzMjIKKyNkZWZpbmUgSUNNUFY2IDMyMworI2RlZmluZSBBSCAzMjQKKyNkZWZpbmUgRVNQIDMyNQorI2RlZmluZSBWTEFOIDMyNgorI2RlZmluZSBNUExTIDMyNworI2RlZmluZSBQUFBPRUQgMzI4CisjZGVmaW5lIFBQUE9FUyAzMjkKKyNkZWZpbmUgSVNPIDMzMAorI2RlZmluZSBFU0lTIDMzMQorI2RlZmluZSBDTE5QIDMzMgorI2RlZmluZSBJU0lTIDMzMworI2RlZmluZSBMMSAzMzQKKyNkZWZpbmUgTDIgMzM1CisjZGVmaW5lIElJSCAzMzYKKyNkZWZpbmUgTFNQIDMzNworI2RlZmluZSBTTlAgMzM4CisjZGVmaW5lIENTTlAgMzM5CisjZGVmaW5lIFBTTlAgMzQwCisjZGVmaW5lIFNUUCAzNDEKKyNkZWZpbmUgSVBYIDM0MgorI2RlZmluZSBORVRCRVVJIDM0MworI2RlZmluZSBMQU5FIDM0NAorI2RlZmluZSBMTEMgMzQ1CisjZGVmaW5lIE1FVEFDIDM0NgorI2RlZmluZSBCQ0MgMzQ3CisjZGVmaW5lIFNDIDM0OAorI2RlZmluZSBJTE1JQyAzNDkKKyNkZWZpbmUgT0FNRjRFQyAzNTAKKyNkZWZpbmUgT0FNRjRTQyAzNTEKKyNkZWZpbmUgT0FNIDM1MgorI2RlZmluZSBPQU1GNCAzNTMKKyNkZWZpbmUgQ09OTkVDVE1TRyAzNTQKKyNkZWZpbmUgTUVUQUNPTk5FQ1QgMzU1CisjZGVmaW5lIFZQSSAzNTYKKyNkZWZpbmUgVkNJIDM1NworI2RlZmluZSBSQURJTyAzNTgKKyNkZWZpbmUgRklTVSAzNTkKKyNkZWZpbmUgTFNTVSAzNjAKKyNkZWZpbmUgTVNVIDM2MQorI2RlZmluZSBIRklTVSAzNjIKKyNkZWZpbmUgSExTU1UgMzYzCisjZGVmaW5lIEhNU1UgMzY0CisjZGVmaW5lIFNJTyAzNjUKKyNkZWZpbmUgT1BDIDM2NgorI2RlZmluZSBEUEMgMzY3CisjZGVmaW5lIFNMUyAzNjgKKyNkZWZpbmUgSFNJTyAzNjkKKyNkZWZpbmUgSE9QQyAzNzAKKyNkZWZpbmUgSERQQyAzNzEKKyNkZWZpbmUgSFNMUyAzNzIKKyNkZWZpbmUgQU5EIDM3MworI2RlZmluZSBPUiAzNzQKKyNkZWZpbmUgVU1JTlVTIDM3NQorCisKKworCisjaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKK3R5cGVkZWYgdW5pb24gWVlTVFlQRQoreworCisvKiBMaW5lIDI5MyBvZiB5YWNjLmMgICovCisjbGluZSAyNDIgImdyYW1tYXIueSIKKwogCWludCBpOwogCWJwZl91X2ludDMyIGg7CiAJdV9jaGFyICplOwpAQCAtNDQ2LDM4ICs2MDcsNzMgQEAKIAkJc3RydWN0IGJsb2NrICpiOwogCX0gYmxrOwogCXN0cnVjdCBibG9jayAqcmJsazsKKworCisKKy8qIExpbmUgMjkzIG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYxNSAieS50YWIuYyIKIH0gWVlTVFlQRTsKLS8qIExpbmUgMTk2IG9mIHlhY2MuYy4gICovCi0jbGluZSA0NTIgInkudGFiLmMiCisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogI2VuZGlmCiAKIAotCiAvKiBDb3B5IHRoZSBzZWNvbmQgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCiAKIAotLyogTGluZSAyMTkgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDQ2NCAieS50YWIuYyIKKy8qIExpbmUgMzQzIG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYyNyAieS50YWIuYyIKIAotI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKF9fU0laRV9UWVBFX18pCi0jIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjaWZkZWYgc2hvcnQKKyMgdW5kZWYgc2hvcnQKICNlbmRpZgotI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKHNpemVfdCkKLSMgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorCisjaWZkZWYgWVlUWVBFX1VJTlQ4Cit0eXBlZGVmIFlZVFlQRV9VSU5UOCB5eXR5cGVfdWludDg7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHl5dHlwZV91aW50ODsKICNlbmRpZgotI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIChkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpKQotIyBpbmNsdWRlIDxzdGRkZWYuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisKKyNpZmRlZiBZWVRZUEVfSU5UOAordHlwZWRlZiBZWVRZUEVfSU5UOCB5eXR5cGVfaW50ODsKKyNlbGlmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIGNoYXIgeXl0eXBlX2ludDg7CisjZWxzZQordHlwZWRlZiBzaG9ydCBpbnQgeXl0eXBlX2ludDg7CiAjZW5kaWYKLSNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQotIyBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50CisKKyNpZmRlZiBZWVRZUEVfVUlOVDE2Cit0eXBlZGVmIFlZVFlQRV9VSU5UMTYgeXl0eXBlX3VpbnQxNjsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB5eXR5cGVfdWludDE2OwogI2VuZGlmCiAKKyNpZmRlZiBZWVRZUEVfSU5UMTYKK3R5cGVkZWYgWVlUWVBFX0lOVDE2IHl5dHlwZV9pbnQxNjsKKyNlbHNlCit0eXBlZGVmIHNob3J0IGludCB5eXR5cGVfaW50MTY7CisjZW5kaWYKKworI2lmbmRlZiBZWVNJWkVfVAorIyBpZmRlZiBfX1NJWkVfVFlQRV9fCisjICBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworIyBlbGlmIGRlZmluZWQgc2l6ZV90CisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVsaWYgISBkZWZpbmVkIFlZU0laRV9UICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVsc2UKKyMgIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFlZU0laRV9NQVhJTVVNICgoWVlTSVpFX1QpIC0xKQorCiAjaWZuZGVmIFlZXwotIyBpZiBZWUVOQUJMRV9OTFMKKyMgaWYgZGVmaW5lZCBZWUVOQUJMRV9OTFMgJiYgWVlFTkFCTEVfTkxTCiAjICBpZiBFTkFCTEVfTkxTCiAjICAgaW5jbHVkZSA8bGliaW50bC5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCiAjICAgZGVmaW5lIFlZXyhtc2dpZCkgZGdldHRleHQgKCJiaXNvbi1ydW50aW1lIiwgbXNnaWQpCkBAIC00ODgsNyArNjg0LDMyIEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFCisvKiBTdXBwcmVzcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3MgYnkgInVzaW5nIiBFLiAgKi8KKyNpZiAhIGRlZmluZWQgbGludCB8fCBkZWZpbmVkIF9fR05VQ19fCisjIGRlZmluZSBZWVVTRShlKSAoKHZvaWQpIChlKSkKKyNlbHNlCisjIGRlZmluZSBZWVVTRShlKSAvKiBlbXB0eSAqLworI2VuZGlmCisKKy8qIElkZW50aXR5IGZ1bmN0aW9uLCB1c2VkIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IGNvbnN0YW50IGNvbmRpdGlvbnMuICAqLworI2lmbmRlZiBsaW50CisjIGRlZmluZSBZWUlEKG4pIChuKQorI2Vsc2UKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgaW50CitZWUlEIChpbnQgeXlpKQorI2Vsc2UKK3N0YXRpYyBpbnQKK1lZSUQgKHl5aSkKKyAgICBpbnQgeXlpOworI2VuZGlmCit7CisgIHJldHVybiB5eWk7Cit9CisjZW5kaWYKKworI2lmICEgZGVmaW5lZCB5eW92ZXJmbG93IHx8IFlZRVJST1JfVkVSQk9TRQogCiAvKiBUaGUgcGFyc2VyIGludm9rZXMgYWxsb2NhIG9yIG1hbGxvYzsgZGVmaW5lIHRoZSBuZWNlc3Nhcnkgc3ltYm9scy4gICovCiAKQEAgLTQ5Niw2NiArNzE3LDc4IEBACiAjICBpZiBZWVNUQUNLX1VTRV9BTExPQ0EKICMgICBpZmRlZiBfX0dOVUNfXwogIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2J1aWx0aW5fYWxsb2NhCisjICAgZWxpZiBkZWZpbmVkIF9fQlVJTFRJTl9WQV9BUkdfSU5DUgorIyAgICBpbmNsdWRlIDxhbGxvY2EuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGVsaWYgZGVmaW5lZCBfQUlYCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYWxsb2NhCisjICAgZWxpZiBkZWZpbmVkIF9NU0NfVkVSCisjICAgIGluY2x1ZGUgPG1hbGxvYy5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQogIyAgIGVsc2UKICMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCi0jICAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgICAgaWYgISBkZWZpbmVkIF9BTExPQ0FfSCAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKICMgICAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgICBkZWZpbmUgWVlJTkNMVURFRF9TVERMSUJfSAorIyAgICAgaWZuZGVmIEVYSVRfU1VDQ0VTUworIyAgICAgIGRlZmluZSBFWElUX1NVQ0NFU1MgMAorIyAgICAgZW5kaWYKICMgICAgZW5kaWYKICMgICBlbmRpZgogIyAgZW5kaWYKICMgZW5kaWYKIAogIyBpZmRlZiBZWVNUQUNLX0FMTE9DCi0gICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICovCi0jICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoMCkKKyAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gICovCisjICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoWVlJRCAoMCkpCiAjICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCiAgICAgLyogVGhlIE9TIG1pZ2h0IGd1YXJhbnRlZSBvbmx5IG9uZSBndWFyZCBwYWdlIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLAogICAgICAgIGFuZCBhIHBhZ2Ugc2l6ZSBjYW4gYmUgYXMgc21hbGwgYXMgNDA5NiBieXRlcy4gIFNvIHdlIGNhbm5vdCBzYWZlbHkKICAgICAgICBpbnZva2UgYWxsb2NhIChOKSBpZiBOIGV4Y2VlZHMgNDA5Ni4gIFVzZSBhIHNsaWdodGx5IHNtYWxsZXIgbnVtYmVyCiAgICAgICAgdG8gYWxsb3cgZm9yIGEgZmV3IGNvbXBpbGVyLWFsbG9jYXRlZCB0ZW1wb3Jhcnkgc3RhY2sgc2xvdHMuICAqLwotIyAgIGRlZmluZSBZWVNUQUNLX0FMTE9DX01BWElNVU0gNDAzMiAvKiByZWFzb25hYmxlIGNpcmNhIDIwMDUgKi8KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIDQwMzIgLyogcmVhc29uYWJsZSBjaXJjYSAyMDA2ICovCiAjICBlbmRpZgogIyBlbHNlCiAjICBkZWZpbmUgWVlTVEFDS19BTExPQyBZWU1BTExPQwogIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBZWUZSRUUKICMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KLSMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNICgoWVlTSVpFX1QpIC0xKQorIyAgIGRlZmluZSBZWVNUQUNLX0FMTE9DX01BWElNVU0gWVlTSVpFX01BWElNVU0KICMgIGVuZGlmCi0jICBpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7CisjICBpZiAoZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTIFwKKyAgICAgICAmJiAhICgoZGVmaW5lZCBZWU1BTExPQyB8fCBkZWZpbmVkIG1hbGxvYykgXAorCSAgICAgJiYgKGRlZmluZWQgWVlGUkVFIHx8IGRlZmluZWQgZnJlZSkpKQorIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgaWZuZGVmIEVYSVRfU1VDQ0VTUworIyAgICBkZWZpbmUgRVhJVF9TVUNDRVNTIDAKKyMgICBlbmRpZgogIyAgZW5kaWYKICMgIGlmbmRlZiBZWU1BTExPQwogIyAgIGRlZmluZSBZWU1BTExPQyBtYWxsb2MKLSMgICBpZiAoISBkZWZpbmVkIChtYWxsb2MpICYmICEgZGVmaW5lZCAoWVlJTkNMVURFRF9TVERMSUJfSCkgXAotCSYmIChkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpKSkKKyMgICBpZiAhIGRlZmluZWQgbWFsbG9jICYmICEgZGVmaW5lZCBFWElUX1NVQ0NFU1MgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogdm9pZCAqbWFsbG9jIChZWVNJWkVfVCk7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KICMgICBlbmRpZgogIyAgZW5kaWYKICMgIGlmbmRlZiBZWUZSRUUKICMgICBkZWZpbmUgWVlGUkVFIGZyZWUKLSMgICBpZiAoISBkZWZpbmVkIChmcmVlKSAmJiAhIGRlZmluZWQgKFlZSU5DTFVERURfU1RETElCX0gpIFwKLQkmJiAoZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSkpCisjICAgaWYgISBkZWZpbmVkIGZyZWUgJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiB2b2lkIGZyZWUgKHZvaWQgKik7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KICMgICBlbmRpZgogIyAgZW5kaWYKLSMgIGlmZGVmIF9fY3BsdXNwbHVzCi19Ci0jICBlbmRpZgogIyBlbmRpZgotI2VuZGlmIC8qICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFICovCisjZW5kaWYgLyogISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFICovCiAKIAotI2lmICghIGRlZmluZWQgKHl5b3ZlcmZsb3cpIFwKLSAgICAgJiYgKCEgZGVmaW5lZCAoX19jcGx1c3BsdXMpIFwKLQkgfHwgKGRlZmluZWQgKFlZU1RZUEVfSVNfVFJJVklBTCkgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisjaWYgKCEgZGVmaW5lZCB5eW92ZXJmbG93IFwKKyAgICAgJiYgKCEgZGVmaW5lZCBfX2NwbHVzcGx1cyBcCisJIHx8IChkZWZpbmVkIFlZU1RZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKIAogLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCiB1bmlvbiB5eWFsbG9jCiB7Ci0gIHNob3J0IGludCB5eXNzOwotICBZWVNUWVBFIHl5dnM7Ci0gIH07CisgIHl5dHlwZV9pbnQxNiB5eXNzX2FsbG9jOworICBZWVNUWVBFIHl5dnNfYWxsb2M7Cit9OwogCiAvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLwogIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCkBAIC01NjMsMTMgKzc5NiwzNCBAQAogLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCiAgICBOIGVsZW1lbnRzLiAgKi8KICMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQgaW50KSArIHNpemVvZiAoWVlTVFlQRSkpCQkJXAorICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkpIFwKICAgICAgICsgWVlTVEFDS19HQVBfTUFYSU1VTSkKIAorIyBkZWZpbmUgWVlDT1BZX05FRURFRCAxCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2tfYWxsb2MsIFN0YWNrKQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFja19hbGxvYywgU3RhY2ssIHl5c2l6ZSk7CQkJXAorCVN0YWNrID0gJnl5cHRyLT5TdGFja19hbGxvYzsJCQkJCVwKKwl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVhJTVVNOyBcCisJeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoWVlJRCAoMCkpCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBZWUNPUFlfTkVFREVEICYmIFlZQ09QWV9ORUVERUQKIC8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbwogICAgbm90IG92ZXJsYXAuICAqLwogIyBpZm5kZWYgWVlDT1BZCi0jICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgMSA8IF9fR05VQ19fCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIDEgPCBfX0dOVUNfXwogIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCiAgICAgICBfX2J1aWx0aW5fbWVtY3B5IChUbywgRnJvbSwgKENvdW50KSAqIHNpemVvZiAoKihGcm9tKSkpCiAjICBlbHNlCkBAIC01ODAsNzEgKzgzNCw0OCBAQAogCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAogCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKIAl9CQkJCQlcCi0gICAgICB3aGlsZSAoMCkKKyAgICAgIHdoaWxlIChZWUlEICgwKSkKICMgIGVuZGlmCiAjIGVuZGlmCisjZW5kaWYgLyogIVlZQ09QWV9ORUVERUQgKi8KIAotLyogUmVsb2NhdGUgU1RBQ0sgZnJvbSBpdHMgb2xkIGxvY2F0aW9uIHRvIHRoZSBuZXcgb25lLiAgVGhlCi0gICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCi0gICBzdGFjay4gIEFkdmFuY2UgWVlQVFIgdG8gYSBwcm9wZXJseSBhbGlnbmVkIGxvY2F0aW9uIGZvciB0aGUgbmV4dAotICAgc3RhY2suICAqLwotIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFjaykJCQkJCVwKLSAgICBkbwkJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCi0JWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAotCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCi0JeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYSU1VTTsgXAotCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgd2hpbGUgKDApCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQotICAgdHlwZWRlZiBzaWduZWQgY2hhciB5eXNpZ25lZF9jaGFyOwotI2Vsc2UKLSAgIHR5cGVkZWYgc2hvcnQgaW50IHl5c2lnbmVkX2NoYXI7Ci0jZW5kaWYKLQotLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAqLworLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAgKi8KICNkZWZpbmUgWVlGSU5BTCAgMwogLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCi0jZGVmaW5lIFlZTEFTVCAgIDYwNQorI2RlZmluZSBZWUxBU1QgICA3MTAKIAotLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICovCi0jZGVmaW5lIFlZTlRPS0VOUyAgMTE5Ci0vKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gKi8KLSNkZWZpbmUgWVlOTlRTICA0MQotLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAqLwotI2RlZmluZSBZWU5SVUxFUyAgMTg2Ci0vKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAqLwotI2RlZmluZSBZWU5TVEFURVMgIDI1NAorLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLworI2RlZmluZSBZWU5UT0tFTlMgIDEzNgorLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICAqLworI2RlZmluZSBZWU5OVFMgIDQ2CisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2YgcnVsZXMuICAqLworI2RlZmluZSBZWU5SVUxFUyAgMjEzCisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAgKi8KKyNkZWZpbmUgWVlOU1RBVEVTICAyODUKIAogLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCiAjZGVmaW5lIFlZVU5ERUZUT0sgIDIKLSNkZWZpbmUgWVlNQVhVVE9LICAgMzU4CisjZGVmaW5lIFlZTUFYVVRPSyAgIDM3NQogCiAjZGVmaW5lIFlZVFJBTlNMQVRFKFlZWCkJCQkJCQlcCiAgICgodW5zaWduZWQgaW50KSAoWVlYKSA8PSBZWU1BWFVUT0sgPyB5eXRyYW5zbGF0ZVtZWVhdIDogWVlVTkRFRlRPSykKIAogLyogWVlUUkFOU0xBVEVbWVlMRVhdIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXRyYW5zbGF0ZVtdID0KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXl0cmFuc2xhdGVbXSA9CiB7CiAgICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgIDEwMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgMTA1LCAgICAgMiwKLSAgICAgMTEyLCAgIDExMSwgICAxMDgsICAgMTA2LCAgICAgMiwgICAxMDcsICAgICAyLCAgIDEwOSwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgIDExOCwgICAgIDIsCi0gICAgIDExNSwgICAxMTQsICAgMTEzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgMTIwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAxMjIsICAgICAyLAorICAgICAxMjksICAgMTI4LCAgIDEyNSwgICAxMjMsICAgICAyLCAgIDEyNCwgICAgIDIsICAgMTI2LCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgMTM1LCAgICAgMiwKKyAgICAgMTMyLCAgIDEzMSwgICAxMzAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgIDExNiwgICAgIDIsICAgMTE3LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgMTMzLCAgICAgMiwgICAxMzQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgMTA0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAxMjEsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKQEAgLTY2NywxMyArODk4LDE1IEBACiAgICAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwKICAgICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LAogICAgICAgODUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsCi0gICAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTEwCisgICAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwKKyAgICAgMTA1LCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LAorICAgICAxMTUsICAgMTE2LCAgIDExNywgICAxMTgsICAgMTE5LCAgIDEyNwogfTsKIAogI2lmIFlZREVCVUcKIC8qIFlZUFJIU1tZWU5dIC0tIEluZGV4IG9mIHRoZSBmaXJzdCBSSFMgc3ltYm9sIG9mIHJ1bGUgbnVtYmVyIFlZTiBpbgogICAgWVlSSFMuICAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXByaHNbXSA9CitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXByaHNbXSA9CiB7CiAgICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNiwgICAgIDgsICAgICA5LCAgICAxMSwgICAgMTUsICAgIDE5LCAgICAyMywKICAgICAgIDI3LCAgICAyOSwgICAgMzEsICAgIDMzLCAgICAzNSwgICAgMzksICAgIDQxLCAgICA0NSwgICAgNDksICAgIDUxLApAQCAtNjg1LDExNyArOTE4LDEzMiBAQAogICAgICAxODQsICAgMTg2LCAgIDE4OCwgICAxOTAsICAgMTkyLCAgIDE5NCwgICAxOTYsICAgMTk4LCAgIDIwMCwgICAyMDIsCiAgICAgIDIwNCwgICAyMDYsICAgMjA4LCAgIDIxMCwgICAyMTIsICAgMjE0LCAgIDIxNiwgICAyMTgsICAgMjIwLCAgIDIyMiwKICAgICAgMjI0LCAgIDIyNiwgICAyMjgsICAgMjMwLCAgIDIzMiwgICAyMzQsICAgMjM2LCAgIDIzOCwgICAyNDAsICAgMjQyLAotICAgICAyNDQsICAgMjQ2LCAgIDI0OSwgICAyNTIsICAgMjU1LCAgIDI1OCwgICAyNjMsICAgMjY1LCAgIDI2NywgICAyNzAsCi0gICAgIDI3MiwgICAyNzUsICAgMjc3LCAgIDI3OSwgICAyODEsICAgMjgzLCAgIDI4NiwgICAyODksICAgMjkyLCAgIDI5NSwKLSAgICAgMjk4LCAgIDMwMSwgICAzMDMsICAgMzA1LCAgIDMwNywgICAzMDksICAgMzExLCAgIDMxMywgICAzMTUsICAgMzE3LAotICAgICAzMTksICAgMzIxLCAgIDMyMywgICAzMjgsICAgMzM1LCAgIDMzOSwgICAzNDMsICAgMzQ3LCAgIDM1MSwgICAzNTUsCi0gICAgIDM1OSwgICAzNjMsICAgMzY3LCAgIDM3MCwgICAzNzQsICAgMzc2LCAgIDM3OCwgICAzODAsICAgMzgyLCAgIDM4NCwKLSAgICAgMzg2LCAgIDM4OCwgICAzOTIsICAgMzk0LCAgIDM5NiwgICAzOTgsICAgNDAwLCAgIDQwMiwgICA0MDQsICAgNDA2LAotICAgICA0MDgsICAgNDEwLCAgIDQxMiwgICA0MTQsICAgNDE2LCAgIDQxOCwgICA0MjAsICAgNDIyLCAgIDQyNSwgICA0MjgsCi0gICAgIDQzMiwgICA0MzQsICAgNDM2LCAgIDQ0MCwgICA0NDIsICAgNDQ0LCAgIDQ0NiwgICA0NDgsICAgNDUwLCAgIDQ1MiwKLSAgICAgNDU0LCAgIDQ1NiwgICA0NTksICAgNDYyLCAgIDQ2NiwgICA0NjgsICAgNDcwCisgICAgIDI0NCwgICAyNDYsICAgMjQ4LCAgIDI1MCwgICAyNTIsICAgMjU0LCAgIDI1NiwgICAyNTgsICAgMjYwLCAgIDI2MywKKyAgICAgMjY2LCAgIDI2OSwgICAyNzIsICAgMjc3LCAgIDI3OSwgICAyODEsICAgMjg0LCAgIDI4NiwgICAyODksICAgMjkxLAorICAgICAyOTMsICAgMjk2LCAgIDI5OCwgICAzMDAsICAgMzAzLCAgIDMwNiwgICAzMDksICAgMzEyLCAgIDMxNSwgICAzMTgsCisgICAgIDMyMSwgICAzMjYsICAgMzI5LCAgIDMzMiwgICAzMzUsICAgMzM3LCAgIDMzOSwgICAzNDEsICAgMzQzLCAgIDM0NSwKKyAgICAgMzQ3LCAgIDM0OSwgICAzNTEsICAgMzUzLCAgIDM1NSwgICAzNTcsICAgMzU5LCAgIDM2MSwgICAzNjMsICAgMzY1LAorICAgICAzNjcsICAgMzY5LCAgIDM3MSwgICAzNzYsICAgMzgzLCAgIDM4NywgICAzOTEsICAgMzk1LCAgIDM5OSwgICA0MDMsCisgICAgIDQwNywgICA0MTEsICAgNDE1LCAgIDQxOCwgICA0MjIsICAgNDI0LCAgIDQyNiwgICA0MjgsICAgNDMwLCAgIDQzMiwKKyAgICAgNDM0LCAgIDQzNiwgICA0NDAsICAgNDQyLCAgIDQ0NCwgICA0NDYsICAgNDQ4LCAgIDQ1MCwgICA0NTIsICAgNDU0LAorICAgICA0NTYsICAgNDU4LCAgIDQ2MCwgICA0NjIsICAgNDY0LCAgIDQ2NiwgICA0NjgsICAgNDcwLCAgIDQ3MywgICA0NzYsCisgICAgIDQ4MCwgICA0ODIsICAgNDg0LCAgIDQ4OCwgICA0OTAsICAgNDkyLCAgIDQ5NCwgICA0OTYsICAgNDk4LCAgIDUwMCwKKyAgICAgNTAyLCAgIDUwNCwgICA1MDYsICAgNTA4LCAgIDUxMCwgICA1MTIsICAgNTE0LCAgIDUxNiwgICA1MTgsICAgNTIxLAorICAgICA1MjQsICAgNTI4LCAgIDUzMCwgICA1MzIKIH07CiAKLS8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gKi8KLXN0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlyaHNbXSA9CisvKiBZWVJIUyAtLSBBIGAtMSctc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHJ1bGVzJyBSSFMuICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXJoc1tdID0KIHsKLSAgICAgMTIwLCAgICAgMCwgICAgLTEsICAgMTIxLCAgIDEyMiwgICAgLTEsICAgMTIxLCAgICAtMSwgICAgLTEsICAgMTMxLAotICAgICAgLTEsICAgMTIyLCAgIDEyMywgICAxMzEsICAgIC0xLCAgIDEyMiwgICAxMjMsICAgMTI1LCAgICAtMSwgICAxMjIsCi0gICAgIDEyNCwgICAxMzEsICAgIC0xLCAgIDEyMiwgICAxMjQsICAgMTI1LCAgICAtMSwgICAxMDEsICAgIC0xLCAgIDEwMiwKLSAgICAgIC0xLCAgIDEyNiwgICAgLTEsICAgMTQ4LCAgICAtMSwgICAxMjgsICAgMTI5LCAgIDExMSwgICAgLTEsICAgIDQ5LAotICAgICAgLTEsICAgIDUxLCAgIDEwOSwgICAgMzYsICAgIC0xLCAgICA1MSwgICAgIDgsICAgIDUxLCAgICAtMSwgICAgNTEsCi0gICAgICAtMSwgICAgNTIsICAgMTA5LCAgICAzNiwgICAgLTEsICAgIDUyLCAgICAtMSwgICAgNTAsICAgIC0xLCAgICA1MywKLSAgICAgIC0xLCAgIDEyNywgICAxMjUsICAgIC0xLCAgIDEwMywgICAgLTEsICAgMTEyLCAgICAtMSwgICAxMjYsICAgIC0xLAotICAgICAxMzAsICAgMTIzLCAgIDEyNSwgICAgLTEsICAgMTMwLCAgIDEyNCwgICAxMjUsICAgIC0xLCAgIDE0OCwgICAgLTEsCi0gICAgIDEyOSwgICAgLTEsICAgMTMzLCAgICAtMSwgICAxMjcsICAgMTMxLCAgICAtMSwgICAxMzQsICAgMTM1LCAgIDEzNiwKLSAgICAgIC0xLCAgIDEzNCwgICAxMzUsICAgIC0xLCAgIDEzNCwgICAxMzYsICAgIC0xLCAgIDEzNCwgICAgMTMsICAgIC0xLAotICAgICAxMzQsICAgIDE0LCAgICAtMSwgICAxMzQsICAgMTM3LCAgICAtMSwgICAxMzIsICAgMTI1LCAgICAtMSwgICAxMjgsCi0gICAgIDEyMiwgICAxMTEsICAgIC0xLCAgIDEzOCwgICAgLTEsICAgMTQ1LCAgIDE0MywgICAxNDUsICAgIC0xLCAgIDE0NSwKLSAgICAgMTQ0LCAgIDE0NSwgICAgLTEsICAgMTM5LCAgICAtMSwgICAxNDksICAgIC0xLCAgIDE1MCwgICAgLTEsICAgMTUxLAotICAgICAxNTIsICAgIC0xLCAgIDE1NSwgICAgLTEsICAgMTU2LCAgIDE1NywgICAgLTEsICAgMTM4LCAgICAtMSwgICAgLTEsCi0gICAgICAgNCwgICAgLTEsICAgICAzLCAgICAtMSwgICAgIDQsICAgMTAyLCAgICAgMywgICAgLTEsICAgICAzLCAgIDEwMiwKLSAgICAgICA0LCAgICAtMSwgICAgIDQsICAgMTAxLCAgICAgMywgICAgLTEsICAgICAzLCAgIDEwMSwgICAgIDQsICAgIC0xLAotICAgICAgIDUsICAgIC0xLCAgICAgNywgICAgLTEsICAgICA5LCAgICAtMSwgICAgMTAsICAgIC0xLCAgICAgNiwgICAgLTEsCi0gICAgICA0NSwgICAgLTEsICAgIDE4LCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxNywgICAgLTEsICAgIDE5LCAgICAtMSwKLSAgICAgIDIwLCAgICAtMSwgICAgMjEsICAgIC0xLCAgICAyMiwgICAgLTEsICAgIDIzLCAgICAtMSwgICAgMjQsICAgIC0xLAotICAgICAgMjUsICAgIC0xLCAgICAyNiwgICAgLTEsICAgIDI3LCAgICAtMSwgICAgMjgsICAgIC0xLCAgICAyOSwgICAgLTEsCi0gICAgICAzMCwgICAgLTEsICAgIDMxLCAgICAtMSwgICAgMzMsICAgIC0xLCAgICAzMiwgICAgLTEsICAgIDU3LCAgICAtMSwKLSAgICAgIDU4LCAgICAtMSwgICAgNTksICAgIC0xLCAgICA2MCwgICAgLTEsICAgIDY1LCAgICAtMSwgICAgNjYsICAgIC0xLAotICAgICAgNjgsICAgIC0xLCAgICA2OSwgICAgLTEsICAgIDcwLCAgICAtMSwgICAgNzEsICAgIC0xLCAgICA3MiwgICAgLTEsCi0gICAgICA3MywgICAgLTEsICAgIDc1LCAgICAtMSwgICAgNzQsICAgIC0xLCAgICA2NywgICAgLTEsICAgIDc2LCAgICAtMSwKLSAgICAgIDc3LCAgICAtMSwgICAgNzgsICAgIC0xLCAgICA5MywgICAgLTEsICAgMTM0LCAgICAzNCwgICAgLTEsICAgMTM0LAotICAgICAgMzUsICAgIC0xLCAgICAxMSwgICAgMzYsICAgIC0xLCAgICAxMiwgICAgMzYsICAgIC0xLCAgICAxNSwgICAgMzYsCi0gICAgIDE0NywgICAgMzYsICAgIC0xLCAgICAzNywgICAgLTEsICAgIDM4LCAgICAtMSwgICAgNjEsICAgMTQ4LCAgICAtMSwKLSAgICAgIDYxLCAgICAtMSwgICAgNjIsICAgMTQ4LCAgICAtMSwgICAgNjIsICAgIC0xLCAgICA2MywgICAgLTEsICAgIDY0LAotICAgICAgLTEsICAgMTQwLCAgICAtMSwgICAgMzksICAgIDQ5LCAgICAtMSwgICAgNDAsICAgIDQ5LCAgICAtMSwgICAgNDEsCi0gICAgICAzNiwgICAgLTEsICAgIDQyLCAgICAzNiwgICAgLTEsICAgIDQzLCAgIDE0MSwgICAgLTEsICAgIDQ0LCAgIDE0MiwKLSAgICAgIC0xLCAgICAzNiwgICAgLTEsICAgIDQ5LCAgICAtMSwgICAgNDksICAgIC0xLCAgIDExMywgICAgLTEsICAgIDQ2LAotICAgICAgLTEsICAgMTE0LCAgICAtMSwgICAgNDcsICAgIC0xLCAgIDExNSwgICAgLTEsICAgIDQ4LCAgICAtMSwgICAxNDgsCi0gICAgICAtMSwgICAxNDYsICAgIC0xLCAgIDEzOCwgICAxMTYsICAgMTQ1LCAgIDExNywgICAgLTEsICAgMTM4LCAgIDExNiwKLSAgICAgMTQ1LCAgIDExOCwgICAgMzYsICAgMTE3LCAgICAtMSwgICAxNDUsICAgMTA2LCAgIDE0NSwgICAgLTEsICAgMTQ1LAotICAgICAxMDcsICAgMTQ1LCAgICAtMSwgICAxNDUsICAgMTA4LCAgIDE0NSwgICAgLTEsICAgMTQ1LCAgIDEwOSwgICAxNDUsCi0gICAgICAtMSwgICAxNDUsICAgMTA1LCAgIDE0NSwgICAgLTEsICAgMTQ1LCAgIDEwNCwgICAxNDUsICAgIC0xLCAgIDE0NSwKLSAgICAgIDU0LCAgIDE0NSwgICAgLTEsICAgMTQ1LCAgICA1NSwgICAxNDUsICAgIC0xLCAgIDEwNywgICAxNDUsICAgIC0xLAotICAgICAxMjgsICAgMTQ2LCAgIDExMSwgICAgLTEsICAgIDU2LCAgICAtMSwgICAxMDUsICAgIC0xLCAgIDEwNCwgICAgLTEsCi0gICAgIDExNSwgICAgLTEsICAgMTEzLCAgICAtMSwgICAxMTQsICAgIC0xLCAgICAzNiwgICAgLTEsICAgMTI4LCAgIDE0OCwKLSAgICAgMTExLCAgICAtMSwgICAgNzksICAgIC0xLCAgICA4MCwgICAgLTEsICAgIDgxLCAgICAtMSwgICAgODIsICAgIC0xLAotICAgICAgODUsICAgIC0xLCAgICA4NiwgICAgLTEsICAgIDgzLCAgICAtMSwgICAgODQsICAgIC0xLCAgICA4NywgICAgLTEsCi0gICAgICA4OCwgICAgLTEsICAgIDg5LCAgICAtMSwgICAgOTAsICAgIC0xLCAgICA5MSwgICAgLTEsICAgIDkyLCAgICAtMSwKLSAgICAgMTUzLCAgICAtMSwgICAxNDMsICAgIDM2LCAgICAtMSwgICAxNDQsICAgIDM2LCAgICAtMSwgICAxMjgsICAgMTU0LAotICAgICAxMTEsICAgIC0xLCAgICAzNiwgICAgLTEsICAgMTUzLCAgICAtMSwgICAxNTQsICAgMTI0LCAgIDE1MywgICAgLTEsCi0gICAgICA5NCwgICAgLTEsICAgIDk1LCAgICAtMSwgICAgOTYsICAgIC0xLCAgICA5NywgICAgLTEsICAgIDk4LCAgICAtMSwKLSAgICAgIDk5LCAgICAtMSwgICAxMDAsICAgIC0xLCAgIDE1OCwgICAgLTEsICAgMTQzLCAgICAzNiwgICAgLTEsICAgMTQ0LAotICAgICAgMzYsICAgIC0xLCAgIDEyOCwgICAxNTksICAgMTExLCAgICAtMSwgICAgMzYsICAgIC0xLCAgIDE1OCwgICAgLTEsCi0gICAgIDE1OSwgICAxMjQsICAgMTU4LCAgICAtMQorICAgICAxMzcsICAgICAwLCAgICAtMSwgICAxMzgsICAgMTM5LCAgICAtMSwgICAxMzgsICAgIC0xLCAgICAtMSwgICAxNDgsCisgICAgICAtMSwgICAxMzksICAgMTQwLCAgIDE0OCwgICAgLTEsICAgMTM5LCAgIDE0MCwgICAxNDIsICAgIC0xLCAgIDEzOSwKKyAgICAgMTQxLCAgIDE0OCwgICAgLTEsICAgMTM5LCAgIDE0MSwgICAxNDIsICAgIC0xLCAgIDExOCwgICAgLTEsICAgMTE5LAorICAgICAgLTEsICAgMTQzLCAgICAtMSwgICAxNzAsICAgIC0xLCAgIDE0NSwgICAxNDYsICAgMTI4LCAgICAtMSwgICAgNTksCisgICAgICAtMSwgICAgNjEsICAgMTI2LCAgICAzNywgICAgLTEsICAgIDYxLCAgICAgOCwgICAgNjEsICAgIC0xLCAgICA2MSwKKyAgICAgIC0xLCAgICA2MiwgICAxMjYsICAgIDM3LCAgICAtMSwgICAgNjIsICAgIC0xLCAgICA2MCwgICAgLTEsICAgIDYzLAorICAgICAgLTEsICAgMTQ0LCAgIDE0MiwgICAgLTEsICAgMTIwLCAgICAtMSwgICAxMjksICAgIC0xLCAgIDE0MywgICAgLTEsCisgICAgIDE0NywgICAxNDAsICAgMTQyLCAgICAtMSwgICAxNDcsICAgMTQxLCAgIDE0MiwgICAgLTEsICAgMTcwLCAgICAtMSwKKyAgICAgMTQ2LCAgICAtMSwgICAxNTAsICAgIC0xLCAgIDE0NCwgICAxNDgsICAgIC0xLCAgIDE1MSwgICAxNTIsICAgMTUzLAorICAgICAgLTEsICAgMTUxLCAgIDE1MiwgICAgLTEsICAgMTUxLCAgIDE1MywgICAgLTEsICAgMTUxLCAgICAxMywgICAgLTEsCisgICAgIDE1MSwgICAgMTQsICAgIC0xLCAgIDE1MSwgICAxNTQsICAgIC0xLCAgIDE0OSwgICAxNDIsICAgIC0xLCAgIDE0NSwKKyAgICAgMTM5LCAgIDEyOCwgICAgLTEsICAgMTU1LCAgICAtMSwgICAxNjcsICAgMTY1LCAgIDE2NywgICAgLTEsICAgMTY3LAorICAgICAxNjYsICAgMTY3LCAgICAtMSwgICAxNTYsICAgIC0xLCAgIDE3MSwgICAgLTEsICAgMTcyLCAgICAtMSwgICAxNzMsCisgICAgIDE3NCwgICAgLTEsICAgMTc3LCAgICAtMSwgICAxNzgsICAgMTc5LCAgICAtMSwgICAxNTUsICAgIC0xLCAgICAtMSwKKyAgICAgICA0LCAgICAtMSwgICAgIDMsICAgIC0xLCAgICAgNCwgICAxMTksICAgICAzLCAgICAtMSwgICAgIDMsICAgMTE5LAorICAgICAgIDQsICAgIC0xLCAgICAgNCwgICAxMTgsICAgICAzLCAgICAtMSwgICAgIDMsICAgMTE4LCAgICAgNCwgICAgLTEsCisgICAgICA0OSwgICAgLTEsICAgIDUwLCAgICAtMSwgICAgNTEsICAgIC0xLCAgICA1MiwgICAgLTEsICAgIDUzLCAgICAtMSwKKyAgICAgIDU0LCAgICAtMSwgICAgIDUsICAgIC0xLCAgICAgNywgICAgLTEsICAgICA5LCAgICAtMSwgICAgMTAsICAgIC0xLAorICAgICAgIDYsICAgIC0xLCAgICA1NSwgICAgLTEsICAgIDE4LCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxNywgICAgLTEsCisgICAgICAxOSwgICAgLTEsICAgIDIwLCAgICAtMSwgICAgMjEsICAgIC0xLCAgICAyMiwgICAgLTEsICAgIDIzLCAgICAtMSwKKyAgICAgIDI0LCAgICAtMSwgICAgMjUsICAgIC0xLCAgICAyNiwgICAgLTEsICAgIDI3LCAgICAtMSwgICAgMjgsICAgIC0xLAorICAgICAgMjksICAgIC0xLCAgICAzMCwgICAgLTEsICAgIDMxLCAgICAtMSwgICAgMzIsICAgIC0xLCAgICAzNCwgICAgLTEsCisgICAgICAzMywgICAgLTEsICAgIDY3LCAgICAtMSwgICAgNjgsICAgIC0xLCAgICA2OSwgICAgLTEsICAgIDcwLCAgICAtMSwKKyAgICAgIDc1LCAgICAtMSwgICAgNzYsICAgIC0xLCAgICA3OCwgICAgLTEsICAgIDc5LCAgICAtMSwgICAgODAsICAgIC0xLAorICAgICAgODEsICAgIC0xLCAgICA4MiwgICAgLTEsICAgIDgzLCAgICAtMSwgICAgODUsICAgIC0xLCAgICA4NCwgICAgLTEsCisgICAgICA3NywgICAgLTEsICAgIDg2LCAgICAtMSwgICAgODcsICAgIC0xLCAgICA4OCwgICAgLTEsICAgMTAzLCAgICAtMSwKKyAgICAgMTUxLCAgICAzNSwgICAgLTEsICAgMTUxLCAgICAzNiwgICAgLTEsICAgIDExLCAgICAzNywgICAgLTEsICAgIDEyLAorICAgICAgMzcsICAgIC0xLCAgICAxNSwgICAgMzcsICAgMTY5LCAgICAzNywgICAgLTEsICAgIDM4LCAgICAtMSwgICAgMzksCisgICAgICAtMSwgICAgNzEsICAgMTcwLCAgICAtMSwgICAgNzEsICAgIC0xLCAgICA3MiwgICAxNzAsICAgIC0xLCAgICA3MiwKKyAgICAgIC0xLCAgICA3MywgICAgLTEsICAgIDc0LCAgIDE3MCwgICAgLTEsICAgIDc0LCAgICAtMSwgICAxNTcsICAgIC0xLAorICAgICAxNTEsICAgMTU4LCAgICAtMSwgICAgNDAsICAgIDU5LCAgICAtMSwgICAgNDEsICAgIDU5LCAgICAtMSwgICAgNDIsCisgICAgICAzNywgICAgLTEsICAgIDQzLCAgICAzNywgICAgLTEsICAgIDQ0LCAgIDE2MywgICAgLTEsICAgIDQ1LCAgIDE2NCwKKyAgICAgIC0xLCAgICA0NiwgICAxNTksICAgIDQ3LCAgIDE2MCwgICAgLTEsICAgIDQ2LCAgIDE1OSwgICAgLTEsICAgIDQ3LAorICAgICAxNjEsICAgIC0xLCAgICA0OCwgICAxNjIsICAgIC0xLCAgICAzNywgICAgLTEsICAgIDU5LCAgICAtMSwgICAgMzcsCisgICAgICAtMSwgICAgNTksICAgIC0xLCAgICA1OSwgICAgLTEsICAgIDM3LCAgICAtMSwgICAgNTksICAgIC0xLCAgICAzNywKKyAgICAgIC0xLCAgICA1OSwgICAgLTEsICAgIDU5LCAgICAtMSwgICAxMzAsICAgIC0xLCAgICA1NiwgICAgLTEsICAgMTMxLAorICAgICAgLTEsICAgIDU3LCAgICAtMSwgICAxMzIsICAgIC0xLCAgICA1OCwgICAgLTEsICAgMTcwLCAgICAtMSwgICAxNjgsCisgICAgICAtMSwgICAxNTUsICAgMTMzLCAgIDE2NywgICAxMzQsICAgIC0xLCAgIDE1NSwgICAxMzMsICAgMTY3LCAgIDEzNSwKKyAgICAgIDM3LCAgIDEzNCwgICAgLTEsICAgMTY3LCAgIDEyMywgICAxNjcsICAgIC0xLCAgIDE2NywgICAxMjQsICAgMTY3LAorICAgICAgLTEsICAgMTY3LCAgIDEyNSwgICAxNjcsICAgIC0xLCAgIDE2NywgICAxMjYsICAgMTY3LCAgICAtMSwgICAxNjcsCisgICAgIDEyMiwgICAxNjcsICAgIC0xLCAgIDE2NywgICAxMjEsICAgMTY3LCAgICAtMSwgICAxNjcsICAgIDY0LCAgIDE2NywKKyAgICAgIC0xLCAgIDE2NywgICAgNjUsICAgMTY3LCAgICAtMSwgICAxMjQsICAgMTY3LCAgICAtMSwgICAxNDUsICAgMTY4LAorICAgICAxMjgsICAgIC0xLCAgICA2NiwgICAgLTEsICAgMTIyLCAgICAtMSwgICAxMjEsICAgIC0xLCAgIDEzMiwgICAgLTEsCisgICAgIDEzMCwgICAgLTEsICAgMTMxLCAgICAtMSwgICAgMzcsICAgIC0xLCAgIDE0NSwgICAxNzAsICAgMTI4LCAgICAtMSwKKyAgICAgIDg5LCAgICAtMSwgICAgOTAsICAgIC0xLCAgICA5MSwgICAgLTEsICAgIDkyLCAgICAtMSwgICAgOTUsICAgIC0xLAorICAgICAgOTYsICAgIC0xLCAgICA5MywgICAgLTEsICAgIDk0LCAgICAtMSwgICAgOTcsICAgIC0xLCAgICA5OCwgICAgLTEsCisgICAgICA5OSwgICAgLTEsICAgMTAwLCAgICAtMSwgICAxMDEsICAgIC0xLCAgIDEwMiwgICAgLTEsICAgMTc1LCAgICAtMSwKKyAgICAgMTY1LCAgICAzNywgICAgLTEsICAgMTY2LCAgICAzNywgICAgLTEsICAgMTQ1LCAgIDE3NiwgICAxMjgsICAgIC0xLAorICAgICAgMzcsICAgIC0xLCAgIDE3NSwgICAgLTEsICAgMTc2LCAgIDE0MSwgICAxNzUsICAgIC0xLCAgIDEwNCwgICAgLTEsCisgICAgIDEwNSwgICAgLTEsICAgMTA2LCAgICAtMSwgICAxMDcsICAgIC0xLCAgIDEwOCwgICAgLTEsICAgMTA5LCAgICAtMSwKKyAgICAgMTEwLCAgICAtMSwgICAxMTEsICAgIC0xLCAgIDExMiwgICAgLTEsICAgMTEzLCAgICAtMSwgICAxMTQsICAgIC0xLAorICAgICAxMTUsICAgIC0xLCAgIDExNiwgICAgLTEsICAgMTE3LCAgICAtMSwgICAxODAsICAgIC0xLCAgIDE2NSwgICAgMzcsCisgICAgICAtMSwgICAxNjYsICAgIDM3LCAgICAtMSwgICAxNDUsICAgMTgxLCAgIDEyOCwgICAgLTEsICAgIDM3LCAgICAtMSwKKyAgICAgMTgwLCAgICAtMSwgICAxODEsICAgMTQxLCAgIDE4MCwgICAgLTEKIH07CiAKIC8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXJsaW5lW10gPQorc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXlybGluZVtdID0KIHsKLSAgICAgICAwLCAgIDIxMCwgICAyMTAsICAgMjE0LCAgIDIxNiwgICAyMTgsICAgMjE5LCAgIDIyMCwgICAyMjEsICAgMjIyLAotICAgICAyMjQsICAgMjI2LCAgIDIyOCwgICAyMjksICAgMjMxLCAgIDIzMywgICAyMzQsICAgMjM2LCAgIDIzOCwgICAyNDMsCi0gICAgIDI1MiwgICAyNjEsICAgMjcwLCAgIDI3OSwgICAyODEsICAgMjgzLCAgIDI4NSwgICAyODYsICAgMjg3LCAgIDI4OSwKLSAgICAgMjkxLCAgIDI5MywgICAyOTQsICAgMjk2LCAgIDI5NywgICAyOTgsICAgMjk5LCAgIDMwMCwgICAzMDEsICAgMzAzLAotICAgICAzMDQsICAgMzA1LCAgIDMwNiwgICAzMDgsICAgMzEwLCAgIDMxMSwgICAzMTIsICAgMzEzLCAgIDMxNCwgICAzMTUsCi0gICAgIDMxOCwgICAzMTksICAgMzIyLCAgIDMyMywgICAzMjQsICAgMzI1LCAgIDMyNiwgICAzMjcsICAgMzMwLCAgIDMzMSwKLSAgICAgMzMyLCAgIDMzMywgICAzMzYsICAgMzM4LCAgIDMzOSwgICAzNDAsICAgMzQxLCAgIDM0MiwgICAzNDMsICAgMzQ0LAotICAgICAzNDUsICAgMzQ2LCAgIDM0NywgICAzNDgsICAgMzQ5LCAgIDM1MCwgICAzNTEsICAgMzUyLCAgIDM1MywgICAzNTQsCi0gICAgIDM1NSwgICAzNTYsICAgMzU3LCAgIDM1OCwgICAzNTksICAgMzYwLCAgIDM2MSwgICAzNjIsICAgMzYzLCAgIDM2NCwKLSAgICAgMzY1LCAgIDM2NiwgICAzNjcsICAgMzY4LCAgIDM2OSwgICAzNzAsICAgMzcxLCAgIDM3MiwgICAzNzMsICAgMzc0LAotICAgICAzNzUsICAgMzc3LCAgIDM3OCwgICAzNzksICAgMzgwLCAgIDM4MSwgICAzODIsICAgMzgzLCAgIDM4NCwgICAzODUsCi0gICAgIDM4NiwgICAzODcsICAgMzg4LCAgIDM4OSwgICAzOTAsICAgMzkzLCAgIDM5NCwgICAzOTUsICAgMzk2LCAgIDM5NywKLSAgICAgMzk4LCAgIDQwMSwgICA0MDIsICAgNDA1LCAgIDQwOCwgICA0MDksICAgNDEwLCAgIDQxMiwgICA0MTMsICAgNDE0LAotICAgICA0MTYsICAgNDE3LCAgIDQxOSwgICA0MjAsICAgNDIxLCAgIDQyMiwgICA0MjMsICAgNDI0LCAgIDQyNSwgICA0MjYsCi0gICAgIDQyNywgICA0MjgsICAgNDI5LCAgIDQzMCwgICA0MzEsICAgNDMzLCAgIDQzNCwgICA0MzUsICAgNDM2LCAgIDQzNywKLSAgICAgNDM5LCAgIDQ0MCwgICA0NDIsICAgNDQzLCAgIDQ0NCwgICA0NDUsICAgNDQ2LCAgIDQ0NywgICA0NDgsICAgNDQ5LAotICAgICA0NTEsICAgNDUyLCAgIDQ1MywgICA0NTQsICAgNDU3LCAgIDQ1OCwgICA0NjAsICAgNDYxLCAgIDQ2MiwgICA0NjMsCi0gICAgIDQ2NSwgICA0NzIsICAgNDczLCAgIDQ3NiwgICA0NzcsICAgNDc4LCAgIDQ4MSwgICA0ODIsICAgNDgzLCAgIDQ4NCwKLSAgICAgNDg2LCAgIDQ4NywgICA0ODgsICAgNDg5LCAgIDQ5MSwgICA1MDAsICAgNTAxCisgICAgICAgMCwgICAzMTYsICAgMzE2LCAgIDMyMCwgICAzMjIsICAgMzI0LCAgIDMyNSwgICAzMjYsICAgMzI3LCAgIDMyOCwKKyAgICAgMzMwLCAgIDMzMiwgICAzMzQsICAgMzM1LCAgIDMzNywgICAzMzksICAgMzQwLCAgIDM0MiwgICAzNDQsICAgMzU3LAorICAgICAzNjYsICAgMzc1LCAgIDM4NCwgICAzOTMsICAgMzk1LCAgIDM5NywgICAzOTksICAgNDAwLCAgIDQwMSwgICA0MDMsCisgICAgIDQwNSwgICA0MDcsICAgNDA4LCAgIDQxMCwgICA0MTEsICAgNDEyLCAgIDQxMywgICA0MTQsICAgNDE1LCAgIDQxNywKKyAgICAgNDE4LCAgIDQxOSwgICA0MjAsICAgNDIyLCAgIDQyNCwgICA0MjUsICAgNDI2LCAgIDQyNywgICA0MjgsICAgNDI5LAorICAgICA0MzIsICAgNDMzLCAgIDQzNiwgICA0MzcsICAgNDM4LCAgIDQzOSwgICA0NDAsICAgNDQxLCAgIDQ0MiwgICA0NDMsCisgICAgIDQ0NCwgICA0NDUsICAgNDQ2LCAgIDQ0NywgICA0NTAsICAgNDUxLCAgIDQ1MiwgICA0NTMsICAgNDU2LCAgIDQ1OCwKKyAgICAgNDU5LCAgIDQ2MCwgICA0NjEsICAgNDYyLCAgIDQ2MywgICA0NjQsICAgNDY1LCAgIDQ2NiwgICA0NjcsICAgNDY4LAorICAgICA0NjksICAgNDcwLCAgIDQ3MSwgICA0NzIsICAgNDczLCAgIDQ3NCwgICA0NzUsICAgNDc2LCAgIDQ3NywgICA0NzgsCisgICAgIDQ3OSwgICA0ODAsICAgNDgxLCAgIDQ4MiwgICA0ODMsICAgNDg0LCAgIDQ4NSwgICA0ODYsICAgNDg3LCAgIDQ4OCwKKyAgICAgNDg5LCAgIDQ5MCwgICA0OTEsICAgNDkyLCAgIDQ5MywgICA0OTQsICAgNDk1LCAgIDQ5NiwgICA0OTgsICAgNDk5LAorICAgICA1MDAsICAgNTAxLCAgIDUwMiwgICA1MDMsICAgNTA0LCAgIDUwNSwgICA1MDYsICAgNTA3LCAgIDUwOCwgICA1MDksCisgICAgIDUxMCwgICA1MTEsICAgNTEyLCAgIDUxMywgICA1MTYsICAgNTE3LCAgIDUxOCwgICA1MTksICAgNTIwLCAgIDUyMSwKKyAgICAgNTI0LCAgIDUyOSwgICA1MzIsICAgNTM2LCAgIDUzOSwgICA1NDAsICAgNTQ2LCAgIDU0NywgICA1NjcsICAgNTgzLAorICAgICA1ODQsICAgNTk3LCAgIDU5OCwgICA2MDEsICAgNjA0LCAgIDYwNSwgICA2MDYsICAgNjA4LCAgIDYwOSwgICA2MTAsCisgICAgIDYxMiwgICA2MTMsICAgNjE1LCAgIDYxNiwgICA2MTcsICAgNjE4LCAgIDYxOSwgICA2MjAsICAgNjIxLCAgIDYyMiwKKyAgICAgNjIzLCAgIDYyNCwgICA2MjUsICAgNjI2LCAgIDYyNywgICA2MjksICAgNjMwLCAgIDYzMSwgICA2MzIsICAgNjMzLAorICAgICA2MzUsICAgNjM2LCAgIDYzOCwgICA2MzksICAgNjQwLCAgIDY0MSwgICA2NDIsICAgNjQzLCAgIDY0NCwgICA2NDUsCisgICAgIDY0NywgICA2NDgsICAgNjQ5LCAgIDY1MCwgICA2NTMsICAgNjU0LCAgIDY1NiwgICA2NTcsICAgNjU4LCAgIDY1OSwKKyAgICAgNjYxLCAgIDY2OCwgICA2NjksICAgNjcyLCAgIDY3MywgICA2NzQsICAgNjc1LCAgIDY3NiwgICA2NzcsICAgNjgwLAorICAgICA2ODEsICAgNjgyLCAgIDY4MywgICA2ODQsICAgNjg1LCAgIDY4NiwgICA2ODcsICAgNjg5LCAgIDY5MCwgICA2OTEsCisgICAgIDY5MiwgICA2OTQsICAgNzA3LCAgIDcwOAogfTsKICNlbmRpZgogCiAjaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UgfHwgWVlUT0tFTl9UQUJMRQogLyogWVlUTkFNRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCi0gICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICovCisgICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9CiB7CiAgICIkZW5kIiwgImVycm9yIiwgIiR1bmRlZmluZWQiLCAiRFNUIiwgIlNSQyIsICJIT1NUIiwgIkdBVEVXQVkiLCAiTkVUIiwKICAgIk5FVE1BU0siLCAiUE9SVCIsICJQT1JUUkFOR0UiLCAiTEVTUyIsICJHUkVBVEVSIiwgIlBST1RPIiwgIlBST1RPQ0hBSU4iLAogICAiQ0JZVEUiLCAiQVJQIiwgIlJBUlAiLCAiSVAiLCAiU0NUUCIsICJUQ1AiLCAiVURQIiwgIklDTVAiLCAiSUdNUCIsCi0gICJJR1JQIiwgIlBJTSIsICJWUlJQIiwgIkFUQUxLIiwgIkFBUlAiLCAiREVDTkVUIiwgIkxBVCIsICJTQ0EiLCAiTU9QUkMiLAotICAiTU9QREwiLCAiVEtfQlJPQURDQVNUIiwgIlRLX01VTFRJQ0FTVCIsICJOVU0iLCAiSU5CT1VORCIsICJPVVRCT1VORCIsCi0gICJQRl9JRk5BTUUiLCAiUEZfUlNFVCIsICJQRl9STlIiLCAiUEZfU1JOUiIsICJQRl9SRUFTT04iLCAiUEZfQUNUSU9OIiwKLSAgIkxJTksiLCAiR0VRIiwgIkxFUSIsICJORVEiLCAiSUQiLCAiRUlEIiwgIkhJRCIsICJISUQ2IiwgIkFJRCIsICJMU0giLAotICAiUlNIIiwgIkxFTiIsICJJUFY2IiwgIklDTVBWNiIsICJBSCIsICJFU1AiLCAiVkxBTiIsICJNUExTIiwgIlBQUE9FRCIsCi0gICJQUFBPRVMiLCAiSVNPIiwgIkVTSVMiLCAiQ0xOUCIsICJJU0lTIiwgIkwxIiwgIkwyIiwgIklJSCIsICJMU1AiLCAiU05QIiwKLSAgIkNTTlAiLCAiUFNOUCIsICJTVFAiLCAiSVBYIiwgIk5FVEJFVUkiLCAiTEFORSIsICJMTEMiLCAiTUVUQUMiLCAiQkNDIiwKLSAgIlNDIiwgIklMTUlDIiwgIk9BTUY0RUMiLCAiT0FNRjRTQyIsICJPQU0iLCAiT0FNRjQiLCAiQ09OTkVDVE1TRyIsCi0gICJNRVRBQ09OTkVDVCIsICJWUEkiLCAiVkNJIiwgIlJBRElPIiwgIkZJU1UiLCAiTFNTVSIsICJNU1UiLCAiU0lPIiwKLSAgIk9QQyIsICJEUEMiLCAiU0xTIiwgIkFORCIsICJPUiIsICInISciLCAiJ3wnIiwgIicmJyIsICInKyciLCAiJy0nIiwKLSAgIicqJyIsICInLyciLCAiVU1JTlVTIiwgIicpJyIsICInKCciLCAiJz4nIiwgIic9JyIsICInPCciLCAiJ1snIiwgIiddJyIsCi0gICInOiciLCAiJGFjY2VwdCIsICJwcm9nIiwgIm51bGwiLCAiZXhwciIsICJhbmQiLCAib3IiLCAiaWQiLCAibmlkIiwKLSAgIm5vdCIsICJwYXJlbiIsICJwaWQiLCAicWlkIiwgInRlcm0iLCAiaGVhZCIsICJydGVybSIsICJwcXVhbCIsICJkcXVhbCIsCi0gICJhcXVhbCIsICJuZGFxdWFsIiwgInBuYW1lIiwgIm90aGVyIiwgInBmdmFyIiwgInJlYXNvbiIsICJhY3Rpb24iLAorICAiSUdSUCIsICJQSU0iLCAiVlJSUCIsICJDQVJQIiwgIkFUQUxLIiwgIkFBUlAiLCAiREVDTkVUIiwgIkxBVCIsICJTQ0EiLAorICAiTU9QUkMiLCAiTU9QREwiLCAiVEtfQlJPQURDQVNUIiwgIlRLX01VTFRJQ0FTVCIsICJOVU0iLCAiSU5CT1VORCIsCisgICJPVVRCT1VORCIsICJQRl9JRk5BTUUiLCAiUEZfUlNFVCIsICJQRl9STlIiLCAiUEZfU1JOUiIsICJQRl9SRUFTT04iLAorICAiUEZfQUNUSU9OIiwgIlRZUEUiLCAiU1VCVFlQRSIsICJESVIiLCAiQUREUjEiLCAiQUREUjIiLCAiQUREUjMiLAorICAiQUREUjQiLCAiUkEiLCAiVEEiLCAiTElOSyIsICJHRVEiLCAiTEVRIiwgIk5FUSIsICJJRCIsICJFSUQiLCAiSElEIiwKKyAgIkhJRDYiLCAiQUlEIiwgIkxTSCIsICJSU0giLCAiTEVOIiwgIklQVjYiLCAiSUNNUFY2IiwgIkFIIiwgIkVTUCIsCisgICJWTEFOIiwgIk1QTFMiLCAiUFBQT0VEIiwgIlBQUE9FUyIsICJJU08iLCAiRVNJUyIsICJDTE5QIiwgIklTSVMiLCAiTDEiLAorICAiTDIiLCAiSUlIIiwgIkxTUCIsICJTTlAiLCAiQ1NOUCIsICJQU05QIiwgIlNUUCIsICJJUFgiLCAiTkVUQkVVSSIsCisgICJMQU5FIiwgIkxMQyIsICJNRVRBQyIsICJCQ0MiLCAiU0MiLCAiSUxNSUMiLCAiT0FNRjRFQyIsICJPQU1GNFNDIiwKKyAgIk9BTSIsICJPQU1GNCIsICJDT05ORUNUTVNHIiwgIk1FVEFDT05ORUNUIiwgIlZQSSIsICJWQ0kiLCAiUkFESU8iLAorICAiRklTVSIsICJMU1NVIiwgIk1TVSIsICJIRklTVSIsICJITFNTVSIsICJITVNVIiwgIlNJTyIsICJPUEMiLCAiRFBDIiwKKyAgIlNMUyIsICJIU0lPIiwgIkhPUEMiLCAiSERQQyIsICJIU0xTIiwgIkFORCIsICJPUiIsICInISciLCAiJ3wnIiwgIicmJyIsCisgICInKyciLCAiJy0nIiwgIicqJyIsICInLyciLCAiVU1JTlVTIiwgIicpJyIsICInKCciLCAiJz4nIiwgIic9JyIsICInPCciLAorICAiJ1snIiwgIiddJyIsICInOiciLCAiJGFjY2VwdCIsICJwcm9nIiwgIm51bGwiLCAiZXhwciIsICJhbmQiLCAib3IiLAorICAiaWQiLCAibmlkIiwgIm5vdCIsICJwYXJlbiIsICJwaWQiLCAicWlkIiwgInRlcm0iLCAiaGVhZCIsICJydGVybSIsCisgICJwcXVhbCIsICJkcXVhbCIsICJhcXVhbCIsICJuZGFxdWFsIiwgInBuYW1lIiwgIm90aGVyIiwgInBmdmFyIiwKKyAgInA4MDIxMSIsICJ0eXBlIiwgInN1YnR5cGUiLCAidHlwZV9zdWJ0eXBlIiwgImRpciIsICJyZWFzb24iLCAiYWN0aW9uIiwKICAgInJlbG9wIiwgImlyZWxvcCIsICJhcnRoIiwgIm5hcnRoIiwgImJ5dGVvcCIsICJwbnVtIiwgImF0bXR5cGUiLAogICAiYXRtbXVsdGl0eXBlIiwgImF0bWZpZWxkIiwgImF0bXZhbHVlIiwgImF0bWZpZWxkdmFsdWUiLCAiYXRtbGlzdHZhbHVlIiwKICAgIm10cDJ0eXBlIiwgIm10cDNmaWVsZCIsICJtdHAzdmFsdWUiLCAibXRwM2ZpZWxkdmFsdWUiLCAibXRwM2xpc3R2YWx1ZSIsIDAKQEAgLTgwNSw3ICsxMDUzLDcgQEAKICMgaWZkZWYgWVlQUklOVAogLyogWVlUT0tOVU1bWVlMRVgtTlVNXSAtLSBJbnRlcm5hbCB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bwogICAgdG9rZW4gWVlMRVgtTlVNLiAgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgeXl0b2tudW1bXSA9CitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXRva251bVtdID0KIHsKICAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLCAgIDI2MiwgICAyNjMsICAgMjY0LAogICAgICAyNjUsICAgMjY2LCAgIDI2NywgICAyNjgsICAgMjY5LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsCkBAIC04MTcsMzcgKzEwNjUsNDIgQEAKICAgICAgMzI1LCAgIDMyNiwgICAzMjcsICAgMzI4LCAgIDMyOSwgICAzMzAsICAgMzMxLCAgIDMzMiwgICAzMzMsICAgMzM0LAogICAgICAzMzUsICAgMzM2LCAgIDMzNywgICAzMzgsICAgMzM5LCAgIDM0MCwgICAzNDEsICAgMzQyLCAgIDM0MywgICAzNDQsCiAgICAgIDM0NSwgICAzNDYsICAgMzQ3LCAgIDM0OCwgICAzNDksICAgMzUwLCAgIDM1MSwgICAzNTIsICAgMzUzLCAgIDM1NCwKLSAgICAgMzU1LCAgIDM1NiwgICAzNTcsICAgIDMzLCAgIDEyNCwgICAgMzgsICAgIDQzLCAgICA0NSwgICAgNDIsICAgIDQ3LAotICAgICAzNTgsICAgIDQxLCAgICA0MCwgICAgNjIsICAgIDYxLCAgICA2MCwgICAgOTEsICAgIDkzLCAgICA1OAorICAgICAzNTUsICAgMzU2LCAgIDM1NywgICAzNTgsICAgMzU5LCAgIDM2MCwgICAzNjEsICAgMzYyLCAgIDM2MywgICAzNjQsCisgICAgIDM2NSwgICAzNjYsICAgMzY3LCAgIDM2OCwgICAzNjksICAgMzcwLCAgIDM3MSwgICAzNzIsICAgMzczLCAgIDM3NCwKKyAgICAgIDMzLCAgIDEyNCwgICAgMzgsICAgIDQzLCAgICA0NSwgICAgNDIsICAgIDQ3LCAgIDM3NSwgICAgNDEsICAgIDQwLAorICAgICAgNjIsICAgIDYxLCAgICA2MCwgICAgOTEsICAgIDkzLCAgICA1OAogfTsKICMgZW5kaWYKIAogLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXIxW10gPQorc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXIxW10gPQogewotICAgICAgIDAsICAgMTE5LCAgIDEyMCwgICAxMjAsICAgMTIxLCAgIDEyMiwgICAxMjIsICAgMTIyLCAgIDEyMiwgICAxMjIsCi0gICAgIDEyMywgICAxMjQsICAgMTI1LCAgIDEyNSwgICAxMjUsICAgMTI2LCAgIDEyNiwgICAxMjYsICAgMTI2LCAgIDEyNiwKLSAgICAgMTI2LCAgIDEyNiwgICAxMjYsICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTI5LCAgIDEyOSwgICAxMjksICAgMTMwLAotICAgICAxMzAsICAgMTMxLCAgIDEzMSwgICAxMzIsICAgMTMyLCAgIDEzMiwgICAxMzIsICAgMTMyLCAgIDEzMiwgICAxMzMsCi0gICAgIDEzMywgICAxMzMsICAgMTMzLCAgIDEzMywgICAxMzMsICAgMTMzLCAgIDEzMywgICAxMzMsICAgMTMzLCAgIDEzMywKLSAgICAgMTM0LCAgIDEzNCwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzYsICAgMTM2LAotICAgICAxMzYsICAgMTM2LCAgIDEzNywgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsCi0gICAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwKLSAgICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LAotICAgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsICAgMTM4LCAgIDEzOCwgICAxMzgsCi0gICAgIDEzOCwgICAxMzksICAgMTM5LCAgIDEzOSwgICAxMzksICAgMTM5LCAgIDEzOSwgICAxMzksICAgMTM5LCAgIDEzOSwKLSAgICAgMTM5LCAgIDEzOSwgICAxMzksICAgMTM5LCAgIDEzOSwgICAxNDAsICAgMTQwLCAgIDE0MCwgICAxNDAsICAgMTQwLAotICAgICAxNDAsICAgMTQxLCAgIDE0MSwgICAxNDIsICAgMTQzLCAgIDE0MywgICAxNDMsICAgMTQ0LCAgIDE0NCwgICAxNDQsCi0gICAgIDE0NSwgICAxNDUsICAgMTQ2LCAgIDE0NiwgICAxNDYsICAgMTQ2LCAgIDE0NiwgICAxNDYsICAgMTQ2LCAgIDE0NiwKLSAgICAgMTQ2LCAgIDE0NiwgICAxNDYsICAgMTQ2LCAgIDE0NiwgICAxNDcsICAgMTQ3LCAgIDE0NywgICAxNDcsICAgMTQ3LAotICAgICAxNDgsICAgMTQ4LCAgIDE0OSwgICAxNDksICAgMTQ5LCAgIDE0OSwgICAxNDksICAgMTQ5LCAgIDE0OSwgICAxNDksCi0gICAgIDE1MCwgICAxNTAsICAgMTUwLCAgIDE1MCwgICAxNTEsICAgMTUxLCAgIDE1MiwgICAxNTIsICAgMTUyLCAgIDE1MiwKLSAgICAgMTUzLCAgIDE1NCwgICAxNTQsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU2LCAgIDE1NiwgICAxNTYsICAgMTU2LAotICAgICAxNTcsICAgMTU3LCAgIDE1NywgICAxNTcsICAgMTU4LCAgIDE1OSwgICAxNTkKKyAgICAgICAwLCAgIDEzNiwgICAxMzcsICAgMTM3LCAgIDEzOCwgICAxMzksICAgMTM5LCAgIDEzOSwgICAxMzksICAgMTM5LAorICAgICAxNDAsICAgMTQxLCAgIDE0MiwgICAxNDIsICAgMTQyLCAgIDE0MywgICAxNDMsICAgMTQzLCAgIDE0MywgICAxNDMsCisgICAgIDE0MywgICAxNDMsICAgMTQzLCAgIDE0MywgICAxNDQsICAgMTQ1LCAgIDE0NiwgICAxNDYsICAgMTQ2LCAgIDE0NywKKyAgICAgMTQ3LCAgIDE0OCwgICAxNDgsICAgMTQ5LCAgIDE0OSwgICAxNDksICAgMTQ5LCAgIDE0OSwgICAxNDksICAgMTUwLAorICAgICAxNTAsICAgMTUwLCAgIDE1MCwgICAxNTAsICAgMTUwLCAgIDE1MCwgICAxNTAsICAgMTUwLCAgIDE1MCwgICAxNTAsCisgICAgIDE1MSwgICAxNTEsICAgMTUyLCAgIDE1MiwgICAxNTIsICAgMTUyLCAgIDE1MiwgICAxNTIsICAgMTUyLCAgIDE1MiwKKyAgICAgMTUyLCAgIDE1MiwgICAxNTIsICAgMTUyLCAgIDE1MywgICAxNTMsICAgMTUzLCAgIDE1MywgICAxNTQsICAgMTU1LAorICAgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsCisgICAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwKKyAgICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LAorICAgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NiwgICAxNTYsCisgICAgIDE1NiwgICAxNTYsICAgMTU2LCAgIDE1NiwgICAxNTYsICAgMTU2LCAgIDE1NiwgICAxNTYsICAgMTU2LCAgIDE1NiwKKyAgICAgMTU2LCAgIDE1NiwgICAxNTYsICAgMTU2LCAgIDE1NywgICAxNTcsICAgMTU3LCAgIDE1NywgICAxNTcsICAgMTU3LAorICAgICAxNTgsICAgMTU4LCAgIDE1OCwgICAxNTgsICAgMTU5LCAgIDE1OSwgICAxNjAsICAgMTYwLCAgIDE2MSwgICAxNjIsCisgICAgIDE2MiwgICAxNjMsICAgMTYzLCAgIDE2NCwgICAxNjUsICAgMTY1LCAgIDE2NSwgICAxNjYsICAgMTY2LCAgIDE2NiwKKyAgICAgMTY3LCAgIDE2NywgICAxNjgsICAgMTY4LCAgIDE2OCwgICAxNjgsICAgMTY4LCAgIDE2OCwgICAxNjgsICAgMTY4LAorICAgICAxNjgsICAgMTY4LCAgIDE2OCwgICAxNjgsICAgMTY4LCAgIDE2OSwgICAxNjksICAgMTY5LCAgIDE2OSwgICAxNjksCisgICAgIDE3MCwgICAxNzAsICAgMTcxLCAgIDE3MSwgICAxNzEsICAgMTcxLCAgIDE3MSwgICAxNzEsICAgMTcxLCAgIDE3MSwKKyAgICAgMTcyLCAgIDE3MiwgICAxNzIsICAgMTcyLCAgIDE3MywgICAxNzMsICAgMTc0LCAgIDE3NCwgICAxNzQsICAgMTc0LAorICAgICAxNzUsICAgMTc2LCAgIDE3NiwgICAxNzcsICAgMTc3LCAgIDE3NywgICAxNzcsICAgMTc3LCAgIDE3NywgICAxNzgsCisgICAgIDE3OCwgICAxNzgsICAgMTc4LCAgIDE3OCwgICAxNzgsICAgMTc4LCAgIDE3OCwgICAxNzksICAgMTc5LCAgIDE3OSwKKyAgICAgMTc5LCAgIDE4MCwgICAxODEsICAgMTgxCiB9OwogCiAvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXIyW10gPQorc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXIyW10gPQogewogICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAwLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCiAgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywKQEAgLTg1OSwyNjggKzExMTIsMzA3IEBACiAgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKICAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAogICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMSwKLSAgICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDQsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLAorICAgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgNCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAogICAgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDYsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCiAgICAgICAgMywgICAgIDMsICAgICAyLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKICAgICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAogICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDMsCiAgICAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgICAxLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAzCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwKKyAgICAgICAzLCAgICAgMSwgICAgIDEsICAgICAzCiB9OwogCi0vKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKLSAgIFNUQVRFLU5VTSB3aGVuIFlZVEFCTEUgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybworLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCByZWR1Y3Rpb24gbnVtYmVyIGluIHN0YXRlIFNUQVRFLU5VTS4KKyAgIFBlcmZvcm1lZCB3aGVuIFlZVEFCTEUgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybwogICAgbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4gZXJyb3IuICAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlkZWZhY3RbXSA9CitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQogewotICAgICAgIDQsICAgICAwLCAgICA1MSwgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDY1LCAgICA2NiwgICAgNjQsCi0gICAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwKLSAgICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgxLCAgICA4MCwgICAxNTAsICAgMTA2LCAgIDEwNywgICAgIDAsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDYzLCAgIDE0NCwgICAgODIsICAgIDgzLCAgICA4NCwgICAgODUsCi0gICAgIDEwOSwgICAxMTEsICAgMTEyLCAgIDExMywgICAgODYsICAgIDg3LCAgICA5NiwgICAgODgsICAgIDg5LCAgICA5MCwKLSAgICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk1LCAgICA5NCwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxNTIsICAgMTUzLAotICAgICAxNTQsICAgMTU1LCAgIDE1OCwgICAxNTksICAgMTU2LCAgIDE1NywgICAxNjAsICAgMTYxLCAgIDE2MiwgICAxNjMsCi0gICAgIDE2NCwgICAxNjUsICAgMTAwLCAgIDE3MywgICAxNzQsICAgMTc1LCAgIDE3NiwgICAxNzcsICAgMTc4LCAgIDE3OSwKLSAgICAgIDI0LCAgICAgMCwgICAgMjUsICAgICAyLCAgICA1MSwgICAgNTEsICAgICA1LCAgICAgMCwgICAgMzEsICAgICAwLAotICAgICAgNTAsICAgIDQ0LCAgIDExNCwgICAgIDAsICAgMTMxLCAgIDEzMCwgICAgNDUsICAgIDQ2LCAgICAgMCwgICAgNDgsCi0gICAgICAgMCwgICAxMDMsICAgMTA0LCAgICAgMCwgICAxMTUsICAgMTE2LCAgIDExNywgICAxMTgsICAgMTIxLCAgIDEyMiwKLSAgICAgMTE5LCAgIDEyMywgICAxMjAsICAgICAwLCAgIDEwOCwgICAxMTAsICAgICAwLCAgICAgMCwgICAxNDIsICAgIDEwLAotICAgICAgMTEsICAgIDUxLCAgICA1MSwgICAgMzIsICAgICAwLCAgIDEzMSwgICAxMzAsICAgIDE1LCAgICAyMSwgICAgMTgsCi0gICAgICAyMCwgICAgMjIsICAgIDM5LCAgICAxMiwgICAgIDAsICAgICAwLCAgICAxMywgICAgNTMsICAgIDUyLCAgICA1OCwKLSAgICAgIDYyLCAgICA1OSwgICAgNjAsICAgIDYxLCAgICAzNiwgICAgMzcsICAgMTAxLCAgIDEwMiwgICAgMzQsICAgIDM1LAotICAgICAgMzgsICAgICAwLCAgIDEyNSwgICAxMjcsICAgMTI5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgICAgMCwgICAgIDAsICAgICAwLCAgIDEyNCwgICAxMjYsICAgMTI4LCAgICAgMCwgICAgIDAsICAgMTcwLCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAgNDcsICAgMTY2LCAgIDE4NCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDksICAgMTgwLAotICAgICAxNDYsICAgMTQ1LCAgIDE0OCwgICAxNDksICAgMTQ3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNywgICAgNTEsCi0gICAgICA1MSwgICAgIDYsICAgMTMwLCAgICAgOSwgICAgIDgsICAgIDQwLCAgIDE0MywgICAxNTEsICAgICAwLCAgICAgMCwKLSAgICAgICAwLCAgICAyMywgICAgMjYsICAgIDMwLCAgICAgMCwgICAgMjksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAgMzMsICAgICAwLCAgIDE0MCwgICAxNDEsICAgMTM5LCAgIDEzOCwgICAxMzQsICAgMTM1LCAgIDEzNiwgICAxMzcsCi0gICAgICA0MiwgICAgNDMsICAgMTcxLCAgICAgMCwgICAxNjcsICAgMTY4LCAgIDE4NSwgICAgIDAsICAgMTgxLCAgIDE4MiwKLSAgICAgMTA1LCAgIDEzMCwgICAgMTcsICAgIDE2LCAgICAxOSwgICAgMTQsICAgICAwLCAgICAgMCwgICAgNTcsICAgIDU1LAotICAgICAgNTYsICAgIDU0LCAgIDEzMiwgICAgIDAsICAgMTY5LCAgICAgMCwgICAxODMsICAgICAwLCAgICAyNywgICAgMjgsCi0gICAgICAgMCwgICAxNzIsICAgMTg2LCAgIDEzMworICAgICAgIDQsICAgICAwLCAgICA1MSwgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDcxLCAgICA3MiwgICAgNzAsCisgICAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwKKyAgICAgIDgzLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4OCwgICAgODcsICAgMTcwLCAgIDExMywgICAxMTQsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA2OSwgICAxNjQsICAgIDg5LCAgICA5MCwgICAgOTEsCisgICAgICA5MiwgICAxMTYsICAgMTE4LCAgIDExOSwgICAxMjEsICAgIDkzLCAgICA5NCwgICAxMDMsICAgIDk1LCAgICA5NiwKKyAgICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMiwgICAxMDEsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTcyLAorICAgICAxNzMsICAgMTc0LCAgIDE3NSwgICAxNzgsICAgMTc5LCAgIDE3NiwgICAxNzcsICAgMTgwLCAgIDE4MSwgICAxODIsCisgICAgIDE4MywgICAxODQsICAgMTg1LCAgIDEwNywgICAxOTMsICAgMTk0LCAgIDE5NSwgICAxOTYsICAgMTk3LCAgIDE5OCwKKyAgICAgMTk5LCAgIDIwMCwgICAyMDEsICAgMjAyLCAgIDIwMywgICAyMDQsICAgMjA1LCAgIDIwNiwgICAgMjQsICAgICAwLAorICAgICAgMjUsICAgICAyLCAgICA1MSwgICAgNTEsICAgICA1LCAgICAgMCwgICAgMzEsICAgICAwLCAgICA1MCwgICAgNDQsCisgICAgIDEyMiwgICAgIDAsICAgMTUxLCAgIDE1MCwgICAgNDUsICAgIDQ2LCAgICAgMCwgICAgNDgsICAgICAwLCAgIDExMCwKKyAgICAgMTExLCAgICAgMCwgICAxMjQsICAgMTI1LCAgIDEyNiwgICAxMjcsICAgMTQxLCAgIDE0MiwgICAxMjgsICAgMTQzLAorICAgICAxMjksICAgICAwLCAgIDExNSwgICAxMTcsICAgMTIwLCAgICAgMCwgICAgIDAsICAgMTYyLCAgICAxMCwgICAgMTEsCisgICAgICA1MSwgICAgNTEsICAgIDMyLCAgICAgMCwgICAxNTEsICAgMTUwLCAgICAxNSwgICAgMjEsICAgIDE4LCAgICAyMCwKKyAgICAgIDIyLCAgICAzOSwgICAgMTIsICAgICAwLCAgICAgMCwgICAgMTMsICAgIDUzLCAgICA1MiwgICAgNjQsICAgIDY4LAorICAgICAgNjUsICAgIDY2LCAgICA2NywgICAgMzYsICAgIDM3LCAgIDEwOCwgICAxMDksICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICAzNCwgICAgMzUsICAgIDM4LCAgIDEyMywKKyAgICAgICAwLCAgIDE0NSwgICAxNDcsICAgMTQ5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgIDE0NCwgICAxNDYsICAgMTQ4LCAgICAgMCwgICAgIDAsICAgMTkwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgNDcsICAgMTg2LCAgIDIxMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDksICAgMjA3LCAgIDE2NiwKKyAgICAgMTY1LCAgIDE2OCwgICAxNjksICAgMTY3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNywgICAgNTEsICAgIDUxLAorICAgICAgIDYsICAgMTUwLCAgICAgOSwgICAgIDgsICAgIDQwLCAgIDE2MywgICAxNzEsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAyMywgICAgMjYsICAgIDMwLCAgICAgMCwgICAgMjksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDEzNCwKKyAgICAgMTM1LCAgIDEzMSwgICAxMzgsICAgMTMyLCAgIDEzOSwgICAxNDAsICAgMTMzLCAgICAzMywgICAgIDAsICAgMTYwLAorICAgICAxNjEsICAgMTU5LCAgIDE1OCwgICAxNTQsICAgMTU1LCAgIDE1NiwgICAxNTcsICAgIDQyLCAgICA0MywgICAxOTEsCisgICAgICAgMCwgICAxODcsICAgMTg4LCAgIDIxMiwgICAgIDAsICAgMjA4LCAgIDIwOSwgICAxMTIsICAgMTUwLCAgICAxNywKKyAgICAgIDE2LCAgICAxOSwgICAgMTQsICAgICAwLCAgICAgMCwgICAgNTcsICAgIDU1LCAgICA1NiwgICAgNTQsICAgICAwLAorICAgICAxNTIsICAgICAwLCAgIDE4OSwgICAgIDAsICAgMjEwLCAgICAgMCwgICAgMjcsICAgIDI4LCAgIDEzNiwgICAxMzcsCisgICAgIDEzMCwgICAgIDAsICAgMTkyLCAgIDIxMywgICAxNTMKIH07CiAKLS8qIFlZREVGR09UT1tOVEVSTS1OVU1dLiAqLwotc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWRlZmdvdG9bXSA9CisvKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5ZGVmZ290b1tdID0KIHsKLSAgICAgIC0xLCAgICAgMSwgICAgIDIsICAgMTI0LCAgIDEyMSwgICAxMjIsICAgMjAxLCAgIDEzMywgICAxMzQsICAgMTE2LAotICAgICAyMDMsICAgMjA0LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAxNDgsICAgMTQ5LCAgIDE1MCwgICAxMTcsCi0gICAgICA5MSwgICAgOTIsICAgMTEwLCAgIDExMiwgICAxNjYsICAgMTY3LCAgICA5MywgICAgOTQsICAgMTg1LCAgICA5NSwKLSAgICAgIDk2LCAgICA5NywgICAgOTgsICAgMTcyLCAgIDE3MywgICAyMjMsICAgIDk5LCAgIDEwMCwgICAxNzgsICAgMTc5LAotICAgICAyMjcKKyAgICAgIC0xLCAgICAgMSwgICAgIDIsICAgMTMzLCAgIDEzMCwgICAxMzEsICAgMjIwLCAgIDE0MiwgICAxNDMsICAgMTI1LAorICAgICAyMjIsICAgMjIzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAxNjYsICAgMTY3LCAgIDE2OCwgICAxMjYsCisgICAgICA5OSwgICAxMDAsICAgMTY5LCAgIDIzMSwgICAyODAsICAgMjMzLCAgIDIzNiwgICAxMTgsICAgMTIwLCAgIDE4NSwKKyAgICAgMTg2LCAgIDEwMSwgICAxMDIsICAgMjA0LCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxOTEsICAgMTkyLAorICAgICAyNTAsICAgMTA3LCAgIDEwOCwgICAxOTcsICAgMTk4LCAgIDI1NAogfTsKIAogLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCiAgICBTVEFURS1OVU0uICAqLwotI2RlZmluZSBZWVBBQ1RfTklORiAtMTgxCi1zdGF0aWMgY29uc3Qgc2hvcnQgaW50IHl5cGFjdFtdID0KKyNkZWZpbmUgWVlQQUNUX05JTkYgLTIwOAorc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXBhY3RbXSA9CiB7Ci0gICAgLTE4MSwgICAgMTksICAgMjAwLCAgLTE4MSwgICAgLTMsICAgICAxLCAgICAxNSwgIC0xODEsICAtMTgxLCAgLTE4MSwKLSAgICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLAotICAgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgICAxMywgICAgMjAsCi0gICAgICAxOCwgICAgNDQsICAgLTI2LCAgICAzNSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwKLSAgICAgLTE5LCAgIC0xOSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLAotICAgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsCi0gICAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwKLSAgICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLAotICAgIC0xODEsICAgNDkzLCAgLTE4MSwgICAgNDEsICAgMzk2LCAgIDM5NiwgIC0xODEsICAgLTI0LCAgLTE4MSwgICAxNTUsCi0gICAgICAgMiwgIC0xODEsICAtMTgxLCAgIDQ4OCwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAgICA5LCAgLTE4MSwKLSAgICAgMTM0LCAgLTE4MSwgIC0xODEsICAgIDYyLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLAotICAgIC0xODEsICAtMTgxLCAgLTE4MSwgICAtMTksICAtMTgxLCAgLTE4MSwgICA0OTMsICAgIC05LCAgLTE4MSwgIC0xODEsCi0gICAgLTE4MSwgICAyOTgsICAgMjk4LCAgLTE4MSwgICAtNTMsICAgLTE0LCAgICAtMSwgIC0xODEsICAtMTgxLCAgICAgMCwKLSAgICAgICAzLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgIC0yNCwgICAtMjQsICAtMTgxLCAgICA3NywgICAgODIsICAtMTgxLAotICAgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgIDQzNywgIC0xODEsCi0gICAgLTE4MSwgICA0OTMsICAtMTgxLCAgLTE4MSwgIC0xODEsICAgNDkzLCAgIDQ5MywgICA0OTMsICAgNDkzLCAgIDQ5MywKLSAgICAgNDkzLCAgIDQ5MywgICA0OTMsICAtMTgxLCAgLTE4MSwgIC0xODEsICAgNDkzLCAgIDQ5MywgIC0xODEsICAgIDc4LAotICAgICAgODEsICAgIDg5LCAgLTE4MSwgIC0xODEsICAtMTgxLCAgICA5NSwgICAxMDgsICAgMTEzLCAgLTE4MSwgIC0xODEsCi0gICAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAgMTIwLCAgICAtMSwgICAtMzQsICAtMTgxLCAgIDI5OCwKLSAgICAgMjk4LCAgLTE4MSwgICAgIDQsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgICAxMTIsICAgMTQ5LAotICAgICAxNTAsICAtMTgxLCAgLTE4MSwgICAgODAsICAgIDQxLCAgICAtMSwgICAxODgsICAgMTg5LCAgIDIwNSwgICAyMDYsCi0gICAgLTE4MSwgICAtNDEsICAgIDY1LCAgICA2NSwgICAgOTgsICAgMTQ0LCAgIC05MywgICAtOTMsICAtMTgxLCAgLTE4MSwKLSAgICAgLTM0LCAgIC0zNCwgIC0xODEsICAgLTgwLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgIC01OCwgIC0xODEsICAtMTgxLAotICAgIC0xODEsICAgIDQ2LCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgICAtMjQsICAgLTI0LCAgLTE4MSwgIC0xODEsCi0gICAgLTE4MSwgIC0xODEsICAtMTgxLCAgIDE3NCwgIC0xODEsICAgIDc4LCAgLTE4MSwgICAgOTUsICAtMTgxLCAgLTE4MSwKLSAgICAgIDk2LCAgLTE4MSwgIC0xODEsICAtMTgxCisgICAgLTIwOCwgICAgMjAsICAgMjI2LCAgLTIwOCwgICAtMTAsICAgIC0zLCAgICAgMSwgIC0yMDgsICAtMjA4LCAgLTIwOCwKKyAgICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAtMjgsCisgICAgIC0xNSwgICAgNDksICAgIDY4LCAgIC0xOCwgICAgNjIsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwKKyAgICAtMjA4LCAgIC0yNiwgICAtMjYsICAtMjA4LCAgIC0yNiwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsCisgICAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwKKyAgICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgICA1NzAsCisgICAgLTIwOCwgICAtNDIsICAgNDU2LCAgIDQ1NiwgIC0yMDgsICAgIDE5LCAgLTIwOCwgICA2NTYsICAgIDEyLCAgLTIwOCwKKyAgICAtMjA4LCAgIDE1MywgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgIDU1LCAgLTIwOCwgICAgNTksICAtMjA4LAorICAgIC0yMDgsICAgLTY5LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsCisgICAgLTIwOCwgICAtMjYsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgNTcwLCAgIC0xOSwgIC0yMDgsICAtMjA4LCAgLTIwOCwKKyAgICAgMzQxLCAgIDM0MSwgIC0yMDgsICAgLTkzLCAgICAtMSwgICAgMjEsICAtMjA4LCAgLTIwOCwgICAgLTYsICAgIDM0LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAgMTksICAgIDE5LCAgLTIwOCwgICAgLTksICAgICA2LCAgLTIwOCwgIC0yMDgsCisgICAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAtMTQsICAgIDc0LCAgIC0xMywKKyAgICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgIDIzLCAgLTIwOCwgIC0yMDgsICAtMjA4LAorICAgICA1NzAsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgNTcwLCAgIDU3MCwgICA1NzAsICAgNTcwLCAgIDU3MCwgICA1NzAsCisgICAgIDU3MCwgICA1NzAsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgNTcwLCAgIDU3MCwgIC0yMDgsICAgIDgxLCAgIDEzNCwKKyAgICAgMTM5LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgIDE0MCwgICAxNDEsICAgMTQyLCAgLTIwOCwgIC0yMDgsICAtMjA4LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgMTQzLCAgICAyMSwgICAgNzksICAtMjA4LCAgIDM0MSwgICAzNDEsCisgICAgLTIwOCwgICAgIDQsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAgODYsICAgMTQ0LCAgIDE0NSwKKyAgICAtMjA4LCAgLTIwOCwgICAgNjQsICAgLTQyLCAgICAyMSwgICAxNzksICAgMTg5LCAgIDE5MSwgICAxOTIsICAtMjA4LAorICAgIC0yMDgsICAgMTQ5LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgIC01MSwgICAgNDIsCisgICAgICA0MiwgICAgOTksICAgMTEwLCAgICAzMywgICAgMzMsICAtMjA4LCAgLTIwOCwgICAgNzksICAgIDc5LCAgLTIwOCwKKyAgICAgLTYxLCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgIC01OSwgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAtNjQsICAtMjA4LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAgMTksICAgIDE5LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgICAgLTgsCisgICAgLTIwOCwgICAxNjAsICAtMjA4LCAgICA4MSwgIC0yMDgsICAgMTQwLCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwKKyAgICAtMjA4LCAgICA2NSwgIC0yMDgsICAtMjA4LCAgLTIwOAogfTsKIAogLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KLXN0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwZ290b1tdID0KK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlwZ290b1tdID0KIHsKLSAgICAtMTgxLCAgLTE4MSwgIC0xODEsICAgMjEyLCAgICA1MCwgIC0xODAsICAgLTg2LCAgIC04OSwgICAgIDUsICAgIC0yLAotICAgIC0xODEsICAtMTgxLCAgIC04MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAgMTA3LCAgLTE4MSwgICAgIDcsCi0gICAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgICAtNjYsICAgLTM5LCAgIC0yMSwgICAtNzQsICAtMTgxLCAgIC0zNSwKLSAgICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTgxLCAgLTE1MSwgIC0xODEsICAtMTgxLCAgLTE4MSwgIC0xODEsICAtMTQ1LAotICAgIC0xODEKKyAgICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgMTk2LCAgIC0xMSwgIC0yMDcsICAgLTk0LCAgLTEyMiwgICAgIDUsICAgIC0yLAorICAgIC0yMDgsICAtMjA4LCAgIC04MiwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAgIDUzLCAgLTIwOCwgICAgIDcsCisgICAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMjA4LCAgIC05MSwKKyAgICAgLTQwLCAgIC0yNCwgICAtNzUsICAtMjA4LCAgIC0zNiwgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMTg1LAorICAgIC0yMDgsICAtMjA4LCAgLTIwOCwgIC0yMDgsICAtMTczLCAgLTIwOAogfTsKIAogLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCiAgICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKLSAgIG51bWJlciBpcyB0aGUgb3Bwb3NpdGUuICBJZiB6ZXJvLCBkbyB3aGF0IFlZREVGQUNUIHNheXMuCi0gICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCisgICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLwogI2RlZmluZSBZWVRBQkxFX05JTkYgLTQyCi1zdGF0aWMgY29uc3Qgc2hvcnQgaW50IHl5dGFibGVbXSA9CitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5dGFibGVbXSA9CiB7Ci0gICAgICA4NSwgICAxMzIsICAgLTQxLCAgIDEyMywgICAtMTMsICAgMTE0LCAgIDExNSwgICAgODQsICAgMTk4LCAgICA5MCwKLSAgICAgMTA4LCAgIDEyNSwgICAgMjUsICAgMTU1LCAgIDE1NiwgICAxNjEsICAgMTYyLCAgICAyNSwgICAyMjIsICAgICAzLAotICAgICAxNTUsICAgMTU2LCAgIDEyMCwgICAxMDksICAgMjM3LCAgIDEyNywgICAxMjgsICAgMTI5LCAgIDEzMCwgICAxMzEsCi0gICAgIDIyNiwgICAyNDQsICAgMTcwLCAgIDEwMSwgICAxNzYsICAgMTg4LCAgIDE5MywgICAxMDIsICAgMTEzLCAgIDExMywKLSAgICAgMTkxLCAgIDE5NCwgICAxMjUsICAgMjQ1LCAgIDEyMCwgICAxNjgsICAgMjAyLCAgIDI0NywgICAxMTksICAgMTIwLAotICAgICAxMjYsICAgMTAzLCAgIDEzNiwgICAyNDYsICAgMTA2LCAgIDE1MiwgICAxNTMsICAgMTU0LCAgIDE5NSwgICAxNzEsCi0gICAgIDExOCwgICAxNzcsICAgMTA0LCAgIDE1NywgICAxNTgsICAgMTU5LCAgIDE2MCwgICAxNjEsICAgMTYyLCAgIDEwNSwKLSAgICAgMTU3LCAgIDE1OCwgICAxNTksICAgMTYwLCAgIDE2MSwgICAxNjIsICAgMjQyLCAgIDI0MywgICAxODYsICAgIDgwLAotICAgICAxMDcsICAgMTI2LCAgICA4NSwgICAgODUsICAgMTExLCAgIDEzNSwgICAxOTIsICAgMTkyLCAgICA4MiwgICAgODQsCi0gICAgICA4NCwgICAgOTAsICAgIDkwLCAgICA4MiwgICAyNTEsICAgMTg3LCAgIDE2OSwgICAxOTYsICAgMTc1LCAgIDEzNiwKLSAgICAgMjA1LCAgIDIwMiwgICAyNTIsICAgLTQxLCAgIC00MSwgICAtMTMsICAgLTEzLCAgIDE1MSwgICAxMjMsICAgMTk5LAotICAgICAxOTcsICAgMTEzLCAgIDIwMCwgICAtNDEsICAgMTY4LCAgIC0xMywgICAxMjUsICAgMjI0LCAgIDE1MSwgICAxOTAsCi0gICAgIDE5MCwgICAgODIsICAgMTYzLCAgIDE2NCwgICAxNjUsICAgMjI1LCAgIDE4OSwgICAxODksICAgIDkwLCAgICA5MCwKLSAgICAgMjExLCAgIDE3NCwgICAxMzUsICAgMTEzLCAgIDIxMiwgICAyMTMsICAgMjE0LCAgIDIxNSwgICAyMTYsICAgMjE3LAotICAgICAyMTgsICAgMjE5LCAgIDExOSwgICAxMjAsICAgMjI4LCAgIDIyMCwgICAyMjEsICAgLTI5LCAgIC0yOSwgICAyMjksCi0gICAgIDI0OCwgICAyNDksICAgMTU1LCAgIDE1NiwgICAxOTIsICAgMjMxLCAgIDIzMCwgICAxOTcsICAgMTM3LCAgIDEzOCwKLSAgICAgMTM5LCAgIDE0MCwgICAxNDEsICAgMjMyLCAgIDE0MiwgICAxNDMsICAgMTgwLCAgIDE4MSwgICAxNDQsICAgMTQ1LAotICAgICAxNzQsICAgMTU5LCAgIDE2MCwgICAxNjEsICAgMTYyLCAgIDE4MiwgICAxODMsICAgMTg0LCAgIDIwNiwgICAyMDcsCi0gICAgIDE1MiwgICAxNTMsICAgMTU0LCAgIDIwOCwgICAyMDksICAgMjMzLCAgIDIzNCwgICAxOTAsICAgIDg1LCAgIDE0NiwKLSAgICAgMTQ3LCAgIDIzNSwgICAyMzgsICAgMjM5LCAgIDE4OSwgICAxODksICAgIDkwLCAgICA5MCwgICAxNTUsICAgMTU2LAotICAgICAgLTMsICAgMTM2LCAgIDEzNiwgICAxNTgsICAgMTU5LCAgIDE2MCwgICAxNjEsICAgMTYyLCAgIDI0MCwgICAyNDEsCi0gICAgIDI1MCwgICAgIDQsICAgICA1LCAgIDI1MywgICAgODMsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAotICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgMTM1LCAgIDEzNSwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsCi0gICAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICA4MiwgICAxNjMsICAgMTY0LCAgIDE2NSwKLSAgICAgMTU5LCAgIDE2MCwgICAxNjEsICAgMTYyLCAgIDIzNiwgICAyMTAsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LAorICAgICAgOTMsICAgMTQxLCAgIDIxNywgICAyNDksICAgLTEzLCAgIDEyMiwgICAxMjMsICAgIDkyLCAgIDEyNCwgICAgOTgsCisgICAgIDEzMiwgICAgMjYsICAgLTQxLCAgIDE3NCwgICAxNzUsICAgMTg5LCAgIDI2NCwgICAxOTUsICAgMTM0LCAgIDExNiwKKyAgICAgICAzLCAgIDI1MywgICAyMjEsICAgMjI5LCAgIDIzNCwgICAxMjgsICAgMTI5LCAgIDEwOSwgICAxNDgsICAgMjc4LAorICAgICAxNTAsICAgMTEyLCAgIDE1MSwgICAxNTIsICAgMTEwLCAgIDIxNCwgICAyMDcsICAgMjEyLCAgIDExMSwgICAxMjEsCisgICAgIDEyMSwgICAxMTcsICAgMTIxLCAgIDI3MywgICAxMTMsICAgMjMwLCAgIDIzNSwgICAyNzUsICAgMjEwLCAgIDIxMywKKyAgICAgMTM0LCAgIDI3OSwgICAxOTksICAgMjAwLCAgIC0yOSwgICAtMjksICAgIDI2LCAgIDEzNSwgICAxMjksICAgMTQ1LAorICAgICAxMjksICAgMjAxLCAgIDIwMiwgICAyMDMsICAgMjE2LCAgIDEyNywgICAxOTAsICAgMjcyLCAgIDE5NiwgICAyNzQsCisgICAgIDE3NiwgICAxNzcsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgIDEyOCwgICAxMjksICAgMTM2LCAgIDEzNywKKyAgICAgMTM4LCAgIDEzOSwgICAxNDAsICAgMjcwLCAgIDI3MSwgICAyMDUsICAgMTE0LCAgIDIyMSwgICAyODIsICAgMTM1LAorICAgICAgOTMsICAgIDkzLCAgIDE4NywgICAxNDQsICAgMjExLCAgIDIxMSwgICAxOTMsICAgIDkyLCAgICA5MiwgICAgOTgsCisgICAgICA5OCwgICAyMDYsICAgMjgzLCAgICA5MCwgICAxODgsICAgMTE1LCAgIDE5NCwgICAxNDUsICAgMjI0LCAgIDIyNSwKKyAgICAgMjI2LCAgIDE3MSwgICAxNzIsICAgMTczLCAgIDE3MCwgICAxNzEsICAgMTcyLCAgIDE3MywgICAxODcsICAgMTIxLAorICAgICAyMTgsICAgMTE5LCAgIC0xMywgICAtMTMsICAgMjI3LCAgIDIyOCwgICAxMzIsICAgMjE1LCAgIDIwOSwgICAyMDksCisgICAgIC00MSwgICAtNDEsICAgLTEzLCAgIDIzMiwgICAxMzQsICAgMjA4LCAgIDIwOCwgICAgOTgsICAgIDk4LCAgICA4OCwKKyAgICAgLTQxLCAgIDE0NCwgICAxMjEsICAgMTc0LCAgIDE3NSwgICAxNzAsICAgMjM4LCAgIDI1OSwgICAgOTAsICAgMjE2LAorICAgICAyMzksICAgMjQwLCAgIDI0MSwgICAyNDIsICAgMjQzLCAgIDI0NCwgICAyNDUsICAgMjQ2LCAgIDE4MCwgICAxODEsCisgICAgIDIxOSwgICAyNDcsICAgMjQ4LCAgIDE3NCwgICAxNzUsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgIDI3NiwKKyAgICAgMjc3LCAgIDI1MSwgICAyMTEsICAgMjU4LCAgIDE3NCwgICAxNzUsICAgMjUyLCAgIDE5MywgICAyNTUsICAgMjU2LAorICAgICAyNTcsICAgMjYwLCAgIDI2MSwgICAyNjUsICAgIDkwLCAgIDE4MiwgICAxODMsICAgMTg0LCAgICA5MCwgICAxODIsCisgICAgIDE4MywgICAxODQsICAgMjYyLCAgIDI2NiwgICAyNjcsICAgMjY4LCAgIDI2OSwgICAyODEsICAgIDkxLCAgIDI4NCwKKyAgICAgMTc2LCAgIDE3NywgICAxNzgsICAgMTc5LCAgIDE4MCwgICAxODEsICAgMjA5LCAgICA5MywgICAgIDAsICAgMTcxLAorICAgICAxNzIsICAgMTczLCAgIDI2MywgICAyMDgsICAgMjA4LCAgICA5OCwgICAgOTgsICAgMTc0LCAgIDE3NSwgICAyMzcsCisgICAgICAgMCwgICAxNzcsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgICAtMywgICAxNDUsICAgMTQ1LCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgICAgNCwgICAgIDUsICAgICAwLAorICAgICAgIDAsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCisgICAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwKKyAgICAgIDI1LCAgIDE0NCwgICAxNDQsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLAorICAgICAgMzMsICAgIDM0LCAgICAgMCwgICAgIDAsICAgMTc2LCAgIDE3NywgICAxNzgsICAgMTc5LCAgIDE4MCwgICAxODEsCisgICAgICAgMCwgICAgMzUsICAgICAwLCAgIDE4MiwgICAxODMsICAgMTg0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLAorICAgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsCisgICAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywKKyAgICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAorICAgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsCisgICAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICA4OCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgIDg5LCAgICAgMCwgICAgIDQsICAgICA1LCAgICAgMCwgICAgOTAsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCisgICAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAyNywKKyAgICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzUsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgIDEzNiwgICAxMzcsICAgMTM4LCAgIDEzOSwgICAxNDAsICAgICAwLCAgICAgMCwgICAgMzYsICAgIDM3LCAgICAzOCwKICAgICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LAogICAgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsCiAgICAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwKICAgICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LAotICAgICAgNzksICAgICAwLCAgICAgMCwgICAgODAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDgxLCAgICAgMCwgICAgIDQsCi0gICAgICAgNSwgICAgIDAsICAgIDgyLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAotICAgICAgMjMsICAgIDI0LCAgICAgMCwgICAgIDAsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsCi0gICAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMjcsICAgMTI4LCAgIDEyOSwKLSAgICAgMTMwLCAgIDEzMSwgICAgIDAsICAgICAwLCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsCi0gICAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLAotICAgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgIDAsCi0gICAgICAgMCwgICAgODAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDgxLCAgICAgMCwgICAgIDQsICAgICA1LCAgICAgMCwKLSAgICAgIDgyLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsCisgICAgICAgMCwgICAgODgsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDg5LCAgICAgMCwgICAgIDQsICAgICA1LCAgICAgMCwKKyAgICAgIDkwLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAogICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsCi0gICAgICAgMCwgICAgIDAsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwKLSAgICAgIDMzLCAgICAzNCwgICAxMzksICAgICAwLCAgIDE0MSwgICAgIDAsICAgMTQyLCAgIDE0MywgICAgIDAsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCi0gICAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwKLSAgICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLAotICAgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsCi0gICAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgIDAsICAgICAwLCAgICA4MCwKLSAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDgxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgODIsICAgICA3LAotICAgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsCi0gICAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDAsICAgICAwLCAgICAyNSwKLSAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1MiwgICAxNTMsICAgMTU0LCAgICAgMCwgICAgMzQsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgIDE1NSwgICAxNTYsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzUsCi0gICAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ0LCAgICA0NSwKLSAgICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LAotICAgICAgNTYsICAgIDU3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA3MiwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAxNTcsICAgMTU4LCAgIDE1OSwgICAxNjAsICAgMTYxLCAgIDE2MiwgICAgIDAsICAgICAwLAotICAgICAgODEsICAgMTYzLCAgIDE2NCwgICAxNjUsICAgICAwLCAgICA4MgotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWNoZWNrW10gPQotewotICAgICAgIDIsICAgIDg3LCAgICAgMCwgICAgODQsICAgICAwLCAgICA0MCwgICAgNDEsICAgICAyLCAgICAgOCwgICAgIDIsCi0gICAgICAzNiwgICAgODUsICAgIDM2LCAgICA1NCwgICAgNTUsICAgMTA4LCAgIDEwOSwgICAgMzYsICAgMTY5LCAgICAgMCwKLSAgICAgIDU0LCAgICA1NSwgICAxMDIsICAgIDQ5LCAgIDIwNCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLAotICAgICAxNzUsICAgMTExLCAgICA5OCwgICAgMzYsICAgMTAwLCAgIDEyMSwgICAxMjIsICAgIDM2LCAgICA0MCwgICAgNDEsCi0gICAgIDEyMSwgICAxMjIsICAgMTE2LCAgIDIyMywgICAxMDIsICAgIDM2LCAgIDEzNSwgICAyMjcsICAgMTAxLCAgIDEwMiwKLSAgICAgIDg1LCAgICAzNiwgICAgODcsICAgMTExLCAgICAzNiwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAxMTEsICAgIDk4LAotICAgICAgODEsICAgMTAwLCAgICA0OSwgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAgNDksCi0gICAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDEwNywgICAxMDgsICAgMTA5LCAgIDExNywgICAxMTgsICAgMTEzLCAgIDEwMywKLSAgICAgIDM2LCAgIDExNiwgICAgODQsICAgIDg1LCAgICA0OSwgICAgODcsICAgMTIxLCAgIDEyMiwgICAxMTIsICAgIDg0LAotICAgICAgODUsICAgIDg0LCAgICA4NSwgICAxMTIsICAgMjQ1LCAgIDExNiwgICAgOTgsICAgMTExLCAgIDEwMCwgICAxMzQsCi0gICAgIDEzNSwgICAxOTAsICAgMjQ3LCAgIDEwMSwgICAxMDIsICAgMTAxLCAgIDEwMiwgICAxMTYsICAgMTg5LCAgIDEwOSwKLSAgICAgMTExLCAgIDExMywgICAxMDksICAgMTExLCAgICAzNiwgICAxMTEsICAgMTkwLCAgICAzNiwgICAxMTYsICAgMTIxLAotICAgICAxMjIsICAgMTEyLCAgIDExMywgICAxMTQsICAgMTE1LCAgICAzNiwgICAxMjEsICAgMTIyLCAgIDEyMSwgICAxMjIsCi0gICAgIDE1MSwgICAgMzYsICAgMTM0LCAgIDEzNSwgICAxNTUsICAgMTU2LCAgIDE1NywgICAxNTgsICAgMTU5LCAgIDE2MCwKLSAgICAgMTYxLCAgIDE2MiwgICAxMDEsICAgMTAyLCAgICAzNiwgICAxNjYsICAgMTY3LCAgIDEwMSwgICAxMDIsICAgIDM2LAotICAgICAyMzYsICAgMjM3LCAgICA1NCwgICAgNTUsICAgMTg5LCAgIDE5MCwgICAgMzYsICAgMTExLCAgICAgMywgICAgIDQsCi0gICAgICAgNSwgICAgIDYsICAgICA3LCAgICA1MSwgICAgIDksICAgIDEwLCAgIDEwNCwgICAxMDUsICAgIDEzLCAgICAxNCwKLSAgICAgIDM2LCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTMsICAgMTE0LCAgIDExNSwgICAxMDEsICAgMTAyLAotICAgICAgNDYsICAgIDQ3LCAgICA0OCwgICAxMDEsICAgMTAyLCAgICAzNiwgICAgMzYsICAgMTg5LCAgIDE5MCwgICAgMzQsCi0gICAgICAzNSwgICAxMTEsICAgICA0LCAgICAgNCwgICAxODksICAgMTkwLCAgIDE4OSwgICAxOTAsICAgIDU0LCAgICA1NSwKLSAgICAgICAwLCAgIDIzNiwgICAyMzcsICAgMTA1LCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAgIDMsICAgICAzLAotICAgICAgMzYsICAgIDExLCAgICAxMiwgICAxMTcsICAgICAyLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwKLSAgICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgIDIzNiwgICAyMzcsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LAotICAgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAxMTIsICAgMTEzLCAgIDExNCwgICAxMTUsCi0gICAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAyMDQsICAgMTQ4LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwKLSAgICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LAotICAgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksCi0gICAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwKLSAgICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LAotICAgICAxMDAsICAgIC0xLCAgICAtMSwgICAxMDMsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTA3LCAgICAtMSwgICAgMTEsCi0gICAgICAxMiwgICAgLTEsICAgMTEyLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKLSAgICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLAotICAgICAgMzIsICAgIDMzLCAgICAtMSwgICAgLTEsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsCi0gICAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwKLSAgICAgIDUyLCAgICA1MywgICAgLTEsICAgIC0xLCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLAotICAgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsCi0gICAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwKLSAgICAgIDgyLCAgICA4MywgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLAotICAgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAgLTEsCi0gICAgICAtMSwgICAxMDMsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTA3LCAgICAtMSwgICAgMTEsICAgIDEyLCAgICAtMSwKLSAgICAgMTEyLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLAotICAgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsCi0gICAgICAtMSwgICAgLTEsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKLSAgICAgIDQ0LCAgICA0NSwgICAgIDUsICAgIC0xLCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgLTEsICAgIC0xLAotICAgICAgLTEsICAgIC0xLCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsCisgICAgICAyNSwgICAgIDAsICAgICAwLCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwKKyAgICAgIDMzLCAgICAzNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgIDM1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKKyAgICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLAorICAgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsCiAgICAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKICAgICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLAorICAgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgODgsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICA4OSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDkwLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzUsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksCisgICAgICA0MCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwKKyAgICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgMTQ2LAorICAgICAxNDcsICAgMTQ4LCAgIDE0OSwgICAxNTAsICAgICAwLCAgIDE1MSwgICAxNTIsICAgICAwLCAgICAgMCwgICAxNTMsCisgICAgIDE1NCwgICAgIDAsICAgICAwLCAgICA3MywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgMTU1LCAgIDE1NiwgICAgIDAsICAgIDg5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTAsCisgICAgICAgMCwgICAgIDAsICAgMTU3LCAgIDE1OCwgICAxNTksICAgMTYwLCAgIDE2MSwgICAxNjIsICAgMTYzLCAgIDE2NCwKKyAgICAgMTY1Cit9OworCisjZGVmaW5lIHl5cGFjdF92YWx1ZV9pc19kZWZhdWx0KHl5c3RhdGUpIFwKKyAgKCh5eXN0YXRlKSA9PSAoLTIwOCkpCisKKyNkZWZpbmUgeXl0YWJsZV92YWx1ZV9pc19lcnJvcih5eXRhYmxlX3ZhbHVlKSBcCisgIFlZSUQgKDApCisKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXljaGVja1tdID0KK3sKKyAgICAgICAyLCAgICA5NSwgICAgIDgsICAgMTg4LCAgICAgMCwgICAgNDEsICAgIDQyLCAgICAgMiwgICAgNDQsICAgICAyLAorICAgICAgOTIsICAgIDM3LCAgICAgMCwgICAgNjQsICAgIDY1LCAgIDEwNiwgICAyMjMsICAgMTA4LCAgICA5MywgICAgMzcsCisgICAgICAgMCwgICAxOTQsICAgMTQ0LCAgICAzNywgICAgMzcsICAgMTE4LCAgIDExOSwgICAgMzcsICAgICA1LCAgICAzNywKKyAgICAgICA3LCAgICA1OSwgICAgIDksICAgIDEwLCAgICAzNywgICAxMjgsICAgMTMwLCAgIDEzMSwgICAgMzcsICAgIDQxLAorICAgICAgNDIsICAgIDU5LCAgICA0NCwgICAyNTAsICAgIDU5LCAgICA1OSwgICAgNTksICAgMjU0LCAgIDEzMCwgICAxMzEsCisgICAgIDEyNSwgICAgNTksICAgMTIxLCAgIDEyMiwgICAxMTgsICAgMTE5LCAgICAzNywgICAgOTMsICAgMTE5LCAgICA5NSwKKyAgICAgMTE5LCAgIDEzMCwgICAxMzEsICAgMTMyLCAgIDEyOCwgICAgODksICAgMTA2LCAgIDEyOCwgICAxMDgsICAgMTI4LAorICAgICAxMjEsICAgMTIyLCAgIDEyMywgICAxMjQsICAgMTI1LCAgIDEyNiwgICAxMTgsICAgMTE5LCAgICA1OSwgICAgNjAsCisgICAgICA2MSwgICAgNjIsICAgIDYzLCAgIDEzNCwgICAxMzUsICAgMTIxLCAgICAzNywgICAyMDksICAgMjczLCAgIDEyNSwKKyAgICAgIDkyLCAgICA5MywgICAgMzcsICAgIDk1LCAgIDEzMCwgICAxMzEsICAgIDM3LCAgICA5MiwgICAgOTMsICAgIDkyLAorICAgICAgOTMsICAgMTI1LCAgIDI3NSwgICAxMjksICAgMTA2LCAgICAzNywgICAxMDgsICAgMTQzLCAgIDE0NCwgICAxMTgsCisgICAgIDExOSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAxMzMsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDM3LCAgIDEyMSwKKyAgICAgMTI2LCAgICA1OSwgICAxMTgsICAgMTE5LCAgIDExOCwgICAxMTksICAgMjA4LCAgIDEyOCwgICAxMzAsICAgMTMxLAorICAgICAxMTgsICAgMTE5LCAgIDEyOCwgICAgNTksICAgMjA5LCAgIDEzMCwgICAxMzEsICAgMTMwLCAgIDEzMSwgICAxMjAsCisgICAgIDEyOCwgICAxNDMsICAgMTQ0LCAgICA2NCwgICAgNjUsICAgMTMzLCAgIDE3MCwgICAgNjEsICAgMTI5LCAgIDEyOCwKKyAgICAgMTc0LCAgIDE3NSwgICAxNzYsICAgMTc3LCAgIDE3OCwgICAxNzksICAgMTgwLCAgIDE4MSwgICAxMjUsICAgMTI2LAorICAgICAxMjYsICAgMTg1LCAgIDE4NiwgICAgNjQsICAgIDY1LCAgIDEyMywgICAxMjQsICAgMTI1LCAgIDEyNiwgICAyNjMsCisgICAgIDI2NCwgICAgMzcsICAgMjA4LCAgIDIwOSwgICAgNjQsICAgIDY1LCAgICAzNywgICAgMzcsICAgIDM3LCAgICAzNywKKyAgICAgIDM3LCAgICAzNywgICAgMzcsICAgICA0LCAgIDEyOSwgICAxMzAsICAgMTMxLCAgIDEzMiwgICAxMjksICAgMTMwLAorICAgICAxMzEsICAgMTMyLCAgIDEyOCwgICAgIDQsICAgICAzLCAgICAgMywgICAgNDcsICAgIDM3LCAgICAgMiwgICAxMzQsCisgICAgIDEyMSwgICAxMjIsICAgMTIzLCAgIDEyNCwgICAxMjUsICAgMTI2LCAgIDIwOCwgICAyMDksICAgIC0xLCAgICA1NiwKKyAgICAgIDU3LCAgICA1OCwgICAyMjMsICAgMjA4LCAgIDIwOSwgICAyMDgsICAgMjA5LCAgICA2NCwgICAgNjUsICAgMTY2LAorICAgICAgLTEsICAgMTIyLCAgIDEyMywgICAxMjQsICAgMTI1LCAgIDEyNiwgICAgIDAsICAgMjYzLCAgIDI2NCwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgIDEyMywgICAxMjQsICAgMTI1LCAgIDEyNiwgICAgMTEsICAgIDEyLCAgICAtMSwKKyAgICAgIC0xLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLAorICAgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsCisgICAgICAzNCwgICAyNjMsICAgMjY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKKyAgICAgIDQ0LCAgICA0NSwgICAgLTEsICAgIC0xLCAgIDEyMSwgICAxMjIsICAgMTIzLCAgIDEyNCwgICAxMjUsICAgMTI2LAorICAgICAgLTEsICAgIDU1LCAgICAtMSwgICAxMzAsICAgMTMxLCAgIDEzMiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKKyAgICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLAogICAgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsCi0gICAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAgLTEsICAgIC0xLCAgIDEwMywKLSAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTA3LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxMTIsICAgIDE2LAotICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsCi0gICAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgLTEsICAgIC0xLCAgICAzNiwKLSAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICAtMSwgICAgNDUsICAgIC0xLAotICAgICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTYsCi0gICAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY1LCAgICA2NiwKLSAgICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LAotICAgICAgNzcsICAgIDc4LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA5MywgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAgIC0xLCAgICAtMSwgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAgLTEsICAgIC0xLAotICAgICAxMDcsICAgMTEzLCAgIDExNCwgICAxMTUsICAgIC0xLCAgIDExMgorICAgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsCisgICAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDEwNywgICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgIDExMywKKyAgICAgMTE0LCAgIDExNSwgICAxMTYsICAgMTE3LCAgICAtMSwgICAgLTEsICAgMTIwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAxMjQsICAgIC0xLCAgICAxMSwgICAgMTIsICAgIC0xLCAgIDEyOSwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwKKyAgICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsICAgIC0xLCAgICAtMSwgICAgMzcsICAgIDM4LAorICAgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1NSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgLTEsICAgIC0xLCAgICA2NiwgICAgNjcsICAgIDY4LAorICAgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICA3NywgICAgNzgsCisgICAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA4OCwKKyAgICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LAorICAgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDEwNywgICAxMDgsCisgICAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LCAgIDExNSwgICAxMTYsICAgMTE3LCAgICAtMSwKKyAgICAgIC0xLCAgIDEyMCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxMjQsICAgIC0xLCAgICAxMSwgICAgMTIsICAgIC0xLAorICAgICAxMjksICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsCisgICAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywKKyAgICAgIDM0LCAgICAtMSwgICAgLTEsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLAorICAgICAgNDQsICAgIDQ1LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgNTUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAorICAgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsCisgICAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywKKyAgICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLAorICAgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxMTMsCisgICAgIDExNCwgICAxMTUsICAgMTE2LCAgIDExNywgICAgLTEsICAgIC0xLCAgIDEyMCwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgMTI0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxMjksICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksCisgICAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsICAgIC0xLCAgICAtMSwgICAgMzcsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1NSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwKKyAgICAgIDcwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNzUsICAgIDc2LCAgICA3NywgICAgNzgsICAgIDc5LAorICAgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA4OCwgICAgIDMsCisgICAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgLTEsICAgIC0xLCAgICAxMywKKyAgICAgIDE0LCAgICAtMSwgICAgLTEsICAgMTAzLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgMzUsICAgIDM2LCAgICAtMSwgICAxMjQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDEyOSwKKyAgICAgIC0xLCAgICAtMSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLAorICAgICAgNTQKIH07CiAKIC8qIFlZU1RPU1tTVEFURS1OVU1dIC0tIFRoZSAoaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSkgYWNjZXNzaW5nCiAgICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5c3Rvc1tdID0KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlzdG9zW10gPQogewotICAgICAgIDAsICAgMTIwLCAgIDEyMSwgICAgIDAsICAgIDExLCAgICAxMiwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCisgICAgICAgMCwgICAxMzcsICAgMTM4LCAgICAgMCwgICAgMTEsICAgIDEyLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwKICAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LAotICAgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLAotICAgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgICA4MSwgICAgODIsICAgIDgzLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwKLSAgICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLAotICAgICAxMDMsICAgMTA3LCAgIDExMiwgICAxMjIsICAgMTI3LCAgIDEyOCwgICAxMzEsICAgMTMyLCAgIDEzMywgICAxMzQsCi0gICAgIDEzOCwgICAxMzksICAgMTQwLCAgIDE0NSwgICAxNDYsICAgMTQ4LCAgIDE0OSwgICAxNTAsICAgMTUxLCAgIDE1NSwKLSAgICAgMTU2LCAgICAzNiwgICAgMzYsICAgIDM2LCAgICA0OSwgICAgNDksICAgIDM2LCAgICAzNiwgICAgMzYsICAgIDQ5LAotICAgICAxNDEsICAgIDQ5LCAgIDE0MiwgICAxMjgsICAgMTQ4LCAgIDE0OCwgICAxMjgsICAgMTM4LCAgIDE0NSwgICAxMDEsCi0gICAgIDEwMiwgICAxMjMsICAgMTI0LCAgIDEzMSwgICAxMjIsICAgMTQ2LCAgIDE0OCwgICAgNDksICAgIDUwLCAgICA1MSwKLSAgICAgIDUyLCAgICA1MywgICAxMjUsICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTQ4LCAgICAgMywgICAgIDQsICAgICA1LAotICAgICAgIDYsICAgICA3LCAgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNCwgICAgMzQsICAgIDM1LCAgIDEzNSwgICAxMzYsCi0gICAgIDEzNywgICAxMTYsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDU0LCAgICA1NSwgICAxMDQsICAgMTA1LCAgIDEwNiwKLSAgICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEzLCAgIDExNCwgICAxMTUsICAgMTQzLCAgIDE0NCwgICAgMzYsICAgMTI4LAotICAgICAxNDMsICAgMTQ0LCAgIDE1MiwgICAxNTMsICAgIDM2LCAgIDEyOCwgICAxNDMsICAgMTQ0LCAgIDE1NywgICAxNTgsCi0gICAgIDEwNCwgICAxMDUsICAgMTEzLCAgIDExNCwgICAxMTUsICAgMTQ3LCAgIDE0OCwgICAxNDUsICAgMTI1LCAgIDEyNywKLSAgICAgMTI4LCAgIDEzMSwgICAxNDgsICAgMTI1LCAgIDEzMSwgICAxMTEsICAgMTExLCAgIDExMSwgICAgIDgsICAgMTA5LAotICAgICAxMDksICAgMTI1LCAgIDEyNiwgICAxMjksICAgMTMwLCAgIDE0OCwgICAxMDEsICAgMTAyLCAgIDEwMSwgICAxMDIsCi0gICAgIDEzNiwgICAxNDUsICAgMTQ1LCAgIDE0NSwgICAxNDUsICAgMTQ1LCAgIDE0NSwgICAxNDUsICAgMTQ1LCAgIDE0NSwKLSAgICAgMTQ1LCAgIDE0NSwgICAxNTMsICAgMTU0LCAgICAzNiwgICAgMzYsICAgMTU4LCAgIDE1OSwgICAgMzYsICAgIDM2LAotICAgICAgMzYsICAgMTQ4LCAgICA1MSwgICAgMzYsICAgIDM2LCAgIDExMSwgICAxMjMsICAgMTI0LCAgICAgNCwgICAgIDQsCi0gICAgICAgMywgICAgIDMsICAgMTE3LCAgIDExOCwgICAxMTEsICAgMTI0LCAgIDExMSwgICAxMjQsICAgMTI1LCAgIDEyNSwKLSAgICAgIDM2LCAgIDE1MywgICAxNTgsICAgMTE3CisgICAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKKyAgICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNTUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LAorICAgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksCisgICAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwKKyAgICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LAorICAgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTA3LCAgIDEwOCwgICAxMDksCisgICAgIDExMCwgICAxMTEsICAgMTEyLCAgIDExMywgICAxMTQsICAgMTE1LCAgIDExNiwgICAxMTcsICAgMTIwLCAgIDEyNCwKKyAgICAgMTI5LCAgIDEzOSwgICAxNDQsICAgMTQ1LCAgIDE0OCwgICAxNDksICAgMTUwLCAgIDE1MSwgICAxNTUsICAgMTU2LAorICAgICAxNTcsICAgMTY3LCAgIDE2OCwgICAxNzAsICAgMTcxLCAgIDE3MiwgICAxNzMsICAgMTc3LCAgIDE3OCwgICAgMzcsCisgICAgICAzNywgICAgMzcsICAgIDU5LCAgICA1OSwgICAgMzcsICAgIDM3LCAgICAzNywgICAgNTksICAgMTYzLCAgICA1OSwKKyAgICAgMTY0LCAgIDE0NSwgICAxNzAsICAgMTcwLCAgIDE3MCwgICAxNDUsICAgMTU1LCAgIDE2NywgICAxMTgsICAgMTE5LAorICAgICAxNDAsICAgMTQxLCAgIDE0OCwgICAxMzksICAgMTY4LCAgIDE3MCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsCisgICAgICA2MywgICAxNDIsICAgMTQzLCAgIDE0NCwgICAxNDUsICAgMTcwLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwKKyAgICAgICA3LCAgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNCwgICAgMzUsICAgIDM2LCAgICA0NiwgICAgNDcsICAgIDQ4LAorICAgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAxNTIsICAgMTUzLCAgIDE1NCwgICAxNTgsCisgICAgIDEzMywgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNjQsICAgIDY1LCAgIDEyMSwgICAxMjIsICAgMTIzLCAgIDEyNCwKKyAgICAgMTI1LCAgIDEyNiwgICAxMzAsICAgMTMxLCAgIDEzMiwgICAxNjUsICAgMTY2LCAgICAzNywgICAxNDUsICAgMTY1LAorICAgICAxNjYsICAgMTc0LCAgIDE3NSwgICAgMzcsICAgMTQ1LCAgIDE2NSwgICAxNjYsICAgMTc5LCAgIDE4MCwgICAxMjEsCisgICAgIDEyMiwgICAxMzAsICAgMTMxLCAgIDEzMiwgICAxNjksICAgMTcwLCAgIDE2NywgICAxNDIsICAgMTQ0LCAgIDE0NSwKKyAgICAgMTQ4LCAgIDE3MCwgICAxNDIsICAgMTQ4LCAgIDEyOCwgICAxMjgsICAgMTI4LCAgICAgOCwgICAxMjYsICAgMTI2LAorICAgICAxNDIsICAgMTQzLCAgIDE0NiwgICAxNDcsICAgMTcwLCAgIDExOCwgICAxMTksICAgMTE4LCAgIDExOSwgICAgMzcsCisgICAgICA1OSwgICAxNTksICAgIDU5LCAgIDE2MSwgICAgMzcsICAgIDU5LCAgIDE2MiwgICAxNTMsICAgMTY3LCAgIDE2NywKKyAgICAgMTY3LCAgIDE2NywgICAxNjcsICAgMTY3LCAgIDE2NywgICAxNjcsICAgMTY3LCAgIDE2NywgICAxNjcsICAgMTc1LAorICAgICAxNzYsICAgIDM3LCAgICAzNywgICAxODAsICAgMTgxLCAgICAzNywgICAgMzcsICAgIDM3LCAgIDE3MCwgICAgNjEsCisgICAgICAzNywgICAgMzcsICAgMTI4LCAgIDE0MCwgICAxNDEsICAgICA0LCAgICAgNCwgICAgIDMsICAgICAzLCAgICA0NywKKyAgICAgMTM0LCAgIDEzNSwgICAxMjgsICAgMTQxLCAgIDEyOCwgICAxNDEsICAgMTQyLCAgIDE0MiwgICAgMzcsICAgIDU5LAorICAgICAxNjAsICAgIDM3LCAgIDE3NSwgICAxODAsICAgMTM0CiB9OwogCiAjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCkBAIC0xMTM1LDkgKzE0MjcsMTggQEAKIAogLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQogICAgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KLSAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgSG93ZXZlciwKKyAgIFlZRkFJTCBhcHBlYXJzIHRvIGJlIGluIHVzZS4gIE5ldmVydGhlbGVzcywgaXQgaXMgZm9ybWFsbHkgZGVwcmVjYXRlZAorICAgaW4gQmlzb24gMi40LjIncyBORVdTIGVudHJ5LCB3aGVyZSBhIHBsYW4gdG8gcGhhc2UgaXQgb3V0IGlzCisgICBkaXNjdXNzZWQuICAqLwogCiAjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorI2lmIGRlZmluZWQgWVlGQUlMCisgIC8qIFRoaXMgaXMgaGVyZSB0byBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIHRoZSBHQ0MgY3BwJ3MKKyAgICAgLVd1bnVzZWQtbWFjcm9zLiAgTm9ybWFsbHkgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhhdCB3YXJuaW5nLCBidXQKKyAgICAgc29tZSB1c2VycyBkbywgYW5kIHdlIHdhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciB1c2VycyB0byByZW1vdmUKKyAgICAgWVlGQUlMIHVzZXMsIHdoaWNoIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyBmcm9tIEJpc29uIDIuNS4gICovCisjZW5kaWYKIAogI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCiAKQEAgLTExNDcsOCArMTQ0OCw3IEBACiAgICAgewkJCQkJCQkJXAogICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCiAgICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKLSAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCisgICAgICBZWVBPUFNUQUNLICgxKTsJCQkJCQlcCiAgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKICAgICB9CQkJCQkJCQlcCiAgIGVsc2UJCQkJCQkJCVwKQEAgLTExNTYsNyArMTQ1Niw3IEBACiAgICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKICAgICAgIFlZRVJST1I7CQkJCQkJCVwKICAgICB9CQkJCQkJCQlcCi13aGlsZSAoMCkKK3doaWxlIChZWUlEICgwKSkKIAogCiAjZGVmaW5lIFlZVEVSUk9SCTEKQEAgLTExNzEsNyArMTQ3MSw3IEBACiAjaWZuZGVmIFlZTExPQ19ERUZBVUxUCiAjIGRlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pCQkJCVwKICAgICBkbwkJCQkJCQkJCVwKLSAgICAgIGlmIChOKQkJCQkJCQkJXAorICAgICAgaWYgKFlZSUQgKE4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJewkJCQkJCQkJXAogCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKIAkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKQEAgLTExODUsMjMgKzE0ODUsMTQgQEAKIAkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPQkJXAogCSAgICBZWVJIU0xPQyAoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCQkJXAogCX0JCQkJCQkJCVwKLSAgICB3aGlsZSAoMCkKKyAgICB3aGlsZSAoWVlJRCAoMCkpCiAjZW5kaWYKIAogCi0vKiBZWV9MT0NBVElPTl9QUklOVCAtLSBQcmludCB0aGUgbG9jYXRpb24gb24gdGhlIHN0cmVhbS4KLSAgIFRoaXMgbWFjcm8gd2FzIG5vdCBtYW5kYXRlZCBvcmlnaW5hbGx5OiBkZWZpbmUgb25seSBpZiB3ZSBrbm93Ci0gICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCisvKiBUaGlzIG1hY3JvIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqLwogCiAjaWZuZGVmIFlZX0xPQ0FUSU9OX1BSSU5UCi0jIGlmIFlZTFRZUEVfSVNfVFJJVklBTAotIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykJCQlcCi0gICAgIGZwcmludGYgKEZpbGUsICIlZC4lZC0lZC4lZCIsCQkJXAotICAgICAgICAgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKLSAgICAgICAgICAgICAgKExvYykubGFzdF9saW5lLCAgKExvYykubGFzdF9jb2x1bW4pCi0jIGVsc2UKLSMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpICgodm9pZCkgMCkKLSMgZW5kaWYKKyMgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQogI2VuZGlmCiAKIApAQCAtMTIyNSwzNyArMTUxNiwxMDAgQEAKIGRvIHsJCQkJCQlcCiAgIGlmICh5eWRlYnVnKQkJCQkJXAogICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCi19IHdoaWxlICgwKQorfSB3aGlsZSAoWVlJRCAoMCkpCiAKLSMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJXAotZG8gewkJCQkJCQkJXAotICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAotICAgIHsJCQkJCQkJCVwKLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQlcCi0gICAgICB5eXN5bXByaW50IChzdGRlcnIsCQkJCQlcCi0gICAgICAgICAgICAgICAgICBUeXBlLCBWYWx1ZSk7CVwKLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsJCQkJCVwKLSAgICB9CQkJCQkJCQlcCi19IHdoaWxlICgwKQorIyBkZWZpbmUgWVlfU1lNQk9MX1BSSU5UKFRpdGxlLCBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pCQkJICBcCitkbyB7CQkJCQkJCQkJICBcCisgIGlmICh5eWRlYnVnKQkJCQkJCQkJICBcCisgICAgewkJCQkJCQkJCSAgXAorICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIlcyAiLCBUaXRsZSk7CQkJCQkgIFwKKyAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLAkJCQkJCSAgXAorCQkgIFR5cGUsIFZhbHVlKTsgXAorICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJCSAgXAorICAgIH0JCQkJCQkJCQkgIFwKK30gd2hpbGUgKFlZSUQgKDApKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFByaW50IHRoaXMgc3ltYm9sIG9uIFlZT1VUUFVULiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypBUkdTVVNFRCovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBGSUxFICp5eW91dHB1dDsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKKyNlbmRpZgoreworICBpZiAoIXl5dmFsdWVwKQorICAgIHJldHVybjsKKyMgaWZkZWYgWVlQUklOVAorICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQorICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOworIyBlbHNlCisgIFlZVVNFICh5eW91dHB1dCk7CisjIGVuZGlmCisgIHN3aXRjaCAoeXl0eXBlKQorICAgIHsKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFByaW50IHRoaXMgc3ltYm9sIG9uIFlZT1VUUFVULiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB2b2lkCit5eV9zeW1ib2xfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCisgICAgRklMRSAqeXlvdXRwdXQ7CisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXA7CisjZW5kaWYKK3sKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAidG9rZW4gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7CisgIGVsc2UKKyAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAibnRlcm0gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7CisKKyAgeXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCk7CisgIFlZRlBSSU5URiAoeXlvdXRwdXQsICIpIik7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgogfCB5eV9zdGFja19wcmludCAtLSBQcmludCB0aGUgc3RhdGUgc3RhY2sgZnJvbSBpdHMgQk9UVE9NIHVwIHRvIGl0cyB8CiB8IFRPUCAoaW5jbHVkZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCi15eV9zdGFja19wcmludCAoc2hvcnQgaW50ICpib3R0b20sIHNob3J0IGludCAqdG9wKQoreXlfc3RhY2tfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlib3R0b20sIHl5dHlwZV9pbnQxNiAqeXl0b3ApCiAjZWxzZQogc3RhdGljIHZvaWQKLXl5X3N0YWNrX3ByaW50IChib3R0b20sIHRvcCkKLSAgICBzaG9ydCBpbnQgKmJvdHRvbTsKLSAgICBzaG9ydCBpbnQgKnRvcDsKK3l5X3N0YWNrX3ByaW50ICh5eWJvdHRvbSwgeXl0b3ApCisgICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKKyAgICB5eXR5cGVfaW50MTYgKnl5dG9wOwogI2VuZGlmCiB7CiAgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7Ci0gIGZvciAoLyogTm90aGluZy4gKi87IGJvdHRvbSA8PSB0b3A7ICsrYm90dG9tKQotICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKmJvdHRvbSk7CisgIGZvciAoOyB5eWJvdHRvbSA8PSB5eXRvcDsgeXlib3R0b20rKykKKyAgICB7CisgICAgICBpbnQgeXlib3QgPSAqeXlib3R0b207CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsIHl5Ym90KTsKKyAgICB9CiAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKIH0KIApAQCAtMTI2MywzNyArMTYxNyw0NSBAQAogZG8gewkJCQkJCQkJXAogICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAogICAgIHl5X3N0YWNrX3ByaW50ICgoQm90dG9tKSwgKFRvcCkpOwkJCQlcCi19IHdoaWxlICgwKQorfSB3aGlsZSAoWVlJRCAoMCkpCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCiB8IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCi15eV9yZWR1Y2VfcHJpbnQgKGludCB5eXJ1bGUpCit5eV9yZWR1Y2VfcHJpbnQgKFlZU1RZUEUgKnl5dnNwLCBpbnQgeXlydWxlKQogI2Vsc2UKIHN0YXRpYyB2b2lkCi15eV9yZWR1Y2VfcHJpbnQgKHl5cnVsZSkKK3l5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSkKKyAgICBZWVNUWVBFICp5eXZzcDsKICAgICBpbnQgeXlydWxlOwogI2VuZGlmCiB7CisgIGludCB5eW5yaHMgPSB5eXIyW3l5cnVsZV07CiAgIGludCB5eWk7CiAgIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOwotICBZWUZQUklOVEYgKHN0ZGVyciwgIlJlZHVjaW5nIHN0YWNrIGJ5IHJ1bGUgJWQgKGxpbmUgJWx1KSwgIiwKLSAgICAgICAgICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7Ci0gIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLwotICBmb3IgKHl5aSA9IHl5cHJoc1t5eXJ1bGVdOyAwIDw9IHl5cmhzW3l5aV07IHl5aSsrKQotICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1t5eWldXSk7Ci0gIFlZRlBSSU5URiAoc3RkZXJyLCAiLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eXJ1bGVdXSk7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAlbHUpOlxuIiwKKwkgICAgIHl5cnVsZSAtIDEsIHl5bG5vKTsKKyAgLyogVGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZC4gICovCisgIGZvciAoeXlpID0gMDsgeXlpIDwgeXlucmhzOyB5eWkrKykKKyAgICB7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAgICQlZCA9ICIsIHl5aSArIDEpOworICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsIHl5cmhzW3l5cHJoc1t5eXJ1bGVdICsgeXlpXSwKKwkJICAgICAgICYoeXl2c3BbKHl5aSArIDEpIC0gKHl5bnJocyldKQorCQkgICAgICAgCQkgICAgICAgKTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CiB9CiAKICMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQkJXAogZG8gewkJCQkJXAogICBpZiAoeXlkZWJ1ZykJCQkJXAotICAgIHl5X3JlZHVjZV9wcmludCAoUnVsZSk7CQlcCi19IHdoaWxlICgwKQorICAgIHl5X3JlZHVjZV9wcmludCAoeXl2c3AsIFJ1bGUpOyBcCit9IHdoaWxlIChZWUlEICgwKSkKIAogLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CiAgICBtdWx0aXBsZSBwYXJzZXJzIGNhbiBjb2V4aXN0LiAgKi8KQEAgLTEzMjIsNDcgKzE2ODQsNDggQEAKICMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKICNlbmRpZgogCi0MCiAKICNpZiBZWUVSUk9SX1ZFUkJPU0UKIAogIyBpZm5kZWYgeXlzdHJsZW4KLSMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKQorIyAgaWYgZGVmaW5lZCBfX0dMSUJDX18gJiYgZGVmaW5lZCBfU1RSSU5HX0gKICMgICBkZWZpbmUgeXlzdHJsZW4gc3RybGVuCiAjICBlbHNlCiAvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBZWVNUUi4gICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIFlZU0laRV9UCi0jICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQogeXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQotIyAgIGVsc2UKKyNlbHNlCitzdGF0aWMgWVlTSVpFX1QKIHl5c3RybGVuICh5eXN0cikKLSAgICAgY29uc3QgY2hhciAqeXlzdHI7Ci0jICAgZW5kaWYKKyAgICBjb25zdCBjaGFyICp5eXN0cjsKKyNlbmRpZgogewotICBjb25zdCBjaGFyICp5eXMgPSB5eXN0cjsKLQotICB3aGlsZSAoKnl5cysrICE9ICdcMCcpCisgIFlZU0laRV9UIHl5bGVuOworICBmb3IgKHl5bGVuID0gMDsgeXlzdHJbeXlsZW5dOyB5eWxlbisrKQogICAgIGNvbnRpbnVlOwotCi0gIHJldHVybiB5eXMgLSB5eXN0ciAtIDE7CisgIHJldHVybiB5eWxlbjsKIH0KICMgIGVuZGlmCiAjIGVuZGlmCiAKICMgaWZuZGVmIHl5c3RwY3B5Ci0jICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkgJiYgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpCisjICBpZiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBkZWZpbmVkIF9TVFJJTkdfSCAmJiBkZWZpbmVkIF9HTlVfU09VUkNFCiAjICAgZGVmaW5lIHl5c3RwY3B5IHN0cGNweQogIyAgZWxzZQogLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgogICAgWVlERVNULiAgKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgY2hhciAqCi0jICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQogeXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCi0jICAgZWxzZQorI2Vsc2UKK3N0YXRpYyBjaGFyICoKIHl5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQotICAgICBjaGFyICp5eWRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnl5c3JjOwotIyAgIGVuZGlmCisgICAgY2hhciAqeXlkZXN0OworICAgIGNvbnN0IGNoYXIgKnl5c3JjOworI2VuZGlmCiB7CiAgIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKICAgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CkBAIC0xMzg4LDcgKzE3NTEsNyBAQAogewogICBpZiAoKnl5c3RyID09ICciJykKICAgICB7Ci0gICAgICBzaXplX3QgeXluID0gMDsKKyAgICAgIFlZU0laRV9UIHl5biA9IDA7CiAgICAgICBjaGFyIGNvbnN0ICp5eXAgPSB5eXN0cjsKIAogICAgICAgZm9yICg7OykKQEAgLTE0MjMsNTMgKzE3ODYsMTUwIEBACiB9CiAjIGVuZGlmCiAKKy8qIENvcHkgaW50byAqWVlNU0csIHdoaWNoIGlzIG9mIHNpemUgKllZTVNHX0FMTE9DLCBhbiBlcnJvciBtZXNzYWdlCisgICBhYm91dCB0aGUgdW5leHBlY3RlZCB0b2tlbiBZWVRPS0VOIGZvciB0aGUgc3RhdGUgc3RhY2sgd2hvc2UgdG9wIGlzCisgICBZWVNTUC4KKworICAgUmV0dXJuIDAgaWYgKllZTVNHIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbi4gIFJldHVybiAxIGlmICpZWU1TRyBpcworICAgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBtZXNzYWdlLiAgSW4gdGhhdCBjYXNlLCBhbHNvIHNldAorICAgKllZTVNHX0FMTE9DIHRvIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMuICBSZXR1cm4gMiBpZiB0aGUKKyAgIHJlcXVpcmVkIG51bWJlciBvZiBieXRlcyBpcyB0b28gbGFyZ2UgdG8gc3RvcmUuICAqLworc3RhdGljIGludAoreXlzeW50YXhfZXJyb3IgKFlZU0laRV9UICp5eW1zZ19hbGxvYywgY2hhciAqKnl5bXNnLAorICAgICAgICAgICAgICAgIHl5dHlwZV9pbnQxNiAqeXlzc3AsIGludCB5eXRva2VuKQoreworICBZWVNJWkVfVCB5eXNpemUwID0geXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5dG9rZW5dKTsKKyAgWVlTSVpFX1QgeXlzaXplID0geXlzaXplMDsKKyAgWVlTSVpFX1QgeXlzaXplMTsKKyAgZW51bSB7IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gPSA1IH07CisgIC8qIEludGVybmF0aW9uYWxpemVkIGZvcm1hdCBzdHJpbmcuICovCisgIGNvbnN0IGNoYXIgKnl5Zm9ybWF0ID0gMDsKKyAgLyogQXJndW1lbnRzIG9mIHl5Zm9ybWF0LiAqLworICBjaGFyIGNvbnN0ICp5eWFyZ1tZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNXTsKKyAgLyogTnVtYmVyIG9mIHJlcG9ydGVkIHRva2VucyAob25lIGZvciB0aGUgInVuZXhwZWN0ZWQiLCBvbmUgcGVyCisgICAgICJleHBlY3RlZCIpLiAqLworICBpbnQgeXljb3VudCA9IDA7CisKKyAgLyogVGhlcmUgYXJlIG1hbnkgcG9zc2liaWxpdGllcyBoZXJlIHRvIGNvbnNpZGVyOgorICAgICAtIEFzc3VtZSBZWUZBSUwgaXMgbm90IHVzZWQuICBJdCdzIHRvbyBmbGF3ZWQgdG8gY29uc2lkZXIuICBTZWUKKyAgICAgICA8aHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2Jpc29uLXBhdGNoZXMvMjAwOS0xMi9tc2cwMDAyNC5odG1sPgorICAgICAgIGZvciBkZXRhaWxzLiAgWVlFUlJPUiBpcyBmaW5lIGFzIGl0IGRvZXMgbm90IGludm9rZSB0aGlzCisgICAgICAgZnVuY3Rpb24uCisgICAgIC0gSWYgdGhpcyBzdGF0ZSBpcyBhIGNvbnNpc3RlbnQgc3RhdGUgd2l0aCBhIGRlZmF1bHQgYWN0aW9uLCB0aGVuCisgICAgICAgdGhlIG9ubHkgd2F5IHRoaXMgZnVuY3Rpb24gd2FzIGludm9rZWQgaXMgaWYgdGhlIGRlZmF1bHQgYWN0aW9uCisgICAgICAgaXMgYW4gZXJyb3IgYWN0aW9uLiAgSW4gdGhhdCBjYXNlLCBkb24ndCBjaGVjayBmb3IgZXhwZWN0ZWQKKyAgICAgICB0b2tlbnMgYmVjYXVzZSB0aGVyZSBhcmUgbm9uZS4KKyAgICAgLSBUaGUgb25seSB3YXkgdGhlcmUgY2FuIGJlIG5vIGxvb2thaGVhZCBwcmVzZW50IChpbiB5eWNoYXIpIGlzIGlmCisgICAgICAgdGhpcyBzdGF0ZSBpcyBhIGNvbnNpc3RlbnQgc3RhdGUgd2l0aCBhIGRlZmF1bHQgYWN0aW9uLiAgVGh1cywKKyAgICAgICBkZXRlY3RpbmcgdGhlIGFic2VuY2Ugb2YgYSBsb29rYWhlYWQgaXMgc3VmZmljaWVudCB0byBkZXRlcm1pbmUKKyAgICAgICB0aGF0IHRoZXJlIGlzIG5vIHVuZXhwZWN0ZWQgb3IgZXhwZWN0ZWQgdG9rZW4gdG8gcmVwb3J0LiAgSW4gdGhhdAorICAgICAgIGNhc2UsIGp1c3QgcmVwb3J0IGEgc2ltcGxlICJzeW50YXggZXJyb3IiLgorICAgICAtIERvbid0IGFzc3VtZSB0aGVyZSBpc24ndCBhIGxvb2thaGVhZCBqdXN0IGJlY2F1c2UgdGhpcyBzdGF0ZSBpcyBhCisgICAgICAgY29uc2lzdGVudCBzdGF0ZSB3aXRoIGEgZGVmYXVsdCBhY3Rpb24uICBUaGVyZSBtaWdodCBoYXZlIGJlZW4gYQorICAgICAgIHByZXZpb3VzIGluY29uc2lzdGVudCBzdGF0ZSwgY29uc2lzdGVudCBzdGF0ZSB3aXRoIGEgbm9uLWRlZmF1bHQKKyAgICAgICBhY3Rpb24sIG9yIHVzZXIgc2VtYW50aWMgYWN0aW9uIHRoYXQgbWFuaXB1bGF0ZWQgeXljaGFyLgorICAgICAtIE9mIGNvdXJzZSwgdGhlIGV4cGVjdGVkIHRva2VuIGxpc3QgZGVwZW5kcyBvbiBzdGF0ZXMgdG8gaGF2ZQorICAgICAgIGNvcnJlY3QgbG9va2FoZWFkIGluZm9ybWF0aW9uLCBhbmQgaXQgZGVwZW5kcyBvbiB0aGUgcGFyc2VyIG5vdAorICAgICAgIHRvIHBlcmZvcm0gZXh0cmEgcmVkdWN0aW9ucyBhZnRlciBmZXRjaGluZyBhIGxvb2thaGVhZCBmcm9tIHRoZQorICAgICAgIHNjYW5uZXIgYW5kIGJlZm9yZSBkZXRlY3RpbmcgYSBzeW50YXggZXJyb3IuICBUaHVzLCBzdGF0ZSBtZXJnaW5nCisgICAgICAgKGZyb20gTEFMUiBvciBJRUxSKSBhbmQgZGVmYXVsdCByZWR1Y3Rpb25zIGNvcnJ1cHQgdGhlIGV4cGVjdGVkCisgICAgICAgdG9rZW4gbGlzdC4gIEhvd2V2ZXIsIHRoZSBsaXN0IGlzIGNvcnJlY3QgZm9yIGNhbm9uaWNhbCBMUiB3aXRoCisgICAgICAgb25lIGV4Y2VwdGlvbjogaXQgd2lsbCBzdGlsbCBjb250YWluIGFueSB0b2tlbiB0aGF0IHdpbGwgbm90IGJlCisgICAgICAgYWNjZXB0ZWQgZHVlIHRvIGFuIGVycm9yIGFjdGlvbiBpbiBhIGxhdGVyIHN0YXRlLgorICAqLworICBpZiAoeXl0b2tlbiAhPSBZWUVNUFRZKQorICAgIHsKKyAgICAgIGludCB5eW4gPSB5eXBhY3RbKnl5c3NwXTsKKyAgICAgIHl5YXJnW3l5Y291bnQrK10gPSB5eXRuYW1lW3l5dG9rZW5dOworICAgICAgaWYgKCF5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKyAgICAgICAgICAgICBZWUNIRUNLLiAgSW4gb3RoZXIgd29yZHMsIHNraXAgdGhlIGZpcnN0IC1ZWU4gYWN0aW9ucyBmb3IKKyAgICAgICAgICAgICB0aGlzIHN0YXRlIGJlY2F1c2UgdGhleSBhcmUgZGVmYXVsdCBhY3Rpb25zLiAgKi8KKyAgICAgICAgICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7CisgICAgICAgICAgLyogU3RheSB3aXRoaW4gYm91bmRzIG9mIGJvdGggeXljaGVjayBhbmQgeXl0bmFtZS4gICovCisgICAgICAgICAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW4gKyAxOworICAgICAgICAgIGludCB5eXhlbmQgPSB5eWNoZWNrbGltIDwgWVlOVE9LRU5TID8geXljaGVja2xpbSA6IFlZTlRPS0VOUzsKKyAgICAgICAgICBpbnQgeXl4OworCisgICAgICAgICAgZm9yICh5eXggPSB5eXhiZWdpbjsgeXl4IDwgeXl4ZW5kOyArK3l5eCkKKyAgICAgICAgICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUgorICAgICAgICAgICAgICAgICYmICF5eXRhYmxlX3ZhbHVlX2lzX2Vycm9yICh5eXRhYmxlW3l5eCArIHl5bl0pKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHl5Y291bnQgPT0gWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeXljb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHl5c2l6ZSA9IHl5c2l6ZTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHl5YXJnW3l5Y291bnQrK10gPSB5eXRuYW1lW3l5eF07CisgICAgICAgICAgICAgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKKyAgICAgICAgICAgICAgICBpZiAoISAoeXlzaXplIDw9IHl5c2l6ZTEKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgeXlzaXplMSA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgeXlzaXplID0geXlzaXplMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHN3aXRjaCAoeXljb3VudCkKKyAgICB7CisjIGRlZmluZSBZWUNBU0VfKE4sIFMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5eWZvcm1hdCA9IFM7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhaworICAgICAgWVlDQVNFXygwLCBZWV8oInN5bnRheCBlcnJvciIpKTsKKyAgICAgIFlZQ0FTRV8oMSwgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiKSk7CisgICAgICBZWUNBU0VfKDIsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMiKSk7CisgICAgICBZWUNBU0VfKDMsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMiKSk7CisgICAgICBZWUNBU0VfKDQsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMiKSk7CisgICAgICBZWUNBU0VfKDUsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMgb3IgJXMiKSk7CisjIHVuZGVmIFlZQ0FTRV8KKyAgICB9CisKKyAgeXlzaXplMSA9IHl5c2l6ZSArIHl5c3RybGVuICh5eWZvcm1hdCk7CisgIGlmICghICh5eXNpemUgPD0geXlzaXplMSAmJiB5eXNpemUxIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCisgICAgcmV0dXJuIDI7CisgIHl5c2l6ZSA9IHl5c2l6ZTE7CisKKyAgaWYgKCp5eW1zZ19hbGxvYyA8IHl5c2l6ZSkKKyAgICB7CisgICAgICAqeXltc2dfYWxsb2MgPSAyICogeXlzaXplOworICAgICAgaWYgKCEgKHl5c2l6ZSA8PSAqeXltc2dfYWxsb2MKKyAgICAgICAgICAgICAmJiAqeXltc2dfYWxsb2MgPD0gWVlTVEFDS19BTExPQ19NQVhJTVVNKSkKKyAgICAgICAgKnl5bXNnX2FsbG9jID0gWVlTVEFDS19BTExPQ19NQVhJTVVNOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIEF2b2lkIHNwcmludGYsIGFzIHRoYXQgaW5mcmluZ2VzIG9uIHRoZSB1c2VyJ3MgbmFtZSBzcGFjZS4KKyAgICAgRG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgZXZlbiBpZiB0aGUgdHJhbnNsYXRpb24KKyAgICAgcHJvZHVjZWQgYSBzdHJpbmcgd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mICIlcyJzLiAgKi8KKyAgeworICAgIGNoYXIgKnl5cCA9ICp5eW1zZzsKKyAgICBpbnQgeXlpID0gMDsKKyAgICB3aGlsZSAoKCp5eXAgPSAqeXlmb3JtYXQpICE9ICdcMCcpCisgICAgICBpZiAoKnl5cCA9PSAnJScgJiYgeXlmb3JtYXRbMV0gPT0gJ3MnICYmIHl5aSA8IHl5Y291bnQpCisgICAgICAgIHsKKyAgICAgICAgICB5eXAgKz0geXl0bmFtZXJyICh5eXAsIHl5YXJnW3l5aSsrXSk7CisgICAgICAgICAgeXlmb3JtYXQgKz0gMjsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgeXlwKys7CisgICAgICAgICAgeXlmb3JtYXQrKzsKKyAgICAgICAgfQorICB9CisgIHJldHVybiAwOworfQogI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLwogCi0MCi0KLSNpZiBZWURFQlVHCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi1zdGF0aWMgdm9pZAoteXlzeW1wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQotI2Vsc2UKLXN0YXRpYyB2b2lkCi15eXN5bXByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKLSAgICBGSUxFICp5eW91dHB1dDsKLSAgICBpbnQgeXl0eXBlOwotICAgIFlZU1RZUEUgKnl5dmFsdWVwOwotI2VuZGlmCi17Ci0gIC8qIFBhY2lmeSBgYHVudXNlZCB2YXJpYWJsZScnIHdhcm5pbmdzLiAgKi8KLSAgKHZvaWQpIHl5dmFsdWVwOwotCi0gIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCi0gICAgWVlGUFJJTlRGICh5eW91dHB1dCwgInRva2VuICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOwotICBlbHNlCi0gICAgWVlGUFJJTlRGICh5eW91dHB1dCwgIm50ZXJtICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOwotCi0KLSMgaWZkZWYgWVlQUklOVAotICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQotICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOwotIyBlbmRpZgotICBzd2l0Y2ggKHl5dHlwZSkKLSAgICB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIFlZRlBSSU5URiAoeXlvdXRwdXQsICIpIik7Ci19Ci0KLSNlbmRpZiAvKiAhIFlZREVCVUcgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCiB8IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAogYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKy8qQVJHU1VTRUQqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCiB5eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXApCiAjZWxzZQpAQCAtMTQ4MCw4ICsxOTQwLDcgQEAKICAgICBZWVNUWVBFICp5eXZhbHVlcDsKICNlbmRpZgogewotICAvKiBQYWNpZnkgYGB1bnVzZWQgdmFyaWFibGUnJyB3YXJuaW5ncy4gICovCi0gICh2b2lkKSB5eXZhbHVlcDsKKyAgWVlVU0UgKHl5dmFsdWVwKTsKIAogICBpZiAoIXl5bXNnKQogICAgIHl5bXNnID0gIkRlbGV0aW5nIjsKQEAgLTE0OTEsMjEgKzE5NTAsMjAgQEAKICAgICB7CiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworCWJyZWFrOwogICAgIH0KIH0KLQwKKwogCiAvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLwotCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQotIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCiBpbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7Ci0jIGVsc2UKKyNlbHNlCiBpbnQgeXlwYXJzZSAoKTsKLSMgZW5kaWYKKyNlbmRpZgogI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cwogaW50IHl5cGFyc2UgKHZvaWQpOwogI2Vsc2UKIGludCB5eXBhcnNlICgpOwpAQCAtMTUxMyw5NCArMTk3MSwxMDIgQEAKICNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KIAogCi0KLS8qIFRoZSBsb29rLWFoZWFkIHN5bWJvbC4gICovCisvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCiBpbnQgeXljaGFyOwogCi0vKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9va2FoZWFkIHN5bWJvbC4gICovCiBZWVNUWVBFIHl5bHZhbDsKIAogLyogTnVtYmVyIG9mIHN5bnRheCBlcnJvcnMgc28gZmFyLiAgKi8KIGludCB5eW5lcnJzOwogCiAKLQogLyotLS0tLS0tLS0tLgogfCB5eXBhcnNlLiAgfAogYC0tLS0tLS0tLS0qLwogCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQotIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi1pbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSkKLSMgZWxzZQotaW50IHl5cGFyc2UgKFlZUEFSU0VfUEFSQU0pCi0gIHZvaWQgKllZUEFSU0VfUEFSQU07Ci0jIGVuZGlmCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQoraW50Cit5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKQorI2Vsc2UKK2ludAoreXlwYXJzZSAoWVlQQVJTRV9QQVJBTSkKKyAgICB2b2lkICpZWVBBUlNFX1BBUkFNOworI2VuZGlmCiAjZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogaW50CiB5eXBhcnNlICh2b2lkKQogI2Vsc2UKIGludAogeXlwYXJzZSAoKQotICAgIDsKKwogI2VuZGlmCiAjZW5kaWYKIHsKLSAgCi0gIGludCB5eXN0YXRlOworICAgIGludCB5eXN0YXRlOworICAgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLworICAgIGludCB5eWVycnN0YXR1czsKKworICAgIC8qIFRoZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMuCisgICAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcy4KKworICAgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworCisgICAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgICB5eXR5cGVfaW50MTYgeXlzc2FbWVlJTklUREVQVEhdOworICAgIHl5dHlwZV9pbnQxNiAqeXlzczsKKyAgICB5eXR5cGVfaW50MTYgKnl5c3NwOworCisgICAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKyAgICBZWVNUWVBFICp5eXZzOworICAgIFlZU1RZUEUgKnl5dnNwOworCisgICAgWVlTSVpFX1QgeXlzdGFja3NpemU7CisKICAgaW50IHl5bjsKICAgaW50IHl5cmVzdWx0OwotICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KLSAgaW50IHl5ZXJyc3RhdHVzOwotICAvKiBMb29rLWFoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLwotICBpbnQgeXl0b2tlbiA9IDA7Ci0KLSAgLyogVGhyZWUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKLSAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcywKLSAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKLSAgICAgYHl5bHMnOiByZWxhdGVkIHRvIGxvY2F0aW9ucy4KLQotICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKLSAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCi0KLSAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KLSAgc2hvcnQgaW50IHl5c3NhW1lZSU5JVERFUFRIXTsKLSAgc2hvcnQgaW50ICp5eXNzID0geXlzc2E7Ci0gIHNob3J0IGludCAqeXlzc3A7Ci0KLSAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07Ci0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKLSAgWVlTVFlQRSAqeXl2c3A7Ci0KLQotCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKLQotICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOwotCisgIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKyAgaW50IHl5dG9rZW47CiAgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCiAgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCiAgIFlZU1RZUEUgeXl2YWw7CiAKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKyAgLyogQnVmZmVyIGZvciBlcnJvciBtZXNzYWdlcywgYW5kIGl0cyBhbGxvY2F0ZWQgc2l6ZS4gICovCisgIGNoYXIgeXltc2didWZbMTI4XTsKKyAgY2hhciAqeXltc2cgPSB5eW1zZ2J1ZjsKKyAgWVlTSVpFX1QgeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7CisjZW5kaWYKIAotICAvKiBXaGVuIHJlZHVjaW5nLCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZAotICAgICBydWxlLiAgKi8KLSAgaW50IHl5bGVuOworI2RlZmluZSBZWVBPUFNUQUNLKE4pICAgKHl5dnNwIC09IChOKSwgeXlzc3AgLT0gKE4pKQorCisgIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkIHJ1bGUuCisgICAgIEtlZXAgdG8gemVybyB3aGVuIG5vIHN5bWJvbCBzaG91bGQgYmUgcG9wcGVkLiAgKi8KKyAgaW50IHl5bGVuID0gMDsKKworICB5eXRva2VuID0gMDsKKyAgeXlzcyA9IHl5c3NhOworICB5eXZzID0geXl2c2E7CisgIHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7CiAKICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpKTsKIAogICB5eXN0YXRlID0gMDsKICAgeXllcnJzdGF0dXMgPSAwOwogICB5eW5lcnJzID0gMDsKLSAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisgIHl5Y2hhciA9IFlZRU1QVFk7IC8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCiAKICAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KICAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCiAgICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KICAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotCiAgIHl5c3NwID0geXlzczsKICAgeXl2c3AgPSB5eXZzOwogCkBAIC0xNjExLDggKzIwNzcsNyBAQAogYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgeXluZXdzdGF0ZToKICAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLSAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLgotICAgICAqLworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuICBTbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KICAgeXlzc3ArKzsKIAogIHl5c2V0c3RhdGU6CkBAIC0xNjI1LDEyICsyMDkwLDExIEBACiAKICNpZmRlZiB5eW92ZXJmbG93CiAgICAgICB7Ci0JLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiBVc2UgY29waWVzIG9mCisJLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiAgVXNlIGNvcGllcyBvZgogCSAgIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8KIAkgICBtZW1vcnkuICAqLwogCVlZU1RZUEUgKnl5dnMxID0geXl2czsKLQlzaG9ydCBpbnQgKnl5c3MxID0geXlzczsKLQorCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwogCiAJLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCiAJICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQpAQCAtMTYzOSw3ICsyMTAzLDYgQEAKIAl5eW92ZXJmbG93IChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSwKIAkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAogCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0KIAkJICAgICZ5eXN0YWNrc2l6ZSk7CiAKIAl5eXNzID0geXlzczE7CkBAIC0xNjU3LDE0ICsyMTIwLDEzIEBACiAJeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwogCiAgICAgICB7Ci0Jc2hvcnQgaW50ICp5eXNzMSA9IHl5c3M7CisJeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7CiAJdW5pb24geXlhbGxvYyAqeXlwdHIgPQogCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKIAlpZiAoISB5eXB0cikKIAkgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0JWVlTVEFDS19SRUxPQ0FURSAoeXlzcyk7Ci0JWVlTVEFDS19SRUxPQ0FURSAoeXl2cyk7Ci0KKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzX2FsbG9jLCB5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzX2FsbG9jLCB5eXZzKTsKICMgIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKIAlpZiAoeXlzczEgIT0geXlzc2EpCiAJICBZWVNUQUNLX0ZSRUUgKHl5c3MxKTsKQEAgLTE2NzUsNyArMjEzNyw2IEBACiAgICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOwogICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKIAotCiAgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCiAJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOwogCkBAIC0xNjg1LDYgKzIxNDYsOSBAQAogCiAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7CiAKKyAgaWYgKHl5c3RhdGUgPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKwogICBnb3RvIHl5YmFja3VwOwogCiAvKi0tLS0tLS0tLS0tLgpAQCAtMTY5MiwxOSArMjE1NiwxNyBAQAogYC0tLS0tLS0tLS0tKi8KIHl5YmFja3VwOgogCi0vKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLS8qIFJlYWQgYSBsb29rLWFoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS8qIHl5cmVzdW1lOiAqLworICAvKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgUmVhZCBhCisgICAgIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCiAKLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2stYWhlYWQgdG9rZW4uICAqLwotCisgIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwogICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCisgIGlmICh5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKICAgICBnb3RvIHl5ZGVmYXVsdDsKIAotICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9vay1haGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KKyAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KIAotICAvKiBZWUNIQVIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0Ygb3IgYSB2YWxpZCBsb29rLWFoZWFkIHN5bWJvbC4gICovCisgIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2thaGVhZCBzeW1ib2wuICAqLwogICBpZiAoeXljaGFyID09IFlZRU1QVFkpCiAgICAgewogICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7CkBAIC0xNzMwLDMxICsyMTkyLDI2IEBACiAgIHl5biA9IHl5dGFibGVbeXluXTsKICAgaWYgKHl5biA8PSAwKQogICAgIHsKLSAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQotCWdvdG8geXllcnJsYWI7CisgICAgICBpZiAoeXl0YWJsZV92YWx1ZV9pc19lcnJvciAoeXluKSkKKyAgICAgICAgZ290byB5eWVycmxhYjsKICAgICAgIHl5biA9IC15eW47CiAgICAgICBnb3RvIHl5cmVkdWNlOwogICAgIH0KIAotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSAgLyogU2hpZnQgdGhlIGxvb2stYWhlYWQgdG9rZW4uICAqLwotICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOwotCi0gIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCi0gIGlmICh5eWNoYXIgIT0gWVlFT0YpCi0gICAgeXljaGFyID0gWVlFTVBUWTsKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLQotCiAgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKICAgICAgc3RhdHVzLiAgKi8KICAgaWYgKHl5ZXJyc3RhdHVzKQogICAgIHl5ZXJyc3RhdHVzLS07CiAKKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCisgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisKKyAgLyogRGlzY2FyZCB0aGUgc2hpZnRlZCB0b2tlbi4gICovCisgIHl5Y2hhciA9IFlZRU1QVFk7CisKICAgeXlzdGF0ZSA9IHl5bjsKKyAgKisreXl2c3AgPSB5eWx2YWw7CisKICAgZ290byB5eW5ld3N0YXRlOwogCiAKQEAgLTE3OTAsOTAgKzIyNDcsMTI4IEBACiAgIHN3aXRjaCAoeXluKQogICAgIHsKICAgICAgICAgY2FzZSAyOgotI2xpbmUgMjExICJncmFtbWFyLnkiCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSAzMTcgImdyYW1tYXIueSIKICAgICB7Ci0JZmluaXNoX3BhcnNlKCh5eXZzcFswXS5ibGspLmIpOworCWZpbmlzaF9wYXJzZSgoeXl2c3BbKDIpIC0gKDIpXS5ibGspLmIpOwogfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDoKLSNsaW5lIDIxNiAiZ3JhbW1hci55IgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgMzIyICJncmFtbWFyLnkiCiAgICAgeyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjoKLSNsaW5lIDIxOSAiZ3JhbW1hci55IgotICAgIHsgZ2VuX2FuZCgoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMyNSAiZ3JhbW1hci55IgorICAgIHsgZ2VuX2FuZCgoeXl2c3BbKDEpIC0gKDMpXS5ibGspLmIsICh5eXZzcFsoMykgLSAoMyldLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWygzKSAtICgzKV0uYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzoKLSNsaW5lIDIyMCAiZ3JhbW1hci55IgotICAgIHsgZ2VuX2FuZCgoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMyNiAiZ3JhbW1hci55IgorICAgIHsgZ2VuX2FuZCgoeXl2c3BbKDEpIC0gKDMpXS5ibGspLmIsICh5eXZzcFsoMykgLSAoMyldLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWygzKSAtICgzKV0uYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODoKLSNsaW5lIDIyMSAiZ3JhbW1hci55IgotICAgIHsgZ2VuX29yKCh5eXZzcFstMl0uYmxrKS5iLCAoeXl2c3BbMF0uYmxrKS5iKTsgKHl5dmFsLmJsaykgPSAoeXl2c3BbMF0uYmxrKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgMzI3ICJncmFtbWFyLnkiCisgICAgeyBnZW5fb3IoKHl5dnNwWygxKSAtICgzKV0uYmxrKS5iLCAoeXl2c3BbKDMpIC0gKDMpXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFsoMykgLSAoMyldLmJsayk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk6Ci0jbGluZSAyMjIgImdyYW1tYXIueSIKLSAgICB7IGdlbl9vcigoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMyOCAiZ3JhbW1hci55IgorICAgIHsgZ2VuX29yKCh5eXZzcFsoMSkgLSAoMyldLmJsaykuYiwgKHl5dnNwWygzKSAtICgzKV0uYmxrKS5iKTsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDMpIC0gKDMpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDoKLSNsaW5lIDIyNCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbLTFdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMzMCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMToKLSNsaW5lIDIyNiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbLTFdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMzMiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzoKLSNsaW5lIDIyOSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZShOVUxMLCAoYnBmX3VfaW50MzIpKHl5dnNwWzBdLmkpLAotCQkJCQkJICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMV0uYmxrKS5xKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgMzM1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX25jb2RlKE5VTEwsIChicGZfdV9pbnQzMikoeXl2c3BbKDEpIC0gKDEpXS5pKSwKKwkJCQkJCSAgICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspLnEpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDoKLSNsaW5lIDIzMSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbLTFdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMzNyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDIpIC0gKDMpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNToKLSNsaW5lIDIzMyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9zY29kZSgoeXl2c3BbMF0ucyksICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMzOSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9zY29kZSgoeXl2c3BbKDEpIC0gKDEpXS5zKSwgKHl5dmFsLmJsaykucSA9ICh5eXZzcFsoMCkgLSAoMSldLmJsaykucSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE2OgotI2xpbmUgMjM0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX21jb2RlKCh5eXZzcFstMl0ucyksIE5VTEwsICh5eXZzcFswXS5pKSwKLQkJCQkgICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstM10uYmxrKS5xKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgMzQwICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX21jb2RlKCh5eXZzcFsoMSkgLSAoMyldLnMpLCBOVUxMLCAoeXl2c3BbKDMpIC0gKDMpXS5pKSwKKwkJCQkgICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFsoMCkgLSAoMyldLmJsaykucSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE3OgotI2xpbmUgMjM2ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX21jb2RlKCh5eXZzcFstMl0ucyksICh5eXZzcFswXS5zKSwgMCwKLQkJCQkgICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstM10uYmxrKS5xKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgMzQyICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX21jb2RlKCh5eXZzcFsoMSkgLSAoMyldLnMpLCAoeXl2c3BbKDMpIC0gKDMpXS5zKSwgMCwKKwkJCQkgICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFsoMCkgLSAoMyldLmJsaykucSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE4OgotI2xpbmUgMjM4ICJncmFtbWFyLnkiCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSAzNDQgImdyYW1tYXIueSIKICAgICB7CiAJCQkJICAvKiBEZWNpZGUgaG93IHRvIHBhcnNlIEhJRCBiYXNlZCBvbiBwcm90byAqLwotCQkJCSAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMV0uYmxrKS5xOwotCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZSgoeXl2c3BbMF0ucyksIDAsICh5eXZhbC5ibGspLnEpOworCQkJCSAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFsoMCkgLSAoMSldLmJsaykucTsKKwkJCQkgIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QT1JUKQorCQkJCSAgCWJwZl9lcnJvcigiJ3BvcnQnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOworCQkJCSAgZWxzZSBpZiAoKHl5dmFsLmJsaykucS5hZGRyID09IFFfUE9SVFJBTkdFKQorCQkJCSAgCWJwZl9lcnJvcigiJ3BvcnRyYW5nZScgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICBlbHNlIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QUk9UTykKKwkJCQkgIAlicGZfZXJyb3IoIidwcm90bycgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICBlbHNlIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QUk9UT0NIQUlOKQorCQkJCSAgCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOworCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZSgoeXl2c3BbKDEpIC0gKDEpXS5zKSwgMCwgKHl5dmFsLmJsaykucSk7CiAJCQkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTk6Ci0jbGluZSAyNDMgImdyYW1tYXIueSIKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM1NyAiZ3JhbW1hci55IgogICAgIHsKICNpZmRlZiBJTkVUNgotCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9tY29kZTYoKHl5dnNwWy0yXS5zKSwgTlVMTCwgKHl5dnNwWzBdLmkpLAotCQkJCSAgICAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0zXS5ibGspLnEpOworCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9tY29kZTYoKHl5dnNwWygxKSAtICgzKV0ucyksIE5VTEwsICh5eXZzcFsoMykgLSAoMyldLmkpLAorCQkJCSAgICAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWygwKSAtICgzKV0uYmxrKS5xKTsKICNlbHNlCiAJCQkJICBicGZfZXJyb3IoIidpcDZhZGRyL3ByZWZpeGxlbicgbm90IHN1cHBvcnRlZCAiCiAJCQkJCSJpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKTsKQEAgLTE4ODIsMTEgKzIzNzcsMTMgQEAKICAgICBicmVhazsKIAogICBjYXNlIDIwOgotI2xpbmUgMjUyICJncmFtbWFyLnkiCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSAzNjYgImdyYW1tYXIueSIKICAgICB7CiAjaWZkZWYgSU5FVDYKLQkJCQkgICh5eXZhbC5ibGspLmIgPSBnZW5fbWNvZGU2KCh5eXZzcFswXS5zKSwgMCwgMTI4LAotCQkJCSAgICAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0xXS5ibGspLnEpOworCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9tY29kZTYoKHl5dnNwWygxKSAtICgxKV0ucyksIDAsIDEyOCwKKwkJCQkgICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFsoMCkgLSAoMSldLmJsaykucSk7CiAjZWxzZQogCQkJCSAgYnBmX2Vycm9yKCInaXA2YWRkcicgbm90IHN1cHBvcnRlZCAiCiAJCQkJCSJpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKTsKQEAgLTE4OTUsODMyICsyMzkyLDEzNzYgQEAKICAgICBicmVhazsKIAogICBjYXNlIDIxOgotI2xpbmUgMjYxICJncmFtbWFyLnkiCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSAzNzUgImdyYW1tYXIueSIKICAgICB7IAotCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9lY29kZSgoeXl2c3BbMF0uZSksICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7CisJCQkJICAoeXl2YWwuYmxrKS5iID0gZ2VuX2Vjb2RlKCh5eXZzcFsoMSkgLSAoMSldLmUpLCAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWygwKSAtICgxKV0uYmxrKS5xKTsKIAkJCQkgIC8qCiAJCQkJICAgKiAkMSB3YXMgYWxsb2NhdGVkIGJ5ICJwY2FwX2V0aGVyX2F0b24oKSIsCiAJCQkJICAgKiBzbyB3ZSBtdXN0IGZyZWUgaXQgbm93IHRoYXQgd2UncmUgZG9uZQogCQkJCSAgICogd2l0aCBpdC4KIAkJCQkgICAqLwotCQkJCSAgZnJlZSgoeXl2c3BbMF0uZSkpOworCQkJCSAgZnJlZSgoeXl2c3BbKDEpIC0gKDEpXS5lKSk7CiAJCQkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjI6Ci0jbGluZSAyNzAgImdyYW1tYXIueSIKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM4NCAiZ3JhbW1hci55IgogICAgIHsKLQkJCQkgICh5eXZhbC5ibGspLmIgPSBnZW5fYWNvZGUoKHl5dnNwWzBdLmUpLCAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0xXS5ibGspLnEpOworCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9hY29kZSgoeXl2c3BbKDEpIC0gKDEpXS5lKSwgKHl5dmFsLmJsaykucSA9ICh5eXZzcFsoMCkgLSAoMSldLmJsaykucSk7CiAJCQkJICAvKgogCQkJCSAgICogJDEgd2FzIGFsbG9jYXRlZCBieSAicGNhcF9ldGhlcl9hdG9uKCkiLAogCQkJCSAgICogc28gd2UgbXVzdCBmcmVlIGl0IG5vdyB0aGF0IHdlJ3JlIGRvbmUKIAkJCQkgICAqIHdpdGggaXQuCiAJCQkJICAgKi8KLQkJCQkgIGZyZWUoKHl5dnNwWzBdLmUpKTsKKwkJCQkgIGZyZWUoKHl5dnNwWygxKSAtICgxKV0uZSkpOwogCQkJCX0KICAgICBicmVhazsKIAogICBjYXNlIDIzOgotI2xpbmUgMjc5ICJncmFtbWFyLnkiCi0gICAgeyBnZW5fbm90KCh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSAzOTMgImdyYW1tYXIueSIKKyAgICB7IGdlbl9ub3QoKHl5dnNwWygyKSAtICgyKV0uYmxrKS5iKTsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDIpIC0gKDIpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNDoKLSNsaW5lIDI4MSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbLTFdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5NSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNToKLSNsaW5lIDI4MyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbLTFdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5NyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNzoKLSNsaW5lIDI4NiAiZ3JhbW1hci55IgotICAgIHsgZ2VuX2FuZCgoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQwMCAiZ3JhbW1hci55IgorICAgIHsgZ2VuX2FuZCgoeXl2c3BbKDEpIC0gKDMpXS5ibGspLmIsICh5eXZzcFsoMykgLSAoMyldLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWygzKSAtICgzKV0uYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjg6Ci0jbGluZSAyODcgImdyYW1tYXIueSIKLSAgICB7IGdlbl9vcigoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQwMSAiZ3JhbW1hci55IgorICAgIHsgZ2VuX29yKCh5eXZzcFsoMSkgLSAoMyldLmJsaykuYiwgKHl5dnNwWygzKSAtICgzKV0uYmxrKS5iKTsgKHl5dmFsLmJsaykgPSAoeXl2c3BbKDMpIC0gKDMpXS5ibGspOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyOToKLSNsaW5lIDI4OSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZShOVUxMLCAoYnBmX3VfaW50MzIpKHl5dnNwWzBdLmkpLAotCQkJCQkJICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMV0uYmxrKS5xKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDAzICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX25jb2RlKE5VTEwsIChicGZfdV9pbnQzMikoeXl2c3BbKDEpIC0gKDEpXS5pKSwKKwkJCQkJCSAgICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspLnEpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzMjoKLSNsaW5lIDI5NCAiZ3JhbW1hci55IgotICAgIHsgZ2VuX25vdCgoeXl2c3BbMF0uYmxrKS5iKTsgKHl5dmFsLmJsaykgPSAoeXl2c3BbMF0uYmxrKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDA4ICJncmFtbWFyLnkiCisgICAgeyBnZW5fbm90KCh5eXZzcFsoMikgLSAoMildLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWygyKSAtICgyKV0uYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzM6Ci0jbGluZSAyOTYgImdyYW1tYXIueSIKLSAgICB7IFFTRVQoKHl5dmFsLmJsaykucSwgKHl5dnNwWy0yXS5pKSwgKHl5dnNwWy0xXS5pKSwgKHl5dnNwWzBdLmkpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDEwICJncmFtbWFyLnkiCisgICAgeyBRU0VUKCh5eXZhbC5ibGspLnEsICh5eXZzcFsoMSkgLSAoMyldLmkpLCAoeXl2c3BbKDIpIC0gKDMpXS5pKSwgKHl5dnNwWygzKSAtICgzKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzNDoKLSNsaW5lIDI5NyAiZ3JhbW1hci55IgotICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbLTFdLmkpLCAoeXl2c3BbMF0uaSksIFFfREVGQVVMVCk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQxMSAiZ3JhbW1hci55IgorICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbKDEpIC0gKDIpXS5pKSwgKHl5dnNwWygyKSAtICgyKV0uaSksIFFfREVGQVVMVCk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDM1OgotI2xpbmUgMjk4ICJncmFtbWFyLnkiCi0gICAgeyBRU0VUKCh5eXZhbC5ibGspLnEsICh5eXZzcFstMV0uaSksIFFfREVGQVVMVCwgKHl5dnNwWzBdLmkpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDEyICJncmFtbWFyLnkiCisgICAgeyBRU0VUKCh5eXZhbC5ibGspLnEsICh5eXZzcFsoMSkgLSAoMildLmkpLCBRX0RFRkFVTFQsICh5eXZzcFsoMikgLSAoMildLmkpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzY6Ci0jbGluZSAyOTkgImdyYW1tYXIueSIKLSAgICB7IFFTRVQoKHl5dmFsLmJsaykucSwgKHl5dnNwWy0xXS5pKSwgUV9ERUZBVUxULCBRX1BST1RPKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDEzICJncmFtbWFyLnkiCisgICAgeyBRU0VUKCh5eXZhbC5ibGspLnEsICh5eXZzcFsoMSkgLSAoMildLmkpLCBRX0RFRkFVTFQsIFFfUFJPVE8pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzNzoKLSNsaW5lIDMwMCAiZ3JhbW1hci55IgotICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbLTFdLmkpLCBRX0RFRkFVTFQsIFFfUFJPVE9DSEFJTik7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQxNCAiZ3JhbW1hci55IgorICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbKDEpIC0gKDIpXS5pKSwgUV9ERUZBVUxULCBRX1BST1RPQ0hBSU4pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzODoKLSNsaW5lIDMwMSAiZ3JhbW1hci55IgotICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbLTFdLmkpLCBRX0RFRkFVTFQsICh5eXZzcFswXS5pKSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQxNSAiZ3JhbW1hci55IgorICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbKDEpIC0gKDIpXS5pKSwgUV9ERUZBVUxULCAoeXl2c3BbKDIpIC0gKDIpXS5pKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDM5OgotI2xpbmUgMzAzICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MTcgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspID0gKHl5dnNwWygyKSAtICgyKV0uYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDA6Ci0jbGluZSAzMDQgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbLTFdLmJsaykuYjsgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMl0uYmxrKS5xOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MTggImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbKDIpIC0gKDMpXS5ibGspLmI7ICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbKDEpIC0gKDMpXS5ibGspLnE7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQxOgotI2xpbmUgMzA1ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX3Byb3RvX2FiYnJldigoeXl2c3BbMF0uaSkpOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDE5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX3Byb3RvX2FiYnJldigoeXl2c3BbKDEpIC0gKDEpXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0MjoKLSNsaW5lIDMwNiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9yZWxhdGlvbigoeXl2c3BbLTFdLmkpLCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSksIDApOworCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDIwICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX3JlbGF0aW9uKCh5eXZzcFsoMikgLSAoMyldLmkpLCAoeXl2c3BbKDEpIC0gKDMpXS5hKSwgKHl5dnNwWygzKSAtICgzKV0uYSksIDApOwogCQkJCSAgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQzOgotI2xpbmUgMzA4ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX3JlbGF0aW9uKCh5eXZzcFstMV0uaSksICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSwgMSk7CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MjIgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fcmVsYXRpb24oKHl5dnNwWygyKSAtICgzKV0uaSksICh5eXZzcFsoMSkgLSAoMyldLmEpLCAoeXl2c3BbKDMpIC0gKDMpXS5hKSwgMSk7CiAJCQkJICAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDQ6Ci0jbGluZSAzMTAgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbMF0ucmJsayk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MjQgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbKDEpIC0gKDEpXS5yYmxrKTsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQ1OgotI2xpbmUgMzExICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX2F0bXR5cGVfYWJicmV2KCh5eXZzcFswXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MjUgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fYXRtdHlwZV9hYmJyZXYoKHl5dnNwWygxKSAtICgxKV0uaSkpOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDY6Ci0jbGluZSAzMTIgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fYXRtbXVsdGlfYWJicmV2KCh5eXZzcFswXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MjYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fYXRtbXVsdGlfYWJicmV2KCh5eXZzcFsoMSkgLSAoMSldLmkpKTsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQ3OgotI2xpbmUgMzEzICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gKHl5dnNwWzBdLmJsaykuYjsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQyNyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykuYiA9ICh5eXZzcFsoMikgLSAoMildLmJsaykuYjsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQ4OgotI2xpbmUgMzE0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX210cDJ0eXBlX2FiYnJldigoeXl2c3BbMF0uaSkpOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDI4ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX210cDJ0eXBlX2FiYnJldigoeXl2c3BbKDEpIC0gKDEpXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0OToKLSNsaW5lIDMxNSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9ICh5eXZzcFswXS5ibGspLmI7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MjkgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbKDIpIC0gKDIpXS5ibGspLmI7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA1MToKLSNsaW5lIDMxOSAiZ3JhbW1hci55IgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDMzICJncmFtbWFyLnkiCiAgICAgeyAoeXl2YWwuaSkgPSBRX0RFRkFVTFQ7IH0KICAgICBicmVhazsKIAogICBjYXNlIDUyOgotI2xpbmUgMzIyICJncmFtbWFyLnkiCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0MzYgImdyYW1tYXIueSIKICAgICB7ICh5eXZhbC5pKSA9IFFfU1JDOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA1MzoKLSNsaW5lIDMyMyAiZ3JhbW1hci55IgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDM3ICJncmFtbWFyLnkiCiAgICAgeyAoeXl2YWwuaSkgPSBRX0RTVDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNTQ6Ci0jbGluZSAzMjQgImdyYW1tYXIueSIKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQzOCAiZ3JhbW1hci55IgogICAgIHsgKHl5dmFsLmkpID0gUV9PUjsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNTU6Ci0jbGluZSAzMjUgImdyYW1tYXIueSIKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQzOSAiZ3JhbW1hci55IgogICAgIHsgKHl5dmFsLmkpID0gUV9PUjsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNTY6Ci0jbGluZSAzMjYgImdyYW1tYXIueSIKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ0MCAiZ3JhbW1hci55IgogICAgIHsgKHl5dmFsLmkpID0gUV9BTkQ7IH0KICAgICBicmVhazsKIAogICBjYXNlIDU3OgotI2xpbmUgMzI3ICJncmFtbWFyLnkiCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NDEgImdyYW1tYXIueSIKICAgICB7ICh5eXZhbC5pKSA9IFFfQU5EOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA1ODoKLSNsaW5lIDMzMCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9IT1NUOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NDIgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfQUREUjE7IH0KICAgICBicmVhazsKIAogICBjYXNlIDU5OgotI2xpbmUgMzMxICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX05FVDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDQzICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0FERFIyOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2MDoKLSNsaW5lIDMzMiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9QT1JUOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NDQgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfQUREUjM7IH0KICAgICBicmVhazsKIAogICBjYXNlIDYxOgotI2xpbmUgMzMzICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX1BPUlRSQU5HRTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDQ1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0FERFI0OyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2MjoKLSNsaW5lIDMzNiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9HQVRFV0FZOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NDYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfUkE7IH0KICAgICBicmVhazsKIAogICBjYXNlIDYzOgotI2xpbmUgMzM4ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0xJTks7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ0NyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9UQTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjQ6Ci0jbGluZSAzMzkgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfSVA7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ1MCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9IT1NUOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2NToKLSNsaW5lIDM0MCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9BUlA7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ1MSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9ORVQ7IH0KICAgICBicmVhazsKIAogICBjYXNlIDY2OgotI2xpbmUgMzQxICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX1JBUlA7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ1MiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9QT1JUOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2NzoKLSNsaW5lIDM0MiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9TQ1RQOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NTMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfUE9SVFJBTkdFOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2ODoKLSNsaW5lIDM0MyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9UQ1A7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ1NiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9HQVRFV0FZOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2OToKLSNsaW5lIDM0NCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9VRFA7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ1OCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9MSU5LOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MDoKLSNsaW5lIDM0NSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9JQ01QOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NTkgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfSVA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDcxOgotI2xpbmUgMzQ2ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lHTVA7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ2MCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9BUlA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDcyOgotI2xpbmUgMzQ3ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lHUlA7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ2MSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9SQVJQOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MzoKLSNsaW5lIDM0OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9QSU07IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ2MiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9TQ1RQOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3NDoKLSNsaW5lIDM0OSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9WUlJQOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NjMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfVENQOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3NToKLSNsaW5lIDM1MCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9BVEFMSzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDY0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX1VEUDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzY6Ci0jbGluZSAzNTEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfQUFSUDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDY1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lDTVA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc3OgotI2xpbmUgMzUyICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0RFQ05FVDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDY2ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lHTVA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc4OgotI2xpbmUgMzUzICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0xBVDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDY3ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lHUlA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc5OgotI2xpbmUgMzU0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX1NDQTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDY4ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX1BJTTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODA6Ci0jbGluZSAzNTUgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfTU9QREw7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ2OSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9WUlJQOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4MToKLSNsaW5lIDM1NiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9NT1BSQzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDcwICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0NBUlA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDgyOgotI2xpbmUgMzU3ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lQVjY7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ3MSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9BVEFMSzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODM6Ci0jbGluZSAzNTggImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfSUNNUFY2OyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NzIgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfQUFSUDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODQ6Ci0jbGluZSAzNTkgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfQUg7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ3MyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9ERUNORVQ7IH0KICAgICBicmVhazsKIAogICBjYXNlIDg1OgotI2xpbmUgMzYwICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0VTUDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDc0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0xBVDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODY6Ci0jbGluZSAzNjEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfSVNPOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NzUgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfU0NBOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4NzoKLSNsaW5lIDM2MiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9FU0lTOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0NzYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfTU9QREw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDg4OgotI2xpbmUgMzYzICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lTSVM7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ3NyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9NT1BSQzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODk6Ci0jbGluZSAzNjQgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfSVNJU19MMTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDc4ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lQVjY7IH0KICAgICBicmVhazsKIAogICBjYXNlIDkwOgotI2xpbmUgMzY1ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfTDI7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ3OSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9JQ01QVjY7IH0KICAgICBicmVhazsKIAogICBjYXNlIDkxOgotI2xpbmUgMzY2ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfSUlIOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0ODAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfQUg7IH0KICAgICBicmVhazsKIAogICBjYXNlIDkyOgotI2xpbmUgMzY3ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfTFNQOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0ODEgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfRVNQOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5MzoKLSNsaW5lIDM2OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9JU0lTX1NOUDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDgyICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lTTzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTQ6Ci0jbGluZSAzNjkgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfSVNJU19QU05QOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0ODMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfRVNJUzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTU6Ci0jbGluZSAzNzAgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfSVNJU19DU05QOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0ODQgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfSVNJUzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTY6Ci0jbGluZSAzNzEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IFFfQ0xOUDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDg1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfTDE7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk3OgotI2xpbmUgMzcyICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX1NUUDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDg2ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfTDI7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk4OgotI2xpbmUgMzczICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBRX0lQWDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDg3ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfSUlIOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5OToKLSNsaW5lIDM3NCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9ORVRCRVVJOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0ODggImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfSVNJU19MU1A7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEwMDoKLSNsaW5lIDM3NSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gUV9SQURJTzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDg5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfU05QOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDE6Ci0jbGluZSAzNzcgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9icm9hZGNhc3QoKHl5dnNwWy0xXS5pKSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ5MCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9JU0lTX1BTTlA7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEwMjoKLSNsaW5lIDM3OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX211bHRpY2FzdCgoeXl2c3BbLTFdLmkpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDkxICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfQ1NOUDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAzOgotI2xpbmUgMzc5ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbGVzcygoeXl2c3BbMF0uaSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0OTIgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfQ0xOUDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA0OgotI2xpbmUgMzgwICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fZ3JlYXRlcigoeXl2c3BbMF0uaSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0OTMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IFFfU1RQOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDU6Ci0jbGluZSAzODEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9ieXRlb3AoKHl5dnNwWy0xXS5pKSwgKHl5dnNwWy0yXS5pKSwgKHl5dnNwWzBdLmkpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDk0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX0lQWDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA2OgotI2xpbmUgMzgyICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5faW5ib3VuZCgwKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDk1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBRX05FVEJFVUk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEwNzoKLSNsaW5lIDM4MyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2luYm91bmQoMSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDQ5NiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gUV9SQURJTzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA4OgotI2xpbmUgMzg0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fdmxhbigoeXl2c3BbMF0uaSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA0OTggImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9icm9hZGNhc3QoKHl5dnNwWygxKSAtICgyKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDk6Ci0jbGluZSAzODUgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl92bGFuKC0xKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNDk5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbXVsdGljYXN0KCh5eXZzcFsoMSkgLSAoMildLmkpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTEwOgotI2xpbmUgMzg2ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbXBscygoeXl2c3BbMF0uaSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MDAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9sZXNzKCh5eXZzcFsoMikgLSAoMildLmkpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTExOgotI2xpbmUgMzg3ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbXBscygtMSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUwMSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2dyZWF0ZXIoKHl5dnNwWygyKSAtICgyKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTI6Ci0jbGluZSAzODggImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wcHBvZWQoKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTAyICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fYnl0ZW9wKCh5eXZzcFsoMykgLSAoNCldLmkpLCAoeXl2c3BbKDIpIC0gKDQpXS5pKSwgKHl5dnNwWyg0KSAtICg0KV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTM6Ci0jbGluZSAzODkgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wcHBvZXMoKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTAzICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5faW5ib3VuZCgwKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTE0OgotI2xpbmUgMzkwICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSAoeXl2c3BbMF0ucmJsayk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUwNCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2luYm91bmQoMSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExNToKLSNsaW5lIDM5MyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX2lmbmFtZSgoeXl2c3BbMF0ucykpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MDUgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl92bGFuKCh5eXZzcFsoMikgLSAoMildLmkpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTE2OgotI2xpbmUgMzk0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfcnVsZXNldCgoeXl2c3BbMF0ucykpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MDYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl92bGFuKC0xKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTE3OgotI2xpbmUgMzk1ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfcm5yKCh5eXZzcFswXS5pKSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUwNyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX21wbHMoKHl5dnNwWygyKSAtICgyKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTg6Ci0jbGluZSAzOTYgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9zcm5yKCh5eXZzcFswXS5pKSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUwOCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX21wbHMoLTEpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTk6Ci0jbGluZSAzOTcgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9yZWFzb24oKHl5dnNwWzBdLmkpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTA5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcHBwb2VkKCk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyMDoKLSNsaW5lIDM5OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX2FjdGlvbigoeXl2c3BbMF0uaSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MTAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wcHBvZXMoKHl5dnNwWygyKSAtICgyKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjE6Ci0jbGluZSA0MDEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICh5eXZzcFswXS5pKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTExICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcHBwb2VzKC0xKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTIyOgotI2xpbmUgNDAyICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBwZnJlYXNvbl90b19udW0oKHl5dnNwWzBdLnMpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTEyICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSAoeXl2c3BbKDEpIC0gKDEpXS5yYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTIzOgotI2xpbmUgNDA1ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBwZmFjdGlvbl90b19udW0oKHl5dnNwWzBdLnMpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTEzICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSAoeXl2c3BbKDIpIC0gKDIpXS5yYmxrKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI0OgotI2xpbmUgNDA4ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBCUEZfSkdUOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MTYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9pZm5hbWUoKHl5dnNwWygyKSAtICgyKV0ucykpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjU6Ci0jbGluZSA0MDkgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IEJQRl9KR0U7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUxNyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX3J1bGVzZXQoKHl5dnNwWygyKSAtICgyKV0ucykpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjY6Ci0jbGluZSA0MTAgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IEJQRl9KRVE7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUxOCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX3JucigoeXl2c3BbKDIpIC0gKDIpXS5pKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyNzoKLSNsaW5lIDQxMiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQlBGX0pHVDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTE5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfc3JucigoeXl2c3BbKDIpIC0gKDIpXS5pKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyODoKLSNsaW5lIDQxMyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQlBGX0pHRTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTIwICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfcmVhc29uKCh5eXZzcFsoMikgLSAoMildLmkpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI5OgotI2xpbmUgNDE0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBCUEZfSkVROyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MjEgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9hY3Rpb24oKHl5dnNwWygyKSAtICgyKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzA6Ci0jbGluZSA0MTYgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkaSgoeXl2c3BbMF0uaSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MjUgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wODAyMTFfdHlwZSgoeXl2c3BbKDIpIC0gKDQpXS5pKSB8ICh5eXZzcFsoNCkgLSAoNCldLmkpLAorCQkJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8CisJCQkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKKwkJCQl9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMzE6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MjkgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wODAyMTFfdHlwZSgoeXl2c3BbKDIpIC0gKDIpXS5pKSwKKwkJCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spOworCQkJCX0KICAgICBicmVhazsKIAogICBjYXNlIDEzMjoKLSNsaW5lIDQxOSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2xvYWQoKHl5dnNwWy0zXS5pKSwgKHl5dnNwWy0xXS5hKSwgMSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDUzMiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3A4MDIxMV90eXBlKCh5eXZzcFsoMikgLSAoMildLmkpLAorCQkJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8CisJCQkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKKwkJCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzM6Ci0jbGluZSA0MjAgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkKCh5eXZzcFstNV0uaSksICh5eXZzcFstM10uYSksICh5eXZzcFstMV0uaSkpOyB9Ci0gICAgYnJlYWs7CiAKLSAgY2FzZSAxMzQ6Ci0jbGluZSA0MjEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9BREQsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1MzYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wODAyMTFfZmNkaXIoKHl5dnNwWygyKSAtICgyKV0uaSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzU6Ci0jbGluZSA0MjIgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9TVUIsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KLSAgICBicmVhazsKIAotICBjYXNlIDEzNjoKLSNsaW5lIDQyMyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoQlBGX01VTCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDU0MCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gc3RyMnRvaygoeXl2c3BbKDEpIC0gKDEpXS5zKSwgaWVlZTgwMjExX3R5cGVzKTsKKwkJCQkgIGlmICgoeXl2YWwuaSkgPT0gLTEpCisJCQkJICAJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSB0eXBlIG5hbWUiKTsKKwkJCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzc6Ci0jbGluZSA0MjQgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9ESVYsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDU0NyAiZ3JhbW1hci55IgorICAgIHsgY29uc3Qgc3RydWN0IHRvayAqdHlwZXMgPSBOVUxMOworCQkJCSAgaW50IGk7CisJCQkJICBmb3IgKGkgPSAwOzsgaSsrKSB7CisJCQkJICAJaWYgKGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayA9PSBOVUxMKSB7CisJCQkJICAJCS8qIFJhbiBvdXQgb2YgdHlwZXMgKi8KKwkJCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgdHlwZSIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCh5eXZzcFsoLTEpIC0gKDEpXS5pKSA9PSBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50eXBlKSB7CisJCQkJCQl0eXBlcyA9IGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvazsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJICB9CisKKwkJCQkgICh5eXZhbC5pKSA9IHN0cjJ0b2soKHl5dnNwWygxKSAtICgxKV0ucyksIHR5cGVzKTsKKwkJCQkgIGlmICgoeXl2YWwuaSkgPT0gLTEpCisJCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgc3VidHlwZSBuYW1lIik7CisJCQkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTM4OgotI2xpbmUgNDI1ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfQU5ELCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9Ci0gICAgYnJlYWs7CiAKLSAgY2FzZSAxMzk6Ci0jbGluZSA0MjYgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9PUiwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDU2NyAiZ3JhbW1hci55IgorICAgIHsgaW50IGk7CisJCQkJICBmb3IgKGkgPSAwOzsgaSsrKSB7CisJCQkJICAJaWYgKGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayA9PSBOVUxMKSB7CisJCQkJICAJCS8qIFJhbiBvdXQgb2YgdHlwZXMgKi8KKwkJCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgdHlwZSBuYW1lIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkoeXl2YWwuaSkgPSBzdHIydG9rKCh5eXZzcFsoMSkgLSAoMSldLnMpLCBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50b2spOworCQkJCQlpZiAoKHl5dmFsLmkpICE9IC0xKSB7CisJCQkJCQkoeXl2YWwuaSkgfD0gaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udHlwZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJICB9CisJCQkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQwOgotI2xpbmUgNDI3ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfTFNILCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA1ODQgImdyYW1tYXIueSIKKyAgICB7IGlmIChwY2FwX3N0cmNhc2VjbXAoKHl5dnNwWygxKSAtICgxKV0ucyksICJub2RzIikgPT0gMCkKKwkJCQkJKHl5dmFsLmkpID0gSUVFRTgwMjExX0ZDMV9ESVJfTk9EUzsKKwkJCQkgIGVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcCgoeXl2c3BbKDEpIC0gKDEpXS5zKSwgInRvZHMiKSA9PSAwKQorCQkJCQkoeXl2YWwuaSkgPSBJRUVFODAyMTFfRkMxX0RJUl9UT0RTOworCQkJCSAgZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKCh5eXZzcFsoMSkgLSAoMSldLnMpLCAiZnJvbWRzIikgPT0gMCkKKwkJCQkJKHl5dmFsLmkpID0gSUVFRTgwMjExX0ZDMV9ESVJfRlJPTURTOworCQkJCSAgZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKCh5eXZzcFsoMSkgLSAoMSldLnMpLCAiZHN0b2RzIikgPT0gMCkKKwkJCQkJKHl5dmFsLmkpID0gSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOworCQkJCSAgZWxzZQorCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIGRpcmVjdGlvbiIpOworCQkJCX0KICAgICBicmVhazsKIAogICBjYXNlIDE0MToKLSNsaW5lIDQyOCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoQlBGX1JTSCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNTk3ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5pKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQyOgotI2xpbmUgNDI5ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fbmVnKCh5eXZzcFswXS5hKSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDU5OCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gcGZyZWFzb25fdG9fbnVtKCh5eXZzcFsoMSkgLSAoMSldLnMpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQzOgotI2xpbmUgNDMwICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYSkgPSAoeXl2c3BbLTFdLmEpOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MDEgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IHBmYWN0aW9uX3RvX251bSgoeXl2c3BbKDEpIC0gKDEpXS5zKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE0NDoKLSNsaW5lIDQzMSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2xvYWRsZW4oKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjA0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBCUEZfSkdUOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDU6Ci0jbGluZSA0MzMgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICcmJzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjA1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBCUEZfSkdFOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDY6Ci0jbGluZSA0MzQgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICd8JzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjA2ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBCUEZfSkVROyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDc6Ci0jbGluZSA0MzUgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICc8JzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjA4ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBCUEZfSkdUOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDg6Ci0jbGluZSA0MzYgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICc+JzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjA5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBCUEZfSkdFOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDk6Ci0jbGluZSA0MzcgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICc9JzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjEwICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBCUEZfSkVROyB9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxNTE6Ci0jbGluZSA0NDAgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9ICh5eXZzcFstMV0uaSk7IH0KKyAgY2FzZSAxNTA6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MTIgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkaSgoeXl2c3BbKDEpIC0gKDEpXS5pKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE1MjoKLSNsaW5lIDQ0MiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9MQU5FOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MTUgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkKCh5eXZzcFsoMSkgLSAoNCldLmkpLCAoeXl2c3BbKDMpIC0gKDQpXS5hKSwgMSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE1MzoKLSNsaW5lIDQ0MyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9MTEM7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYxNiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmEpID0gZ2VuX2xvYWQoKHl5dnNwWygxKSAtICg2KV0uaSksICh5eXZzcFsoMykgLSAoNildLmEpLCAoeXl2c3BbKDUpIC0gKDYpXS5pKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE1NDoKLSNsaW5lIDQ0NCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9NRVRBQzsJfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjE3ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfQURELCAoeXl2c3BbKDEpIC0gKDMpXS5hKSwgKHl5dnNwWygzKSAtICgzKV0uYSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNTU6Ci0jbGluZSA0NDUgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IEFfQkNDOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MTggImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9TVUIsICh5eXZzcFsoMSkgLSAoMyldLmEpLCAoeXl2c3BbKDMpIC0gKDMpXS5hKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE1NjoKLSNsaW5lIDQ0NiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9PQU1GNEVDOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MTkgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9NVUwsICh5eXZzcFsoMSkgLSAoMyldLmEpLCAoeXl2c3BbKDMpIC0gKDMpXS5hKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE1NzoKLSNsaW5lIDQ0NyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9PQU1GNFNDOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MjAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9ESVYsICh5eXZzcFsoMSkgLSAoMyldLmEpLCAoeXl2c3BbKDMpIC0gKDMpXS5hKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE1ODoKLSNsaW5lIDQ0OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9TQzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjIxICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfQU5ELCAoeXl2c3BbKDEpIC0gKDMpXS5hKSwgKHl5dnNwWygzKSAtICgzKV0uYSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNTk6Ci0jbGluZSA0NDkgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IEFfSUxNSUM7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYyMiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoQlBGX09SLCAoeXl2c3BbKDEpIC0gKDMpXS5hKSwgKHl5dnNwWygzKSAtICgzKV0uYSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjA6Ci0jbGluZSA0NTEgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IEFfT0FNOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MjMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9MU0gsICh5eXZzcFsoMSkgLSAoMyldLmEpLCAoeXl2c3BbKDMpIC0gKDMpXS5hKSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE2MToKLSNsaW5lIDQ1MiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gQV9PQU1GNDsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjI0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfUlNILCAoeXl2c3BbKDEpIC0gKDMpXS5hKSwgKHl5dnNwWygzKSAtICgzKV0uYSkpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjI6Ci0jbGluZSA0NTMgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5pKSA9IEFfQ09OTkVDVE1TRzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjI1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fbmVnKCh5eXZzcFsoMikgLSAoMildLmEpKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTYzOgotI2xpbmUgNDU0ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBBX01FVEFDT05ORUNUOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MjYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9ICh5eXZzcFsoMikgLSAoMyldLmEpOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjQ6Ci0jbGluZSA0NTcgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSA9IEFfVlBJOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MjcgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkbGVuKCk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE2NToKLSNsaW5lIDQ1OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID0gQV9WQ0k7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYyOSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gJyYnOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjY6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MzAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9ICd8JzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTY3OgotI2xpbmUgNDYxICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoKHl5dnNwWy0yXS5ibGspLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikoeXl2c3BbMF0uaSksIChicGZfdV9pbnQzMikoeXl2c3BbLTFdLmkpLCAwKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjMxICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSAnPCc7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE2ODoKLSNsaW5lIDQ2MiAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCh5eXZzcFstMl0uYmxrKS5hdG1maWVsZHR5cGUsIChicGZfaW50MzIpKHl5dnNwWzBdLmkpLCAoYnBmX3VfaW50MzIpKHl5dnNwWy0xXS5pKSwgMSk7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYzMiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gJz4nOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjk6Ci0jbGluZSA0NjMgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbLTFdLmJsaykuYjsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYzMyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gJz0nOyB9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxNzA6Ci0jbGluZSA0NjUgImdyYW1tYXIueSIKLSAgICB7Ci0JKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID0gKHl5dnNwWy0xXS5ibGspLmF0bWZpZWxkdHlwZTsKLQlpZiAoKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID09IEFfVlBJIHx8Ci0JICAgICh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSA9PSBBX1ZDSSkKLQkJKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikgKHl5dnNwWzBdLmkpLCBCUEZfSkVRLCAwKTsKLQl9CisgIGNhc2UgMTcxOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjM2ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSAoeXl2c3BbKDIpIC0gKDMpXS5pKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTcyOgotI2xpbmUgNDczICJncmFtbWFyLnkiCi0gICAgeyBnZW5fb3IoKHl5dnNwWy0yXS5ibGspLmIsICh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2MzggImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IEFfTEFORTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTczOgotI2xpbmUgNDc2ICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuaSkgPSBNX0ZJU1U7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDYzOSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gQV9MTEM7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE3NDoKLSNsaW5lIDQ3NyAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gTV9MU1NVOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2NDAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IEFfTUVUQUM7CX0KICAgICBicmVhazsKIAogICBjYXNlIDE3NToKLSNsaW5lIDQ3OCAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmkpID0gTV9NU1U7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY0MSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gQV9CQ0M7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE3NjoKLSNsaW5lIDQ4MSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9IE1fU0lPOyB9CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2NDIgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IEFfT0FNRjRFQzsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTc3OgotI2xpbmUgNDgyICJncmFtbWFyLnkiCi0gICAgeyAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID0gTV9PUEM7IH0KKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY0MyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gQV9PQU1GNFNDOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNzg6Ci0jbGluZSA0ODMgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNX0RQQzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjQ0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBBX1NDOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNzk6Ci0jbGluZSA0ODQgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNX1NMUzsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjQ1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBBX0lMTUlDOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODA6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2NDcgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IEFfT0FNOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxODE6Ci0jbGluZSA0ODcgImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dnNwWy0yXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbMF0uaSksICh1X2ludCkoeXl2c3BbLTFdLmkpLCAwKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjQ4ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBBX09BTUY0OyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxODI6Ci0jbGluZSA0ODggImdyYW1tYXIueSIKLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dnNwWy0yXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbMF0uaSksICh1X2ludCkoeXl2c3BbLTFdLmkpLCAxKTsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjQ5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBBX0NPTk5FQ1RNU0c7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE4MzoKLSNsaW5lIDQ4OSAiZ3JhbW1hci55IgotICAgIHsgKHl5dmFsLmJsaykuYiA9ICh5eXZzcFstMV0uYmxrKS5iOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjUwICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBBX01FVEFDT05ORUNUOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxODQ6Ci0jbGluZSA0OTEgImdyYW1tYXIueSIKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY1MyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID0gQV9WUEk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE4NToKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY1NCAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID0gQV9WQ0k7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE4NzoKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY1NyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCh5eXZzcFsoMCkgLSAoMildLmJsaykuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSh5eXZzcFsoMikgLSAoMildLmkpLCAoYnBmX3VfaW50MzIpKHl5dnNwWygxKSAtICgyKV0uaSksIDApOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODg6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2NTggImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fYXRtZmllbGRfY29kZSgoeXl2c3BbKDApIC0gKDIpXS5ibGspLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikoeXl2c3BbKDIpIC0gKDIpXS5pKSwgKGJwZl91X2ludDMyKSh5eXZzcFsoMSkgLSAoMildLmkpLCAxKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTg5OgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjU5ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gKHl5dnNwWygyKSAtICgzKV0uYmxrKS5iOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTkwOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjYxICJncmFtbWFyLnkiCiAgICAgewotCSh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSAoeXl2c3BbLTFdLmJsaykubXRwM2ZpZWxkdHlwZTsKLQlpZiAoKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNX1NJTyB8fAotCSAgICAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID09IE1fT1BDIHx8Ci0JICAgICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPT0gTV9EUEMgfHwKLQkgICAgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNX1NMUyApCi0JCSh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSAoeXl2c3BbMF0uaSksIEJQRl9KRVEsIDApOworCSh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSA9ICh5eXZzcFsoMCkgLSAoMSldLmJsaykuYXRtZmllbGR0eXBlOworCWlmICgoeXl2YWwuYmxrKS5hdG1maWVsZHR5cGUgPT0gQV9WUEkgfHwKKwkgICAgKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID09IEFfVkNJKQorCQkoeXl2YWwuYmxrKS5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSAoeXl2c3BbKDEpIC0gKDEpXS5pKSwgQlBGX0pFUSwgMCk7CiAJfQogICAgIGJyZWFrOwogCi0gIGNhc2UgMTg2OgotI2xpbmUgNTAxICJncmFtbWFyLnkiCi0gICAgeyBnZW5fb3IoKHl5dnNwWy0yXS5ibGspLmIsICh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9CisgIGNhc2UgMTkyOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjY5ICJncmFtbWFyLnkiCisgICAgeyBnZW5fb3IoKHl5dnNwWygxKSAtICgzKV0uYmxrKS5iLCAoeXl2c3BbKDMpIC0gKDMpXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFsoMykgLSAoMyldLmJsayk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE5MzoKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY3MiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gTV9GSVNVOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTQ6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2NzMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IE1fTFNTVTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTk1OgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjc0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBNX01TVTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMTk2OgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjc1ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuaSkgPSBNSF9GSVNVOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTc6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2NzYgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5pKSA9IE1IX0xTU1U7IH0KKyAgICBicmVhazsKKworICBjYXNlIDE5ODoKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY3NyAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmkpID0gTUhfTVNVOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOTk6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2ODAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNX1NJTzsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjAwOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjgxICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID0gTV9PUEM7IH0KKyAgICBicmVhazsKKworICBjYXNlIDIwMToKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY4MiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9IE1fRFBDOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDI6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2ODMgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNX1NMUzsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjAzOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjg0ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID0gTUhfU0lPOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDQ6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2ODUgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNSF9PUEM7IH0KKyAgICBicmVhazsKKworICBjYXNlIDIwNToKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY4NiAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9IE1IX0RQQzsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjA2OgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjg3ICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID0gTUhfU0xTOyB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDg6CisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSA2OTAgImdyYW1tYXIueSIKKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dnNwWygwKSAtICgyKV0uYmxrKS5tdHAzZmllbGR0eXBlLCAodV9pbnQpKHl5dnNwWygyKSAtICgyKV0uaSksICh1X2ludCkoeXl2c3BbKDEpIC0gKDIpXS5pKSwgMCk7IH0KKyAgICBicmVhazsKKworICBjYXNlIDIwOToKKworLyogTGluZSAxODA2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDY5MSAiZ3JhbW1hci55IgorICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9tdHAzZmllbGRfY29kZSgoeXl2c3BbKDApIC0gKDIpXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbKDIpIC0gKDIpXS5pKSwgKHVfaW50KSh5eXZzcFsoMSkgLSAoMildLmkpLCAxKTsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjEwOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjkyICJncmFtbWFyLnkiCisgICAgeyAoeXl2YWwuYmxrKS5iID0gKHl5dnNwWygyKSAtICgzKV0uYmxrKS5iOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorICAgIGJyZWFrOworCisgIGNhc2UgMjExOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNjk0ICJncmFtbWFyLnkiCisgICAgeworCSh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSAoeXl2c3BbKDApIC0gKDEpXS5ibGspLm10cDNmaWVsZHR5cGU7CisJaWYgKCh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPT0gTV9TSU8gfHwKKwkgICAgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNX09QQyB8fAorCSAgICAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID09IE1fRFBDIHx8CisJICAgICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPT0gTV9TTFMgfHwKKwkgICAgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNSF9TSU8gfHwKKwkgICAgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNSF9PUEMgfHwKKwkgICAgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNSF9EUEMgfHwKKwkgICAgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9PSBNSF9TTFMpCisJCSh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSAoeXl2c3BbKDEpIC0gKDEpXS5pKSwgQlBGX0pFUSwgMCk7CisJfQorICAgIGJyZWFrOworCisgIGNhc2UgMjEzOgorCisvKiBMaW5lIDE4MDYgb2YgeWFjYy5jICAqLworI2xpbmUgNzA4ICJncmFtbWFyLnkiCisgICAgeyBnZW5fb3IoKHl5dnNwWygxKSAtICgzKV0uYmxrKS5iLCAoeXl2c3BbKDMpIC0gKDMpXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFsoMykgLSAoMyldLmJsayk7IH0KICAgICBicmVhazsKIAogCisKKy8qIExpbmUgMTgwNiBvZiB5YWNjLmMgICovCisjbGluZSAzNzQ0ICJ5LnRhYi5jIgogICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgfQorICAvKiBVc2VyIHNlbWFudGljIGFjdGlvbnMgc29tZXRpbWVzIGFsdGVyIHl5Y2hhciwgYW5kIHRoYXQgcmVxdWlyZXMKKyAgICAgdGhhdCB5eXRva2VuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zbGF0aW9uLiAgV2UgdGFrZSB0aGUKKyAgICAgYXBwcm9hY2ggb2YgdHJhbnNsYXRpbmcgaW1tZWRpYXRlbHkgYmVmb3JlIGV2ZXJ5IHVzZSBvZiB5eXRva2VuLgorICAgICBPbmUgYWx0ZXJuYXRpdmUgaXMgdHJhbnNsYXRpbmcgaGVyZSBhZnRlciBldmVyeSBzZW1hbnRpYyBhY3Rpb24sCisgICAgIGJ1dCB0aGF0IHRyYW5zbGF0aW9uIHdvdWxkIGJlIG1pc3NlZCBpZiB0aGUgc2VtYW50aWMgYWN0aW9uIGludm9rZXMKKyAgICAgWVlBQk9SVCwgWVlBQ0NFUFQsIG9yIFlZRVJST1IgaW1tZWRpYXRlbHkgYWZ0ZXIgYWx0ZXJpbmcgeXljaGFyIG9yCisgICAgIGlmIGl0IGludm9rZXMgWVlCQUNLVVAuICBJbiB0aGUgY2FzZSBvZiBZWUFCT1JUIG9yIFlZQUNDRVBULCBhbgorICAgICBpbmNvcnJlY3QgZGVzdHJ1Y3RvciBtaWdodCB0aGVuIGJlIGludm9rZWQgaW1tZWRpYXRlbHkuICBJbiB0aGUKKyAgICAgY2FzZSBvZiBZWUVSUk9SIG9yIFlZQkFDS1VQLCBzdWJzZXF1ZW50IHBhcnNlciBhY3Rpb25zIG1pZ2h0IGxlYWQKKyAgICAgdG8gYW4gaW5jb3JyZWN0IGRlc3RydWN0b3IgY2FsbCBvciB2ZXJib3NlIHN5bnRheCBlcnJvciBtZXNzYWdlCisgICAgIGJlZm9yZSB0aGUgbG9va2FoZWFkIGlzIHRyYW5zbGF0ZWQuICAqLworICBZWV9TWU1CT0xfUFJJTlQgKCItPiAkJCA9IiwgeXlyMVt5eW5dLCAmeXl2YWwsICZ5eWxvYyk7CiAKLS8qIExpbmUgMTEyNiBvZiB5YWNjLmMuICAqLwotI2xpbmUgMjcxNCAieS50YWIuYyIKLQwKLSAgeXl2c3AgLT0geXlsZW47Ci0gIHl5c3NwIC09IHl5bGVuOwotCi0KKyAgWVlQT1BTVEFDSyAoeXlsZW4pOworICB5eWxlbiA9IDA7CiAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CiAKICAgKisreXl2c3AgPSB5eXZhbDsKIAotCiAgIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCiAgICAgIHRoYXQgZ29lcyB0bywgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvIGFuZCB0aGUgcnVsZQogICAgICBudW1iZXIgcmVkdWNlZCBieS4gICovCkBAIC0yNzQwLDEzNyArMzc4MSw3MiBAQAogfCB5eWVycmxhYiAtLSBoZXJlIG9uIGRldGVjdGluZyBlcnJvciB8CiBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHl5ZXJybGFiOgorICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBsYXRlc3QgbG9va2FoZWFkIHRyYW5zbGF0aW9uLiAgU2VlIGNvbW1lbnRzIGF0CisgICAgIHVzZXIgc2VtYW50aWMgYWN0aW9ucyBmb3Igd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgKi8KKyAgeXl0b2tlbiA9IHl5Y2hhciA9PSBZWUVNUFRZID8gWVlFTVBUWSA6IFlZVFJBTlNMQVRFICh5eWNoYXIpOworCiAgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwogICBpZiAoIXl5ZXJyc3RhdHVzKQogICAgIHsKICAgICAgICsreXluZXJyczsKLSNpZiBZWUVSUk9SX1ZFUkJPU0UKLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLQotICAgICAgaWYgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8IFlZTEFTVCkKLQl7Ci0JICBpbnQgeXl0eXBlID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7Ci0JICBZWVNJWkVfVCB5eXNpemUwID0geXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5dHlwZV0pOwotCSAgWVlTSVpFX1QgeXlzaXplID0geXlzaXplMDsKLQkgIFlZU0laRV9UIHl5c2l6ZTE7Ci0JICBpbnQgeXlzaXplX292ZXJmbG93ID0gMDsKLQkgIGNoYXIgKnl5bXNnID0gMDsKLSMJICBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA1Ci0JICBjaGFyIGNvbnN0ICp5eWFyZ1tZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNXTsKLQkgIGludCB5eXg7Ci0KLSNpZiAwCi0JICAvKiBUaGlzIGlzIHNvIHhnZXR0ZXh0IHNlZXMgdGhlIHRyYW5zbGF0YWJsZSBmb3JtYXRzIHRoYXQgYXJlCi0JICAgICBjb25zdHJ1Y3RlZCBvbiB0aGUgZmx5LiAgKi8KLQkgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIik7Ci0JICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIik7Ci0JICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIik7Ci0JICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIik7Ci0JICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIG9yICVzIik7CisjaWYgISBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOworI2Vsc2UKKyMgZGVmaW5lIFlZU1lOVEFYX0VSUk9SIHl5c3ludGF4X2Vycm9yICgmeXltc2dfYWxsb2MsICZ5eW1zZywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5c3NwLCB5eXRva2VuKQorICAgICAgeworICAgICAgICBjaGFyIGNvbnN0ICp5eW1zZ3AgPSBZWV8oInN5bnRheCBlcnJvciIpOworICAgICAgICBpbnQgeXlzeW50YXhfZXJyb3Jfc3RhdHVzOworICAgICAgICB5eXN5bnRheF9lcnJvcl9zdGF0dXMgPSBZWVNZTlRBWF9FUlJPUjsKKyAgICAgICAgaWYgKHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9PSAwKQorICAgICAgICAgIHl5bXNncCA9IHl5bXNnOworICAgICAgICBlbHNlIGlmICh5eXN5bnRheF9lcnJvcl9zdGF0dXMgPT0gMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoeXltc2cgIT0geXltc2didWYpCisgICAgICAgICAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworICAgICAgICAgICAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eW1zZ19hbGxvYyk7CisgICAgICAgICAgICBpZiAoIXl5bXNnKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeXltc2cgPSB5eW1zZ2J1ZjsKKyAgICAgICAgICAgICAgICB5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKKyAgICAgICAgICAgICAgICB5eXN5bnRheF9lcnJvcl9zdGF0dXMgPSAyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5eXN5bnRheF9lcnJvcl9zdGF0dXMgPSBZWVNZTlRBWF9FUlJPUjsKKyAgICAgICAgICAgICAgICB5eW1zZ3AgPSB5eW1zZzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgeXllcnJvciAoeXltc2dwKTsKKyAgICAgICAgaWYgKHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9PSAyKQorICAgICAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisgICAgICB9CisjIHVuZGVmIFlZU1lOVEFYX0VSUk9SCiAjZW5kaWYKLQkgIGNoYXIgKnl5Zm10OwotCSAgY2hhciBjb25zdCAqeXlmOwotCSAgc3RhdGljIGNoYXIgY29uc3QgeXl1bmV4cGVjdGVkW10gPSAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIjsKLQkgIHN0YXRpYyBjaGFyIGNvbnN0IHl5ZXhwZWN0aW5nW10gPSAiLCBleHBlY3RpbmcgJXMiOwotCSAgc3RhdGljIGNoYXIgY29uc3QgeXlvcltdID0gIiBvciAlcyI7Ci0JICBjaGFyIHl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQKLQkJCSsgc2l6ZW9mIHl5ZXhwZWN0aW5nIC0gMQotCQkJKyAoKFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gLSAyKQotCQkJICAgKiAoc2l6ZW9mIHl5b3IgLSAxKSldOwotCSAgY2hhciBjb25zdCAqeXlwcmVmaXggPSB5eWV4cGVjdGluZzsKLQotCSAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgotCSAgICAgWVlDSEVDSy4gICovCi0JICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7Ci0KLQkgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLwotCSAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW47Ci0JICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7Ci0JICBpbnQgeXljb3VudCA9IDE7Ci0KLQkgIHl5YXJnWzBdID0geXl0bmFtZVt5eXR5cGVdOwotCSAgeXlmbXQgPSB5eXN0cGNweSAoeXlmb3JtYXQsIHl5dW5leHBlY3RlZCk7Ci0KLQkgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCi0JICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUikKLQkgICAgICB7Ci0JCWlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCi0JCSAgewotCQkgICAgeXljb3VudCA9IDE7Ci0JCSAgICB5eXNpemUgPSB5eXNpemUwOwotCQkgICAgeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZCAtIDFdID0gJ1wwJzsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJeXlhcmdbeXljb3VudCsrXSA9IHl5dG5hbWVbeXl4XTsKLQkJeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKLQkJeXlzaXplX292ZXJmbG93IHw9IHl5c2l6ZTEgPCB5eXNpemU7Ci0JCXl5c2l6ZSA9IHl5c2l6ZTE7Ci0JCXl5Zm10ID0geXlzdHBjcHkgKHl5Zm10LCB5eXByZWZpeCk7Ci0JCXl5cHJlZml4ID0geXlvcjsKLQkgICAgICB9Ci0KLQkgIHl5ZiA9IFlZXyh5eWZvcm1hdCk7Ci0JICB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zik7Ci0JICB5eXNpemVfb3ZlcmZsb3cgfD0geXlzaXplMSA8IHl5c2l6ZTsKLQkgIHl5c2l6ZSA9IHl5c2l6ZTE7Ci0KLQkgIGlmICgheXlzaXplX292ZXJmbG93ICYmIHl5c2l6ZSA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pCi0JICAgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlzaXplKTsKLQkgIGlmICh5eW1zZykKLQkgICAgewotCSAgICAgIC8qIEF2b2lkIHNwcmludGYsIGFzIHRoYXQgaW5mcmluZ2VzIG9uIHRoZSB1c2VyJ3MgbmFtZSBzcGFjZS4KLQkJIERvbid0IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGV2ZW4gaWYgdGhlIHRyYW5zbGF0aW9uCi0JCSBwcm9kdWNlZCBhIHN0cmluZyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgIiVzInMuICAqLwotCSAgICAgIGNoYXIgKnl5cCA9IHl5bXNnOwotCSAgICAgIGludCB5eWkgPSAwOwotCSAgICAgIHdoaWxlICgoKnl5cCA9ICp5eWYpKQotCQl7Ci0JCSAgaWYgKCp5eXAgPT0gJyUnICYmIHl5ZlsxXSA9PSAncycgJiYgeXlpIDwgeXljb3VudCkKLQkJICAgIHsKLQkJICAgICAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOwotCQkgICAgICB5eWYgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHl5cCsrOwotCQkgICAgICB5eWYrKzsKLQkJICAgIH0KLQkJfQotCSAgICAgIHl5ZXJyb3IgKHl5bXNnKTsKLQkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3IiKSk7Ci0JICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQl5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKICAgICB9CiAKIAogCiAgIGlmICh5eWVycnN0YXR1cyA9PSAzKQogICAgIHsKLSAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rLWFoZWFkIHRva2VuIGFmdGVyIGFuCisgICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCiAJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KIAogICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKLSAgICAgICAgeworCXsKIAkgIC8qIFJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dC4gICovCiAJICBpZiAoeXljaGFyID09IFlZRU9GKQogCSAgICBZWUFCT1JUOwotICAgICAgICB9CisJfQogICAgICAgZWxzZQogCXsKLQkgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyIsIHl5dG9rZW4sICZ5eWx2YWwpOworCSAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIiwKKwkJICAgICAgeXl0b2tlbiwgJnl5bHZhbCk7CiAJICB5eWNoYXIgPSBZWUVNUFRZOwogCX0KICAgICB9CiAKLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rLWFoZWFkIHRva2VuIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvcgorICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKICAgICAgdG9rZW4uICAqLwogICBnb3RvIHl5ZXJybGFiMTsKIApAQCAtMjg4MywxMSArMzg1OSwxNCBAQAogICAvKiBQYWNpZnkgY29tcGlsZXJzIGxpa2UgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzCiAgICAgIFlZRVJST1IgYW5kIHRoZSBsYWJlbCB5eWVycm9ybGFiIHRoZXJlZm9yZSBuZXZlciBhcHBlYXJzIGluIHVzZXIKICAgICAgY29kZS4gICovCi0gIGlmICgwKQorICBpZiAoLypDT05TVENPTkQqLyAwKQogICAgICBnb3RvIHl5ZXJyb3JsYWI7CiAKLXl5dnNwIC09IHl5bGVuOwotICB5eXNzcCAtPSB5eWxlbjsKKyAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAorICAgICB0aGlzIFlZRVJST1IuICAqLworICBZWVBPUFNUQUNLICh5eWxlbik7CisgIHl5bGVuID0gMDsKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKICAgeXlzdGF0ZSA9ICp5eXNzcDsKICAgZ290byB5eWVycmxhYjE7CiAKQEAgLTI5MDEsNyArMzg4MCw3IEBACiAgIGZvciAoOzspCiAgICAgewogICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICAgICAgaWYgKHl5biAhPSBZWVBBQ1RfTklORikKKyAgICAgIGlmICgheXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQgKHl5bikpCiAJewogCSAgeXluICs9IFlZVEVSUk9SOwogCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQpAQCAtMjkxNywxOSArMzg5NiwxNyBAQAogCVlZQUJPUlQ7CiAKIAotICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7Ci0gICAgICBZWVBPUFNUQUNLOworICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwKKwkJICB5eXN0b3NbeXlzdGF0ZV0sIHl5dnNwKTsKKyAgICAgIFlZUE9QU1RBQ0sgKDEpOwogICAgICAgeXlzdGF0ZSA9ICp5eXNzcDsKICAgICAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CiAgICAgfQogCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQogICAqKyt5eXZzcCA9IHl5bHZhbDsKIAogCi0gIC8qIFNoaWZ0IHRoZSBlcnJvciB0b2tlbi4gKi8KKyAgLyogU2hpZnQgdGhlIGVycm9yIHRva2VuLiAgKi8KICAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXN0b3NbeXluXSwgeXl2c3AsIHl5bHNwKTsKIAogICB5eXN0YXRlID0geXluOwpAQCAtMjk1MCw3ICszOTI3LDcgQEAKICAgeXlyZXN1bHQgPSAxOwogICBnb3RvIHl5cmV0dXJuOwogCi0jaWZuZGVmIHl5b3ZlcmZsb3cKKyNpZiAhZGVmaW5lZCh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI5NjEsMjMgKzM5MzgsMzkgQEAKICNlbmRpZgogCiB5eXJldHVybjoKLSAgaWYgKHl5Y2hhciAhPSBZWUVPRiAmJiB5eWNoYXIgIT0gWVlFTVBUWSkKLSAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKLQkJIHl5dG9rZW4sICZ5eWx2YWwpOworICBpZiAoeXljaGFyICE9IFlZRU1QVFkpCisgICAgeworICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgbGF0ZXN0IGxvb2thaGVhZCB0cmFuc2xhdGlvbi4gIFNlZSBjb21tZW50cyBhdAorICAgICAgICAgdXNlciBzZW1hbnRpYyBhY3Rpb25zIGZvciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICAqLworICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKKyAgICAgICAgICAgICAgICAgIHl5dG9rZW4sICZ5eWx2YWwpOworICAgIH0KKyAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAorICAgICB0aGlzIFlZQUJPUlQgb3IgWVlBQ0NFUFQuICAqLworICBZWVBPUFNUQUNLICh5eWxlbik7CisgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CiAgIHdoaWxlICh5eXNzcCAhPSB5eXNzKQogICAgIHsKICAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBwb3BwaW5nIiwKIAkJICB5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOwotICAgICAgWVlQT1BTVEFDSzsKKyAgICAgIFlZUE9QU1RBQ0sgKDEpOwogICAgIH0KICNpZm5kZWYgeXlvdmVyZmxvdwogICBpZiAoeXlzcyAhPSB5eXNzYSkKICAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOwogI2VuZGlmCi0gIHJldHVybiB5eXJlc3VsdDsKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKyAgaWYgKHl5bXNnICE9IHl5bXNnYnVmKQorICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworI2VuZGlmCisgIC8qIE1ha2Ugc3VyZSBZWUlEIGlzIHVzZWQuICAqLworICByZXR1cm4gWVlJRCAoeXlyZXN1bHQpOwogfQogCiAKLSNsaW5lIDUwMyAiZ3JhbW1hci55IgorCisvKiBMaW5lIDIwNjcgb2YgeWFjYy5jICAqLworI2xpbmUgNzEwICJncmFtbWFyLnkiCiAKIApkaWZmIC0tZ2l0IGEvZ3JhbW1hci55IGIvZ3JhbW1hci55CmluZGV4IGY5YjdjYjEuLmU5Y2M2ZTYgMTAwNjQ0Ci0tLSBhL2dyYW1tYXIueQorKysgYi9ncmFtbWFyLnkKQEAgLTIyLDcgKzIyLDcgQEAKICAqLwogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZ3JhbW1hci55LHYgMS44Ni4yLjkgMjAwNy8wOS8xMiAxOToxNzoyNSBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2dyYW1tYXIueSx2IDEuMTAxIDIwMDctMTEtMTggMDI6MDM6NTIgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtNDUsNiArNDUsNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjZW5kaWYgLyogV0lOMzIgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC01Nyw3ICs1OCw4IEBACiAjaW5jbHVkZSA8bmV0L3BmdmFyLmg+CiAjaW5jbHVkZSA8bmV0L2lmX3BmbG9nLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxwY2FwLW5hbWVkYi5oPgorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CiAKICNpZmRlZiBIQVZFX09TX1BST1RPX0gKICNpbmNsdWRlICJvcy1wcm90by5oIgpAQCAtNjcsNiArNjksOTIgQEAKIAkJCSAocSkuZGlyID0gKGQpLFwKIAkJCSAocSkuYWRkciA9IChhKQogCitzdHJ1Y3QgdG9rIHsKKwlpbnQgdjsJCQkvKiB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKnM7CQkvKiBzdHJpbmcgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGllZWU4MDIxMV90eXBlc1tdID0geworCXsgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEsICJkYXRhIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX01HVCwgIm1ndCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfVFlQRV9NR1QsICJtYW5hZ2VtZW50IiB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwgImN0bCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfVFlQRV9DVEwsICJjb250cm9sIiB9LAorCXsgMCwgTlVMTCB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgaWVlZTgwMjExX21ndF9zdWJ0eXBlc1tdID0geworCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFUSwgImFzc29jcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFUSwgImFzc29jLXJlcSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BU1NPQ19SRVNQLCAiYXNzb2NyZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFU1AsICJhc3NvYy1yZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVRLCAicmVhc3NvY3JlcSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9SRUFTU09DX1JFUSwgInJlYXNzb2MtcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVTUCwgInJlYXNzb2NyZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVTUCwgInJlYXNzb2MtcmVzcCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QUk9CRV9SRVEsICJwcm9iZXJlcSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QUk9CRV9SRVEsICJwcm9iZS1yZXEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFJPQkVfUkVTUCwgInByb2JlcmVzcCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QUk9CRV9SRVNQLCAicHJvYmUtcmVzcCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9CRUFDT04sICJiZWFjb24iIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVRJTSwgImF0aW0iIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfRElTQVNTT0MsICJkaXNhc3NvYyIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ESVNBU1NPQywgImRpc2Fzc29jaWF0aW9uIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FVVEgsICJhdXRoIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FVVEgsICJhdXRoZW50aWNhdGlvbiIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ERUFVVEgsICJkZWF1dGgiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfREVBVVRILCAiZGVhdXRoZW50aWNhdGlvbiIgfSwKKwl7IDAsIE5VTEwgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGllZWU4MDIxMV9jdGxfc3VidHlwZXNbXSA9IHsKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QU19QT0xMLCAicHMtcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9SVFMsICJydHMiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ1RTLCAiY3RzIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDSywgImFjayIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9FTkQsICJjZi1lbmQiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfRU5EX0FDSywgImNmLWVuZC1hY2siIH0sCisJeyAwLCBOVUxMIH0KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBpZWVlODAyMTFfZGF0YV9zdWJ0eXBlc1tdID0geworCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RBVEEsICJkYXRhIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0FDSywgImRhdGEtY2YtYWNrIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX1BPTEwsICJkYXRhLWNmLXBvbGwiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNQTCwgImRhdGEtY2YtYWNrLXBvbGwiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBLCAibnVsbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfQUNLLCAiY2YtYWNrIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9QT0xMLCAiY2YtcG9sbCIgIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBX0NGX0FDUEwsICJjZi1hY2stcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1N8SUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RBVEEsICJxb3MtZGF0YSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1N8SUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0FDSywgInFvcy1kYXRhLWNmLWFjayIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1N8SUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX1BPTEwsICJxb3MtZGF0YS1jZi1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNQTCwgInFvcy1kYXRhLWNmLWFjay1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBLCAicW9zIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBX0NGX1BPTEwsICJxb3MtY2YtcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1N8SUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9BQ1BMLCAicW9zLWNmLWFjay1wb2xsIiB9LAorCXsgMCwgTlVMTCB9Cit9Oworc3RydWN0IHR5cGUydG9rIHsKKwlpbnQgdHlwZTsKKwljb25zdCBzdHJ1Y3QgdG9rICp0b2s7Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0eXBlMnRvayBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tdID0geworCXsgSUVFRTgwMjExX0ZDMF9UWVBFX01HVCwgaWVlZTgwMjExX21ndF9zdWJ0eXBlcyB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwgaWVlZTgwMjExX2N0bF9zdWJ0eXBlcyB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEsIGllZWU4MDIxMV9kYXRhX3N1YnR5cGVzIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBpbnQKK3N0cjJ0b2soY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgdG9rICp0b2tzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgdG9rc1tpXS5zICE9IE5VTEw7IGkrKykgeworCQlpZiAocGNhcF9zdHJjYXNlY21wKHRva3NbaV0ucywgc3RyKSA9PSAwKQorCQkJcmV0dXJuICh0b2tzW2ldLnYpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKwogaW50IG5fZXJyb3JzID0gMDsKIAogc3RhdGljIHN0cnVjdCBxdWFsIHFlcnIgPSB7IFFfVU5ERUYsIFFfVU5ERUYsIFFfVU5ERUYsIFFfVU5ERUYgfTsKQEAgLTc5LDcgKzE2Nyw3IEBACiAJLyogTk9UUkVBQ0hFRCAqLwogfQogCi0jaWZuZGVmIFlZQklTT04KKyNpZmRlZiBORUVEX1lZUEFSU0VfV1JBUFBFUgogaW50IHl5cGFyc2Uodm9pZCk7CiAKIGludApAQCAtMTEzLDYgKzIwMSwxNiBAQAogCWVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJkcm9wIikgPT0gMCB8fAogCQlwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAiYmxvY2siKSA9PSAwKQogCQlyZXR1cm4gKFBGX0RST1ApOworI2lmIEhBVkVfUEZfTkFUX1RIUk9VR0hfUEZfTk9SRFIKKwllbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAicmRyIikgPT0gMCkKKwkJcmV0dXJuIChQRl9SRFIpOworCWVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJuYXQiKSA9PSAwKQorCQlyZXR1cm4gKFBGX05BVCk7CisJZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgImJpbmF0IikgPT0gMCkKKwkJcmV0dXJuIChQRl9CSU5BVCk7CisJZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgIm5vcmRyIikgPT0gMCkKKwkJcmV0dXJuIChQRl9OT1JEUik7CisjZW5kaWYKIAllbHNlIHsKIAkJYnBmX2Vycm9yKCJ1bmtub3duIFBGIGFjdGlvbiIpOwogCQkvKk5PVFJFQUNIRUQqLwpAQCAtMTI0LDYgKzIyMiw5IEBACiB7CiAJYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CiAJLypOT1RSRUFDSEVEKi8KKworCS8qIHRoaXMgaXMgdG8gbWFrZSB0aGUgVkMgY29tcGlsZXIgaGFwcHkgKi8KKwlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEzMSw2ICsyMzIsOSBAQAogewogCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOwogCS8qTk9UUkVBQ0hFRCovCisKKwkvKiB0aGlzIGlzIHRvIG1ha2UgdGhlIFZDIGNvbXBpbGVyIGhhcHB5ICovCisJcmV0dXJuIC0xOwogfQogI2VuZGlmIC8qIEhBVkVfTkVUX1BGVkFSX0ggKi8KICV9CkBAIC0xNTcsNyArMjYxLDcgQEAKICV0eXBlCTxhPglhcnRoIG5hcnRoCiAldHlwZQk8aT4JYnl0ZW9wIHBuYW1lIHBudW0gcmVsb3AgaXJlbG9wCiAldHlwZQk8YmxrPglhbmQgb3IgcGFyZW4gbm90IG51bGwgcHJvZwotJXR5cGUJPHJibGs+CW90aGVyIHBmdmFyCisldHlwZQk8cmJsaz4Jb3RoZXIgcGZ2YXIgcDgwMjExCiAldHlwZQk8aT4JYXRtdHlwZSBhdG1tdWx0aXR5cGUKICV0eXBlCTxibGs+CWF0bWZpZWxkCiAldHlwZQk8YmxrPglhdG1maWVsZHZhbHVlIGF0bXZhbHVlIGF0bWxpc3R2YWx1ZQpAQCAtMTY4LDExICsyNzIsMTIgQEAKIAogJXRva2VuICBEU1QgU1JDIEhPU1QgR0FURVdBWQogJXRva2VuICBORVQgTkVUTUFTSyBQT1JUIFBPUlRSQU5HRSBMRVNTIEdSRUFURVIgUFJPVE8gUFJPVE9DSEFJTiBDQllURQotJXRva2VuICBBUlAgUkFSUCBJUCBTQ1RQIFRDUCBVRFAgSUNNUCBJR01QIElHUlAgUElNIFZSUlAKKyV0b2tlbiAgQVJQIFJBUlAgSVAgU0NUUCBUQ1AgVURQIElDTVAgSUdNUCBJR1JQIFBJTSBWUlJQIENBUlAKICV0b2tlbiAgQVRBTEsgQUFSUCBERUNORVQgTEFUIFNDQSBNT1BSQyBNT1BETAogJXRva2VuICBUS19CUk9BRENBU1QgVEtfTVVMVElDQVNUCiAldG9rZW4gIE5VTSBJTkJPVU5EIE9VVEJPVU5ECiAldG9rZW4gIFBGX0lGTkFNRSBQRl9SU0VUIFBGX1JOUiBQRl9TUk5SIFBGX1JFQVNPTiBQRl9BQ1RJT04KKyV0b2tlbglUWVBFIFNVQlRZUEUgRElSIEFERFIxIEFERFIyIEFERFIzIEFERFI0IFJBIFRBCiAldG9rZW4gIExJTksKICV0b2tlbglHRVEgTEVRIE5FUQogJXRva2VuCUlEIEVJRCBISUQgSElENiBBSUQKQEAgLTE4OSwxNCArMjk0LDE1IEBACiAldG9rZW4JT0FNIE9BTUY0IENPTk5FQ1RNU0cgTUVUQUNPTk5FQ1QKICV0b2tlbglWUEkgVkNJCiAldG9rZW4JUkFESU8KLSV0b2tlbglGSVNVIExTU1UgTVNVCi0ldG9rZW4JU0lPIE9QQyBEUEMgU0xTCisldG9rZW4JRklTVSBMU1NVIE1TVSBIRklTVSBITFNTVSBITVNVCisldG9rZW4JU0lPIE9QQyBEUEMgU0xTIEhTSU8gSE9QQyBIRFBDIEhTTFMKKyAKIAogJXR5cGUJPHM+IElECiAldHlwZQk8ZT4gRUlECiAldHlwZQk8ZT4gQUlECiAldHlwZQk8cz4gSElEIEhJRDYKLSV0eXBlCTxpPiBOVU0gYWN0aW9uIHJlYXNvbgorJXR5cGUJPGk+IE5VTSBhY3Rpb24gcmVhc29uIHR5cGUgc3VidHlwZSB0eXBlX3N1YnR5cGUgZGlyCiAKICVsZWZ0IE9SIEFORAogJW5vbmFzc29jICAnIScKQEAgLTIzOCw2ICszNDQsMTQgQEAKIAl8IEhJRAkJCXsKIAkJCQkgIC8qIERlY2lkZSBob3cgdG8gcGFyc2UgSElEIGJhc2VkIG9uIHByb3RvICovCiAJCQkJICAkJC5xID0gJDxibGs+MC5xOworCQkJCSAgaWYgKCQkLnEuYWRkciA9PSBRX1BPUlQpCisJCQkJICAJYnBmX2Vycm9yKCIncG9ydCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICBlbHNlIGlmICgkJC5xLmFkZHIgPT0gUV9QT1JUUkFOR0UpCisJCQkJICAJYnBmX2Vycm9yKCIncG9ydHJhbmdlJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKKwkJCQkgIGVsc2UgaWYgKCQkLnEuYWRkciA9PSBRX1BST1RPKQorCQkJCSAgCWJwZl9lcnJvcigiJ3Byb3RvJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKKwkJCQkgIGVsc2UgaWYgKCQkLnEuYWRkciA9PSBRX1BST1RPQ0hBSU4pCisJCQkJICAJYnBmX2Vycm9yKCIncHJvdG9jaGFpbicgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICAkJC5iID0gZ2VuX25jb2RlKCQxLCAwLCAkJC5xKTsKIAkJCQl9CiAJfCBISUQ2ICcvJyBOVU0JCXsKQEAgLTMyNSw2ICs0MzksMTIgQEAKIAl8IERTVCBPUiBTUkMJCXsgJCQgPSBRX09SOyB9CiAJfCBTUkMgQU5EIERTVAkJeyAkJCA9IFFfQU5EOyB9CiAJfCBEU1QgQU5EIFNSQwkJeyAkJCA9IFFfQU5EOyB9CisJfCBBRERSMQkJCXsgJCQgPSBRX0FERFIxOyB9CisJfCBBRERSMgkJCXsgJCQgPSBRX0FERFIyOyB9CisJfCBBRERSMwkJCXsgJCQgPSBRX0FERFIzOyB9CisJfCBBRERSNAkJCXsgJCQgPSBRX0FERFI0OyB9CisJfCBSQQkJCXsgJCQgPSBRX1JBOyB9CisJfCBUQQkJCXsgJCQgPSBRX1RBOyB9CiAJOwogLyogYWRkcmVzcyB0eXBlIHF1YWxpZmllcnMgKi8KIGFxdWFsOgkgIEhPU1QJCQl7ICQkID0gUV9IT1NUOyB9CkBAIC0zNDcsNiArNDY3LDcgQEAKIAl8IElHUlAJCQl7ICQkID0gUV9JR1JQOyB9CiAJfCBQSU0JCQl7ICQkID0gUV9QSU07IH0KIAl8IFZSUlAJCQl7ICQkID0gUV9WUlJQOyB9CisJfCBDQVJQIAkJCXsgJCQgPSBRX0NBUlA7IH0KIAl8IEFUQUxLCQkJeyAkJCA9IFFfQVRBTEs7IH0KIAl8IEFBUlAJCQl7ICQkID0gUV9BQVJQOyB9CiAJfCBERUNORVQJCXsgJCQgPSBRX0RFQ05FVDsgfQpAQCAtMzg2LDggKzUwNywxMCBAQAogCXwgTVBMUyBwbnVtCQl7ICQkID0gZ2VuX21wbHMoJDIpOyB9CiAJfCBNUExTCQkJeyAkJCA9IGdlbl9tcGxzKC0xKTsgfQogCXwgUFBQT0VECQl7ICQkID0gZ2VuX3BwcG9lZCgpOyB9Ci0JfCBQUFBPRVMJCXsgJCQgPSBnZW5fcHBwb2VzKCk7IH0KKwl8IFBQUE9FUyBwbnVtCQl7ICQkID0gZ2VuX3BwcG9lcygkMik7IH0KKwl8IFBQUE9FUwkJeyAkJCA9IGdlbl9wcHBvZXMoLTEpOyB9CiAJfCBwZnZhcgkJCXsgJCQgPSAkMTsgfQorCXwgcHF1YWwgcDgwMjExCQl7ICQkID0gJDI7IH0KIAk7CiAKIHBmdmFyOgkgIFBGX0lGTkFNRSBJRAkJeyAkJCA9IGdlbl9wZl9pZm5hbWUoJDIpOyB9CkBAIC0zOTgsNiArNTIxLDc5IEBACiAJfCBQRl9BQ1RJT04gYWN0aW9uCXsgJCQgPSBnZW5fcGZfYWN0aW9uKCQyKTsgfQogCTsKIAorcDgwMjExOiAgIFRZUEUgdHlwZSBTVUJUWVBFIHN1YnR5cGUKKwkJCQl7ICQkID0gZ2VuX3A4MDIxMV90eXBlKCQyIHwgJDQsCisJCQkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwKKwkJCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOworCQkJCX0KKwl8IFRZUEUgdHlwZQkJeyAkJCA9IGdlbl9wODAyMTFfdHlwZSgkMiwKKwkJCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spOworCQkJCX0KKwl8IFNVQlRZUEUgdHlwZV9zdWJ0eXBlCXsgJCQgPSBnZW5fcDgwMjExX3R5cGUoJDIsCisJCQkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwKKwkJCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOworCQkJCX0KKwl8IERJUiBkaXIJCXsgJCQgPSBnZW5fcDgwMjExX2ZjZGlyKCQyKTsgfQorCTsKKwordHlwZToJICBOVU0KKwl8IElECQkJeyAkJCA9IHN0cjJ0b2soJDEsIGllZWU4MDIxMV90eXBlcyk7CisJCQkJICBpZiAoJCQgPT0gLTEpCisJCQkJICAJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSB0eXBlIG5hbWUiKTsKKwkJCQl9CisJOworCitzdWJ0eXBlOiAgTlVNCisJfCBJRAkJCXsgY29uc3Qgc3RydWN0IHRvayAqdHlwZXMgPSBOVUxMOworCQkJCSAgaW50IGk7CisJCQkJICBmb3IgKGkgPSAwOzsgaSsrKSB7CisJCQkJICAJaWYgKGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayA9PSBOVUxMKSB7CisJCQkJICAJCS8qIFJhbiBvdXQgb2YgdHlwZXMgKi8KKwkJCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgdHlwZSIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCQ8aT4tMSA9PSBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50eXBlKSB7CisJCQkJCQl0eXBlcyA9IGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvazsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJICB9CisKKwkJCQkgICQkID0gc3RyMnRvaygkMSwgdHlwZXMpOworCQkJCSAgaWYgKCQkID09IC0xKQorCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIHN1YnR5cGUgbmFtZSIpOworCQkJCX0KKwk7CisKK3R5cGVfc3VidHlwZToJSUQJCXsgaW50IGk7CisJCQkJICBmb3IgKGkgPSAwOzsgaSsrKSB7CisJCQkJICAJaWYgKGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayA9PSBOVUxMKSB7CisJCQkJICAJCS8qIFJhbiBvdXQgb2YgdHlwZXMgKi8KKwkJCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgdHlwZSBuYW1lIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkkJCA9IHN0cjJ0b2soJDEsIGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayk7CisJCQkJCWlmICgkJCAhPSAtMSkgeworCQkJCQkJJCQgfD0gaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udHlwZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJICB9CisJCQkJfQorCQk7CisKK2RpcjoJICBOVU0KKwl8IElECQkJeyBpZiAocGNhcF9zdHJjYXNlY21wKCQxLCAibm9kcyIpID09IDApCisJCQkJCSQkID0gSUVFRTgwMjExX0ZDMV9ESVJfTk9EUzsKKwkJCQkgIGVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcCgkMSwgInRvZHMiKSA9PSAwKQorCQkJCQkkJCA9IElFRUU4MDIxMV9GQzFfRElSX1RPRFM7CisJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoJDEsICJmcm9tZHMiKSA9PSAwKQorCQkJCQkkJCA9IElFRUU4MDIxMV9GQzFfRElSX0ZST01EUzsKKwkJCQkgIGVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcCgkMSwgImRzdG9kcyIpID09IDApCisJCQkJCSQkID0gSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOworCQkJCSAgZWxzZQorCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIGRpcmVjdGlvbiIpOworCQkJCX0KKwk7CisKIHJlYXNvbjoJICBOVU0JCQl7ICQkID0gJDE7IH0KIAl8IElECQkJeyAkJCA9IHBmcmVhc29uX3RvX251bSgkMSk7IH0KIAk7CkBAIC00NzYsMTIgKzY3MiwxOSBAQAogbXRwMnR5cGU6IEZJU1UJCQl7ICQkID0gTV9GSVNVOyB9CiAJfCBMU1NVCQkJeyAkJCA9IE1fTFNTVTsgfQogCXwgTVNVCQkJeyAkJCA9IE1fTVNVOyB9CisJfCBIRklTVQkJCXsgJCQgPSBNSF9GSVNVOyB9CisJfCBITFNTVQkJCXsgJCQgPSBNSF9MU1NVOyB9CisJfCBITVNVCQkJeyAkJCA9IE1IX01TVTsgfQogCTsKIAkvKiBNVFAzIGZpZWxkIHR5cGVzIHF1YW50aWZpZXIgKi8KIG10cDNmaWVsZDogU0lPCQkJeyAkJC5tdHAzZmllbGR0eXBlID0gTV9TSU87IH0KIAl8IE9QQwkJCXsgJCQubXRwM2ZpZWxkdHlwZSA9IE1fT1BDOyB9CiAJfCBEUEMJCQl7ICQkLm10cDNmaWVsZHR5cGUgPSBNX0RQQzsgfQogCXwgU0xTICAgICAgICAgICAgICAgICAgIHsgJCQubXRwM2ZpZWxkdHlwZSA9IE1fU0xTOyB9CisJfCBIU0lPCQkJeyAkJC5tdHAzZmllbGR0eXBlID0gTUhfU0lPOyB9CisJfCBIT1BDCQkJeyAkJC5tdHAzZmllbGR0eXBlID0gTUhfT1BDOyB9CisJfCBIRFBDCQkJeyAkJC5tdHAzZmllbGR0eXBlID0gTUhfRFBDOyB9CisJfCBIU0xTICAgICAgICAgICAgICAgICAgeyAkJC5tdHAzZmllbGR0eXBlID0gTUhfU0xTOyB9CiAJOwogbXRwM3ZhbHVlOiBtdHAzZmllbGR2YWx1ZQogCXwgcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoJDxibGs+MC5tdHAzZmllbGR0eXBlLCAodV9pbnQpJDIsICh1X2ludCkkMSwgMCk7IH0KQEAgLTQ5Myw3ICs2OTYsMTEgQEAKIAlpZiAoJCQubXRwM2ZpZWxkdHlwZSA9PSBNX1NJTyB8fAogCSAgICAkJC5tdHAzZmllbGR0eXBlID09IE1fT1BDIHx8CiAJICAgICQkLm10cDNmaWVsZHR5cGUgPT0gTV9EUEMgfHwKLQkgICAgJCQubXRwM2ZpZWxkdHlwZSA9PSBNX1NMUyApCisJICAgICQkLm10cDNmaWVsZHR5cGUgPT0gTV9TTFMgfHwKKwkgICAgJCQubXRwM2ZpZWxkdHlwZSA9PSBNSF9TSU8gfHwKKwkgICAgJCQubXRwM2ZpZWxkdHlwZSA9PSBNSF9PUEMgfHwKKwkgICAgJCQubXRwM2ZpZWxkdHlwZSA9PSBNSF9EUEMgfHwKKwkgICAgJCQubXRwM2ZpZWxkdHlwZSA9PSBNSF9TTFMpCiAJCSQkLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoJCQubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSAkMSwgQlBGX0pFUSwgMCk7CiAJfQogCTsKZGlmZiAtLWdpdCBhL2llZWU4MDIxMS5oIGIvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczODAzZAotLS0gL2Rldi9udWxsCisrKyBiL2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBBdHN1c2hpIE9ub2UKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IFNhbSBMZWZmbGVyLCBFcnJubyBDb25zdWx0aW5nCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvc3lzL25ldDgwMjExL2llZWU4MDIxMS5oLHYgMS4xMCAyMDA1LzA3LzIyIDE2OjU1OjI3IHNhbSBFeHAgJAorICovCisjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfSF8KKyNkZWZpbmUgX05FVDgwMjExX0lFRUU4MDIxMV9IXworCisvKgorICogODAyLjExIHByb3RvY29sIGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9WRVJTSU9OX01BU0sJCTB4MDMKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9WRVJTSU9OX1NISUZUCQkwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVkVSU0lPTl8wCQkJMHgwMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSwkJCTB4MGMKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9UWVBFX1NISUZUCQkyCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVFlQRV9NR1QJCQkweDAwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVFlQRV9DVEwJCQkweDA0CisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVFlQRV9EQVRBCQkJMHgwOAorCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLCQkweGYwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9TSElGVAkJNAorLyogZm9yIFRZUEVfTUdUICovCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9BU1NPQ19SRVEJCTB4MDAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFU1AJMHgxMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVEJMHgyMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQCTB4MzAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFUQkJMHg0MAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFJPQkVfUkVTUAkweDUwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9CRUFDT04JCTB4ODAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FUSU0JCTB4OTAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RJU0FTU09DCQkweGEwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9BVVRICQkweGIwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9ERUFVVEgJCTB4YzAKKy8qIGZvciBUWVBFX0NUTCAqLworI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFNfUE9MTAkJMHhhMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUlRTCQkweGIwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMJCTB4YzAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDSwkJMHhkMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfRU5ECQkweGUwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9FTkRfQUNLCTB4ZjAKKy8qIGZvciBUWVBFX0RBVEEgKGJpdCBjb21iaW5hdGlvbikgKi8KKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RBVEEJCTB4MDAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0FDSwkJMHgxMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfUE9MTAkJMHgyMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNQTAkJMHgzMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBCQkweDQwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfQUNLCTB4NTAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9QT0xMCTB4NjAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9BQ1BMCTB4NzAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUwkJMHg4MAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TX05VTEwJCTB4YzAKKworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9NQVNLCQkJMHgwMworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9OT0RTCQkJMHgwMAkvKiBTVEEtPlNUQSAqLworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9UT0RTCQkJMHgwMQkvKiBTVEEtPkFQICAqLworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9GUk9NRFMJCTB4MDIJLyogQVAgLT5TVEEgKi8KKyNkZWZpbmUJSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTCQkweDAzCS8qIEFQIC0+QVAgICovCisKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMV9NT1JFX0ZSQUcJCQkweDA0CisjZGVmaW5lCUlFRUU4MDIxMV9GQzFfUkVUUlkJCQkweDA4CisjZGVmaW5lCUlFRUU4MDIxMV9GQzFfUFdSX01HVAkJCTB4MTAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMV9NT1JFX0RBVEEJCQkweDIwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzFfV0VQCQkJMHg0MAorI2RlZmluZQlJRUVFODAyMTFfRkMxX09SREVSCQkJMHg4MAorCisjZGVmaW5lCUlFRUU4MDIxMV9TRVFfRlJBR19NQVNLCQkJMHgwMDBmCisjZGVmaW5lCUlFRUU4MDIxMV9TRVFfRlJBR19TSElGVAkJMAorI2RlZmluZQlJRUVFODAyMTFfU0VRX1NFUV9NQVNLCQkJMHhmZmYwCisjZGVmaW5lCUlFRUU4MDIxMV9TRVFfU0VRX1NISUZUCQkJNAorCisjZGVmaW5lCUlFRUU4MDIxMV9OV0lEX0xFTgkJCTMyCisKKyNkZWZpbmUJSUVFRTgwMjExX1FPU19UWE9QCQkJMHgwMGZmCisvKiBiaXQgOCBpcyByZXNlcnZlZCAqLworI2RlZmluZQlJRUVFODAyMTFfUU9TX0FDS1BPTElDWQkJCTB4NjAKKyNkZWZpbmUJSUVFRTgwMjExX1FPU19BQ0tQT0xJQ1lfUwkJNQorI2RlZmluZQlJRUVFODAyMTFfUU9TX0VTT1AJCQkweDEwCisjZGVmaW5lCUlFRUU4MDIxMV9RT1NfRVNPUF9TCQkJNAorI2RlZmluZQlJRUVFODAyMTFfUU9TX1RJRAkJCTB4MGYKKworI2RlZmluZSBJRUVFODAyMTFfTUdUX1NVQlRZUEVfTkFNRVMgewkJCVwKKwkiYXNzb2MtcmVxIiwJCSJhc3NvYy1yZXNwIiwJCVwKKwkicmVhc3NvYy1yZXEiLAkJInJlYXNzb2MtcmVzcCIsCQlcCisJInByb2JlLXJlcSIsCQkicHJvYmUtcmVzcCIsCQlcCisJInJlc2VydmVkIzYiLAkJInJlc2VydmVkIzciLAkJXAorCSJiZWFjb24iLAkJImF0aW0iLAkJCVwKKwkiZGlzYXNzb2MiLAkJImF1dGgiLAkJCVwKKwkiZGVhdXRoIiwJCSJyZXNlcnZlZCMxMyIsCQlcCisJInJlc2VydmVkIzE0IiwJCSJyZXNlcnZlZCMxNSIJCVwKK30KKworI2RlZmluZSBJRUVFODAyMTFfQ1RMX1NVQlRZUEVfTkFNRVMgewkJCVwKKwkicmVzZXJ2ZWQjMCIsCQkicmVzZXJ2ZWQjMSIsCQlcCisJInJlc2VydmVkIzIiLAkJInJlc2VydmVkIzMiLAkJXAorCSJyZXNlcnZlZCMzIiwJCSJyZXNlcnZlZCM1IiwJCVwKKwkicmVzZXJ2ZWQjNiIsCQkicmVzZXJ2ZWQjNyIsCQlcCisJInJlc2VydmVkIzgiLAkJInJlc2VydmVkIzkiLAkJXAorCSJwcy1wb2xsIiwJCSJydHMiLAkJCVwKKwkiY3RzIiwJCQkiYWNrIiwJCQlcCisJImNmLWVuZCIsCQkiY2YtZW5kLWFjayIJCVwKK30KKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9TVUJUWVBFX05BTUVTIHsJCQlcCisJImRhdGEiLAkJCSJkYXRhLWNmLWFjayIsCQlcCisJImRhdGEtY2YtcG9sbCIsCQkiZGF0YS1jZi1hY2stcG9sbCIsCVwKKwkibnVsbCIsCQkJImNmLWFjayIsCQlcCisJImNmLXBvbGwiLAkJImNmLWFjay1wb2xsIiwJCVwKKwkicW9zLWRhdGEiLAkJInFvcy1kYXRhLWNmLWFjayIsCVwKKwkicW9zLWRhdGEtY2YtcG9sbCIsCSJxb3MtZGF0YS1jZi1hY2stcG9sbCIsCVwKKwkicW9zIiwJCQkicmVzZXJ2ZWQjMTMiLAkJXAorCSJxb3MtY2YtcG9sbCIsCQkicW9zLWNmLWFjay1wb2xsIglcCit9CisKKyNkZWZpbmUgSUVFRTgwMjExX1RZUEVfTkFNRVMJeyAibWd0IiwgImN0bCIsICJkYXRhIiwgInJlc2VydmVkIzQiIH0KKworI2VuZGlmIC8qIF9ORVQ4MDIxMV9JRUVFODAyMTFfSF8gKi8KZGlmZiAtLWdpdCBhL2luZXQuYyBiL2luZXQuYwppbmRleCA4YTQ0NzI4Li42YWU0NmVmIDEwMDY0NAotLS0gYS9pbmV0LmMKKysrIGIvaW5ldC5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2luZXQuYyx2IDEuNjYuMi42IDIwMDcvMDYvMTEgMDk6NTI6MDQgZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9pbmV0LmMsdiAxLjc5IDIwMDgtMDQtMjAgMTg6MTk6MDIgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtMTMzLDYgKzEzMyw3IEBACiAJcGNhcF90ICpwOwogCXBjYXBfaWZfdCAqY3VyZGV2LCAqcHJldmRldiwgKm5leHRkZXY7CiAJaW50IHRoaXNfaW5zdGFuY2U7CisJY2hhciBvcGVuX2VycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKIAogCS8qCiAJICogSXMgdGhlcmUgYWxyZWFkeSBhbiBlbnRyeSBpbiB0aGUgbGlzdCBmb3IgdGhpcyBpbnRlcmZhY2U/CkBAIC0xOTIsMTEgKzE5MywxMSBAQAogCQkJfQogCQkJc3RyY3B5KGVuX25hbWUsICJlbiIpOwogCQkJc3RyY2F0KGVuX25hbWUsIG5hbWUgKyAzKTsKLQkJCXAgPSBwY2FwX29wZW5fbGl2ZShlbl9uYW1lLCA2OCwgMCwgMCwgZXJyYnVmKTsKKwkJCXAgPSBwY2FwX29wZW5fbGl2ZShlbl9uYW1lLCA2OCwgMCwgMCwgb3Blbl9lcnJidWYpOwogCQkJZnJlZShlbl9uYW1lKTsKIAkJfSBlbHNlCiAjZW5kaWYgLyogX19BUFBMRSAqLwotCQlwID0gcGNhcF9vcGVuX2xpdmUobmFtZSwgNjgsIDAsIDAsIGVycmJ1Zik7CisJCXAgPSBwY2FwX29wZW5fbGl2ZShuYW1lLCA2OCwgMCwgMCwgb3Blbl9lcnJidWYpOwogCQlpZiAocCA9PSBOVUxMKSB7CiAJCQkvKgogCQkJICogTm8uICBEb24ndCBib3RoZXIgaW5jbHVkaW5nIGl0LgpAQCAtMzU2LDYgKzM1Nyw1MiBAQAogCXJldHVybiAoMCk7CiB9CiAKKy8qCisgKiBYWFggLSBvbiBGcmVlQlNEcyB0aGF0IHN1cHBvcnQgaXQsIHNob3VsZCBpdCBnZXQgdGhlIHN5c2N0bCBuYW1lZAorICogImRldi57YWRhcHRlciBmYW1pbHkgbmFtZX0ue2FkYXB0ZXIgdW5pdH0uJWRlc2MiIHRvIGdldCBhIGRlc2NyaXB0aW9uCisgKiBvZiB0aGUgYWRhcHRlcj8gIE5vdGUgdGhhdCAiZGV2LmFuLjAuJWRlc2MiIGlzICJBaXJvbmV0IFBDNDUwMC9QQzQ4MDAiCisgKiB3aXRoIG15IENpc2NvIDM1MCBjYXJkLCBzbyB0aGUgbmFtZSBpc24ndCBlbnRpcmVseSBkZXNjcmlwdGl2ZS4gIFRoZQorICogImRldi5hbi4wLiVwbnBpbmZvIiBoYXMgYSBiZXR0ZXIgZGVzY3JpcHRpb24sIGFsdGhvdWdoIG9uZSBtaWdodCBhcmd1ZQorICogdGhhdCB0aGUgcHJvYmxlbSBpcyByZWFsbHkgYSBkcml2ZXIgYnVnIC0gaWYgaXQgY2FuIGZpbmQgb3V0IHRoYXQgaXQncworICogYSBDaXNjbyAzNDAgb3IgMzUwLCByYXRoZXIgdGhhbiBhbiBvbGQgQWlyb25ldCBjYXJkLCBpdCBzaG91bGQgdXNlCisgKiB0aGF0IGluIHRoZSBkZXNjcmlwdGlvbi4KKyAqCisgKiBEbyBOZXRCU0QsIERyYWdvbmZseUJTRCwgb3IgT3BlbkJTRCBzdXBwb3J0IHRoaXMgYXMgd2VsbD8gIEZyZWVCU0QKKyAqIGFuZCBPcGVuQlNEIGxldCB5b3UgZ2V0IGEgZGVzY3JpcHRpb24sIGJ1dCBpdCdzIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIE9TLAorICogaXQncyBzZXQgd2l0aCBhbm90aGVyIGlvY3RsIHRoYXQgaWZjb25maWcgc3VwcG9ydHM7IHdlIHVzZSB0aGF0IHRvIGdldAorICogYSBkZXNjcmlwdGlvbiBpbiBGcmVlQlNEIGFuZCBPcGVuQlNELCBidXQgaWYgdGhlcmUgaXMgbm8gc3VjaAorICogZGVzY3JpcHRpb24gYXZhaWxhYmxlLCBpdCBzdGlsbCBtaWdodCBiZSBuaWNlIHRvIGdldCBzb21lIGRlc2NyaXB0aW9uCisgKiBzdHJpbmcgYmFzZWQgb24gdGhlIGRldmljZSB0eXBlIG9yIHNvbWV0aGluZyBzdWNoIGFzIHRoYXQuCisgKgorICogSW4gT1MgWCwgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIGZyYW1ld29yayBjYW4gYXBwYXJlbnRseSByZXR1cm4KKyAqIG5hbWVzIGluIDEwLjQgYW5kIGxhdGVyLgorICoKKyAqIEl0IGFsc28gYXBwZWFycyB0aGF0IGZyZWVkZXNrdG9wLm9yZydzIEhBTCBvZmZlcnMgYW4gImluZm8ucHJvZHVjdCIKKyAqIHN0cmluZywgYnV0IHRoZSBIQUwgc3BlY2lmaWNhdGlvbiBzYXlzIGl0ICJzaG91bGQgbm90IGJlIHVzZWQgaW4gYW55CisgKiBVSSIgYW5kICJzdWJzeXN0ZW0vY2FwYWJpbGl0eSBzcGVjaWZpYyBwcm9wZXJ0aWVzIiBzaG91bGQgYmUgdXNlZAorICogaW5zdGVhZCBhbmQsIGluIGFueSBjYXNlLCBJIHRoaW5rIEhBTCBpcyBiZWluZyBkZXByZWNhdGVkIGluCisgKiBmYXZvciBvZiBvdGhlciBzdHVmZiBzdWNoIGFzIERldmljZUtpdC4gIERldmljZUtpdCBkb2Vzbid0IGFwcGVhcgorICogdG8gaGF2ZSBhbnkgb2J2aW91cyBwcm9kdWN0IGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLCBidXQgbWF5YmUKKyAqIEkgaGF2ZW4ndCBsb29rZWQgaGFyZCBlbm91Z2guCisgKgorICogVXNpbmcgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIGZyYW1ld29yaywgb3IgSEFMLCBvciBEZXZpY2VLaXQsIG9yCisgKiB3aGF0ZXZlciwgd291bGQgcmVxdWlyZSB0aGF0IGxpYnBjYXAgYXBwbGljYXRpb25zIGJlIGxpbmtlZCB3aXRoCisgKiB0aGUgZnJhbWV3b3Jrcy9saWJyYXJpZXMgaW4gcXVlc3Rpb24uICBUaGF0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0KKyAqIGZvciBwcm9ncmFtcyBsaW5raW5nIHdpdGggdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIGxpYnBjYXAgKHVubGVzcworICogeW91J3JlIHJ1bm5pbmcgb24gQUlYIC0gd2hpY2ggSSB0aGluayBpcyB0aGUgb25seSBVTipYIHRoYXQgZG9lc24ndAorICogc3VwcG9ydCBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBvdGhlciBsaWJyYXJpZXMgb24gd2hpY2ggaXQKKyAqIGRlcGVuZHMsIGFuZCBoYXZpbmcgYW4gZXhlY3V0YWJsZSBsaW5rZWQgb25seSB3aXRoIHRoZSBmaXJzdCBzaGFyZWQKKyAqIGxpYnJhcnkgYXV0b21hdGljYWxseSBwaWNrIHVwIHRoZSBvdGhlciBsaWJyYXJpZXMgd2hlbiBzdGFydGVkIC0KKyAqIGFuZCB1c2luZyBIQUwgb3Igd2hhdGV2ZXIpLiAgUHJvZ3JhbXMgbGlua2VkIHdpdGggdGhlIHN0YXRpYworICogdmVyc2lvbiBvZiBsaWJwY2FwIHdvdWxkIGhhdmUgdG8gdXNlIHBjYXAtY29uZmlnIHdpdGggdGhlIC0tc3RhdGljCisgKiBmbGFnIGluIG9yZGVyIHRvIGdldCB0aGUgcmlnaHQgbGlua2VyIGZsYWdzIGluIG9yZGVyIHRvIHBpY2sgdXAKKyAqIHRoZSBhZGRpdGlvbmFsIGxpYnJhcmllcy9mcmFtZXdvcmtzOyB0aG9zZSBwcm9ncmFtcyBuZWVkIHRoYXQgYW55d2F5CisgKiBmb3IgbGlicGNhcCAxLjEgYW5kIGJleW9uZCBvbiBMaW51eCwgYXMsIGJ5IGRlZmF1bHQsIGl0IHJlcXVpcmVzCisgKiAtbG5sLgorICoKKyAqIERvIGFueSBvdGhlciBVTipYZXMsIG9yIGRlc2t0b3AgZW52aXJvbm1lbnRzIHN1cHBvcnQgZ2V0dGluZyBhCisgKiBkZXNjcmlwdGlvbj8KKyAqLwogaW50CiBhZGRfYWRkcl90b19pZmxpc3QocGNhcF9pZl90ICoqYWxsZGV2cywgY29uc3QgY2hhciAqbmFtZSwgdV9pbnQgZmxhZ3MsCiAgICAgc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcl9zaXplLApAQCAtMzY1LDE0ICs0MTIsOTAgQEAKICAgICBjaGFyICplcnJidWYpCiB7CiAJcGNhcF9pZl90ICpjdXJkZXY7CisJY2hhciAqZGVzY3JpcHRpb24gPSBOVUxMOwogCXBjYXBfYWRkcl90ICpjdXJhZGRyLCAqcHJldmFkZHIsICpuZXh0YWRkcjsKKyNpZmRlZiBTSU9DR0lGREVTQ1IKKwlpbnQgczsKKwlzdHJ1Y3QgaWZyZXEgaWZyZGVzYzsKKyNpZm5kZWYgSUZERVNDUlNJWkUKKwlzaXplX3QgZGVzY3JsZW4gPSA2NDsKKyNlbHNlCisJc2l6ZV90IGRlc2NybGVuID0gSUZERVNDUlNJWkU7CisjZW5kaWYgLyogSUZERVNDUlNJWkUgKi8KKyNlbmRpZiAvKiBTSU9DR0lGREVTQ1IgKi8KIAotCWlmIChhZGRfb3JfZmluZF9pZigmY3VyZGV2LCBhbGxkZXZzLCBuYW1lLCBmbGFncywgTlVMTCwgZXJyYnVmKSA9PSAtMSkgeworI2lmZGVmIFNJT0NHSUZERVNDUgorCS8qCisJICogR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGludGVyZmFjZS4KKwkgKi8KKwltZW1zZXQoJmlmcmRlc2MsIDAsIHNpemVvZiBpZnJkZXNjKTsKKwlzdHJsY3B5KGlmcmRlc2MuaWZyX25hbWUsIG5hbWUsIHNpemVvZiBpZnJkZXNjLmlmcl9uYW1lKTsKKwlzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChzID49IDApIHsKKyNpZmRlZiBfX0ZyZWVCU0RfXworCQkvKgorCQkgKiBPbiBGcmVlQlNELCBpZiB0aGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggZm9yIHRoZQorCQkgKiBkZXNjcmlwdGlvbiwgdGhlIGlvY3RsIHN1Y2NlZWRzLCBidXQgdGhlIGRlc2NyaXB0aW9uCisJCSAqIGlzbid0IGNvcGllZCwgaWZyX2J1ZmZlci5sZW5ndGggaXMgc2V0IHRvIHRoZSBkZXNjcmlwdGlvbgorCQkgKiBsZW5ndGgsIGFuZCBpZnJfYnVmZmVyLmJ1ZmZlciBpcyBzZXQgdG8gTlVMTC4KKwkJICovCisJCWZvciAoOzspIHsKKwkJCWZyZWUoZGVzY3JpcHRpb24pOworCQkJaWYgKChkZXNjcmlwdGlvbiA9IG1hbGxvYyhkZXNjcmxlbikpICE9IE5VTEwpIHsKKwkJCQlpZnJkZXNjLmlmcl9idWZmZXIuYnVmZmVyID0gZGVzY3JpcHRpb247CisJCQkJaWZyZGVzYy5pZnJfYnVmZmVyLmxlbmd0aCA9IGRlc2NybGVuOworCQkJCWlmIChpb2N0bChzLCBTSU9DR0lGREVTQ1IsICZpZnJkZXNjKSA9PSAwKSB7CisJCQkJCWlmIChpZnJkZXNjLmlmcl9idWZmZXIuYnVmZmVyID09CisJCQkJCSAgICBkZXNjcmlwdGlvbikKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlCisJCQkJCQlkZXNjcmxlbiA9IGlmcmRlc2MuaWZyX2J1ZmZlci5sZW5ndGg7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogRmFpbGVkIHRvIGdldCBpbnRlcmZhY2UgZGVzY3JpcHRpb24uCisJCQkJCSAqLworCQkJCQlmcmVlKGRlc2NyaXB0aW9uKTsKKwkJCQkJZGVzY3JpcHRpb24gPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlicmVhazsKKwkJfQorI2Vsc2UgLyogX19GcmVlQlNEX18gKi8KKwkJLyoKKwkJICogVGhlIG9ubHkgb3RoZXIgT1MgdGhhdCBjdXJyZW50bHkgc3VwcG9ydHMKKwkJICogU0lPQ0dJRkRFU0NSIGlzIE9wZW5CU0QsIGFuZCBpdCBoYXMgbm8gd2F5CisJCSAqIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIC0gaXQncyBjbGFtcGVkCisJCSAqIHRvIGEgbWF4aW11bSBvZiBJRkRFU0NSU0laRS4KKwkJICovCisJCWlmICgoZGVzY3JpcHRpb24gPSBtYWxsb2MoZGVzY3JsZW4pKSAhPSBOVUxMKSB7CisJCQlpZnJkZXNjLmlmcl9kYXRhID0gKGNhZGRyX3QpZGVzY3JpcHRpb247CisJCQlpZiAoaW9jdGwocywgU0lPQ0dJRkRFU0NSLCAmaWZyZGVzYykgIT0gMCkgeworCQkJCS8qCisJCQkJICogRmFpbGVkIHRvIGdldCBpbnRlcmZhY2UgZGVzY3JpcHRpb24uCisJCQkJICovCisJCQkJZnJlZShkZXNjcmlwdGlvbik7CisJCQkJZGVzY3JpcHRpb24gPSBOVUxMOworCQkJfQorCQl9CisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKwkJY2xvc2Uocyk7CisJCWlmIChkZXNjcmlwdGlvbiAhPSBOVUxMICYmIHN0cmxlbihkZXNjcmlwdGlvbikgPT0gMCkgeworCQkJZnJlZShkZXNjcmlwdGlvbik7CisJCQlkZXNjcmlwdGlvbiA9IE5VTEw7CisJCX0KKwl9CisjZW5kaWYgLyogU0lPQ0dJRkRFU0NSICovCisKKwlpZiAoYWRkX29yX2ZpbmRfaWYoJmN1cmRldiwgYWxsZGV2cywgbmFtZSwgZmxhZ3MsIGRlc2NyaXB0aW9uLAorCSAgICBlcnJidWYpID09IC0xKSB7CisJCWZyZWUoZGVzY3JpcHRpb24pOwogCQkvKgogCQkgKiBFcnJvciAtIGdpdmUgdXAuCiAJCSAqLwogCQlyZXR1cm4gKC0xKTsKIAl9CisJZnJlZShkZXNjcmlwdGlvbik7CiAJaWYgKGN1cmRldiA9PSBOVUxMKSB7CiAJCS8qCiAJCSAqIERldmljZSB3YXNuJ3QgYWRkZWQgYmVjYXVzZSBpdCBjYW4ndCBiZSBvcGVuZWQuCkBAIC02MDgsNiArNzMxLDE1IEBACiAjaWZkZWYgSEFWRV9TRVBURUxfQVBJCiAJICAgIHx8IHN0cnN0cihkZXZpY2UsICJzZXB0ZWwiKSAhPSBOVUxMCiAjZW5kaWYKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfQlQKKwkgICAgfHwgc3Ryc3RyKGRldmljZSwgImJsdWV0b290aCIpICE9IE5VTEwKKyNlbmRpZgorI2lmZGVmIFBDQVBfU1VQUE9SVF9VU0IKKwkgICAgfHwgc3Ryc3RyKGRldmljZSwgInVzYm1vbiIpICE9IE5VTEwKKyNlbmRpZgorI2lmZGVmIEhBVkVfU05GX0FQSQorCSAgICB8fCBzdHJzdHIoZGV2aWNlLCAic25mIikgIT0gTlVMTAorI2VuZGlmCiAJICAgICkgewogCQkqbmV0cCA9ICptYXNrcCA9IDA7CiAJCXJldHVybiAwOwpAQCAtNjM5LDYgKzc3MSwxMiBAQAogCX0KIAlzaW40ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZnIuaWZyX2FkZHI7CiAJKm5ldHAgPSBzaW40LT5zaW5fYWRkci5zX2FkZHI7CisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKyNpZmRlZiBsaW51eAorCS8qIFhYWCBXb3JrIGFyb3VuZCBMaW51eCBrZXJuZWwgYnVnICovCisJaWZyLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisjZW5kaWYKKwkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAJaWYgKGlvY3RsKGZkLCBTSU9DR0lGTkVUTUFTSywgKGNoYXIgKikmaWZyKSA8IDApIHsKIAkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIlNJT0NHSUZORVRNQVNLOiAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKQEAgLTc0MCw4ICs4NzgsMTAgQEAKIAkJICovCiAJCXdoaWxlKE5BZGFwdHMtLSkKIAkJewotCQkJc3RyY3B5KChjaGFyKil0VXN0ciwgdEFzdHIpOwotCQkJKGNoYXIqKXRVc3RyICs9IHN0cmxlbih0QXN0cikgKyAxOzsKKwkJCWNoYXIqIHRtcCA9IChjaGFyKil0VXN0cjsKKwkJCXN0cmNweSh0bXAsIHRBc3RyKTsKKwkJCXRtcCArPSBzdHJsZW4odEFzdHIpICsgMTsKKwkJCXRVc3RyID0gKFdDSEFSKil0bXA7CiAJCQl0QXN0ciArPSBzdHJsZW4odEFzdHIpICsgMTsKIAkJfQogCmRpZmYgLS1naXQgYS9sYmwvb3MtYWl4NC5oIGIvbGJsL29zLWFpeDQuaAppbmRleCBmN2VkYjYyLi5jNWRmY2UyIDEwMDY0NAotLS0gYS9sYmwvb3MtYWl4NC5oCisrKyBiL2xibC9vcy1haXg0LmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGJsL29zLWFpeDQuaCx2IDEuMSAyMDAyLzA2LzAxIDA5OjM3OjQwIGd1eSBFeHAgJAorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3MtYWl4NC5oLHYgMS4xIDIwMDItMDYtMDEgMDk6Mzc6NDAgZ3V5IEV4cCAkCiAgKi8KIAogLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIEFJWCA0LnggKi8KZGlmZiAtLWdpdCBhL2xibC9vcy1ocHV4MTEuaCBiL2xibC9vcy1ocHV4MTEuaAppbmRleCA1NWE3OWU1Li41ZTMyNWE5IDEwMDY0NAotLS0gYS9sYmwvb3MtaHB1eDExLmgKKysrIGIvbGJsL29zLWhwdXgxMS5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2xibC9vcy1ocHV4MTEuaCx2IDEuMSAyMDAyLzA2LzAxIDA5OjM3OjQxIGd1eSBFeHAgJAorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3MtaHB1eDExLmgsdiAxLjEgMjAwMi0wNi0wMSAwOTozNzo0MSBndXkgRXhwICQKICAqLwogCiAvKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gSFAtVVggMTEueCAqLwpkaWZmIC0tZ2l0IGEvbGJsL29zLW9zZjQuaCBiL2xibC9vcy1vc2Y0LmgKaW5kZXggYWJiMjA3ZS4uNjBhYmNkOSAxMDA2NDQKLS0tIGEvbGJsL29zLW9zZjQuaAorKysgYi9sYmwvb3Mtb3NmNC5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2xibC9vcy1vc2Y0LmgsdiAxLjIgMjAwMC8xMi8yMiAxMTo1MTozMyBndXkgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGJsL29zLW9zZjQuaCx2IDEuMiAyMDAwLTEyLTIyIDExOjUxOjMzIGd1eSBFeHAgJCAoTEJMKQogICovCiAKIC8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBEaWdpdGFsIFVOSVggNC54ICovCmRpZmYgLS1naXQgYS9sYmwvb3Mtb3NmNS5oIGIvbGJsL29zLW9zZjUuaAppbmRleCAzMzhjYWE4Li4xZWJjYWM2IDEwMDY0NAotLS0gYS9sYmwvb3Mtb3NmNS5oCisrKyBiL2xibC9vcy1vc2Y1LmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGJsL29zLW9zZjUuaCx2IDEuMiAyMDAyLzA4LzAyIDAzOjI0OjE1IGd1eSBFeHAgJCAoTEJMKQorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3Mtb3NmNS5oLHYgMS4yIDIwMDItMDgtMDIgMDM6MjQ6MTUgZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2xibC9vcy1zb2xhcmlzMi5oIGIvbGJsL29zLXNvbGFyaXMyLmgKaW5kZXggNWRlMmM2ZS4uZmFlMmFhMyAxMDA2NDQKLS0tIGEvbGJsL29zLXNvbGFyaXMyLmgKKysrIGIvbGJsL29zLXNvbGFyaXMyLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGJsL29zLXNvbGFyaXMyLmgsdiAxLjE5IDIwMDAvMTAvMTEgMDQ6MDI6NTIgZ3V5IEV4cCAkIChMQkwpCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2xibC9vcy1zb2xhcmlzMi5oLHYgMS4xOSAyMDAwLTEwLTExIDA0OjAyOjUyIGd1eSBFeHAgJCAoTEJMKQogICovCiAKIC8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBTdW5PUyA1ICovCmRpZmYgLS1naXQgYS9sYmwvb3Mtc3Vub3M0LmggYi9sYmwvb3Mtc3Vub3M0LmgKaW5kZXggZmQ4ZjUwOC4uY2ZkNGIwNCAxMDA2NDQKLS0tIGEvbGJsL29zLXN1bm9zNC5oCisrKyBiL2xibC9vcy1zdW5vczQuaApAQCAtMTgsNyArMTgsNyBAQAogICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3Mtc3Vub3M0LmgsdiAxLjMyLjEuMSAxOTk5LzEwLzA3IDIzOjQ2OjQxIG1jciBFeHAgJCAoTEJMKQorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3Mtc3Vub3M0LmgsdiAxLjMyIDE5OTktMTAtMDcgMjM6NDY6NDEgbWNyIEV4cCAkIChMQkwpCiAgKi8KIAogLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFN1bk9TIDQgKi8KZGlmZiAtLWdpdCBhL2xibC9vcy11bHRyaXg0LmggYi9sYmwvb3MtdWx0cml4NC5oCmluZGV4IGJkOTMxYjMuLjlmMmExNTUgMTAwNjQ0Ci0tLSBhL2xibC9vcy11bHRyaXg0LmgKKysrIGIvbGJsL29zLXVsdHJpeDQuaApAQCAtMTgsNyArMTgsNyBAQAogICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3MtdWx0cml4NC5oLHYgMS4xOS4xLjEgMTk5OS8xMC8wNyAyMzo0Njo0MSBtY3IgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGJsL29zLXVsdHJpeDQuaCx2IDEuMTkgMTk5OS0xMC0wNyAyMzo0Njo0MSBtY3IgRXhwICQgKExCTCkKICAqLwogCiAvKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gVWx0cml4IDQgKi8KZGlmZiAtLWdpdCBhL2xsYy5oIGIvbGxjLmgKaW5kZXggZmZkM2E2MC4uYjhjMjIxZiAxMDA2NDQKLS0tIGEvbGxjLmgKKysrIGIvbGxjLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGxjLmgsdiAxLjIgMjAwMS8wMS8yOCAwOTo0NDo1MCBndXkgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGxjLmgsdiAxLjIgMjAwMS0wMS0yOCAwOTo0NDo1MCBndXkgRXhwICQgKExCTCkKICAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvbWlzc2luZy9zbnByaW50Zi5jIGIvbWlzc2luZy9zbnByaW50Zi5jCmluZGV4IDljMGE2ZWUuLjg5OTFmMjQgMTAwNjQ0Ci0tLSBhL21pc3Npbmcvc25wcmludGYuYworKysgYi9taXNzaW5nL3NucHJpbnRmLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqIFNVQ0ggREFNQUdFLgogICovCiAKLS8qICRJZDogc25wcmludGYuYyx2IDEuMSAyMDA0LzA0LzA1IDIyOjQzOjUxIGd1eSBFeHAgJCAqLworLyogJElkOiBzbnByaW50Zi5jLHYgMS4xIDIwMDQtMDQtMDUgMjI6NDM6NTEgZ3V5IEV4cCAkICovCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjaW5jbHVkZSA8Y29uZmlnLmg+CkBAIC0zOSw3ICszOSw3IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9taXNzaW5nL3NucHJpbnRmLmMsdiAxLjEgMjAwNC8wNC8wNSAyMjo0Mzo1MSBndXkgRXhwICQiOworICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9taXNzaW5nL3NucHJpbnRmLmMsdiAxLjEgMjAwNC0wNC0wNSAyMjo0Mzo1MSBndXkgRXhwICQiOwogI2VuZGlmCiAKICNpbmNsdWRlIDxzdGRpby5oPgpkaWZmIC0tZ2l0IGEvbWtkZXAgYi9ta2RlcAppbmRleCAyYTljMjIxLi5iZmU0YTI2IDEwMDc1NQotLS0gYS9ta2RlcAorKysgYi9ta2RlcApAQCAtMTMsMTEgKzEzLDEyIEBACiAjCUAoIylta2RlcC5zaAk1LjExIChCZXJrZWxleSkgNS81Lzg4CiAjCiAKLVBBVEg9L2JpbjovdXNyL2JpbjovdXNyL3VjYjovdXNyL2xvY2FsOi91c3IvbG9jYWwvYmluCitQQVRIPS9iaW46L3Vzci9iaW46L3Vzci91Y2I6L3Vzci9sb2NhbDovdXNyL2xvY2FsL2JpbjovdXNyL3Nmdy9iaW4KIGV4cG9ydCBQQVRICiAKIE1BS0U9TWFrZWZpbGUJCQkjIGRlZmF1bHQgbWFrZWZpbGUgbmFtZSBpcyAiTWFrZWZpbGUiCiBDQz1jYwkJCQkjIGRlZmF1bHQgQyBjb21waWxlciBpcyAiY2MiCitERVBFTkRFTkNZX0NGTEFHPS1NCQkjIGRlZmF1bHQgZGVwZW5kZW5jeS1nZW5lcmF0aW9uIGZsYWcgaXMgLU0KIAogd2hpbGUgOgogCWRvIGNhc2UgIiQxIiBpbgpAQCAtMzEsNiArMzIsMTEgQEAKIAkJCU1BS0U9JDIKIAkJCXNoaWZ0OyBzaGlmdCA7OwogCisJCSMgLW0gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkZXBlbmRlbmN5LWdlbmVyYXRpb24gZmxhZworCQktbSkKKwkJCURFUEVOREVOQ1lfQ0ZMQUc9JDIKKwkJCXNoaWZ0OyBzaGlmdCA7OworCiAJCSMgdGhlIC1wIGZsYWcgcHJvZHVjZXMgInByb2dyYW06IHByb2dyYW0uYyIgc3R5bGUgZGVwZW5kZW5jaWVzCiAJCSMgc28gLm8ncyBkb24ndCBnZXQgcHJvZHVjZWQKIAkJLXApCkBAIC00Miw3ICs0OCw3IEBACiBkb25lCiAKIGlmIFsgJCMgPSAwIF0gOyB0aGVuCi0JZWNobyAndXNhZ2U6IG1rZGVwIFstcF0gWy1jIGNjXSBbLWYgbWFrZWZpbGVdIFtmbGFnc10gZmlsZSAuLi4nCisJZWNobyAndXNhZ2U6IG1rZGVwIFstcF0gWy1jIGNjXSBbLWYgbWFrZWZpbGVdIFstbSBkZXBlbmRlbmN5LWNmbGFnXSBbZmxhZ3NdIGZpbGUgLi4uJwogCWV4aXQgMQogZmkKIApAQCAtNzQsNyArODAsNyBAQAogIyBzZWQgLWUgJ3MvOlteIl0qIlwoW14iXSpcKSIuKi86IFwxLycgLWUgJ3MvXC5jLy5vLycgfAogCiAjIFhYWCB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIHRoaW5ncyBsaWtlICItRERFQ0xXQUlUU1RBVFVTPXVuaW9uXCB3YWl0IgotJENDIC1NICQqIHwKKyRDQyAkREVQRU5ERU5DWV9DRkxBRyAkKiB8CiBzZWQgIgogCXM7IFwuLzsgO2cKIAkkU0VEIiB8CmRpZmYgLS1naXQgYS9tc2Rvcy9iaW4yYy5jIGIvbXNkb3MvYmluMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODIwNTZlCi0tLSAvZGV2L251bGwKKysrIGIvbXNkb3MvYmluMmMuYwpAQCAtMCwwICsxLDQzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0ZGFyZy5oPg0KKyNpbmNsdWRlIDx0aW1lLmg+DQorDQorc3RhdGljIHZvaWQgQWJvcnQgKGNoYXIgKmZtdCwuLi4pDQorew0KKyAgdmFfbGlzdCBhcmdzOw0KKyAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7DQorICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOw0KKyAgdmFfZW5kIChhcmdzKTsNCisgIGV4aXQgKDEpOw0KK30NCisNCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KK3sNCisgIEZJTEUgICppbkZpbGU7DQorICBGSUxFICAqb3V0RmlsZSA9IHN0ZG91dDsNCisgIHRpbWVfdCBub3cgICAgID0gdGltZSAoTlVMTCk7DQorICBpbnQgICAgY2gsIGk7DQorDQorICBpZiAoYXJnYyAhPSAyKQ0KKyAgICAgQWJvcnQgKCJVc2FnZTogJXMgYmluLWZpbGUgWz4gcmVzdWx0XSIsIGFyZ3ZbMF0pOw0KKw0KKyAgaWYgKChpbkZpbGUgPSBmb3Blbihhcmd2WzFdLCJyYiIpKSA9PSBOVUxMKQ0KKyAgICAgQWJvcnQgKCJDYW5ub3Qgb3BlbiAlc1xuIiwgYXJndlsxXSk7DQorDQorICBmcHJpbnRmIChvdXRGaWxlLA0KKyAgICAgICAgICAgIi8qIGRhdGEgc3RhdGVtZW50cyBmb3IgZmlsZSAlcyBhdCAlLjI0cyAqL1xuIg0KKyAgICAgICAgICAgIi8qIEdlbmVyYXRlZCBieSBCSU4yQywgRy5WYW5lbSAxOTk1ICovXG4iLA0KKyAgICAgICAgICAgYXJndlsxXSwgY3RpbWUoJm5vdykpOw0KKw0KKyAgaSA9IDA7DQorICB3aGlsZSAoKGNoID0gZmdldGMoaW5GaWxlKSkgIT0gRU9GKQ0KKyAgew0KKyAgICBpZiAoaSsrICUgMTIgPT0gMCkNCisgICAgICAgZnB1dHMgKCJcbiAgIiwgb3V0RmlsZSk7DQorICAgIGZwcmludGYgKG91dEZpbGUsICIweCUwMlgsIiwgY2gpOw0KKyAgfQ0KKyAgZnB1dGMgKCdcbicsIG91dEZpbGUpOw0KKyAgZmNsb3NlIChpbkZpbGUpOw0KKyAgcmV0dXJuICgwKTsNCit9DQpkaWZmIC0tZ2l0IGEvbXNkb3MvY29tbW9uLmRqIGIvbXNkb3MvY29tbW9uLmRqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjRkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9jb21tb24uZGoKQEAgLTAsMCArMSw4MCBAQAorIworIyBDb21tb24gZGVmaW5lcyBmb3IgbGlicGNhcCBhbmQgMTYvMzItYml0IG5ldHdvcmsgZHJpdmVycyAoZGpncHApCisjCisjIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbXNkb3MvY29tbW9uLmRqLHYgMS4yIDIwMDQtMTItMTkgMTk6MzY6MzMgZ3V5IEV4cCAkIChMQkwpCisKKy5TVUZGSVhFUzogLmV4ZSAud2xtIC5keGUgLmwgLnkKKy5QSE9OWTogICAgY2hlY2tfZ2NjbGliCisKK2RlZmF1bHQ6IGNoZWNrX2djY2xpYiBhbGwKKworR0NDTElCICAgPSAvZGpncHAvbGliL2djYy1saWIvZGpncHAvMy4zMQorTUFLRUZJTEUgPSBNYWtlZmlsZS5kagorCisjCisjIERMWCAyLjkxKyBsaWIuIENoYW5nZSBwYXRoIHRvIHN1aXRlLgorIyBOb3QgdXNlZCBhbnltb3JlLiBVc2VzIERYRTMgbm93LgorIworIyBETFhfTElCICA9ICQoREpESVIpL2NvbnRyaWIvZGx4LjI5MS9saWJkbHguYQorIyBETFhfTElOSyA9ICQoREpESVIpL2Jpbi9kbHhnZW4uZXhlCisKK1dBVFQzMl9ST09UID0gJChzdWJzdCBcLC8sJChXQVRUX1JPT1QpKQorCisKK2lmZXEgKCQod2lsZGNhcmQgJChHQ0NMSUIpL2xpYmdjYy5hKSwpCitjaGVja19nY2NsaWI6CisJQGVjaG8gbGliZ2NjLmEgbm90IGZvdW5kLiBTZXQgXCIkKEdDQ0xJQilcIiB0byBcIi9kamdwcC9saWIvZ2NjLWxpYi9kamdwcC8zLlhcIgorZW5kaWYKKworCisjCisjIEluY2x1ZGUgMzItYml0IGRyaXZlciBzdXBwb3J0CisjCitVU0VfMzJCSVRfRFJJVkVSUyA9IDAKKworIworIyBVc2UgbG9hZGFibGUgZHJpdmVyIG1vZHVsZXMgaW5zdGVhZCBvZiBzdGF0aWNhbGx5IGxpbmtpbmcKKyMgYWxsIGRyaXZlcnMuCisjCitVU0VfMzJCSVRfTU9EVUxFUyA9IDAKKworIworIyBQdXQgaW50ZXJydXB0IHNlbnNpdGl2ZSBjb2RlL2RhdGEgaW4gbG9ja2VkIHNlY3Rpb25zCisjIERvIGBtYWtlIGNsZWFuJyBpbiBhbGwgYWZmZWN0ZWQgZGlyZWN0b3JpZXMgYWZ0ZXIgY2hhbmdpbmcgdGhpcy4KKyMKK1VTRV9TRUNUSU9OX0xPQ0tJTkcgPSAwCisKKyMKKyMgU2V0IHRvIDEgdG8gdXNlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpYiAob25seSBmb3IgbWUpCisjCitVU0VfRVhDRVBUID0gMAorCitDQyAgID0gZ2NjLmV4ZQorTEQgICA9IGxkLmV4ZQorQVNNICA9IG5hc20uZXhlIC1mYmluIC1kREVCVUcKK1lBQ0MgPSBiaXNvbi5leGUKK0xFWCAgPSBmbGV4LmV4ZQorCitDRkxBR1MgPSAtZyAtZ2NvZmYgLU8yIC1XYWxsIC1JLiAtSSQoV0FUVDMyX1JPT1QpL2luYworCitpZmVxICgkKFVTRV9FWENFUFQpLDEpCisgIENGTEFHUyArPSAtRFVTRV9FWENFUFQKKyAgRVhDX0xJQiA9IGQ6L3Byb2cvbXcvZXhjZXB0L2xpYi9saWJleGMuYQorZW5kaWYKKworaWZlcSAoJChVU0VfU0VDVElPTl9MT0NLSU5HKSwxKQorICBDRkxBR1MgKz0gLURVU0VfU0VDVElPTl9MT0NLSU5HCitlbmRpZgorCitpZmVxICgkKFVTRV8zMkJJVF9EUklWRVJTKSwxKQorICBDRkxBR1MgKz0gLURVU0VfMzJCSVRfRFJJVkVSUworZW5kaWYKKworJS5vOiAlLmMKKwkkKENDKSAtYyAkKENGTEFHUykgJDwKKwlAZWNobworCislLm86ICUucworCSQoQ0MpIC1jICQoQ0ZMQUdTKSAteCBhc3NlbWJsZXItd2l0aC1jcHAgLW8gJEAgJDwKKwlAZWNobworCmRpZmYgLS1naXQgYS9tc2Rvcy9tYWtlZmlsZSBiL21zZG9zL21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjRlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9tYWtlZmlsZQpAQCAtMCwwICsxLDE4NCBAQAorIw0KKyMgIE1ha2VmaWxlIGZvciBkb3MtbGlicGNhcC4gTkIuIFRoaXMgbWFrZWZpbGUgcmVxdWlyZXMgYSBCb3JsYW5kDQorIyAgY29tcGF0aWJsZSBtYWtlIHRvb2wuDQorIw0KKyMgIFRhcmdldHM6DQorIyAgICBCb3JsYW5kIEMgNC4wKyAgICAgIChET1MgbGFyZ2UgbW9kZWwpDQorIyAgICBNZXRhd2FyZSBIaWdoQyAzLjMrIChQaGFyTGFwIDM4NnxEb3NYKQ0KKyMNCisNCisuQVVUT0RFUEVORA0KKy5TV0FQDQorDQorIWlmICIkKFdBVFRfUk9PVCkiID09ICIiDQorIWVycm9yIEVudmlyb25tZW50IHZhcmlhYmxlICJXQVRUX1JPT1QiIG5vdCBzZXQuDQorIWVuZGlmDQorDQorV0FUVF9JTkMgPSAkKFdBVFRfUk9PVClcaW5jDQorDQorREVGUyAgID0gLURNU0RPUyAtRERFQlVHIC1ETkRJU19ERUJVRyAtRF9VXz0gLURpbmxpbmU9IFwNCisgICAgICAgICAtREhBVkVfU1RSRVJST1IgLURIQVZFX0xJTUlUU19IDQorDQorQVNNICAgID0gdGFzbS5leGUgLXQgLWwgLW14IC1tMiAtRERFQlVHDQorDQorU09VUkNFID0gZ3JhbW1hci5jICBzY2FubmVyLmMgYnBmX2ZpbHQuYyBicGZfaW1hZy5jIGJwZl9kdW1wLmMgXA0KKyAgICAgICAgIGV0aGVyZW50LmMgZ2VuY29kZS5jIG5hbWV0b2FkLmMgcGNhcC1kb3MuYyBvcHRpbWl6ZS5jIFwNCisgICAgICAgICBzYXZlZmlsZS5jIHBjYXAuYyBpbmV0LmMgbXNkb3NcbmRpczIuYyBtc2Rvc1xwa3RkcnZyLmMgXA0KKyAgICAgICAgIG1pc3Npbmdcc25wcmludGYuYw0KKw0KK0JPUkxBTkRfT0JKID0gJChTT1VSQ0U6LmM9Lm9iaikgbXNkb3NccGt0X3J4MC5vYmogbXNkb3NcbmRpc18wLm9iag0KKw0KK0hJR0hDX09CSiAgID0gJChTT1VSQ0U6LmM9Lm8zMikgbXNkb3NccGt0X3J4MC5vMzINCisNCithbGw6DQorICAgICAgICAgICAgQGVjaG8gVXNhZ2U6IG1ha2UgcGNhcF9iYy5saWIgb3IgcGNhcF9oYy5saWINCisNCisNCitwY2FwX2JjLmxpYjogYmNjLmFyZyAkKEJPUkxBTkRfT0JKKSBwY2FwX2JjDQorDQorDQorcGNhcF9oYy5saWI6IGhjMzg2LmFyZyAkKEhJR0hDX09CSikNCisgICAgICAgICAgICAzODZsaWIgJDwgQCYmfA0KKyAgICAgICAgICAgICAgIC1ub3dhcm4gLW5vYmFja3VwIC10d29jYXNlIC1yZXBsYWNlICQoSElHSENfT0JKKQ0KK3wNCisNCitwY2FwX2JjOiAgICAkKEJPUkxBTkRfT0JKKQ0KKyAgICAgICAgICAgIEB0bGliIHBjYXBfYmMubGliIC9DIEAmJnwNCisgICAgICAgICAgICAgICAtKyQoKio6Lm9iaj0tKykNCit8DQorDQorLmMub2JqOg0KKyAgICAgICAgICAgIGJjYy5leGUgQGJjYy5hcmcgLW8kKi5vYmogJCouYw0KKw0KKy5jLm8zMjoNCisgICAgICAgICAgICBoYzM4Ni5leGUgQGhjMzg2LmFyZyAtbyAkKi5vMzIgJCouYw0KKw0KKy5hc20ub2JqOg0KKyAgICAgICAgICAgICQoQVNNKSAkKi5hc20sICQqLm9iag0KKw0KKy5hc20ubzMyOg0KKyAgICAgICAgICAgICQoQVNNKSAtRERPU1g9MSAkKi5hc20sICQqLm8zMg0KKw0KK3NjYW5uZXIuYzogc2Nhbm5lci5sDQorICAgICAgICAgICAgZmxleCAtUHBjYXBfIC03IC1vc2Nhbm5lci5jIHNjYW5uZXIubA0KKw0KK2dyYW1tYXIuYyB0b2tkZWZzLmg6IGdyYW1tYXIueQ0KKyAgICAgICAgICAgIGJpc29uIC0tbmFtZS1wcmVmaXg9cGNhcF8gLS15YWNjIC0tZGVmaW5lcyBncmFtbWFyLnkNCisgICAgICAgICAgICAtIEBkZWwgZ3JhbW1hci5jDQorICAgICAgICAgICAgLSBAZGVsIHRva2RlZnMuaA0KKyAgICAgICAgICAgIHJlbiB5X3RhYi5jIGdyYW1tYXIuYw0KKyAgICAgICAgICAgIHJlbiB5X3RhYi5oIHRva2RlZnMuaA0KKw0KK2JjYy5hcmc6ICAgIG1zZG9zXE1ha2VmaWxlDQorICAgICAgICAgICAgQGNvcHkgJiZ8DQorICAgICAgICAgICAgICAkKERFRlMpIC1tbCAtYyAtdiAtMyAtTzIgLXBvIC1SVC0gLXctDQorICAgICAgICAgICAgICAtSSQoV0FUVF9JTkMpIC1JLiAtSS5cbXNkb3NccG1fZHJ2ciAtSD0kKFRFTVApXGJjYy5zeW0NCit8ICQ8DQorDQoraGMzODYuYXJnOiAgbXNkb3NcTWFrZWZpbGUNCisgICAgICAgICAgICBAY29weSAmJnwNCisgICAgICAgICAgICAjIC1EVVNFXzMyQklUX0RSSVZFUlMNCisgICAgICAgICAgICAgICQoREVGUykgLURET1NYPTEgLXczIC1jIC1nIC1PNQ0KKyAgICAgICAgICAgICAgLUkkKFdBVFRfSU5DKSAtSS4gLUkuXG1zZG9zXHBtX2RydnINCisgICAgICAgICAgICAgIC1Ic3VmZml4PS5vMzINCisgICAgICAgICAgICAgIC1Ibm9jb3B5cg0KKyAgICAgICAgICAgICAgLUhwcmFnbWE9T2Zmd2Fybig0OTEsNTUzLDU3MikNCisgICAgICAgICAgICAgIC1Ib249UmVjb2duaXplX2xpYnJhcnkgICMgbWFrZSBtZW1jcHkvc3RybGVuIGV0Yy4gaW5saW5lDQorICAgICAgICAgICAgICAtSG9mZj1CZWhhdmVkICAgICAgICAgICAjIHR1cm4gb2ZmIHNvbWUgb3B0aW1pc2VyIHdhcm5pbmdzDQorfCAkPA0KKw0KK2NsZWFuOg0KKyAgICAgICAgICAgIEBkZWwgKi5vYmoNCisgICAgICAgICAgICBAZGVsICoubzMyDQorICAgICAgICAgICAgQGRlbCAqLmxzdA0KKyAgICAgICAgICAgIEBkZWwgKi5tYXANCisgICAgICAgICAgICBAZGVsIGJjYy5hcmcNCisgICAgICAgICAgICBAZGVsIGhjMzg2LmFyZw0KKyAgICAgICAgICAgIEBkZWwgZ3JhbW1hci5jDQorICAgICAgICAgICAgQGRlbCB0b2tkZWZzLmgNCisgICAgICAgICAgICBAZGVsIHNjYW5uZXIuYw0KKyAgICAgICAgICAgIEBlY2hvIENsZWFuZWQNCisNCisjDQorIyBkZXBlbmRlbmNpZXMNCisjICAgICAgICAgICAgIA0KK3BrdF9yeDAub2JqOiAgbXNkb3NccGt0X3J4MC5hc20NCisNCiticGZfZmlsdC5vYmo6IGJwZl9maWx0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnbnVjLmgNCisNCiticGZfaW1hZy5vYmo6IGJwZl9pbWFnLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KK2JwZl9kdW1wLm9iajogYnBmX2R1bXAuYyBwY2FwLmggcGNhcC1icGYuaA0KKw0KK2V0aGVyZW50Lm9iajogZXRoZXJlbnQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtbmFtZWRiLmgNCisNCitvcHRpbWl6ZS5vYmo6IG9wdGltaXplLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmgNCisNCitzYXZlZmlsZS5vYmo6IHNhdmVmaWxlLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KK3BjYXAub2JqOiBwY2FwLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQoraW5ldC5vYmo6IGluZXQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorZ3JhbW1hci5vYmo6IGdyYW1tYXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcDQorICBwZi5oIHBjYXAtbmFtZWRiLmgNCisNCitzY2FubmVyLm9iajogc2Nhbm5lci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwNCisgIHBjYXAtbmFtZWRiLmggdG9rZGVmcy5oDQorDQorZ2VuY29kZS5vYmo6IGdlbmNvZGUuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggXA0KKyAgZXRoZXJ0eXBlLmggbmxwaWQuaCBsbGMuaCBnZW5jb2RlLmggYXRtdW5pMzEuaCBzdW5hdG1wb3MuaCBwcHAuaCBzbGwuaCBcDQorICBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtZWRiLmgNCisNCituYW1ldG9hZC5vYmo6IG5hbWV0b2FkLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXA0KKyAgcGNhcC1uYW1lZGIuaCBldGhlcnR5cGUuaA0KKw0KK3BjYXAtZG9zLm9iajogcGNhcC1kb3MuYyBwY2FwLmggcGNhcC1icGYuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggXA0KKyAgbXNkb3NccGt0ZHJ2ci5oDQorDQorcGt0ZHJ2ci5vYmo6IG1zZG9zXHBrdGRydnIuYyBnbnVjLmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwNCisgIHBjYXAuaCBwY2FwLWJwZi5oIG1zZG9zXHBrdGRydnIuaCBtc2Rvc1xwa3Rfc3R1Yi5pbmMNCisNCituZGlzMi5vYmo6IG1zZG9zXG5kaXMyLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIFwNCisgIG1zZG9zXG5kaXMyLmgNCisNCitwa3RfcngwLm8zMjogIG1zZG9zXHBrdF9yeDAuYXNtDQorDQorYnBmX2ZpbHQubzMyOiBicGZfZmlsdC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ251Yy5oDQorDQorYnBmX2ltYWcubzMyOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCiticGZfZHVtcC5vMzI6IGJwZl9kdW1wLmMgcGNhcC5oIHBjYXAtYnBmLmgNCisNCitldGhlcmVudC5vMzI6IGV0aGVyZW50LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBwY2FwLW5hbWVkYi5oDQorDQorb3B0aW1pemUubzMyOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oDQorDQorc2F2ZWZpbGUubzMyOiBzYXZlZmlsZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCitwY2FwLm8zMjogcGNhcC5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KK2luZXQubzMyOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KK2dyYW1tYXIubzMyOiBncmFtbWFyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXA0KKyAgcGYuaCBwY2FwLW5hbWVkYi5oDQorDQorc2Nhbm5lci5vMzI6IHNjYW5uZXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcDQorICBwY2FwLW5hbWVkYi5oIHRva2RlZnMuaA0KKw0KK2dlbmNvZGUubzMyOiBnZW5jb2RlLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIFwNCisgIGV0aGVydHlwZS5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG9zLmggcHBwLmggc2xsLmggXA0KKyAgYXJjbmV0LmggcGYuaCBwY2FwLW5hbWVkYi5oDQorDQorbmFtZXRvYWQubzMyOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwNCisgIHBjYXAtbmFtZWRiLmggZXRoZXJ0eXBlLmgNCisNCitwY2FwLWRvcy5vMzI6IHBjYXAtZG9zLmMgcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwNCisgIG1zZG9zXHBrdGRydnIuaA0KKw0KK3BrdGRydnIubzMyOiBtc2Rvc1xwa3RkcnZyLmMgZ251Yy5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcDQorICBwY2FwLmggcGNhcC1icGYuaCBtc2Rvc1xwa3RkcnZyLmggbXNkb3NccGt0X3N0dWIuaW5jDQorDQorbmRpczIubzMyOiBtc2Rvc1xuZGlzMi5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcDQorICBtc2Rvc1xuZGlzMi5oDQorDQpkaWZmIC0tZ2l0IGEvbXNkb3MvbWFrZWZpbGUuZGogYi9tc2Rvcy9tYWtlZmlsZS5kagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2U1OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbXNkb3MvbWFrZWZpbGUuZGoKQEAgLTAsMCArMSwxNTIgQEAKKyMKKyMgR05VIE1ha2VmaWxlIGZvciBET1MtbGlicGNhcC4gZGpncHAgdmVyc2lvbi4KKyMKKyMgVXNlIHRoaXMgbWFrZWZpbGUgZnJvbSB0aGUgbGlicGNhcCByb290IGRpcmVjdG9yeS4KKyMgRS5nLiBsaWtlIHRoaXM6CisjCisjICBjOlxuZXRccGNhcD4gbWFrZSAtZiBtc2Rvcy9tYWtlZmlsZS5kagorIworIyBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL21zZG9zL21ha2VmaWxlLmRqLHYgMS4yIDIwMDQtMTItMTkgMTk6NDE6MDYgZ3V5IEV4cCAkIChMQkwpCisKK1ZQQVRIID0gbWlzc2luZyBtc2RvcworCitQUkVSRVFVSVNJVEVTID0gc2Nhbm5lci5jIGdyYW1tYXIuYyB0b2tkZWZzLmggdmVyc2lvbi5oIG1zZG9zL3BrdF9zdHViLmluYworCitpbmNsdWRlIG1zZG9zL2NvbW1vbi5kagorCitEUklWRVJfRElSID0gLi9tc2Rvcy9wbV9kcnZyCisKK0NGTEFHUyArPSAtRERFQlVHIC1ETkRJU19ERUJVRyAtREhBVkVfTElNSVRTX0ggLURIQVZFX1NUUkVSUk9SIFwKKyAgICAgICAgICAtRF9VXz0nX19hdHRyaWJ1dGVfXygodW51c2VkKSknIC1ESEFWRV9WRVJTSU9OX0gKKworIyBDRkxBR1MgKz0gLUR5eWx2YWw9cGNhcF9sdmFsIC1EQkRFQlVHIC1ETkRFQlVHCisKK1NPVVJDRVMgPSBncmFtbWFyLmMgc2Nhbm5lci5jIGJwZl9maWx0LmMgYnBmX2ltYWcuYyBicGZfZHVtcC5jICAgXAorICAgICAgICAgIGV0aGVyZW50LmMgZ2VuY29kZS5jIG5hbWV0b2FkLmMgcGNhcC1kb3MuYyBvcHRpbWl6ZS5jICBcCisgICAgICAgICAgc2F2ZWZpbGUuYyBwY2FwLmMgaW5ldC5jIG1zZG9zXHBrdGRydnIuYyBtc2Rvcy9uZGlzMi5jIFwKKyAgICAgICAgICBtaXNzaW5nL3NucHJpbnRmLmMKKworT0JKRUNUUyA9ICQobm90ZGlyICQoU09VUkNFUzouYz0ubykpCitURU1QQklOID0gdG1wLmJpbgorCitpZmVxICgkKFVTRV8zMkJJVF9EUklWRVJTKSwxKQorICBQTV9PQkpFQ1RTID0gJChhZGRwcmVmaXggJChEUklWRVJfRElSKS8sIFwKKyAgICAgICAgICAgICAgICAgcHJpbnRrLm8gcGNpLm8gcGNpLXNjYW4ubyBiaW9zMzIubyBkbWEubyBpcnEubyBpbnR3cmFwLm8gXAorICAgICAgICAgICAgICAgICBsb2NrLm8ga21hbGxvYy5vIHF1aXJrcy5vIHRpbWVyLm8gbmV0X2luaXQubykKKyAgIworICAjIFN0YXRpYyBsaW5rIG9mIGRyaXZlcnMKKyAgIworICBpZmVxICgkKFVTRV8zMkJJVF9NT0RVTEVTKSwwKQorICAgIFBNX09CSkVDVFMgKz0gJChhZGRwcmVmaXggJChEUklWRVJfRElSKS8sIFwKKyAgICAgICAgICAgICAgICAgICAgYWNjdG9uLm8gODM5MC5vIDNjNTAzLm8gM2M1MDkubyAzYzU5eC5vIDNjNTE1Lm8gXAorICAgICAgICAgICAgICAgICAgICAzYzU3NV9jYi5vIDNjOTB4Lm8gbmUubyB3ZC5vIGNzODl4MC5vIHJ0bDgxMzkubykKKyAgZW5kaWYKK2VuZGlmCisKK2FsbDogbGlicGNhcC5hCisKK2lmZXEgKCQoVVNFXzMyQklUX0RSSVZFUlMpLDEpCiskKFBNX09CSkVDVFMpOgorCSQoTUFLRSkgLWYgTWFrZWZpbGUuZGogLUMgJChEUklWRVJfRElSKSAkKG5vdGRpciAkQCkKK2VuZGlmCisKK2xpYnBjYXAuYTogdmVyc2lvbi5oICQoT0JKRUNUUykgJChQTV9PQkpFQ1RTKQorCXJtIC1mICRACisJYXIgcnMgJEAgJF4KKworbXNkb3MvcGt0X3N0dWIuaW5jOiBtc2Rvcy9iaW4yYy5leGUgbXNkb3MvcGt0X3J4MS5TCisJJChBU00pIC1vICQoVEVNUEJJTikgLWxtc2Rvcy9wa3RfcngxLmxzdCBtc2Rvcy9wa3RfcngxLlMKKwkuL21zZG9zL2JpbjJjICQoVEVNUEJJTikgPiAkQAorCXJtIC1mICQoVEVNUEJJTikKKworZ3JhbW1hci5jIHRva2RlZnMuaDogZ3JhbW1hci55CisJcm0gLWYgZ3JhbW1hci5jIHRva2RlZnMuaAorCSQoWUFDQykgLS1uYW1lLXByZWZpeD1wY2FwXyAtLXlhY2MgLS1kZWZpbmVzIGdyYW1tYXIueQorCW12IC1mIHlfdGFiLmMgZ3JhbW1hci5jCisJbXYgLWYgeV90YWIuaCB0b2tkZWZzLmgKKwordmVyc2lvbi5oOiAuL1ZFUlNJT04KKwlAZWNobyAnLyogR2VuZXJhdGVkIGZyb20gVkVSU0lPTi4gRG8gbm90IGVkaXQgKi8nID4gJEAKKwlzZWQgLWUgJ3MvLiovc3RhdGljIGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ1tdID0gImxpYnBjYXAgKCYpIjsvJyAuL1ZFUlNJT04gPj4gJEAKKworc2Nhbm5lci5jOiBzY2FubmVyLmwKKwkkKExFWCkgLVBwY2FwXyAtNyAtdCAkXiA+ICRACisJQGVjaG8KKworbXNkb3MvYmluMmMuZXhlOiBtc2Rvcy9iaW4yYy5jCisJJChDQykgJCouYyAtbyAkKi5leGUKKworY2xlYW46CisJJChNQUtFKSAtZiBNYWtlZmlsZS5kaiAtQyAkKERSSVZFUl9ESVIpIGNsZWFuCisJJChNQUtFKSAtZiBNYWtlZmlsZS5kaiAtQyBsaWJjcGNhcCBjbGVhbgorCXJtIC1mICQoT0JKRUNUUykgbXNkb3MvcGt0X3J4MS5sc3QgTWFrZWZpbGUuYmFrICQoUFJFUkVRVUlTSVRFUykKKwordmNsZWFuOiBjbGVhbgorCXJtIC1mIGxpYnBjYXAuYSBtc2Rvcy9iaW4yYy5leGUKKworIworIyBHZW5lcmF0ZWQgZGVwZW5kZW5jaWVzOyBEdWUgdG8gc29tZSBoYWNrcyBpbiBnY2MgMi45NSBhbmQgZGpncHAgMi4wMworIyB3ZSBtdXN0IHByZXZlbnQgIiQoREpESVIpL2Jpbi8uLi9pbmNsdWRlL3N5cy92ZXJzaW9uLmgiIGZyb20gYmVlaW5nCisjIGluY2x1ZGVkIGluIGRlcGVuZGVuY3kgb3V0cHV0IChvciBlbHNlIHRoaXMgbWFrZWZpbGUgY2Fubm90IGJlIHVzZWQgb24KKyMgYW5vdGhlciBtYWNoaW5lKS4gV2UgdGhlcmVmb3JlIHVzZSBhIHNwZWNpYWwgJ3NwZWNzJyBmaWxlIGR1cmluZworIyBwcmUtcHJvY2Vzc2luZy4KKyMKK01NX1NQRUNTID0gc3BlY3MudG1wCitNQUtFRklMRSA9IG1zZG9zL01ha2VmaWxlLmRqCisKK2RlcGVuZDogJChQUkVSRVFVSVNJVEVTKQorCUBlY2hvIEdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzLi4KKwlAY3AgJChNQUtFRklMRSkgTWFrZWZpbGUuYmFrCisJQGVjaG8gIipjcHA6ICUoY3BwX2NwdSkgJXtwb3NpeDotRF9QT1NJWF9TT1VSQ0V9IC1yZW1hcCIgPiAkKE1NX1NQRUNTKQorCXNlZCAtZSAiL14jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQiIDwgTWFrZWZpbGUuYmFrID4gJChNQUtFRklMRSkKKwllY2hvICIjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIiAgICAgICAgICAgICAgICAgICAgICAgID4+ICQoTUFLRUZJTEUpCisJJChDQykgLU1NIC1zcGVjcz0kKE1NX1NQRUNTKSAkKENGTEFHUykgJChTT1VSQ0VTKSAgICAgICA+PiAkKE1BS0VGSUxFKQorCXJtIC1mICQoTU1fU1BFQ1MpCisKKyMKKyMgTWFudWFsbHkgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcworIyAgICAgICAgICAgICAKK21zZG9zL3BrdGRydnIuYzogbXNkb3MvcGt0X3N0dWIuaW5jCitzY2FubmVyLmM6IHNjYW5uZXIubAorZ3JhbW1hci5jIHRva2RlZnMuaDogZ3JhbW1hci55CitncmFtbWFyLmg6IGdyYW1tYXIueQorc2Nhbm5lci5sOiBwY2FwLWludC5oIHBjYXAtbmFtZWRiLmggZ2VuY29kZS5oIGdyYW1tYXIuaCBnbnVjLmgKK2dyYW1tYXIueTogcGNhcC1pbnQuaCBnZW5jb2RlLmggcGNhcC1uYW1lZGIuaCBnbnVjLmgKKworIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMKKyMKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUKK2dyYW1tYXIubzogZ3JhbW1hci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIHBmLmggXAorICBwY2FwLW5hbWVkYi5oCitzY2FubmVyLm86IHNjYW5uZXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBwY2FwLW5hbWVkYi5oIFwKKyAgdG9rZGVmcy5oCiticGZfZmlsdC5vOiBicGZfZmlsdC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ251Yy5oCiticGZfaW1hZy5vOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKK2JwZl9kdW1wLm86IGJwZl9kdW1wLmMgcGNhcC5oIHBjYXAtYnBmLmgKK2V0aGVyZW50Lm86IGV0aGVyZW50LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBwY2FwLW5hbWVkYi5oCitnZW5jb2RlLm86IGdlbmNvZGUuYyBwY2FwLWRvcy5oIG1zZG9zL3BtX2RydnIvbG9jay5oIHBjYXAtaW50LmggcGNhcC5oIFwKKyAgcGNhcC1icGYuaCBldGhlcnR5cGUuaCBubHBpZC5oIGxsYy5oIGdlbmNvZGUuaCBhdG11bmkzMS5oIHN1bmF0bXBvcy5oIFwKKyAgcHBwLmggc2xsLmggYXJjbmV0LmggcGYuaCBwY2FwLW5hbWVkYi5oCituYW1ldG9hZC5vOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwKKyAgcGNhcC1uYW1lZGIuaCBldGhlcnR5cGUuaAorcGNhcC1kb3MubzogcGNhcC1kb3MuYyBtc2Rvcy9wbV9kcnZyL3BtZHJ2ci5oIG1zZG9zL3BtX2RydnIvaWZhY2UuaCBcCisgIG1zZG9zL3BtX2RydnIvbG9jay5oIG1zZG9zL3BtX2RydnIvaW9wb3J0LmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwKKyAgcGNhcC5oIHBjYXAtYnBmLmggbXNkb3MvcG1fZHJ2ci9rbWFsbG9jLmggbXNkb3MvcG1fZHJ2ci9iaXRvcHMuaCBcCisgIG1zZG9zL3BtX2RydnIvdGltZXIuaCBtc2Rvcy9wbV9kcnZyL2RtYS5oIG1zZG9zL3BtX2RydnIvaXJxLmggXAorICBtc2Rvcy9wbV9kcnZyL3ByaW50ay5oIG1zZG9zL3BtX2RydnIvcGNpLmggbXNkb3MvcG1fZHJ2ci9iaW9zMzIuaCBcCisgIG1zZG9zL3BtX2RydnIvbW9kdWxlLmggbXNkb3MvcG1fZHJ2ci8zYzUwMS5oIG1zZG9zL3BtX2RydnIvM2M1MDMuaCBcCisgIG1zZG9zL3BtX2RydnIvM2M1MDkuaCBtc2Rvcy9wbV9kcnZyLzNjNTl4LmggbXNkb3MvcG1fZHJ2ci8zYzUxNS5oIFwKKyAgbXNkb3MvcG1fZHJ2ci8zYzkweC5oIG1zZG9zL3BtX2RydnIvM2M1NzVfY2IuaCBtc2Rvcy9wbV9kcnZyL25lLmggXAorICBtc2Rvcy9wbV9kcnZyL3dkLmggbXNkb3MvcG1fZHJ2ci9hY2N0b24uaCBtc2Rvcy9wbV9kcnZyL2NzODl4MC5oIFwKKyAgbXNkb3MvcG1fZHJ2ci9ydGw4MTM5LmggbXNkb3MvcG1fZHJ2ci9uZTJrLXBjaS5oIG1zZG9zL3BrdGRydnIuaAorb3B0aW1pemUubzogb3B0aW1pemUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaAorc2F2ZWZpbGUubzogc2F2ZWZpbGUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCitwY2FwLm86IHBjYXAuYyBwY2FwLWRvcy5oIG1zZG9zL3BtX2RydnIvbG9jay5oIHBjYXAtaW50LmggcGNhcC5oIFwKKyAgcGNhcC1icGYuaAoraW5ldC5vOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorcGt0ZHJ2ci5vOiBtc2Rvcy9wa3RkcnZyLmMgZ251Yy5oIHBjYXAtZG9zLmggbXNkb3MvcG1fZHJ2ci9sb2NrLmggXAorICBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIG1zZG9zL3BrdGRydnIuaCBtc2Rvcy9wa3Rfc3R1Yi5pbmMKK25kaXMyLm86IG1zZG9zL25kaXMyLmMgcGNhcC1kb3MuaCBtc2Rvcy9wbV9kcnZyL2xvY2suaCBwY2FwLWludC5oIHBjYXAuaCBcCisgIHBjYXAtYnBmLmggbXNkb3MvbmRpczIuaAorc25wcmludGYubzogbWlzc2luZy9zbnByaW50Zi5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKZGlmZiAtLWdpdCBhL21zZG9zL21ha2VmaWxlLndjIGIvbXNkb3MvbWFrZWZpbGUud2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkNTY3MgotLS0gL2Rldi9udWxsCisrKyBiL21zZG9zL21ha2VmaWxlLndjCkBAIC0wLDAgKzEsMTMxIEBACisjDQorIyAgV2F0Y29tIE1ha2VmaWxlIGZvciBkb3MtbGlicGNhcC4NCisjDQorIyBTcGVjaWZ5IE1PREVMID0gYDNyJyBvciBgM3MnDQorIyBTcGVjaWZ5IFRBUkdFVCA9IGBwaGFybGFwJyBvciBgZG9zNGcnDQorIw0KKyMgVXNlIHRoaXMgbWFrZWZpbGUgZnJvbSB0aGUgbGlicGNhcCByb290IGRpcmVjdG9yeS4NCisjIEUuZy4gbGlrZSB0aGlzOg0KKyMNCisjICBjOlxuZXRccGNhcD4gd21ha2UgLWYgbXNkb3NcbWFrZWZpbGUud2MNCisjDQorDQorTU9ERUwgID0gM3MNCitUQVJHRVQgPSBkb3M0Zw0KKw0KK09CSkRJUiA9IG1zZG9zXCQoVEFSR0VUKS53JChNT0RFTCkNCitMSUIgICAgPSAkKE9CSkRJUilccGNhcC5saWINCisNCisuRVhURU5TSU9OUzogLmwgLnkNCisNCitERUZTID0gLWRERUJVRyAtZE5ESVNfREVCVUcgLWRfVV89IC1kSEFWRV9MSU1JVFNfSCAtZEhBVkVfU1RSRVJST1IgJg0KKyAgICAgICAtZEhBVkVfU05QUklOVEYgLWRIQVZFX1ZTTlBSSU5URg0KKw0KK0NDICA9IHdjYzM4Ni5leGUNCitBU00gPSB3YXNtLmV4ZSAtJChNT0RFTCkgJChERUZTKSAtZERPU1ggLWRET1M0R1cgLXpxIC1idD1kb3MgLWZyPW51bCAtZDMgLXMNCisNCitPQkpTID0gJChPQkpESVIpXGdyYW1tYXIub2JqICAkKE9CSkRJUilcc2Nhbm5lci5vYmogICQoT0JKRElSKVxwY2FwLm9iaiAgICAgJg0KKyAgICAgICAkKE9CSkRJUilcYnBmX2ZpbHQub2JqICQoT0JKRElSKVxicGZfaW1hZy5vYmogJChPQkpESVIpXGJwZl9kdW1wLm9iaiAmDQorICAgICAgICQoT0JKRElSKVxldGhlcmVudC5vYmogJChPQkpESVIpXGdlbmNvZGUub2JqICAkKE9CSkRJUilcbmFtZXRvYWQub2JqICYNCisgICAgICAgJChPQkpESVIpXHBjYXAtZG9zLm9iaiAkKE9CSkRJUilccGt0ZHJ2ci5vYmogICQoT0JKRElSKVxvcHRpbWl6ZS5vYmogJg0KKyAgICAgICAkKE9CSkRJUilcc2F2ZWZpbGUub2JqICQoT0JKRElSKVxpbmV0Lm9iaiAgICAgJChPQkpESVIpXG5kaXMyLm9iag0KKw0KK0NGTEFHUyA9ICQoREVGUykgJChZWURFRlMpIC1JLiAtSSQoJXdhdHRfcm9vdClcaW5jIC1JLlxtc2Rvc1xwbV9kcnZyICYNCisgICAgICAgICAtJChNT0RFTCkgLW1mIC16ZmYgLXpnZiAtenEgLWJ0PWRvcyAtZnI9bnVsIC13NiAtZnBpICAgICAgICAmDQorICAgICAgICAgLW9pbHJ0ZiAtem0NCisNCitURU1QQklOID0gdG1wLmJpbg0KKw0KK2FsbDogJChPQkpESVIpICQoT0JKRElSKVxwY2FwLmxpYg0KKw0KKyQoT0JKRElSKToNCisgICAgICAgICAgLSBta2RpciAkKE9CSkRJUikNCisNCiskKE9CSkRJUilccGNhcC5saWI6ICQoT0JKUykgd2xpYi5hcmcNCisgICAgICAgICAgd2xpYiAtcSAtYiAtYyAkKE9CSkRJUilccGNhcC5saWIgQHdsaWIuYXJnDQorDQord2xpYi5hcmc6IG1zZG9zXG1ha2VmaWxlLndjDQorICAgICAgICAgICVjcmVhdGUgJF5ADQorICAgICAgICAgIGZvciAlZiBpbiAoJChPQkpTKSkgZG8gJWFwcGVuZCAkXkAgKy0gJWYNCisNCiskKE9CSkRJUilccGt0ZHJ2ci5vYmo6IG1zZG9zXHBrdF9zdHViLmluYyBtc2Rvc1xwa3RkcnZyLmMgZ251Yy5oICYNCisgIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggbXNkb3NccGt0ZHJ2ci5oDQorICAgICAgICAgICokKENDKSAkKENGTEFHUykgbXNkb3NccGt0ZHJ2ci5jIC1mbz0kQA0KKw0KKyQoT0JKRElSKVxuZGlzMi5vYmo6IG1zZG9zXG5kaXMyLmMNCisgICAgICAgICAgKiQoQ0MpICQoQ0ZMQUdTKSBtc2Rvc1xuZGlzMi5jIC1mbz0kQA0KKw0KKy5FUkFTRQ0KKy5jeyQoT0JKRElSKX0ub2JqOg0KKyAgICAgICAgICAqJChDQykgJChDRkxBR1MpICRbQCAtZm89JEANCisNCitncmFtbWFyLmMgdG9rZGVmcy5oOiBncmFtbWFyLnkgDQorICAgICAgICAgIGJpc29uIC0tbmFtZS1wcmVmaXg9cGNhcF8gLS15YWNjIC0tZGVmaW5lcyAkW0ANCisgICAgICAgICAgLSBAZGVsIGdyYW1tYXIuYw0KKyAgICAgICAgICAtIEBkZWwgdG9rZGVmcy5oDQorICAgICAgICAgIHJlbiB5X3RhYi5jIGdyYW1tYXIuYw0KKyAgICAgICAgICByZW4geV90YWIuaCB0b2tkZWZzLmgNCisNCitzY2FubmVyLmM6IHNjYW5uZXIubA0KKyAgICAgICAgICBmbGV4IC1QcGNhcF8gLTcgLW8kQCAkW0ANCisNCittc2Rvc1xwa3Rfc3R1Yi5pbmM6IGJpbjJjLmV4ZSBtc2Rvc1xwa3RfcngxLlMNCisgICAgICAgICAgbmFzbSAtZmJpbiAtZERFQlVHIC1vICQoVEVNUEJJTikgLWxtc2Rvc1xwa3RfcngxLmxzdCBtc2Rvc1xwa3RfcngxLlMNCisgICAgICAgICAgYmluMmMuZXhlICAkKFRFTVBCSU4pID4gJEANCisgICAgICAgICAgQGRlbCAkKFRFTVBCSU4pDQorDQorYmluMmMuZXhlOiBtc2Rvc1xiaW4yYy5jDQorICAgICAgICAgIHdjbCAkW0ANCisNCitjbGVhbiByZWFsY2xlYW4gdmNsZWFuOiAuU1lNQk9MSUMNCisgICAgICAgICAgZm9yICVmIGluIChkb3M0Zy53M3IgZG9zNGcudzNzIHBoYXJsYXAudzNyIHBoYXJsYXAudzNzKSBkbyAmDQorICAgICAgICAgICAgQGRlbCAlZlwqLm9iag0KKyAgICAgICAgICBAZGVsIGdyYW1tYXIuYw0KKyAgICAgICAgICBAZGVsIHRva2RlZnMuaA0KKyAgICAgICAgICBAZGVsIHNjYW5uZXIuYw0KKyAgICAgICAgICBAZGVsIGJpbjJjLmV4ZQ0KKyAgICAgICAgICBAZGVsIGJpbjJjLm9iag0KKyAgICAgICAgICBAZGVsIG1zZG9zXHBrdF9zdHViLmluYw0KKyAgICAgICAgICBAZWNobyBDbGVhbmVkDQorDQorIw0KKyMgZGVwZW5kZW5jaWVzDQorIyAgICAgICAgICAgICAgICAgICAgIA0KKyQoT0JKRElSKVxicGZfZmlsdC5vYmo6IGJwZl9maWx0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnbnVjLmgNCisNCiskKE9CSkRJUilcYnBmX2ltYWcub2JqOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCiskKE9CSkRJUilcYnBmX2R1bXAub2JqOiBicGZfZHVtcC5jIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorJChPQkpESVIpXGV0aGVyZW50Lm9iajogZXRoZXJlbnQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtbmFtLmgNCisNCiskKE9CSkRJUilcb3B0aW1pemUub2JqOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oDQorDQorJChPQkpESVIpXHNhdmVmaWxlLm9iajogc2F2ZWZpbGUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorJChPQkpESVIpXHBjYXAub2JqOiBwY2FwLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorJChPQkpESVIpXGluZXQub2JqOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KKyQoT0JKRElSKVxncmFtbWFyLm9iajogZ3JhbW1hci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oICYNCisgIHBmLmggcGNhcC1uYW0uaA0KKw0KKyQoT0JKRElSKVxzY2FubmVyLm9iajogc2Nhbm5lci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oICYNCisgIHBjYXAtbmFtLmggdG9rZGVmcy5oDQorDQorJChPQkpESVIpXGdlbmNvZGUub2JqOiBnZW5jb2RlLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oICYNCisgIGV0aGVydHlwLmggbmxwaWQuaCBsbGMuaCBnZW5jb2RlLmggYXRtdW5pMzEuaCBzdW5hdG1wby5oIHBwcC5oIHNsbC5oICYNCisgIGFyY25ldC5oIHBmLmggcGNhcC1uYW0uaA0KKw0KKyQoT0JKRElSKVxuYW1ldG9hZC5vYmo6IG5hbWV0b2FkLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggJg0KKyAgcGNhcC1uYW0uaCBldGhlcnR5cC5oDQorDQorJChPQkpESVIpXHBjYXAtZG9zLm9iajogcGNhcC1kb3MuYyBwY2FwLmggcGNhcC1icGYuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggJg0KKyAgbXNkb3NccGt0ZHJ2ci5oDQorDQorJChPQkpESVIpXHBrdGRydnIub2JqOiBtc2Rvc1xwa3RkcnZyLmMgZ251Yy5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCAmDQorICBwY2FwLmggcGNhcC1icGYuaCBtc2Rvc1xwa3RkcnZyLmggbXNkb3NccGt0X3N0dWIuaW5jDQorDQorJChPQkpESVIpXG5kaXMyLm9iajogbXNkb3NcbmRpczIuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggJg0KKyAgbXNkb3NcbmRpczIuaA0KKw0KZGlmZiAtLWdpdCBhL21zZG9zL25kaXMyLmMgYi9tc2Rvcy9uZGlzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNWVhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9uZGlzMi5jCkBAIC0wLDAgKzEsODYwIEBACisvKiANCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsMTk5NA0KKyAqICAgICAgVGV4YXMgQSZNIFVuaXZlcnNpdHkuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQorICogYXJlIG1ldDoNCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQ0KKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoNCisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGV4YXMgQSZNIFVuaXZlcnNpdHkNCisgKiAgICAgIGFuZCBpdHMgY29udHJpYnV0b3JzLg0KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzDQorICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlDQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorICoNCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBVTklWRVJTSVRZIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORA0KKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFDQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwNCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUw0KKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQ0KKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUDQorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQ0KKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCisgKiBTVUNIIERBTUFHRS4NCisgKg0KKyAqIERldmVsb3BlcnM6DQorICogICAgICAgICAgICAgRGF2aWQgSy4gSGVzcywgRG91Z2xhcyBMZWUgU2NoYWxlcywgRGF2aWQgUi4gU2FmZm9yZA0KKyAqDQorICogSGVhdmlseSBtb2RpZmllZCBmb3IgTWV0YXdhcmUgSGlnaEMgKyBHTlUgQyAyLjgrDQorICogICAgICAgICAgICAgR2lzbGUgVmFuZW0gMTk5OA0KKyAqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8ZG9zLmg+DQorI2luY2x1ZGUgPGlvLmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPG1hbGxvYy5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaW5jbHVkZSAicGNhcC1kb3MuaCINCisjaW5jbHVkZSAicGNhcC1pbnQuaCINCisjaW5jbHVkZSAibXNkb3MvbmRpczIuaCINCisNCisjaWYgZGVmaW5lZChVU0VfTkRJUzIpDQorDQorLyoNCisgKiAgUGFja2V0IGJ1ZmZlciBoYW5kbGluZw0KKyAqLw0KK2V4dGVybiBpbnQgICAgIEZyZWVQa3RCdWYgIChQa3RCdWYgKmJ1Zik7DQorZXh0ZXJuIGludCAgICAgRW5xdWVQa3RCdWYgKFBrdEJ1ZiAqYnVmKTsNCitleHRlcm4gUGt0QnVmKiBBbGxvY1BrdEJ1ZiAodm9pZCk7DQorDQorLyoNCisgKiAgVmFyaW91cyBkZWZpbmVzDQorICovDQorI2RlZmluZSBNQVhfTlVNX0RFQlVHX1NUUklOR1MgOTANCisjZGVmaW5lIERFQlVHX1NUUklOR19MRU5HVEggICA4MA0KKyNkZWZpbmUgU1RBQ0tfUE9PTF9TSVpFICAgICAgIDYNCisjZGVmaW5lIFNUQUNLX1NJWkUgICAgICAgICAgICAyNTYNCisNCisjZGVmaW5lIE1FRElBX0ZEREkgICAgICAgICAgICAxDQorI2RlZmluZSBNRURJQV9FVEhFUk5FVCAgICAgICAgMg0KKyNkZWZpbmUgTUVESUFfVE9LRU4gICAgICAgICAgIDMNCisNCitzdGF0aWMgaW50ICAgICBzdGFydERlYnVnICAgICA9IDA7DQorc3RhdGljIGludCAgICAgc3RvcERlYnVnICAgICAgPSAwOw0KKw0KK3N0YXRpYyBEV09SRCAgIGRyb3BwZWRQYWNrZXRzID0gMEw7DQorc3RhdGljIFdPUkQgICAgZnJhbWVTaXplICAgICAgPSAwOw0KK3N0YXRpYyBXT1JEICAgIGhlYWRlclNpemUgICAgID0gMDsNCitzdGF0aWMgaW50ICAgICBtZWRpYVR5cGUgICAgICA9IDA7DQorc3RhdGljIGNoYXIgICAqbGFzdEVyciAgICAgICAgPSBOVUxMOw0KKw0KK3N0YXRpYyBCWVRFICAgIGRlYnVnU3RyaW5ncyBbTUFYX05VTV9ERUJVR19TVFJJTkdTXVtERUJVR19TVFJJTkdfTEVOR1RIXTsNCitzdGF0aWMgQllURSAgICpmcmVlU3RhY2tzICAgW1NUQUNLX1BPT0xfU0laRV07DQorc3RhdGljIGludCAgICAgZnJlZVN0YWNrUHRyID0gU1RBQ0tfUE9PTF9TSVpFIC0gMTsNCisNCitzdGF0aWMgUHJvdE1hbiBwcm90TWFuRW50cnkgPSBOVUxMOw0KK3N0YXRpYyBXT1JEICAgIHByb3RNYW5EUyAgICA9IDA7DQorc3RhdGljIHZvbGF0aWxlIGludCB4bWl0UGVuZGluZzsNCisNCitzdGF0aWMgc3RydWN0IF9Qa3RCdWYgICAgICAgICp0eEJ1ZlBlbmRpbmc7DQorc3RhdGljIHN0cnVjdCBfQ2FyZEhhbmRsZSAgICAqaGFuZGxlOw0KK3N0YXRpYyBzdHJ1Y3QgX0NvbW1vbkNoYXJzICAgIGNvbW1vbjsNCitzdGF0aWMgc3RydWN0IF9Qcm90b2NvbENoYXJzICBwcm90Q2hhcnM7DQorc3RhdGljIHN0cnVjdCBfUHJvdERpc3BhdGNoICAgbG93ZXJUYWJsZTsNCisNCitzdGF0aWMgc3RydWN0IF9GYWlsaW5nTW9kdWxlcyBmYWlsaW5nTW9kdWxlczsNCitzdGF0aWMgc3RydWN0IF9CaW5kaW5nc0xpc3QgICBiaW5kaW5nczsNCisNCitzdGF0aWMgc3RydWN0IHsNCisgICAgICAgICBXT1JEICBlcnJfbnVtOw0KKyAgICAgICAgIGNoYXIgKmVycl90ZXh0Ow0KKyAgICAgICB9IG5kaXNfZXJybGlzdFtdID0gew0KKw0KKyAgeyBFUlJfU1VDQ0VTUywNCisgICAgIlRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuIiAgfSwNCisNCisgIHsgRVJSX1dBSVRfRk9SX1JFTEVBU0UsDQorICAgICJUaGUgUmVjZWl2ZUNoYWluIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYnV0IHRoZSBwcm90b2NvbCBoYXNcbiINCisgICAgInJldGFpbmVkIGNvbnRyb2wgb2YgdGhlIGJ1ZmZlci5cbiIgIH0sDQorDQorICB7IEVSUl9SRVFVRVNUX1FVRVVFRCwNCisgICAgIlRoZSBjdXJyZW50IHJlcXVlc3QgaGFzIGJlZW4gcXVldWVkLlxuIiAgfSwNCisNCisgIHsgRVJSX0ZSQU1FX05PVF9SRUNPR05JWkVELA0KKyAgICAiRnJhbWUgbm90IHJlY29nbml6ZWQuXG4iICB9LA0KKw0KKyAgeyBFUlJfRlJBTUVfUkVKRUNURUQsDQorICAgICJGcmFtZSB3YXMgZGlzY2FyZGVkLlxuIiAgfSwNCisNCisgIHsgRVJSX0ZPUldBUkRfRlJBTUUsDQorICAgICJQcm90b2NvbCB3aXNoZXMgdG8gZm9yd2FyZCBmcmFtZSB0byBhbm90aGVyIHByb3RvY29sLlxuIiAgfSwNCisNCisgIHsgRVJSX09VVF9PRl9SRVNPVVJDRSwNCisgICAgIk91dCBvZiByZXNvdXJjZS5cbiIgIH0sDQorDQorICB7IEVSUl9JTlZBTElEX1BBUkFNRVRFUiwNCisgICAgIkludmFsaWQgcGFyYW1ldGVyLlxuIiAgfSwNCisNCisgIHsgRVJSX0lOVkFMSURfRlVOQ1RJT04sDQorICAgICJJbnZhbGlkIGZ1bmN0aW9uLlxuIiAgfSwNCisNCisgIHsgRVJSX05PVF9TVVBQT1JURUQsDQorICAgICJOb3Qgc3VwcG9ydGVkLlxuIiAgfSwNCisNCisgIHsgRVJSX0hBUkRXQVJFX0VSUk9SLA0KKyAgICAiSGFyZHdhcmUgZXJyb3IuXG4iICB9LA0KKw0KKyAgeyBFUlJfVFJBTlNNSVRfRVJST1IsDQorICAgICJUaGUgcGFja2V0IHdhcyBub3QgdHJhbnNtaXR0ZWQgZHVlIHRvIGFuIGVycm9yLlxuIiAgfSwNCisNCisgIHsgRVJSX05PX1NVQ0hfREVTVElOQVRJT04sDQorICAgICJUb2tlbiByaW5nIHBhY2tldCB3YXMgbm90IHJlY29nbml6ZWQgd2hlbiB0cmFuc21pdHRlZC5cbiIgIH0sDQorDQorICB7IEVSUl9CVUZGRVJfVE9PX1NNQUxMLA0KKyAgICAiUHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwuXG4iICB9LA0KKw0KKyAgeyBFUlJfQUxSRUFEWV9TVEFSVEVELA0KKyAgICAiTmV0d29yayBkcml2ZXJzIGFscmVhZHkgc3RhcnRlZC5cbiIgIH0sDQorDQorICB7IEVSUl9JTkNPTVBMRVRFX0JJTkRJTkcsDQorICAgICJQcm90b2NvbCBkcml2ZXIgY291bGQgbm90IGNvbXBsZXRlIGl0cyBiaW5kaW5ncy5cbiIgIH0sDQorDQorICB7IEVSUl9EUklWRVJfTk9UX0lOSVRJQUxJWkVELA0KKyAgICAiTUFDIGRpZCBub3QgaW5pdGlhbGl6ZSBwcm9wZXJseS5cbiIgIH0sDQorDQorICB7IEVSUl9IQVJEV0FSRV9OT1RfRk9VTkQsDQorICAgICJIYXJkd2FyZSBub3QgZm91bmQuXG4iICB9LA0KKw0KKyAgeyBFUlJfSEFSRFdBUkVfRkFJTFVSRSwNCisgICAgIkhhcmR3YXJlIGZhaWx1cmUuXG4iICB9LA0KKw0KKyAgeyBFUlJfQ09ORklHVVJBVElPTl9GQUlMVVJFLA0KKyAgICAiQ29uZmlndXJhdGlvbiBmYWlsdXJlLlxuIiAgfSwNCisNCisgIHsgRVJSX0lOVEVSUlVQVF9DT05GTElDVCwNCisgICAgIkludGVycnVwdCBjb25mbGljdC5cbiIgIH0sDQorDQorICB7IEVSUl9JTkNPTVBBVElCTEVfTUFDLA0KKyAgICAiVGhlIE1BQyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbC5cbiIgIH0sDQorDQorICB7IEVSUl9JTklUSUFMSVpBVElPTl9GQUlMRUQsDQorICAgICJJbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iICB9LA0KKw0KKyAgeyBFUlJfTk9fQklORElORywNCisgICAgIkJpbmRpbmcgZGlkIG5vdCBvY2N1ci5cbiIgIH0sDQorDQorICB7IEVSUl9ORVRXT1JLX01BWV9OT1RfQkVfQ09OTkVDVEVELA0KKyAgICAiVGhlIG5ldHdvcmsgbWF5IG5vdCBiZSBjb25uZWN0ZWQgdG8gdGhlIGFkYXB0ZXIuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5DT01QQVRJQkxFX09TX1ZFUlNJT04sDQorICAgICJUaGUgdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wuXG4iICB9LA0KKw0KKyAgeyBFUlJfQUxSRUFEWV9SRUdJU1RFUkVELA0KKyAgICAiVGhlIHByb3RvY29sIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIgIH0sDQorDQorICB7IEVSUl9QQVRIX05PVF9GT1VORCwNCisgICAgIlBST1RNQU4uRVhFIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiIgIH0sDQorDQorICB7IEVSUl9JTlNVRkZJQ0lFTlRfTUVNT1JZLA0KKyAgICAiSW5zdWZmaWNpZW50IG1lbW9yeS5cbiIgIH0sDQorDQorICB7IEVSUl9JTkZPX05PVF9GT1VORCwNCisgICAgIlByb3RvY29sIE1hbmFuZ2VyIGluZm8gc3RydWN0dXJlIGlzIGxvc3Qgb3IgY29ycnVwdGVkLlxuIiAgfSwNCisNCisgIHsgRVJSX0dFTkVSQUxfRkFJTFVSRSwNCisgICAgIkdlbmVyYWwgZmFpbHVyZS5cbiIgIH0NCit9Ow0KKw0KKy8qDQorICogIFNvbWUgaGFuZHkgbWFjcm9zDQorICovICAgICAgIA0KKyNkZWZpbmUgUEVSUk9SKHN0cikgICAgcHJpbnRmKCIlcyAoJWQpOiAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sc3RyKQ0KKyNkZWZpbmUgREVCVUdfUklORygpICAgKGRlYnVnU3RyaW5nc1tzdG9wRGVidWcrMSA9PSBNQVhfTlVNX0RFQlVHX1NUUklOR1MgPyBcDQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcERlYnVnID0gMCA6ICsrc3RvcERlYnVnXSkNCisNCisvKg0KKyAqIG5lZWRzIHJld3JpdGUgZm9yIERPU1gNCisgKi8NCisjZGVmaW5lIE1BQ19ESVNQQVRDSChobmQpICAoKHN0cnVjdCBfTWFjVXBwZXJEaXNwYXRjaCopKGhuZCktPmNvbW1vbi0+dXBwZXJEaXNwYXRjaFRhYmxlKQ0KKyNkZWZpbmUgTUFDX1NUQVRVUyhobmQpICAgICgoc3RydWN0IF9NYWNTdGF0dXNUYWJsZSopICAoaG5kKS0+Y29tbW9uLT5zZXJ2aWNlU3RhdHVzKQ0KKyNkZWZpbmUgTUFDX0NIQVIoaG5kKSAgICAgICgoc3RydWN0IF9NYWNDaGFycyopICAgICAgICAoaG5kKS0+Y29tbW9uLT5zZXJ2aWNlQ2hhcnMpDQorDQorI2lmZGVmIE5ESVNfREVCVUcNCisgICNkZWZpbmUgREVCVUcwKHN0cikgICAgICBwcmludGYgKHN0cikNCisgICNkZWZpbmUgREVCVUcxKGZtdCxhKSAgICBwcmludGYgKGZtdCxhKQ0KKyAgI2RlZmluZSBERUJVRzIoZm10LGEsYikgIHByaW50ZiAoZm10LGEsYikNCisgICNkZWZpbmUgVFJBQ0UwKHN0cikgICAgICBzcHJpbnRmIChERUJVR19SSU5HKCksc3RyKQ0KKyAgI2RlZmluZSBUUkFDRTEoZm10LGEpICAgIHNwcmludGYgKERFQlVHX1JJTkcoKSxmbXQsYSkNCisjZWxzZQ0KKyAgI2RlZmluZSBERUJVRzAoc3RyKSAgICAgICgodm9pZCkwKQ0KKyAgI2RlZmluZSBERUJVRzEoZm10LGEpICAgICgodm9pZCkwKQ0KKyAgI2RlZmluZSBERUJVRzIoZm10LGEsYikgICgodm9pZCkwKQ0KKyAgI2RlZmluZSBUUkFDRTAoc3RyKSAgICAgICgodm9pZCkwKQ0KKyAgI2RlZmluZSBUUkFDRTEoZm10LGEpICAgICgodm9pZCkwKQ0KKyNlbmRpZg0KKw0KKy8qDQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIGJvdGggdGhyZWFkcw0KKyAqLw0KK3ZvaWQgTmRpc0ZyZWVTdGFjayAoQllURSAqYVN0YWNrKQ0KK3sNCisgIEdVQVJEKCk7DQorDQorICBpZiAoZnJlZVN0YWNrUHRyID09IFNUQUNLX1BPT0xfU0laRSAtIDEpDQorICAgICBQRVJST1IgKCJ0cmllZCB0byBmcmVlIHRvbyBtYW55IHN0YWNrcyIpOw0KKw0KKyAgZnJlZVN0YWNrc1srK2ZyZWVTdGFja1B0cl0gPSBhU3RhY2s7DQorDQorICBpZiAoZnJlZVN0YWNrUHRyID09IDApDQorICAgICBUUkFDRTAgKCJmcmVlU3RhY2tQdHIgd2VudCBwb3NpdGl2ZVxuIik7DQorDQorICBVTkdVQVJEKCk7DQorfQ0KKw0KKy8qDQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIGNhbGxiYWNrcyB0byBhbGxvY2F0ZSBsb2NhbCBkYXRhDQorICovDQorQllURSAqTmRpc0FsbG9jU3RhY2sgKHZvaWQpDQorew0KKyAgQllURSAqc3RhY2s7DQorDQorICBHVUFSRCgpOw0KKw0KKyAgaWYgKGZyZWVTdGFja1B0ciA8IDApDQorICB7DQorICAgIC8qIFJhbiBvdXQgb2Ygc3RhY2sgYnVmZmVycy4gUmV0dXJuIE5VTEwgd2hpY2ggd2lsbCBzdGFydA0KKyAgICAgKiBkcm9wcGluZyBwYWNrZXRzDQorICAgICAqLw0KKyAgICBUUkFDRTAgKCJmcmVlU3RhY2tQdHIgd2VudCBuZWdhdGl2ZVxuIik7DQorICAgIHN0YWNrID0gMDsNCisgIH0NCisgIGVsc2UNCisgICAgc3RhY2sgPSBmcmVlU3RhY2tzW2ZyZWVTdGFja1B0ci0tXTsNCisNCisgIFVOR1VBUkQoKTsNCisgIHJldHVybiAoc3RhY2spOw0KK30NCisNCitDQUxMQkFDSyAoTmRpc1N5c3RlbVJlcXVlc3QgKERXT1JEIHBhcmFtMSwgRFdPUkQgcGFyYW0yLCBXT1JEIHBhcmFtMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgb3Bjb2RlLCBXT1JEIHRhcmdldERTKSkNCit7DQorICBzdGF0aWMgaW50ICAgICAgICAgICAgYmluZEVudHJ5ID0gMDsNCisgIHN0cnVjdCBfQ29tbW9uQ2hhcnMgICptYWNDb21tb247DQorICB2b2xhdGlsZSBXT1JEIHJlc3VsdDsNCisNCisgIHN3aXRjaCAob3Bjb2RlKQ0KKyAgew0KKyAgICBjYXNlIFJFUV9JTklUSUFURV9CSU5EOg0KKyAgICAgICAgIG1hY0NvbW1vbiA9IChzdHJ1Y3QgX0NvbW1vbkNoYXJzKikgcGFyYW0yOw0KKyAgICAgICAgIGlmIChtYWNDb21tb24gPT0gTlVMTCkNCisJIHsNCisgICAgICAgICAgIHByaW50ZiAoIlRoZXJlIGlzIGFuIE5ESVMgbWlzY29uZmlndXJhdGlvbi5cbiIpOw0KKyAgICAgICAgICAgcmVzdWx0ID0gRVJSX0dFTkVSQUxfRkFJTFVSRTsNCisJICAgYnJlYWs7DQorCSB9DQorICAgICAgICAgREVCVUcyICgibW9kdWxlIG5hbWUgJXNcbiINCisgICAgICAgICAgICAgICAgICJtb2R1bGUgdHlwZSAlc1xuIiwNCisgICAgICAgICAgICAgICAgIG1hY0NvbW1vbi0+bW9kdWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICgoTWFjQ2hhcnMqKSBtYWNDb21tb24tPnNlcnZpY2VDaGFycyktPm1hY05hbWUpOw0KKw0KKyAgICAgICAgIC8qIEJpbmRpbmcgdG8gdGhlIE1BQyAqLw0KKyAgICAgICAgIHJlc3VsdCA9IG1hY0NvbW1vbi0+c3lzdGVtUmVxdWVzdCAoKERXT1JEKSZjb21tb24sIChEV09SRCkmbWFjQ29tbW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUkVRX0JJTkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDb21tb24tPm1vZHVsZURTKTsNCisNCisgICAgICAgICBpZiAoIXN0cmNtcChiaW5kaW5ncy5tb2R1bGVOYW1lW2JpbmRFbnRyeV0sIGhhbmRsZS0+bW9kdWxlTmFtZSkpDQorICAgICAgICAgICAgICBoYW5kbGUtPmNvbW1vbiA9IG1hY0NvbW1vbjsNCisgICAgICAgICBlbHNlIFBFUlJPUiAoInVua25vd24gbW9kdWxlIik7DQorICAgICAgICAgKytiaW5kRW50cnk7DQorCSBicmVhazsNCisNCisgICAgY2FzZSBSRVFfSU5JVElBVEVfVU5CSU5EOg0KKyAgICAgICAgIG1hY0NvbW1vbiA9IChzdHJ1Y3QgX0NvbW1vbkNoYXJzKikgcGFyYW0yOw0KKyAgICAgICAgIHJlc3VsdCA9IG1hY0NvbW1vbi0+c3lzdGVtUmVxdWVzdCAoKERXT1JEKSZjb21tb24sIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBSRVFfVU5CSU5ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ29tbW9uLT5tb2R1bGVEUyk7DQorICAgICAgICAgYnJlYWs7DQorDQorICAgIGRlZmF1bHQ6DQorICAgICAgICAgcmVzdWx0ID0gRVJSX0dFTkVSQUxfRkFJTFVSRTsNCisJIGJyZWFrOw0KKyAgfQ0KKyAgQVJHU1VTRUQgKHBhcmFtMSk7DQorICBBUkdTVVNFRCAocGFyYW0zKTsNCisgIEFSR1NVU0VEICh0YXJnZXREUyk7DQorICByZXR1cm4gKHJlc3VsdCk7DQorfQ0KKw0KK0NBTExCQUNLIChOZGlzUmVxdWVzdENvbmZpcm0gKFdPUkQgcHJvdElkLCBXT1JEIG1hY0lkLCAgIFdPUkQgcmVxSGFuZGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgc3RhdHVzLCBXT1JEIHJlcXVlc3QsIFdPUkQgcHJvdERTKSkNCit7DQorICBBUkdTVVNFRCAocHJvdElkKTsgICAgQVJHU1VTRUQgKG1hY0lkKTsNCisgIEFSR1NVU0VEIChyZXFIYW5kbGUpOyBBUkdTVVNFRCAoc3RhdHVzKTsNCisgIEFSR1NVU0VEIChyZXF1ZXN0KTsgICBBUkdTVVNFRCAocHJvdERTKTsNCisgIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KK30NCisNCitDQUxMQkFDSyAoTmRpc1RyYW5zbWl0Q29uZmlybSAoV09SRCBwcm90SWQsIFdPUkQgbWFjSWQsIFdPUkQgcmVxSGFuZGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHN0YXR1cywgV09SRCBwcm90RFMpKQ0KK3sNCisgIHhtaXRQZW5kaW5nLS07DQorICBGcmVlUGt0QnVmICh0eEJ1ZlBlbmRpbmcpOyAgLyogQWRkIHBhc3NlZCBFQ0IgYmFjayB0byB0aGUgZnJlZSBsaXN0ICovDQorDQorICBBUkdTVVNFRCAocmVxSGFuZGxlKTsNCisgIEFSR1NVU0VEIChzdGF0dXMpOw0KKyAgQVJHU1VTRUQgKHByb3REUyk7DQorICByZXR1cm4gKEVSUl9TVUNDRVNTKTsNCit9DQorDQorDQorLyoNCisgKiBUaGUgcHJpbWFyeSBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIHBhY2tldHMNCisgKi8NCitDQUxMQkFDSyAoTmRpc1JlY2VpdmVMb29rYWhlYWQgKFdPUkQgIG1hY0lkLCAgICAgIFdPUkQgIGZyYW1lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgIGJ5dGVzQXZhaWwsIEJZVEUgKmJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKmluZGljYXRlLCAgIFdPUkQgIHByb3REUykpDQorew0KKyAgaW50ICAgICByZXN1bHQ7DQorICBQa3RCdWYgKnBrdEJ1ZjsNCisgIFdPUkQgICAgYnl0ZXNDb3BpZWQ7DQorICBzdHJ1Y3QgX1REQnVmRGVzY3IgdERCdWZEZXNjcjsNCisNCisjaWYgMA0KKyAgVFJBQ0UxICgibG9va2FoZWFkIGxlbmd0aCA9ICVkLCAiLCBieXRlc0F2YWlsKTsNCisgIFRSQUNFMSAoImVjYiA9ICUwOGxYLCAiLCAgICAgICAgICAqZWNiKTsNCisgIFRSQUNFMSAoImNvdW50ID0gJTA4bFhcbiIsICAgICAgICAgY291bnQpOw0KKyAgVFJBQ0UxICgib2Zmc2V0ID0gJTA4bFgsICIsICAgICAgICBvZmZzZXQpOw0KKyAgVFJBQ0UxICgidGltZXNBbGxvd2VkID0gJWQsICIsICAgICB0aW1lc0FsbG93ZWQpOw0KKyAgVFJBQ0UxICgicGFja2V0IHNpemUgPSAlZFxuIiwgICAgICBsb29rLT5kYXRhTG9va0FoZWFkTGVuKTsNCisjZW5kaWYNCisNCisgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgcGFja2V0DQorICAgKi8NCisgIGlmICgocGt0QnVmID0gQWxsb2NQa3RCdWYoKSkgPT0gTlVMTCkNCisgIHsNCisgICAgZHJvcHBlZFBhY2tldHMrKzsNCisgICAgcmV0dXJuIChFUlJfRlJBTUVfUkVKRUNURUQpOw0KKyAgfQ0KKw0KKyAgLyoNCisgICAqIE5vdyBrbHVkZ2UgdGhpbmdzLiBOb3RlIHdlIHdpbGwgaGF2ZSB0byB1bmRvIHRoaXMgbGF0ZXIuIFRoaXMgd2lsbA0KKyAgICogbWFrZSB0aGUgcGFja2V0IGNvbnRpZ3VvdXMgYWZ0ZXIgdGhlIE1MSUQgaGFzIGRvbmUgdGhlIHJlcXVlc3RlZCBjb3B5Lg0KKyAgICovDQorDQorICB0REJ1ZkRlc2NyLnRERGF0YUNvdW50ID0gMTsNCisgIHREQnVmRGVzY3IudERCdWZEZXNjclJlY1swXS50RFB0clR5cGUgPSBORElTX1BUUl9QSFlTSUNBTDsNCisgIHREQnVmRGVzY3IudERCdWZEZXNjclJlY1swXS50RERhdGFQdHIgPSBwa3RCdWYtPmJ1ZmZlcjsNCisgIHREQnVmRGVzY3IudERCdWZEZXNjclJlY1swXS50RERhdGFMZW4gPSBwa3RCdWYtPmxlbmd0aDsNCisgIHREQnVmRGVzY3IudERCdWZEZXNjclJlY1swXS5kdW1teSAgICAgPSAwOw0KKw0KKyAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnRyYW5zZmVyRGF0YSAoJmJ5dGVzQ29waWVkLCAwLCAmdERCdWZEZXNjciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Y29tbW9uLT5tb2R1bGVEUyk7DQorICBwa3RCdWYtPnBhY2tldExlbmd0aCA9IGJ5dGVzQ29waWVkOw0KKw0KKyAgaWYgKHJlc3VsdCA9PSBFUlJfU1VDQ0VTUykNCisgICAgICAgRW5xdWVQa3RCdWYocGt0QnVmKTsNCisgIGVsc2UgRnJlZVBrdEJ1ZiAocGt0QnVmKTsNCisNCisgIEFSR1NVU0VEIChmcmFtZVNpemUpOw0KKyAgQVJHU1VTRUQgKGJ5dGVzQXZhaWwpOw0KKyAgQVJHU1VTRUQgKGluZGljYXRlKTsNCisgIEFSR1NVU0VEIChwcm90RFMpOw0KKw0KKyAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7DQorfQ0KKw0KK0NBTExCQUNLIChOZGlzSW5kaWNhdGlvbkNvbXBsZXRlIChXT1JEIG1hY0lkLCBXT1JEIHByb3REUykpDQorew0KKyAgQVJHU1VTRUQgKG1hY0lkKTsNCisgIEFSR1NVU0VEIChwcm90RFMpOw0KKw0KKyAgLyogV2UgZG9uJ3QgZ2l2ZSBhIGhvb3QgYWJvdXQgdGhlc2UuIEp1c3QgcmV0dXJuDQorICAgKi8NCisgIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KK30NCisNCisvKg0KKyAqIFRoaXMgaXMgdGhlIE9USEVSIHdheSB3ZSBtYXkgcmVjZWl2ZSBwYWNrZXRzDQorICovDQorQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlQ2hhaW4gKFdPUkQgbWFjSWQsIFdPUkQgZnJhbWVTaXplLCBXT1JEIHJlcUhhbmRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9SeEJ1ZkRlc2NyICpyeEJ1ZkRlc2NyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFICppbmRpY2F0ZSwgV09SRCBwcm90RFMpKQ0KK3sNCisgIHN0cnVjdCBfUGt0QnVmICpwa3RCdWY7DQorICBpbnQgICAgIGk7DQorDQorICAvKg0KKyAgICogRm9yIG5vdyB3ZSBjb3B5IHRoZSBlbnRpcmUgcGFja2V0IG92ZXIgdG8gYSBQa3RCdWYgc3RydWN0dXJlLiBUaGlzIG1heSBiZQ0KKyAgICogYSBwZXJmb3JtYW5jZSBoaXQgYnV0IHRoaXMgcm91dGluZSBwcm9iYWJseSBpc24ndCBjYWxsZWQgdmVyeSBtdWNoLCBhbmQNCisgICAqIGl0IGlzIGEgbG90IG9mIHdvcmsgdG8gZG8gaXQgb3RoZXJ3aXNlLiBBbHNvIGlmIGl0IGlzIGEgZmlsdGVyIHByb3RvY29sDQorICAgKiBwYWNrZXQgd2UgY291bGQgZW5kIHVwIHN1Y2tpbmcgdXAgTUFDIGJ1ZmZlcy4NCisgICAqLw0KKw0KKyAgaWYgKChwa3RCdWYgPSBBbGxvY1BrdEJ1ZigpKSA9PSBOVUxMKQ0KKyAgew0KKyAgICBkcm9wcGVkUGFja2V0cysrOw0KKyAgICByZXR1cm4gKEVSUl9GUkFNRV9SRUpFQ1RFRCk7DQorICB9DQorICBwa3RCdWYtPnBhY2tldExlbmd0aCA9IDA7DQorDQorICAvKiBDb3B5IHRoZSBwYWNrZXQgdG8gdGhlIGJ1ZmZlcg0KKyAgICovDQorICBmb3IgKGkgPSAwOyBpIDwgcnhCdWZEZXNjci0+cnhEYXRhQ291bnQ7ICsraSkNCisgIHsNCisgICAgc3RydWN0IF9SeEJ1ZkRlc2NyUmVjICpyeERlc2NyID0gJnJ4QnVmRGVzY3ItPnJ4QnVmRGVzY3JSZWNbaV07DQorDQorICAgIG1lbWNweSAocGt0QnVmLT5idWZmZXIgKyBwa3RCdWYtPnBhY2tldExlbmd0aCwNCisgICAgICAgICAgICByeERlc2NyLT5yeERhdGFQdHIsIHJ4RGVzY3ItPnJ4RGF0YUxlbik7DQorICAgIHBrdEJ1Zi0+cGFja2V0TGVuZ3RoICs9IHJ4RGVzY3ItPnJ4RGF0YUxlbjsNCisgIH0NCisNCisgIEVucXVlUGt0QnVmIChwa3RCdWYpOw0KKw0KKyAgQVJHU1VTRUQgKGZyYW1lU2l6ZSk7DQorICBBUkdTVVNFRCAocmVxSGFuZGxlKTsNCisgIEFSR1NVU0VEIChpbmRpY2F0ZSk7DQorICBBUkdTVVNFRCAocHJvdERTKTsgICANCisNCisgIC8qIFRoaXMgZnJlZXMgdXAgdGhlIGJ1ZmZlciBmb3IgdGhlIE1BQyB0byB1c2UNCisgICAqLw0KKyAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7DQorfQ0KKw0KK0NBTExCQUNLIChOZGlzU3RhdHVzUHJvYyAoV09SRCBtYWNJZCwgIFdPUkQgcGFyYW0xLCBCWVRFICppbmRpY2F0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgb3Bjb2RlLCBXT1JEIHByb3REUykpDQorew0KKyAgc3dpdGNoIChvcGNvZGUpDQorICB7DQorICAgIGNhc2UgU1RBVFVTX1JJTkdfU1RBVFVTOg0KKwkgYnJlYWs7DQorICAgIGNhc2UgU1RBVFVTX0FEQVBURVJfQ0hFQ0s6DQorCSBicmVhazsNCisgICAgY2FzZSBTVEFUVVNfU1RBUlRfUkVTRVQ6DQorCSBicmVhazsNCisgICAgY2FzZSBTVEFUVVNfSU5URVJSVVBUOg0KKwkgYnJlYWs7DQorICAgIGNhc2UgU1RBVFVTX0VORF9SRVNFVDoNCisJIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKwkgYnJlYWs7DQorICB9DQorICBBUkdTVVNFRCAobWFjSWQpOw0KKyAgQVJHU1VTRUQgKHBhcmFtMSk7DQorICBBUkdTVVNFRCAoaW5kaWNhdGUpOw0KKyAgQVJHU1VTRUQgKG9wY29kZSk7DQorICBBUkdTVVNFRCAocHJvdERTKTsNCisNCisgIC8qIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYWJvdXQgdGhpcyBzdHVmZiB5ZXQNCisgICAqLw0KKyAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7DQorfQ0KKw0KKy8qDQorICogVGVsbCB0aGUgTkRJUyBkcml2ZXIgdG8gc3RhcnQgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBwYWNrZXQNCisgKi8NCitpbnQgTmRpc1NlbmRQYWNrZXQgKHN0cnVjdCBfUGt0QnVmICpwa3RCdWYsIGludCBtYWNJZCkNCit7IA0KKyAgc3RydWN0IF9UeEJ1ZkRlc2NyIHR4QnVmRGVzY3I7DQorICBpbnQgICAgIHJlc3VsdDsNCisNCisgIHhtaXRQZW5kaW5nKys7DQorICB0eEJ1ZlBlbmRpbmcgPSBwa3RCdWY7ICAgIC8qIHdlIG9ubHkgaGF2ZSAxIHBlbmRpbmcgVHggYXQgYSB0aW1lICovDQorDQorICB0eEJ1ZkRlc2NyLnR4SW1tZWRMZW4gID0gMDsNCisgIHR4QnVmRGVzY3IudHhJbW1lZFB0ciAgPSBOVUxMOw0KKyAgdHhCdWZEZXNjci50eERhdGFDb3VudCA9IDE7DQorICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhQdHJUeXBlID0gTkRJU19QVFJfUEhZU0lDQUw7DQorICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0uZHVtbXkgICAgID0gMDsNCisgIHR4QnVmRGVzY3IudHhCdWZEZXNjclJlY1swXS50eERhdGFMZW4gPSBwa3RCdWYtPnBhY2tldExlbmd0aDsNCisgIHR4QnVmRGVzY3IudHhCdWZEZXNjclJlY1swXS50eERhdGFQdHIgPSBwa3RCdWYtPmJ1ZmZlcjsNCisNCisgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT50cmFuc21pdENoYWluIChjb21tb24ubW9kdWxlSWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0QnVmLT5oYW5kbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4QnVmRGVzY3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT5jb21tb24tPm1vZHVsZURTKTsNCisgIHN3aXRjaCAocmVzdWx0KQ0KKyAgew0KKyAgICBjYXNlIEVSUl9PVVRfT0ZfUkVTT1VSQ0U6DQorICAgICAgICAgLyogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGlmIGl0IGRvZXMgdGhlcmUgaXMgbm90DQorICAgICAgICAgICogbXVjaCB3ZSBjYW4gZG8gYWJvdXQgaXQNCisgICAgICAgICAgKi8NCisgICAgICAgICBwcmludGYgKCJFUlJPUjogdHJhbnNtaXQgcXVldWUgb3ZlcmZsb3dlZFxuIik7DQorICAgICAgICAgcmV0dXJuICgwKTsNCisNCisgICAgY2FzZSBFUlJfU1VDQ0VTUzoNCisgICAgICAgICAvKiBFdmVyeXRoaW5nIHdhcyBodW5reSBkb3J5IGFuZCBzeW5jaHJvbm91cy4gRnJlZSB1cCB0aGUgDQorICAgICAgICAgICogcGFja2V0IGJ1ZmZlcg0KKyAgICAgICAgICAqLw0KKyAgICAgICAgIHhtaXRQZW5kaW5nLS07DQorICAgICAgICAgRnJlZVBrdEJ1ZiAocGt0QnVmKTsNCisgICAgICAgICByZXR1cm4gKDEpOw0KKw0KKyAgICBjYXNlIEVSUl9SRVFVRVNUX1FVRVVFRDoNCisgICAgICAgICAvKiBFdmVyeXRoaW5nIHdhcyBodW5reSBkb3J5IGFuZCBhc3luY2hyb25vdXMuIERvIG5vdGhpbmcNCisgICAgICAgICAgKi8NCisgICAgICAgICByZXR1cm4gKDEpOw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgIHByaW50ZiAoIlR4IGZhaWwsIGNvZGUgPSAlMDRYXG4iLCByZXN1bHQpOw0KKyAgICAgICAgIHJldHVybiAoMCk7DQorICB9DQorfQ0KKw0KKw0KKw0KK3N0YXRpYyBpbnQgbmRpc19uZXJyID0gc2l6ZW9mKG5kaXNfZXJybGlzdCkgLyBzaXplb2YobmRpc19lcnJsaXN0WzBdKTsNCisNCitzdGF0aWMgY2hhciAqTmRpc19zdHJlcnJvciAoV09SRCBlcnJvckNvZGUpDQorew0KKyAgc3RhdGljIGNoYXIgYnVmWzMwXTsNCisgIGludCAgICBpOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IG5kaXNfbmVycjsgaSsrKQ0KKyAgICAgIGlmIChlcnJvckNvZGUgPT0gbmRpc19lcnJsaXN0W2ldLmVycl9udW0pDQorICAgICAgICAgcmV0dXJuIChuZGlzX2Vycmxpc3RbaV0uZXJyX3RleHQpOw0KKw0KKyAgc3ByaW50ZiAoYnVmLCJ1bmtub3duIGVycm9yICVkIixlcnJvckNvZGUpOw0KKyAgcmV0dXJuIChidWYpOw0KK30NCisNCisNCitjaGFyICpOZGlzTGFzdEVycm9yICh2b2lkKQ0KK3sNCisgIGNoYXIgKmVyclN0ciA9IGxhc3RFcnI7DQorICBsYXN0RXJyID0gTlVMTDsNCisgIHJldHVybiAoZXJyU3RyKTsNCit9DQorDQoraW50IE5kaXNPcGVuICh2b2lkKQ0KK3sNCisgIHN0cnVjdCBfUmVxQmxvY2sgcmVxQmxvY2s7DQorICBpbnQgICAgIHJlc3VsdDsNCisgIGludCAgICAgbmRpc0ZkID0gb3BlbiAoTkRJU19QQVRILCBPX1JET05MWSk7DQorDQorICBpZiAobmRpc0ZkIDwgMCkNCisgIHsNCisgICAgcHJpbnRmICgiQ291bGQgbm90IG9wZW4gTkRJUyBQcm90b2NvbCBNYW5hZ2VyIGRldmljZS5cbiIpOw0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgbWVtc2V0ICgmcmVxQmxvY2ssIDAsIHNpemVvZihSZXFCbG9jaykpOw0KKw0KKyAgcmVxQmxvY2sub3Bjb2RlID0gUE1fR0VUX1BST1RPQ09MX01BTkFHRVJfTElOS0FHRTsNCisNCisgIHJlc3VsdCA9IE5kaXNHZXRMaW5rYWdlIChuZGlzRmQsIChjaGFyKikmcmVxQmxvY2ssIHNpemVvZihSZXFCbG9jaykpOw0KKyAgaWYgKHJlc3VsdCAhPSAwKQ0KKyAgew0KKyAgICBwcmludGYgKCJDb3VsZCBub3QgZ2V0IFByb3RvY29sIE1hbmFnZXIgbGlua2FnZS5cbiIpOw0KKyAgICBjbG9zZSAobmRpc0ZkKTsNCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIGNsb3NlIChuZGlzRmQpOw0KKyAgcHJvdE1hbkVudHJ5ID0gKFByb3RNYW4pIHJlcUJsb2NrLnBvaW50ZXIxOw0KKyAgcHJvdE1hbkRTICAgID0gcmVxQmxvY2sud29yZDE7DQorDQorICBERUJVRzIgKCJFbnRyeSBQb2ludCA9ICUwNFg6JTA0WFxuIiwgRlBfU0VHKHByb3RNYW5FbnRyeSksRlBfT0ZGKHByb3RNYW5FbnRyeSkpOw0KKyAgREVCVUcxICgiUHJvdE1hbiBEUyAgPSAlMDRYXG4iLCBwcm90TWFuRFMpOw0KKyAgcmV0dXJuICgxKTsNCit9DQorDQorDQoraW50IE5kaXNSZWdpc3RlckFuZEJpbmQgKGludCBwcm9taXMpDQorew0KKyAgc3RydWN0IF9SZXFCbG9jayByZXFCbG9jazsNCisgIFdPUkQgICAgcmVzdWx0Ow0KKw0KKyAgbWVtc2V0ICgmY29tbW9uLDAsc2l6ZW9mKGNvbW1vbikpOw0KKw0KKyAgY29tbW9uLnRhYmxlU2l6ZSA9IHNpemVvZiAoY29tbW9uKTsNCisNCisgIGNvbW1vbi5tYWpvck5kaXNWZXJzaW9uICAgPSAyOw0KKyAgY29tbW9uLm1pbm9yTmRpc1ZlcnNpb24gICA9IDA7DQorICBjb21tb24ubWFqb3JNb2R1bGVWZXJzaW9uID0gMjsNCisgIGNvbW1vbi5taW5vck1vZHVsZVZlcnNpb24gPSAwOw0KKw0KKyAgLyogSW5kaWNhdGVzIGJpbmRpbmcgZnJvbSBiZWxvdyBhbmQgZHluYW1pY2FsbHkgbG9hZGVkDQorICAgKi8NCisgIGNvbW1vbi5tb2R1bGVGbGFncyA9IDB4MDAwMDAwMDZMOw0KKw0KKyAgc3RyY3B5IChjb21tb24ubW9kdWxlTmFtZSwgIlBDQVAiKTsNCisNCisgIGNvbW1vbi5wcm90b2NvbExldmVsVXBwZXIgPSAweEZGOw0KKyAgY29tbW9uLnByb3RvY29sTGV2ZWxMb3dlciA9IDE7DQorICBjb21tb24uaW50ZXJmYWNlTG93ZXIgICAgID0gMTsNCisjaWZkZWYgX19ESkdQUF9fDQorICBjb21tb24ubW9kdWxlRFMgICAgICAgICAgID0gX2Rvc19kczsgLyogdGhlIGNhbGxiYWNrIGRhdGEgc2VnbWVudCAqLw0KKyNlbHNlDQorICBjb21tb24ubW9kdWxlRFMgICAgICAgICAgID0gX0RTOw0KKyNlbmRpZg0KKw0KKyAgY29tbW9uLnN5c3RlbVJlcXVlc3QgICAgICA9IChTeXN0ZW1SZXF1ZXN0KSBzeXN0ZW1SZXF1ZXN0R2x1ZTsNCisgIGNvbW1vbi5zZXJ2aWNlQ2hhcnMgICAgICAgPSAoQllURSopICZwcm90Q2hhcnM7DQorICBjb21tb24uc2VydmljZVN0YXR1cyAgICAgID0gTlVMTDsNCisgIGNvbW1vbi51cHBlckRpc3BhdGNoVGFibGUgPSBOVUxMOw0KKyAgY29tbW9uLmxvd2VyRGlzcGF0Y2hUYWJsZSA9IChCWVRFKikgJmxvd2VyVGFibGU7DQorDQorICBwcm90Q2hhcnMubGVuZ3RoICA9IHNpemVvZiAocHJvdENoYXJzKTsNCisgIHByb3RDaGFycy5uYW1lWzBdID0gMDsNCisgIHByb3RDaGFycy50eXBlICAgID0gMDsNCisNCisgIGxvd2VyVGFibGUuYmFja1BvaW50ZXIgICAgICAgID0gJmNvbW1vbjsNCisgIGxvd2VyVGFibGUucmVxdWVzdENvbmZpcm0gICAgID0gcmVxdWVzdENvbmZpcm1HbHVlOw0KKyAgbG93ZXJUYWJsZS50cmFuc21pdENvbmZpcm0gICAgPSB0cmFuc21pdENvbmZpcm1HbHVlOw0KKyAgbG93ZXJUYWJsZS5yZWNlaXZlTG9va2FoZWFkICAgPSByZWNlaXZlTG9va2FoZWFkR2x1ZTsNCisgIGxvd2VyVGFibGUuaW5kaWNhdGlvbkNvbXBsZXRlID0gaW5kaWNhdGlvbkNvbXBsZXRlR2x1ZTsNCisgIGxvd2VyVGFibGUucmVjZWl2ZUNoYWluICAgICAgID0gcmVjZWl2ZUNoYWluR2x1ZTsNCisgIGxvd2VyVGFibGUuc3RhdHVzICAgICAgICAgICAgID0gc3RhdHVzR2x1ZTsNCisgIGxvd2VyVGFibGUuZmxhZ3MgICAgICAgICAgICAgID0gMzsNCisgIGlmIChwcm9taXMpDQorICAgICBsb3dlclRhYmxlLmZsYWdzIHw9IDQ7ICAgLyogcHJvbWlzY291cyBtb2RlIChyZWNlaXZlIGV2ZXJ5dGhpbmcpICovDQorDQorICBiaW5kaW5ncy5udW1CaW5kaW5ncyA9IDE7DQorICBzdHJjcHkgKGJpbmRpbmdzLm1vZHVsZU5hbWVbMF0sIGhhbmRsZS0+bW9kdWxlTmFtZSk7DQorDQorICAvKiBSZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBORElTDQorICAgKi8NCisgIHJlcUJsb2NrLm9wY29kZSAgID0gUE1fUkVHSVNURVJfTU9EVUxFOw0KKyAgcmVxQmxvY2sucG9pbnRlcjEgPSAoQllURSBGQVIqKSAmY29tbW9uOw0KKyAgcmVxQmxvY2sucG9pbnRlcjIgPSAoQllURSBGQVIqKSAmYmluZGluZ3M7DQorDQorICByZXN1bHQgPSAoKnByb3RNYW5FbnRyeSkgKCZyZXFCbG9jaywgcHJvdE1hbkRTKTsNCisgIGlmIChyZXN1bHQpDQorICB7DQorICAgIHByaW50ZiAoIlByb3RtYW4gcmVnaXN0ZXJpbmcgZmFpbGVkOiAlc1xuIiwgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsNCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIC8qIFN0YXJ0IHRoZSBiaW5kaW5nIHByb2Nlc3MNCisgICAqLw0KKyAgcmVxQmxvY2sub3Bjb2RlICAgPSBQTV9CSU5EX0FORF9TVEFSVDsNCisgIHJlcUJsb2NrLnBvaW50ZXIxID0gKEJZVEUgRkFSKikgJmZhaWxpbmdNb2R1bGVzOw0KKw0KKyAgcmVzdWx0ID0gKCpwcm90TWFuRW50cnkpICgmcmVxQmxvY2ssIHByb3RNYW5EUyk7DQorICBpZiAocmVzdWx0KQ0KKyAgew0KKyAgICBwcmludGYgKCJTdGFydCBiaW5kaW5nIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQorICAgIHJldHVybiAoMCk7DQorICB9DQorICByZXR1cm4gKDEpOw0KK30NCisNCitzdGF0aWMgaW50IENoZWNrTWFjRmVhdHVyZXMgKENhcmRIYW5kbGUgKmNhcmQpDQorew0KKyAgRFdPUkQgICAgICBzZXJ2aWNlRmxhZ3M7DQorICBCWVRFIF9mYXIgKm1lZGlhU3RyaW5nOw0KKyAgQllURSBfZmFyICptYWNfYWRkcjsNCisNCisgIERFQlVHMiAoImNoZWNraW5nIGNhcmQgZmVhdHVyZXNcbiINCisgICAgICAgICAgImNvbW1vbiB0YWJsZSBhZGRyZXNzID0gJTA4bFgsIG1hY0lkID0gJWRcbiIsDQorICAgICAgICAgIGNhcmQtPmNvbW1vbiwgY2FyZC0+Y29tbW9uLT5tb2R1bGVJZCk7DQorDQorICBzZXJ2aWNlRmxhZ3MgPSBNQUNfQ0hBUiAoaGFuZGxlKS0+c2VydmljZUZsYWdzOw0KKw0KKyAgaWYgKChzZXJ2aWNlRmxhZ3MgJiBTRl9QUk9NSVNDVU9VUykgPT0gMCkNCisgIHsNCisgICAgcHJpbnRmICgiVGhlIE1BQyAlcyBkb2VzIG5vdCBzdXBwb3J0IHByb21pc2N1b3VzIG1vZGUuXG4iLA0KKyAgICAgICAgICAgIGNhcmQtPm1vZHVsZU5hbWUpOw0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgbWVkaWFTdHJpbmcgPSBNQUNfQ0hBUiAoaGFuZGxlKS0+bWFjTmFtZTsNCisNCisgIERFQlVHMSAoIm1lZGlhIHR5cGUgPSAlc1xuIixtZWRpYVN0cmluZyk7DQorDQorICAvKiBHZXQgdGhlIG1lZGlhIHR5cGUuIEFuZCBzZXQgdGhlIGhlYWRlciBzaXplDQorICAgKi8NCisgIGlmICghc3RybmNtcChtZWRpYVN0cmluZywiODAyLjMiLDUpIHx8DQorICAgICAgIXN0cm5jbXAobWVkaWFTdHJpbmcsIkRJWCIsMykgICB8fA0KKyAgICAgICFzdHJuY21wKG1lZGlhU3RyaW5nLCJESVgrODAyLjMiLDkpKQ0KKyAgICAgICBoZWFkZXJTaXplID0gc2l6ZW9mIChFdGhlcm5ldElJSGVhZGVyKTsNCisNCisgIGVsc2UgaWYgKCFzdHJuY21wKG1lZGlhU3RyaW5nLCJGRERJIiw0KSkNCisgICAgICAgaGVhZGVyU2l6ZSA9IHNpemVvZiAoRmRkaUhlYWRlcikgKw0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChJZWVlODAyRG90MlNuYXBIZWFkZXIpOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBwcmludGYgKCJVbnN1cHBvcnRlZCBNQUMgdHlwZTogYCVzJ1xuIiwgbWVkaWFTdHJpbmcpOw0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgZnJhbWVTaXplID0gTUFDX0NIQVIgKGhhbmRsZSktPm1heEZyYW1lU2l6ZTsNCisgIG1hY19hZGRyICA9IE1BQ19DSEFSIChoYW5kbGUpLT5jdXJyZW50QWRkcmVzczsNCisNCisgIHByaW50ZiAoIkhhcmR3YXJlIGFkZHJlc3M6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLA0KKyAgICAgICAgICBtYWNfYWRkclswXSwgbWFjX2FkZHJbMV0sIG1hY19hZGRyWzJdLA0KKyAgICAgICAgICBtYWNfYWRkclszXSwgbWFjX2FkZHJbNF0sIG1hY19hZGRyWzVdKTsNCisgIHJldHVybiAoMSk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgTmRpc1N0YXJ0TWFjIChDYXJkSGFuZGxlICpjYXJkKQ0KK3sNCisgIFdPUkQgcmVzdWx0Ow0KKw0KKyAgLyogU2V0IHRoZSBsb29rYWhlYWQgbGVuZ3RoDQorICAgKi8NCisgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT5yZXF1ZXN0IChjb21tb24ubW9kdWxlSWQsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVFfU0VUX0xPT0tBSEVBRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5jb21tb24tPm1vZHVsZURTKTsNCisNCisgIC8qIFdlIGFzc3VtZSB0aGF0IGlmIHdlIGdvdCBJTlZBTElEIFBBUkFNRVRFUiB0aGVuIGVpdGhlciB0aGlzDQorICAgKiBpcyBub3Qgc3VwcG9ydGVkIG9yIHdpbGwgd29yayBhbnl3YXkuIE5FMjAwMCBkb2VzIHRoaXMuDQorICAgKi8NCisgIGlmIChyZXN1bHQgIT0gRVJSX1NVQ0NFU1MgJiYgcmVzdWx0ICE9IEVSUl9JTlZBTElEX1BBUkFNRVRFUikNCisgIHsNCisgICAgREVCVUcxICgiU2V0IGxvb2thaGVhZCBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgLyogU2V0IHRoZSBwYWNrZXQgZmlsdGVyLiBOb3RlIHRoYXQgZm9yIHNvbWUgbWVkaWFzIGFuZCBkcml2ZXJzIHdlDQorICAgKiBtdXN0IHNwZWNpZnkgYWxsIHRocmVlIGZsYWdzIG9yIHRoZSBjYXJkKHMpIHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5Lg0KKyAgICovDQorICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+cmVxdWVzdCAoY29tbW9uLm1vZHVsZUlkLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgcGFja2V0cyAqLyAgIEZJTFRFUl9QUk9NSVNDVU9VUyB8DQorICAgICAgICAgICAgICAgICAgICAgIC8qIHBhY2tldHMgdG8gdXMgKi8gRklMVEVSX0RJUkVDVEVEICAgIHwNCisgICAgICAgICAgICAgICAgICAgICAgLyogYnJvYWRjYXN0cyAqLyAgICBGSUxURVJfQlJPQURDQVNULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFJFUV9TRVRfUEFDS0VUX0ZJTFRFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5jb21tb24tPm1vZHVsZURTKTsNCisgIGlmIChyZXN1bHQgIT0gRVJSX1NVQ0NFU1MpDQorICB7DQorICAgIERFQlVHMSAoIlNldCBwYWNrZXQgZmlsdGVyIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQorICAgIHJldHVybiAoMCk7DQorICB9DQorDQorICAvKiBJZiBPUEVOL0NMT1NFIHN1cHBvcnRlZCB0aGVuIG9wZW4gdGhlIGFkYXB0ZXINCisgICAqLw0KKyAgaWYgKE1BQ19DSEFSKGhhbmRsZSktPnNlcnZpY2VGbGFncyAmIFNGX09QRU5fQ0xPU0UpDQorICB7DQorICAgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT5yZXF1ZXN0IChjb21tb24ubW9kdWxlSWQsIDAsIDAsIE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVFfT1BFTl9BREFQVEVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+Y29tbW9uLT5tb2R1bGVEUyk7DQorICAgIGlmIChyZXN1bHQgIT0gRVJSX1NVQ0NFU1MpDQorICAgIHsNCisgICAgICBERUJVRzEgKCJPcGVuaW5nIHRoZSBNQUMgZmFpbGVkOiAlc1xuIiwgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsNCisgICAgICByZXR1cm4gKDApOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gKDEpOw0KK30NCisNCit2b2lkIE5kaXNTaHV0ZG93biAodm9pZCkNCit7DQorICBzdHJ1Y3QgX1JlcUJsb2NrIHJlcUJsb2NrOw0KKyAgaW50ICAgICByZXN1bHQsIGk7DQorDQorICBpZiAoIWhhbmRsZSkNCisgICAgIHJldHVybjsNCisNCisgIC8qIElmIHRoZSBhZGFwdGVycyBzdXBwb3J0IG9wZW4gYW5kIGFyZSBvcGVuIHRoZW4gY2xvc2UgdGhlbQ0KKyAgICovDQorICBpZiAoKE1BQ19DSEFSKGhhbmRsZSktPnNlcnZpY2VGbGFncyAmIFNGX09QRU5fQ0xPU0UpICYmDQorICAgICAgKE1BQ19TVEFUVVMoaGFuZGxlKS0+bWFjU3RhdHVzICYgTUFDX09QRU4pKQ0KKyAgew0KKyAgICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+cmVxdWVzdCAoY29tbW9uLm1vZHVsZUlkLCAwLCAwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRX0NMT1NFX0FEQVBURVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPmNvbW1vbi0+bW9kdWxlRFMpOw0KKyAgICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTKQ0KKyAgICB7DQorICAgICAgcHJpbnRmICgiQ2xvc2luZyB0aGUgTUFDIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorDQorICAvKiBUZWxsIHRoZSBQcm90b2NvbCBNYW5hZ2VyIHRvIHVuYmluZCBhbmQgc3RvcA0KKyAgICovDQorICByZXFCbG9jay5vcGNvZGUgICA9IFBNX1VOQklORF9BTkRfU1RPUDsNCisgIHJlcUJsb2NrLnBvaW50ZXIxID0gKEJZVEUgRkFSKikgJmZhaWxpbmdNb2R1bGVzOw0KKyAgcmVxQmxvY2sucG9pbnRlcjIgPSBOVUxMOw0KKw0KKyAgcmVzdWx0ID0gKCpwcm90TWFuRW50cnkpICgmcmVxQmxvY2ssIHByb3RNYW5EUyk7DQorICBpZiAocmVzdWx0KQ0KKyAgICAgcHJpbnRmICgiVW5iaW5kIGZhaWxlZDogJXNcbiIsICBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IFNUQUNLX1BPT0xfU0laRTsgKytpKQ0KKyAgICAgZnJlZSAoZnJlZVN0YWNrc1tpXSAtIFNUQUNLX1NJWkUpOw0KKw0KKyAgaGFuZGxlID0gTlVMTDsNCit9DQorDQoraW50IE5kaXNJbml0IChpbnQgcHJvbWlzKQ0KK3sNCisgIGludCBpLCByZXN1bHQ7DQorDQorICAvKiBBbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIHN0YWNrcyB1c2VkIGZvciBORElTIGNhbGxiYWNrcw0KKyAgICovDQorICBmb3IgKGkgPSAwOyBpIDwgU1RBQ0tfUE9PTF9TSVpFOyArK2kpDQorICB7DQorICAgIGZyZWVTdGFja3NbaV0gPSBtYWxsb2MgKFNUQUNLX1NJWkUpOw0KKyAgICBpZiAoIWZyZWVTdGFja3NbaV0pDQorICAgICAgIHJldHVybiAoMCk7DQorICAgIGZyZWVTdGFja3NbaV0gKz0gU1RBQ0tfU0laRTsNCisgIH0NCisNCisgIGlmICghTmRpc09wZW4oKSkNCisgICAgIHJldHVybiAoMCk7DQorDQorICBpZiAoIU5kaXNSZWdpc3RlckFuZEJpbmQocHJvbWlzKSkNCisgICAgIHJldHVybiAoMCk7DQorDQorICBERUJVRzEgKCJNeSBtb2R1bGUgaWQ6ICVkXG4iLCBjb21tb24ubW9kdWxlSWQpOw0KKyAgREVCVUcxICgiSGFuZGxlIGlkOyAgICAlZFxuIiwgaGFuZGxlLT5jb21tb24tPm1vZHVsZUlkKTsNCisgIERFQlVHMSAoIk1BQyBjYXJkOiAgICAgJS0xNnMgLSAiLCBoYW5kbGUtPm1vZHVsZU5hbWUpOw0KKw0KKyAgYXRleGl0IChOZGlzU2h1dGRvd24pOw0KKw0KKyAgaWYgKCFDaGVja01hY0ZlYXR1cmVzKCZoYW5kbGUpKQ0KKyAgICAgcmV0dXJuICgwKTsNCisNCisgIHN3aXRjaCAobWVkaWFUeXBlKQ0KKyAgew0KKyAgICBjYXNlIE1FRElBX0ZEREk6DQorICAgICAgICAgREVCVUcwICgiTWVkaWEgdHlwZTogRkRESSIpOw0KKwkgYnJlYWs7DQorICAgIGNhc2UgTUVESUFfRVRIRVJORVQ6DQorICAgICAgICAgREVCVUcwICgiTWVkaWEgdHlwZTogRVRIRVJORVQiKTsNCisJIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgIERFQlVHMCAoIlVuc3VwcG9ydGVkIG1lZGlhLlxuIik7DQorICAgICAgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIERFQlVHMSAoIiAtIEZyYW1lIHNpemU6ICVkXG4iLCBmcmFtZVNpemUpOw0KKw0KKyAgaWYgKCFOZGlzU3RhcnRNYWMoJmhhbmRsZSkpDQorICAgICByZXR1cm4gKDApOw0KKyAgcmV0dXJuICgxKTsNCit9DQorI2VuZGlmICAvKiBVU0VfTkRJUzIgKi8NCisNCmRpZmYgLS1naXQgYS9tc2Rvcy9uZGlzMi5oIGIvbXNkb3MvbmRpczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzcyZjRjCi0tLSAvZGV2L251bGwKKysrIGIvbXNkb3MvbmRpczIuaApAQCAtMCwwICsxLDU1OSBAQAorLyogDQorICogQ29weXJpZ2h0IChjKSAxOTkzLDE5OTQNCisgKiAgICAgIFRleGFzIEEmTSBVbml2ZXJzaXR5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUNCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6DQorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRleGFzIEEmTSBVbml2ZXJzaXR5DQorICogICAgICBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4NCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgVU5JVkVSU0lUWSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQNCisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFVOSVZFUlNJVFkgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMNCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikNCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVA0KKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkNCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQorICogU1VDSCBEQU1BR0UuDQorICoNCisgKiBEZXZlbG9wZXJzOg0KKyAqICAgICAgICAgICAgIERhdmlkIEsuIEhlc3MsIERvdWdsYXMgTGVlIFNjaGFsZXMsIERhdmlkIFIuIFNhZmZvcmQNCisgKg0KKyAqIEhlYXZpbHkgbW9kaWZpZWQgZm9yIE1ldGF3YXJlIEhpZ2hDICsgR05VIEMgMi44Kw0KKyAqICAgICAgICAgICAgIEdpc2xlIFZhbmVtIDE5OTgNCisgKi8NCisNCisjaWZuZGVmIF9fUENBUF9ORElTX0gNCisjZGVmaW5lIF9fUENBUF9ORElTX0gNCisNCisjaWYgZGVmaW5lZCAoX19ISUdIQ19fKQ0KKyAgI2RlZmluZSBwYXNjYWwgICAgICAgICAgX0NDKF9DQUxMRUVfUE9QU19TVEFDSyAmIH5fUkVWRVJTRV9QQVJNUykgLyogY2FsbGluZyBjb252ZW50aW9uICovDQorICAjZGVmaW5lIENBTExCQUNLKGZvbykgICBwYXNjYWwgV09SRCBmb28NCisgICNkZWZpbmUgUEFTX1BUUih4LGFyZykgIHR5cGVkZWYgRkFSIFdPUkQgcGFzY2FsICgqeCkgYXJnDQorICAjZGVmaW5lIEdVQVJEKCkgICAgICAgICBfaW5saW5lICgweDlDLDB4RkEpICAgLyogcHVzaGZkLCBjbGkgKi8NCisgICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9pbmxpbmUgKDB4OUQpICAgICAgICAvKiBwb3BmZCAqLw0KKyAgI2RlZmluZSBGQVIgICAgICAgICAgICAgX2Zhcg0KKw0KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pDQorICAjZGVmaW5lIENBTExCQUNLKGZvbykgICBXT1JEIGZvbyBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkNCisgICNkZWZpbmUgUEFTX1BUUih4LGFyZykgIHR5cGVkZWYgV09SRCAoKngpIGFyZyBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkNCisgICNkZWZpbmUgR1VBUkQoKSAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgicHVzaGZkOyBjbGkiKQ0KKyAgI2RlZmluZSBVTkdVQVJEKCkgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwb3BmZCIpDQorICAjZGVmaW5lIEZBUg0KKw0KKyNlbGlmIGRlZmluZWQgKF9fVFVSQk9DX18pDQorICAjZGVmaW5lIENBTExCQUNLKGZvbykgICBXT1JEIHBhc2NhbCBmb28NCisgICNkZWZpbmUgUEFTX1BUUih4LGFyZykgIHR5cGVkZWYgV09SRCBwYXNjYWwgKF9mYXIgKngpIGFyZw0KKyAgI2RlZmluZSBHVUFSRCgpICAgICAgICAgX2FzbSB7IHB1c2hmOyBjbGkgfQ0KKyAgI2RlZmluZSBVTkdVQVJEKCkgICAgICAgX2FzbSB7IHBvcGYgfQ0KKyAgI2RlZmluZSBGQVIgICAgICAgICAgICAgX2Zhcg0KKw0KKyNlbGlmIGRlZmluZWQgKF9fV0FUQ09NQ19fKQ0KKyAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgV09SRCBwYXNjYWwgZm9vDQorICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIFdPUkQgcGFzY2FsIChfZmFyICp4KSBhcmcNCisgICNkZWZpbmUgR1VBUkQoKSAgICAgICAgIF9kaXNhYmxlKCkNCisgICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9lbmFibGUoKQ0KKyAgI2RlZmluZSBGQVIgICAgICAgICAgICAgX2Zhcg0KKw0KKyNlbHNlDQorICAjZXJyb3IgVW5zdXBwb3J0ZWQgY29tcGlsZXINCisjZW5kaWYNCisNCisNCisvKg0KKyAqICBGb3J3YXJkcw0KKyAqLw0KK3N0cnVjdCBfUmVxQmxvY2s7DQorc3RydWN0IF9UeEJ1ZkRlc2NyOw0KK3N0cnVjdCBfVERCdWZEZXNjcjsNCisNCisvKg0KKyAqIFByb3RvY29sIE1hbmFnZXIgQVBJDQorICovDQorUEFTX1BUUiAoUHJvdE1hbiwgKHN0cnVjdCBfUmVxQmxvY2sgRkFSKiwgV09SRCkpOw0KKw0KKy8qDQorICogU3lzdGVtIHJlcXVlc3QNCisgKi8NCitQQVNfUFRSIChTeXN0ZW1SZXF1ZXN0LCAoRFdPUkQsIERXT1JELCBXT1JELCBXT1JELCBXT1JEKSk7DQorDQorLyoNCisgKiBNQUMgQVBJDQorICovDQorUEFTX1BUUiAoVHJhbnNtaXRDaGFpbiwgKFdPUkQsIFdPUkQsIHN0cnVjdCBfVHhCdWZEZXNjciBGQVIqLCBXT1JEKSk7DQorUEFTX1BUUiAoVHJhbnNmZXJEYXRhLCAgKFdPUkQqLFdPUkQsIHN0cnVjdCBfVERCdWZEZXNjciBGQVIqLCBXT1JEKSk7DQorUEFTX1BUUiAoUmVxdWVzdCwgICAgICAgKFdPUkQsIFdPUkQsIFdPUkQsIERXT1JELCBXT1JELCBXT1JEKSk7DQorUEFTX1BUUiAoUmVjZWl2ZVJlbGVhc2UsKFdPUkQsIFdPUkQpKTsNCitQQVNfUFRSIChJbmRpY2F0aW9uT24sICAoV09SRCkpOw0KK1BBU19QVFIgKEluZGljYXRpb25PZmYsIChXT1JEKSk7DQorDQorDQordHlwZWRlZiBlbnVtIHsNCisgICAgICAgIEhBUkRXQVJFX05PVF9JTlNUQUxMRUQgID0gMCwNCisgICAgICAgIEhBUkRXQVJFX0ZBSUxFRF9ESUFHICAgID0gMSwNCisgICAgICAgIEhBUkRXQVJFX0ZBSUxFRF9DT05GSUcgID0gMiwNCisgICAgICAgIEhBUkRXQVJFX0hBUkRfRkFVTFQgICAgID0gMywNCisgICAgICAgIEhBUkRXQVJFX1NPRlRfRkFVTFQgICAgID0gNCwNCisgICAgICAgIEhBUkRXQVJFX09LICAgICAgICAgICAgID0gNywNCisgICAgICAgIEhBUkRXQVJFX01BU0sgICAgICAgICAgID0gMHgwMDA3LA0KKyAgICAgICAgTUFDX0JPVU5EICAgICAgICAgICAgICAgPSAweDAwMDgsDQorICAgICAgICBNQUNfT1BFTiAgICAgICAgICAgICAgICA9IDB4MDAxMCwNCisgICAgICAgIERJQUdfSU5fUFJPR1JFU1MgICAgICAgID0gMHgwMDIwDQorICAgICAgfSBOZGlzTWFjU3RhdHVzOw0KKw0KK3R5cGVkZWYgZW51bSB7DQorICAgICAgICBTVEFUVVNfUklOR19TVEFUVVMgICAgICA9IDEsDQorICAgICAgICBTVEFUVVNfQURBUFRFUl9DSEVDSyAgICA9IDIsDQorICAgICAgICBTVEFUVVNfU1RBUlRfUkVTRVQgICAgICA9IDMsDQorICAgICAgICBTVEFUVVNfSU5URVJSVVBUICAgICAgICA9IDQsDQorICAgICAgICBTVEFUVVNfRU5EX1JFU0VUICAgICAgICA9IDUNCisgICAgICB9IE5kaXNTdGF0dXM7DQorDQordHlwZWRlZiBlbnVtIHsNCisgICAgICAgIEZJTFRFUl9ESVJFQ1RFRCAgICAgICAgID0gMSwNCisgICAgICAgIEZJTFRFUl9CUk9BRENBU1QgICAgICAgID0gMiwNCisgICAgICAgIEZJTFRFUl9QUk9NSVNDVU9VUyAgICAgID0gNCwNCisgICAgICAgIEZJTFRFUl9TT1VSQ0VfUk9VVEUgICAgID0gOA0KKyAgICAgIH0gTmRpc1BhY2tldEZpbHRlcjsNCisNCit0eXBlZGVmIGVudW0gew0KKyAgICAgICAgUkVRX0lOSVRJQVRFX0RJQUdOT1NUSUNTICAgICA9IDEsDQorICAgICAgICBSRVFfUkVBRF9FUlJPUl9MT0cgICAgICAgICAgID0gMiwNCisgICAgICAgIFJFUV9TRVRfU1RBVElPTl9BRERSRVNTICAgICAgPSAzLA0KKyAgICAgICAgUkVRX09QRU5fQURBUFRFUiAgICAgICAgICAgICA9IDQsDQorICAgICAgICBSRVFfQ0xPU0VfQURBUFRFUiAgICAgICAgICAgID0gNSwNCisgICAgICAgIFJFUV9SRVNFVF9NQUMgICAgICAgICAgICAgICAgPSA2LA0KKyAgICAgICAgUkVRX1NFVF9QQUNLRVRfRklMVEVSICAgICAgICA9IDcsDQorICAgICAgICBSRVFfQUREX01VTFRJQ0FTVF9BRERSRVNTICAgID0gOCwNCisgICAgICAgIFJFUV9ERUxFVEVfTVVMVElDQVNUX0FERFJFU1MgPSA5LA0KKyAgICAgICAgUkVRX1VQREFURV9TVEFUSVNUSUNTICAgICAgICA9IDEwLA0KKyAgICAgICAgUkVRX0NMRUFSX1NUQVRJU1RJQ1MgICAgICAgICA9IDExLA0KKyAgICAgICAgUkVRX0lOVEVSUlVQVF9SRVFVRVNUICAgICAgICA9IDEyLA0KKyAgICAgICAgUkVRX1NFVF9GVU5DVElPTkFMX0FERFJFU1MgICA9IDEzLA0KKyAgICAgICAgUkVRX1NFVF9MT09LQUhFQUQgICAgICAgICAgICA9IDE0DQorICAgICAgfSBOZGlzR2VuZXJhbFJlcXVlc3Q7DQorDQordHlwZWRlZiBlbnVtIHsNCisgICAgICAgIFNGX0JST0FEQ0FTVCAgICAgICAgICAgICA9IDB4MDAwMDAwMDFMLA0KKyAgICAgICAgU0ZfTVVMVElDQVNUICAgICAgICAgICAgID0gMHgwMDAwMDAwMkwsDQorICAgICAgICBTRl9GVU5DVElPTkFMICAgICAgICAgICAgPSAweDAwMDAwMDA0TCwNCisgICAgICAgIFNGX1BST01JU0NVT1VTICAgICAgICAgICA9IDB4MDAwMDAwMDhMLA0KKyAgICAgICAgU0ZfU09GVF9BRERSRVNTICAgICAgICAgID0gMHgwMDAwMDAxMEwsDQorICAgICAgICBTRl9TVEFUU19DVVJSRU5UICAgICAgICAgPSAweDAwMDAwMDIwTCwNCisgICAgICAgIFNGX0lOSVRJQVRFX0RJQUdTICAgICAgICA9IDB4MDAwMDAwNDBMLA0KKyAgICAgICAgU0ZfTE9PUEJBQ0sgICAgICAgICAgICAgID0gMHgwMDAwMDA4MEwsDQorICAgICAgICBTRl9SRUNFSVZFX0NIQUlOICAgICAgICAgPSAweDAwMDAwMTAwTCwNCisgICAgICAgIFNGX1NPVVJDRV9ST1VUSU5HICAgICAgICA9IDB4MDAwMDAyMDBMLA0KKyAgICAgICAgU0ZfUkVTRVRfTUFDICAgICAgICAgICAgID0gMHgwMDAwMDQwMEwsDQorICAgICAgICBTRl9PUEVOX0NMT1NFICAgICAgICAgICAgPSAweDAwMDAwODAwTCwNCisgICAgICAgIFNGX0lOVEVSUlVQVF9SRVFVRVNUICAgICA9IDB4MDAwMDEwMDBMLA0KKyAgICAgICAgU0ZfU09VUkNFX1JPVVRJTkdfQlJJREdFID0gMHgwMDAwMjAwMEwsDQorICAgICAgICBTRl9WSVJUVUFMX0FERFJFU1NFUyAgICAgPSAweDAwMDA0MDAwTA0KKyAgICAgIH0gTmRpc01hY1NlcnZpY2VGbGFnczsNCisNCit0eXBlZGVmIGVudW0gew0KKyAgICAgICAgUkVRX0lOSVRJQVRFX0JJTkQgICAgICAgID0gMSwNCisgICAgICAgIFJFUV9CSU5EICAgICAgICAgICAgICAgICA9IDIsDQorICAgICAgICBSRVFfSU5JVElBVEVfUFJFQklORCAgICAgPSAzLA0KKyAgICAgICAgUkVRX0lOSVRJQVRFX1VOQklORCAgICAgID0gNCwNCisgICAgICAgIFJFUV9VTkJJTkQgICAgICAgICAgICAgICA9IDUNCisgICAgICB9IE5kaXNTeXNSZXF1ZXN0Ow0KKw0KK3R5cGVkZWYgZW51bSAgew0KKyAgICAgICAgUE1fR0VUX1BST1RPQ09MX01BTkFHRVJfSU5GTyAgICAgID0gMSwNCisgICAgICAgIFBNX1JFR0lTVEVSX01PRFVMRSAgICAgICAgICAgICAgICA9IDIsDQorICAgICAgICBQTV9CSU5EX0FORF9TVEFSVCAgICAgICAgICAgICAgICAgPSAzLA0KKyAgICAgICAgUE1fR0VUX1BST1RPQ09MX01BTkFHRVJfTElOS0FHRSAgID0gNCwNCisgICAgICAgIFBNX0dFVF9QUk9UT0NPTF9JTklfUEFUSCAgICAgICAgICA9IDUsDQorICAgICAgICBQTV9SRUdJU1RFUl9QUk9UT0NPTF9NQU5BR0VSX0lORk8gPSA2LA0KKyAgICAgICAgUE1fSU5JVF9BTkRfUkVHSVNURVIgICAgICAgICAgICAgID0gNywNCisgICAgICAgIFBNX1VOQklORF9BTkRfU1RPUCAgICAgICAgICAgICAgICA9IDgsDQorICAgICAgICBQTV9CSU5EX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgPSA5LA0KKyAgICAgICAgUE1fUkVHSVNURVJfU1RBVFVTICAgICAgICAgICAgICAgID0gMTANCisgICAgICB9IE5kaXNQcm90TWFuYWdlcjsNCisNCisNCit0eXBlZGVmIGVudW0gew0KKyAgICAgICAgRVJSX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgPSAweDAwLA0KKyAgICAgICAgRVJSX1dBSVRfRk9SX1JFTEVBU0UgICAgICAgICAgICAgPSAweDAxLA0KKyAgICAgICAgRVJSX1JFUVVFU1RfUVVFVUVEICAgICAgICAgICAgICAgPSAweDAyLA0KKyAgICAgICAgRVJSX0ZSQU1FX05PVF9SRUNPR05JWkVEICAgICAgICAgPSAweDAzLA0KKyAgICAgICAgRVJSX0ZSQU1FX1JFSkVDVEVEICAgICAgICAgICAgICAgPSAweDA0LA0KKyAgICAgICAgRVJSX0ZPUldBUkRfRlJBTUUgICAgICAgICAgICAgICAgPSAweDA1LA0KKyAgICAgICAgRVJSX09VVF9PRl9SRVNPVVJDRSAgICAgICAgICAgICAgPSAweDA2LA0KKyAgICAgICAgRVJSX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgPSAweDA3LA0KKyAgICAgICAgRVJSX0lOVkFMSURfRlVOQ1RJT04gICAgICAgICAgICAgPSAweDA4LA0KKyAgICAgICAgRVJSX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgPSAweDA5LA0KKyAgICAgICAgRVJSX0hBUkRXQVJFX0VSUk9SICAgICAgICAgICAgICAgPSAweDBBLA0KKyAgICAgICAgRVJSX1RSQU5TTUlUX0VSUk9SICAgICAgICAgICAgICAgPSAweDBCLA0KKyAgICAgICAgRVJSX05PX1NVQ0hfREVTVElOQVRJT04gICAgICAgICAgPSAweDBDLA0KKyAgICAgICAgRVJSX0JVRkZFUl9UT09fU01BTEwgICAgICAgICAgICAgPSAweDBELA0KKyAgICAgICAgRVJSX0FMUkVBRFlfU1RBUlRFRCAgICAgICAgICAgICAgPSAweDIwLA0KKyAgICAgICAgRVJSX0lOQ09NUExFVEVfQklORElORyAgICAgICAgICAgPSAweDIxLA0KKyAgICAgICAgRVJSX0RSSVZFUl9OT1RfSU5JVElBTElaRUQgICAgICAgPSAweDIyLA0KKyAgICAgICAgRVJSX0hBUkRXQVJFX05PVF9GT1VORCAgICAgICAgICAgPSAweDIzLA0KKyAgICAgICAgRVJSX0hBUkRXQVJFX0ZBSUxVUkUgICAgICAgICAgICAgPSAweDI0LA0KKyAgICAgICAgRVJSX0NPTkZJR1VSQVRJT05fRkFJTFVSRSAgICAgICAgPSAweDI1LA0KKyAgICAgICAgRVJSX0lOVEVSUlVQVF9DT05GTElDVCAgICAgICAgICAgPSAweDI2LA0KKyAgICAgICAgRVJSX0lOQ09NUEFUSUJMRV9NQUMgICAgICAgICAgICAgPSAweDI3LA0KKyAgICAgICAgRVJSX0lOSVRJQUxJWkFUSU9OX0ZBSUxFRCAgICAgICAgPSAweDI4LA0KKyAgICAgICAgRVJSX05PX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgPSAweDI5LA0KKyAgICAgICAgRVJSX05FVFdPUktfTUFZX05PVF9CRV9DT05ORUNURUQgPSAweDJBLA0KKyAgICAgICAgRVJSX0lOQ09NUEFUSUJMRV9PU19WRVJTSU9OICAgICAgPSAweDJCLA0KKyAgICAgICAgRVJSX0FMUkVBRFlfUkVHSVNURVJFRCAgICAgICAgICAgPSAweDJDLA0KKyAgICAgICAgRVJSX1BBVEhfTk9UX0ZPVU5EICAgICAgICAgICAgICAgPSAweDJELA0KKyAgICAgICAgRVJSX0lOU1VGRklDSUVOVF9NRU1PUlkgICAgICAgICAgPSAweDJFLA0KKyAgICAgICAgRVJSX0lORk9fTk9UX0ZPVU5EICAgICAgICAgICAgICAgPSAweDJGLA0KKyAgICAgICAgRVJSX0dFTkVSQUxfRkFJTFVSRSAgICAgICAgICAgICAgPSAweEZGDQorICAgICAgfSBOZGlzRXJyb3I7DQorDQorI2RlZmluZSBORElTX1BBUkFNX0lOVEVHRVIgICAwDQorI2RlZmluZSBORElTX1BBUkFNX1NUUklORyAgICAxDQorDQorI2RlZmluZSBORElTX1RYX0JVRl9MRU5HVEggICA4DQorI2RlZmluZSBORElTX1REX0JVRl9MRU5HVEggICAxDQorI2RlZmluZSBORElTX1JYX0JVRl9MRU5HVEggICA4DQorDQorI2RlZmluZSBORElTX1BUUl9QSFlTSUNBTCAgICAwDQorI2RlZmluZSBORElTX1BUUl9WSVJUVUFMICAgICAyDQorDQorI2RlZmluZSBORElTX1BBVEggICAgIlBST1RNQU4kIg0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9Db21tb25DaGFycyB7DQorICAgICAgICBXT1JEICB0YWJsZVNpemU7DQorICAgICAgICBCWVRFICBtYWpvck5kaXNWZXJzaW9uOyAgICAgICAgLyogMiAtIExhdGVzdCB2ZXJzaW9uICovDQorICAgICAgICBCWVRFICBtaW5vck5kaXNWZXJzaW9uOyAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICovDQorICAgICAgICBXT1JEICByZXNlcnZlZDE7DQorICAgICAgICBCWVRFICBtYWpvck1vZHVsZVZlcnNpb247DQorICAgICAgICBCWVRFICBtaW5vck1vZHVsZVZlcnNpb247DQorICAgICAgICBEV09SRCBtb2R1bGVGbGFnczsNCisgICAgICAgIC8qIDAgLSBCaW5kaW5nIGF0IHVwcGVyIGJvdW5kYXJ5IHN1cHBvcnRlZA0KKyAgICAgICAgICogMSAtIEJpbmRpbmcgYXQgbG93ZXIgYm91bmRhcnkgc3VwcG9ydGVkDQorICAgICAgICAgKiAyIC0gRHluYW1pY2FsbHkgYm91bmQuDQorICAgICAgICAgKiAzLTMxIC0gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4NCisgICAgICAgICAqLw0KKyAgICAgICAgQllURSAgbW9kdWxlTmFtZVsxNl07DQorICAgICAgICBCWVRFICBwcm90b2NvbExldmVsVXBwZXI7DQorICAgICAgICAvKiAxIC0gTUFDDQorICAgICAgICAgKiAyIC0gRGF0YSBMaW5rDQorICAgICAgICAgKiAzIC0gTmV0d29yaw0KKyAgICAgICAgICogNCAtIFRyYW5zcG9ydA0KKyAgICAgICAgICogNSAtIFNlc3Npb24NCisgICAgICAgICAqIC0xIC0gTm90IHNwZWNpZmllZA0KKyAgICAgICAgICovDQorICAgICAgICBCWVRFICBpbnRlcmZhY2VVcHBlcjsNCisgICAgICAgIEJZVEUgIHByb3RvY29sTGV2ZWxMb3dlcjsNCisgICAgICAgIC8qIDAgLSBQaHlzaWNhbA0KKyAgICAgICAgICogMSAtIE1BQw0KKyAgICAgICAgICogMiAtIERhdGEgTGluaw0KKyAgICAgICAgICogMyAtIE5ldHdvcmsNCisgICAgICAgICAqIDQgLSBUcmFuc3BvcnQNCisgICAgICAgICAqIDUgLSBTZXNzaW9uDQorICAgICAgICAgKiAtMSAtIE5vdCBzcGVjaWZpZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgQllURSAgaW50ZXJmYWNlTG93ZXI7DQorICAgICAgICBXT1JEICBtb2R1bGVJZDsNCisgICAgICAgIFdPUkQgIG1vZHVsZURTOw0KKyAgICAgICAgU3lzdGVtUmVxdWVzdCBzeXN0ZW1SZXF1ZXN0Ow0KKyAgICAgICAgQllURSAqc2VydmljZUNoYXJzOw0KKyAgICAgICAgQllURSAqc2VydmljZVN0YXR1czsNCisgICAgICAgIEJZVEUgKnVwcGVyRGlzcGF0Y2hUYWJsZTsNCisgICAgICAgIEJZVEUgKmxvd2VyRGlzcGF0Y2hUYWJsZTsNCisgICAgICAgIEJZVEUgKnJlc2VydmVkMjsgICAgICAgICAgICAvKiBNdXN0IGJlIE5VTEwgKi8NCisgICAgICAgIEJZVEUgKnJlc2VydmVkMzsgICAgICAgICAgICAvKiBNdXN0IGJlIE5VTEwgKi8NCisgICAgICB9IENvbW1vbkNoYXJzOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9NdWx0aWNhc3RMaXN0IHsNCisgICAgICAgIFdPUkQgICBtYXhNdWx0aWNhc3RBZGRyZXNzZXM7DQorICAgICAgICBXT1JEICAgbnVtYmVyTXVsdGljYXN0QWRkcmVzc2VzOw0KKyAgICAgICAgQllURSAgIG11bHRpY2FzdEFkZHJlc3NbMTZdWzE2XTsNCisgICAgICB9IE11bHRpY2FzdExpc3Q7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX01hY0NoYXJzIHsNCisgICAgICAgIFdPUkQgICB0YWJsZVNpemU7DQorICAgICAgICBCWVRFICAgbWFjTmFtZVsxNl07DQorICAgICAgICBXT1JEICAgYWRkcmVzc0xlbmd0aDsNCisgICAgICAgIEJZVEUgICBwZXJtYW5lbnRBZGRyZXNzWzE2XTsNCisgICAgICAgIEJZVEUgICBjdXJyZW50QWRkcmVzc1sxNl07DQorICAgICAgICBEV09SRCAgY3VycmVudEZ1bmN0aW9uYWxBZGRyZXNzOw0KKyAgICAgICAgTXVsdGljYXN0TGlzdCAqbXVsdGljYXN0TGlzdDsNCisgICAgICAgIERXT1JEICBsaW5rU3BlZWQ7DQorICAgICAgICBEV09SRCAgc2VydmljZUZsYWdzOw0KKyAgICAgICAgV09SRCAgIG1heEZyYW1lU2l6ZTsNCisgICAgICAgIERXT1JEICB0eEJ1ZmZlclNpemU7DQorICAgICAgICBXT1JEICAgdHhCdWZmZXJBbGxvY1NpemU7DQorICAgICAgICBEV09SRCAgcnhCdWZmZXJTaXplOw0KKyAgICAgICAgV09SRCAgIHJ4QnVmZmVyQWxsb2NTaXplOw0KKyAgICAgICAgQllURSAgIGllZWVWZW5kb3JbM107DQorICAgICAgICBCWVRFICAgdmVuZG9yQWRhcHRlcjsNCisgICAgICAgIEJZVEUgICp2ZW5kb3JBZGFwdGVyRGVzY3JpcHRpb247DQorICAgICAgICBXT1JEICAgaW50ZXJydXB0TGV2ZWw7DQorICAgICAgICBXT1JEICAgdHhRdWV1ZURlcHRoOw0KKyAgICAgICAgV09SRCAgIG1heERhdGFCbG9ja3M7DQorICAgICAgfSBNYWNDaGFyczsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfUHJvdG9jb2xDaGFycyB7DQorICAgICAgICBXT1JEICAgbGVuZ3RoOw0KKyAgICAgICAgQllURSAgIG5hbWVbMTZdOw0KKyAgICAgICAgV09SRCAgIHR5cGU7DQorICAgICAgfSBQcm90b2NvbENoYXJzOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9NYWNVcHBlckRpc3BhdGNoIHsNCisgICAgICAgIENvbW1vbkNoYXJzICAgICAgKmJhY2tQb2ludGVyOw0KKyAgICAgICAgUmVxdWVzdCAgICAgICAgICAgcmVxdWVzdDsNCisgICAgICAgIFRyYW5zbWl0Q2hhaW4gICAgIHRyYW5zbWl0Q2hhaW47DQorICAgICAgICBUcmFuc2ZlckRhdGEgICAgICB0cmFuc2ZlckRhdGE7DQorICAgICAgICBSZWNlaXZlUmVsZWFzZSAgICByZWNlaXZlUmVsZWFzZTsNCisgICAgICAgIEluZGljYXRpb25PbiAgICAgIGluZGljYXRpb25PbjsNCisgICAgICAgIEluZGljYXRpb25PZmYgICAgIGluZGljYXRpb25PZmY7DQorICAgICAgfSBNYWNVcHBlckRpc3BhdGNoOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9NYWNTdGF0dXNUYWJsZSB7DQorICAgICAgICBXT1JEICAgdGFibGVTaXplOw0KKyAgICAgICAgRFdPUkQgIGxhc3REaWFnOw0KKyAgICAgICAgRFdPUkQgIG1hY1N0YXR1czsNCisgICAgICAgIFdPUkQgICBwYWNrZXRGaWx0ZXI7DQorICAgICAgICBCWVRFICAqbWVkaWFTcGVjaWZpY1N0YXRzOw0KKyAgICAgICAgRFdPUkQgIGxhc3RDbGVhcjsNCisgICAgICAgIERXT1JEICB0b3RhbEZyYW1lc1J4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsRnJhbWVzQ3JjOw0KKyAgICAgICAgRFdPUkQgIHRvdGFsQnl0ZXNSeDsNCisgICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRCdWZTcGFjZVJ4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsTXVsdGljYXN0Ung7DQorICAgICAgICBEV09SRCAgdG90YWxCcm9hZGNhc3RSeDsNCisgICAgICAgIERXT1JEICBvYnNvbGV0ZTFbNV07DQorICAgICAgICBEV09SRCAgdG90YWxEaXNjYXJkSHdFcnJvclJ4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsRnJhbWVzVHg7DQorICAgICAgICBEV09SRCAgdG90YWxCeXRlc1R4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsTXVsdGljYXN0VHg7DQorICAgICAgICBEV09SRCAgdG90YWxCcm9hZGNhc3RUeDsNCisgICAgICAgIERXT1JEICBvYnNvbGV0ZTJbMl07DQorICAgICAgICBEV09SRCAgdG90YWxEaXNjYXJkVGltZW91dFR4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsRGlzY2FyZEh3RXJyb3JUeDsNCisgICAgICB9IE1hY1N0YXR1c1RhYmxlOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9Qcm90RGlzcGF0Y2ggew0KKyAgICAgICAgQ29tbW9uQ2hhcnMgKmJhY2tQb2ludGVyOw0KKyAgICAgICAgRFdPUkQgICAgICAgIGZsYWdzOw0KKyAgICAgICAgLyogMCAtIGhhbmRsZXMgbm9uLUxMQyBmcmFtZXMNCisgICAgICAgICAqIDEgLSBoYW5kbGVzIHNwZWNpZmljLUxTQVAgTExDIGZyYW1lcw0KKyAgICAgICAgICogMiAtIGhhbmRsZXMgc3BlY2lmaWMtTFNBUCBMTEMgZnJhbWVzDQorICAgICAgICAgKiAzLTMxIC0gcmVzZXJ2ZWQgbXVzdCBiZSAwDQorICAgICAgICAgKi8NCisgICAgICAgIHZvaWQgICgqcmVxdWVzdENvbmZpcm0pICh2b2lkKTsNCisgICAgICAgIHZvaWQgICgqdHJhbnNtaXRDb25maXJtKSAodm9pZCk7DQorICAgICAgICB2b2lkICAoKnJlY2VpdmVMb29rYWhlYWQpICh2b2lkKTsNCisgICAgICAgIHZvaWQgICgqaW5kaWNhdGlvbkNvbXBsZXRlKSAodm9pZCk7DQorICAgICAgICB2b2lkICAoKnJlY2VpdmVDaGFpbikgKHZvaWQpOw0KKyAgICAgICAgdm9pZCAgKCpzdGF0dXMpICh2b2lkKTsNCisgICAgICB9IFByb3REaXNwYXRjaDsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfUmVxQmxvY2sgew0KKyAgICAgICAgV09SRCAgICAgIG9wY29kZTsNCisgICAgICAgIFdPUkQgICAgICBzdGF0dXM7DQorICAgICAgICBCWVRFIEZBUiAqcG9pbnRlcjE7DQorICAgICAgICBCWVRFIEZBUiAqcG9pbnRlcjI7DQorICAgICAgICBXT1JEICAgICAgd29yZDE7DQorICAgICAgfSBSZXFCbG9jazsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfVHhCdWZEZXNjclJlYyB7DQorICAgICAgICBCWVRFICAgdHhQdHJUeXBlOw0KKyAgICAgICAgQllURSAgIGR1bW15Ow0KKyAgICAgICAgV09SRCAgIHR4RGF0YUxlbjsNCisgICAgICAgIEJZVEUgICp0eERhdGFQdHI7DQorICAgICAgfSBUeEJ1ZkRlc2NyUmVjOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9UeEJ1ZkRlc2NyIHsNCisgICAgICAgIFdPUkQgICAgICAgICAgdHhJbW1lZExlbjsNCisgICAgICAgIEJZVEUgICAgICAgICAqdHhJbW1lZFB0cjsNCisgICAgICAgIFdPUkQgICAgICAgICAgdHhEYXRhQ291bnQ7DQorICAgICAgICBUeEJ1ZkRlc2NyUmVjIHR4QnVmRGVzY3JSZWNbTkRJU19UWF9CVUZfTEVOR1RIXTsNCisgICAgICB9IFR4QnVmRGVzY3I7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX1REQnVmRGVzY3JSZWMgew0KKyAgICAgICAgQllURSAgIHREUHRyVHlwZTsNCisgICAgICAgIEJZVEUgICBkdW1teTsNCisgICAgICAgIFdPUkQgICB0RERhdGFMZW47DQorICAgICAgICBCWVRFICAqdEREYXRhUHRyOw0KKyAgICAgIH0gVERCdWZEZXNjclJlYzsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfVERCdWZEZXNjciB7DQorICAgICAgICBXT1JEICAgICAgICAgIHRERGF0YUNvdW50Ow0KKyAgICAgICAgVERCdWZEZXNjclJlYyB0REJ1ZkRlc2NyUmVjW05ESVNfVERfQlVGX0xFTkdUSF07DQorICAgICAgfSBUREJ1ZkRlc2NyOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9SeEJ1ZkRlc2NyUmVjIHsNCisgICAgICAgIFdPUkQgICByeERhdGFMZW47DQorICAgICAgICBCWVRFICAqcnhEYXRhUHRyOw0KKyAgICAgIH0gUnhCdWZEZXNjclJlYzsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfUnhCdWZEZXNjciB7DQorICAgICAgICBXT1JEICAgICAgICAgIHJ4RGF0YUNvdW50Ow0KKyAgICAgICAgUnhCdWZEZXNjclJlYyByeEJ1ZkRlc2NyUmVjW05ESVNfUlhfQlVGX0xFTkdUSF07DQorICAgICAgfSBSeEJ1ZkRlc2NyOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9Qa3RCdWYgew0KKwlzdHJ1Y3QgX1BrdEJ1ZiAqbmV4dExpbms7DQorCXN0cnVjdCBfUGt0QnVmICpwcmV2TGluazsNCisgICAgICAgIGludCAgICBoYW5kbGU7DQorICAgICAgICBpbnQgICAgbGVuZ3RoOw0KKyAgICAgICAgaW50ICAgIHBhY2tldExlbmd0aDsNCisgICAgICAgIERXT1JEICBzZXF1ZW5jZTsNCisgICAgICAgIEJZVEUgICpidWZmZXI7DQorICAgICAgfSBQa3RCdWY7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX0NhcmRIYW5kbGUgew0KKyAgICAgICAgQllURSAgICAgICAgIG1vZHVsZU5hbWVbMTZdOw0KKyAgICAgICAgQ29tbW9uQ2hhcnMgKmNvbW1vbjsNCisgICAgICB9IENhcmRIYW5kbGU7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX0JpbmRpbmdzTGlzdCB7DQorICAgICAgICBXT1JEICBudW1CaW5kaW5nczsNCisgICAgICAgIEJZVEUgIG1vZHVsZU5hbWVbMl1bMTZdOw0KKyAgICAgIH0gQmluZGluZ3NMaXN0Ow0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9GYWlsaW5nTW9kdWxlcyB7DQorICAgICAgICBCWVRFICB1cHBlck1vZHVsZU5hbWVbMTZdOw0KKyAgICAgICAgQllURSAgbG93ZXJNb2R1bGVOYW1lWzE2XTsNCisgICAgICB9IEZhaWxpbmdNb2R1bGVzOw0KKw0KKw0KK3R5cGVkZWYgdW5pb24gX0hhcmR3YXJlQWRkcmVzcyB7DQorICAgICAgICBCWVRFICBieXRlc1s2XTsNCisgICAgICAgIFdPUkQgIHdvcmRzWzNdOw0KKyAgICAgICAgc3RydWN0IHsNCisgICAgICAgICAgQllURSBieXRlc1s2XTsNCisgICAgICAgIH0gYWRkcjsNCisgICAgICB9IEhhcmR3YXJlQWRkcmVzczsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfRmRkaUhlYWRlciB7DQorICAgICAgICBCWVRFICAgICAgICAgICAgIGZyYW1lQ29udHJvbDsNCisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJEZXN0SG9zdDsNCisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJTcmNIb3N0Ow0KKyAgICAgIH0gRmRkaUhlYWRlcjsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfRXRoZXJuZXRJSUhlYWRlciB7DQorICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyRGVzdEhvc3Q7DQorICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyU3JjSG9zdDsNCisgICAgICAgIFdPUkQgICAgICAgICAgICAgZXRoZXJUeXBlOw0KKyAgICAgIH0gRXRoZXJuZXRJSUhlYWRlcjsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfSWVlZTgwMkRvdDVIZWFkZXIgew0KKyAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlckRlc3RIb3N0Ow0KKyAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlclNyY0hvc3Q7DQorICAgICAgICBCWVRFICAgICAgICAgICAgIHJvdXRlSW5mb1szMF07DQorICAgICAgfSBJZWVlODAyRG90NUhlYWRlcjsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfSWVlZTgwMkRvdDJTbmFwSGVhZGVyIHsNCisgICAgICAgIEJZVEUgIGRzYXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4QUEgKi8NCisgICAgICAgIEJZVEUgIHNzYXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4QUEgKi8NCisgICAgICAgIEJZVEUgIGNvbnRyb2w7ICAgICAgICAgICAgICAgICAgIC8qIDMgICAgKi8NCisgICAgICAgIEJZVEUgcHJvdG9jb2xJZFs1XTsNCisgICAgICB9IEllZWU4MDJEb3QyU25hcEhlYWRlcjsNCisNCisNCisvKg0KKyAqICBQcm90b3R5cGVzDQorICovDQorZXh0ZXJuIGNoYXIgKk5kaXNMYXN0RXJyb3IgICAgICAgICh2b2lkKTsNCitleHRlcm4gaW50ICAgTmRpc09wZW4gICAgICAgICAgICAgKHZvaWQpOw0KK2V4dGVybiBpbnQgICBOZGlzSW5pdCAgICAgICAgICAgICAoaW50IHByb21pcyk7DQorZXh0ZXJuIGludCAgIE5kaXNSZWdpc3RlckFuZEJpbmQgIChpbnQgcHJvbWlzKTsNCitleHRlcm4gdm9pZCAgTmRpc1NodXRkb3duICAgICAgICAgKHZvaWQpOw0KK2V4dGVybiB2b2lkICBOZGlzQ2hlY2tNYWNGZWF0dXJlcyAoc3RydWN0IF9DYXJkSGFuZGxlICpjYXJkKTsNCitleHRlcm4gaW50ICAgTmRpc1NlbmRQYWNrZXQgICAgICAgKHN0cnVjdCBfUGt0QnVmICpwa3RCdWYsIGludCBtYWNJZCk7DQorDQorLyoNCisgKiAgQXNzZW1ibHkgImdsdWUiIGZ1bmN0aW9ucw0KKyAqLw0KK2V4dGVybiBpbnQgc3lzdGVtUmVxdWVzdEdsdWUoKTsNCitleHRlcm4gaW50IHJlcXVlc3RDb25maXJtR2x1ZSgpOw0KK2V4dGVybiBpbnQgdHJhbnNtaXRDb25maXJtR2x1ZSgpOw0KK2V4dGVybiBpbnQgcmVjZWl2ZUxvb2thaGVhZEdsdWUoKTsNCitleHRlcm4gaW50IGluZGljYXRpb25Db21wbGV0ZUdsdWUoKTsNCitleHRlcm4gaW50IHJlY2VpdmVDaGFpbkdsdWUoKTsNCitleHRlcm4gaW50IHN0YXR1c0dsdWUoKTsNCisNCisvKg0KKyAqICBJT0NUTCBmdW5jdGlvbg0KKyAqLw0KKyNpZmRlZiBfX1NNQUxMX18NCitleHRlcm4gaW50IF9mYXIgTmRpc0dldExpbmthZ2UgKGludCBoYW5kbGUsIGNoYXIgKmRhdGEsIGludCBzaXplKTsNCisjZWxzZQ0KK2V4dGVybiBpbnQgTmRpc0dldExpbmthZ2UgKGludCBoYW5kbGUsIGNoYXIgKmRhdGEsIGludCBzaXplKTsNCisjZW5kaWYNCisNCisvKg0KKyAqICBORElTIGNhbGxiYWNrIGhhbmRsZXJzDQorICovDQorQ0FMTEJBQ0sgKE5kaXNTeXN0ZW1SZXF1ZXN0ICAgICAoRFdPUkQsRFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQpKTsNCitDQUxMQkFDSyAoTmRpc1JlcXVlc3RDb25maXJtICAgICggV09SRCwgV09SRCwgV09SRCwgV09SRCwgV09SRCxXT1JEKSk7DQorQ0FMTEJBQ0sgKE5kaXNUcmFuc21pdENvbmZpcm0gICAoIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQpKTsNCitDQUxMQkFDSyAoTmRpc1JlY2VpdmVMb29rYWhlYWQgICggV09SRCwgV09SRCwgV09SRCwgQllURSosIEJZVEUqLCBXT1JEKSk7DQorQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlQ2hhaW4gICAgICAoIFdPUkQsIFdPUkQsIFdPUkQsIHN0cnVjdCBfUnhCdWZEZXNjciosIEJZVEUqLCBXT1JEKSk7DQorQ0FMTEJBQ0sgKE5kaXNTdGF0dXNQcm9jICAgICAgICAoIFdPUkQsIFdPUkQsIEJZVEUqLCBXT1JELFdPUkQpKTsNCitDQUxMQkFDSyAoTmRpc0luZGljYXRpb25Db21wbGV0ZSggV09SRCwgV09SRCkpOw0KKw0KK0JZVEUgKk5kaXNBbGxvY1N0YWNrICh2b2lkKTsNCit2b2lkICBOZGlzRnJlZVN0YWNrICAoQllURSopOw0KKw0KKyNpZmRlZiBfX0hJR0hDX18NCisgICNkZWZpbmUgUkVOQU1FX0FTTV9TWU0oeCkgcHJhZ21hIEFsaWFzKHgsIkAiICN4ICIiKSAgLyogcHJlcGVuZCBgQCcgKi8NCisgICNkZWZpbmUgUkVOQU1FX0NfU1lNKHgpICAgcHJhZ21hIEFsaWFzKHgsIl8iICN4ICIiKSAgLyogcHJlcGVuZCBgXycgKi8NCisNCisgIFJFTkFNRV9BU01fU1lNIChzeXN0ZW1SZXF1ZXN0R2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAocmVxdWVzdENvbmZpcm1HbHVlKTsNCisgIFJFTkFNRV9BU01fU1lNICh0cmFuc21pdENvbmZpcm1HbHVlKTsNCisgIFJFTkFNRV9BU01fU1lNIChyZWNlaXZlTG9va2FoZWFkR2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAoaW5kaWNhdGlvbkNvbXBsZXRlR2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAocmVjZWl2ZUNoYWluR2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAoc3RhdHVzR2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAoTmRpc0dldExpbmthZ2UpOw0KKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNTeXN0ZW1SZXF1ZXN0KTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzUmVxdWVzdENvbmZpcm0pOw0KKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNUcmFuc21pdENvbmZpcm0pOw0KKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNSZWNlaXZlTG9va2FoZWFkKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzSW5kaWNhdGlvbkNvbXBsZXRlKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzUmVjZWl2ZUNoYWluKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzU3RhdHVzUHJvYyk7DQorICBSRU5BTUVfQ19TWU0gICAoTmRpc0FsbG9jU3RhY2spOw0KKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNGcmVlU3RhY2spOw0KKyNlbmRpZg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL21zZG9zL25kaXNfMC5hc20gYi9tc2Rvcy9uZGlzXzAuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTA5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9uZGlzXzAuYXNtCkBAIC0wLDAgKzEsMTg4IEBACitQQUdFIDYwLDEzMg0KK05BTUUgTkRJU18wDQorDQoraWZkZWYgRE9TWA0KKyAgLjM4Ng0KKyAgX1RFWFQgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScNCisgIF9URVhUICAgRU5EUw0KKyAgX0RBVEEgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScNCisgIF9EQVRBICAgRU5EUw0KKyAgX1RFWFQzMiBTRUdNRU5UIFBVQkxJQyBCWVRFICBVU0UzMiAnQ09ERScNCisgIF9URVhUMzIgRU5EUw0KKyAgQ0JfRFNFRyBFUVUgPENTPiAgICAgICAgICAgICAgICAgICAgICAgICAgOyBET1NYIGlzIHRpbnktbW9kZWwNCisgIERfU0VHICAgRVFVIDxfVEVYVCBTRUdNRU5UPg0KKyAgRF9FTkQgICBFUVUgPF9URVhUIEVORFM+DQorICBBU1NVTUUgIENTOl9URVhULERTOl9URVhUDQorDQorICBQVVNIUkVHUyBlcXUgPHB1c2hhZD4NCisgIFBPUFJFR1MgIGVxdSA8cG9wYWQ+DQorDQorICBQVUJQUk9DIG1hY3JvIG5hbWUNCisgICAgICAgICAgYWxpZ24gNA0KKyAgICAgICAgICBwdWJsaWMgQCZuYW1lDQorICAgICAgICAgIEAmbmFtZSBsYWJlbCBuZWFyDQorICAgICAgICAgIGVuZG0NCitlbHNlDQorICAuMjg2DQorICBfVEVYVCAgIFNFR01FTlQgUFVCTElDIERXT1JEICdDT0RFJw0KKyAgX1RFWFQgICBFTkRTDQorICBfREFUQSAgIFNFR01FTlQgUFVCTElDIERXT1JEICdEQVRBJw0KKyAgX0RBVEEgICBFTkRTDQorICBDQl9EU0VHIEVRVSA8U0VHIF9EQVRBPiAgICAgICAgICAgICAgICAgICA7IDE2Yml0IGlzIHNtYWxsL2xhcmdlIG1vZGVsDQorICBEX1NFRyAgIEVRVSA8X0RBVEEgU0VHTUVOVD4NCisgIERfRU5EICAgRVFVIDxfREFUQSBFTkRTPg0KKyAgQVNTVU1FICBDUzpfVEVYVCxEUzpfREFUQQ0KKw0KKyAgUFVTSFJFR1MgZXF1IDxwdXNoYT4NCisgIFBPUFJFR1MgIGVxdSA8cG9wYT4NCisNCisgIFBVQlBST0MgIG1hY3JvIG5hbWUNCisgICAgICAgICAgIHB1YmxpYyBfJm5hbWUNCisgICAgICAgICAgIF8mbmFtZSBsYWJlbCBmYXINCisgICAgICAgICAgIGVuZG0NCitlbmRpZg0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorRF9TRUcNCisNCitEX0VORA0KKw0KKw0KK19URVhUIFNFR01FTlQNCisNCitFWFRSTiBfTmRpc1N5c3RlbVJlcXVlc3QgICAgICA6IG5lYXINCitFWFRSTiBfTmRpc1JlcXVlc3RDb25maXJtICAgICA6IG5lYXINCitFWFRSTiBfTmRpc1RyYW5zbWl0Q29uZmlybSAgICA6IG5lYXINCitFWFRSTiBfTmRpc1JlY2VpdmVMb29rYWhlYWQgICA6IG5lYXINCitFWFRSTiBfTmRpc0luZGljYXRpb25Db21wbGV0ZSA6IG5lYXINCitFWFRSTiBfTmRpc1JlY2VpdmVDaGFpbiAgICAgICA6IG5lYXINCitFWFRSTiBfTmRpc1N0YXR1c1Byb2MgICAgICAgICA6IG5lYXINCitFWFRSTiBfTmRpc0FsbG9jU3RhY2sgICAgICAgICA6IG5lYXINCitFWFRSTiBfTmRpc0ZyZWVTdGFjayAgICAgICAgICA6IG5lYXINCisNCis7DQorOyAqQUxMKiBpbnRlcnJ1cHQgdGhyZWFkcyBjb21lIHRocm91Z2ggdGhpcyBtYWNyby4NCis7DQorQ0FMTEJBQ0sgbWFjcm8gY2FsbGJhY2tQcm9jLCBhcmdzU2l6ZQ0KKw0KKyAgICAgcHVzaGYNCisgICAgIFBVU0hSRUdTICAgICAgICAgICAgICAgIDs7IFNhdmUgdGhlIHJlZ2lzdGVycw0KKw0KKyAgICAgcHVzaCBlcw0KKyAgICAgcHVzaCBkcw0KKyAgICAgbW92ICBheCxDQl9EU0VHICAgICAgICAgOzsgTG9hZCBEUw0KKyAgICAgbW92ICBkcyxheA0KKyAgICAgY2FsbCBfTmRpc0FsbG9jU3RhY2sgICAgOzsgR2V0IGFuZCBpbnN0YWxsIGEgc3RhY2suDQorDQorICAgICBtb3YgIGJ4LHNzICAgICAgICAgICAgICA7OyBTYXZlIG9mZiB0aGUgb2xkIHN0YWNrIGluIG90aGVyIHJlZ3MNCisgICAgIG1vdiAgY3gsc3ANCisgICAgIG1vdiAgc3MsZHggICAgICAgICAgICAgIDs7IEluc3RhbGwgdGhlIG5ldyBvbmUNCisgICAgIG1vdiAgc3AsYXgNCisgICAgIHB1c2ggYnggICAgICAgICAgICAgICAgIDs7IFNhdmUgdGhlIG9sZCBvbmUgb24gdG8gdGhlIG5ldyBzdGFjaw0KKyAgICAgcHVzaCBjeA0KKyAgICAgc3ViICBzcCwmYXJnc1NpemUgICAgICAgOzsgQWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sNCisNCisgICAgIG1vdiAgYXgsc3MgICAgICAgICAgICAgIDs7IFNldCB1cCB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBtb3ZlDQorICAgICBtb3YgIGVzLGF4DQorICAgICBtb3YgIGRpLHNwDQorICAgICBtb3YgIGRzLGJ4ICAgICAgICAgICAgICA7OyBTZXQgdXAgdGhlIHNvdXJjZSBmb3IgdGhlIG1vdmUuDQorICAgICBtb3YgIHNpLGN4DQorICAgICBhZGQgIHNpLDQrNiszMg0KKw0KKyAgICAgbW92ICBjeCwmYXJnc1NpemUgICAgICAgOzsgTW92ZSB0aGUgYXJndW1lbnRzIHRvIHRoZSBzdGFjay4NCisgICAgIHNociAgY3gsMQ0KKyAgICAgY2xkDQorICAgICByZXAgIG1vdnN3DQorDQorICAgICBtb3YgIGF4LENCX0RTRUcgICAgICAgICA7OyBTZXQgbXkgZGF0YSBzZWdtZW50IGFnYWluLg0KKyAgICAgbW92ICBkcyxheA0KKw0KKyAgICAgY2FsbCAmY2FsbGJhY2tQcm9jICAgICAgOzsgQ2FsbCB0aGUgcmVhbCBjYWxsYmFjay4NCisgICAgIHBvcCAgZGkgICAgICAgICAgICAgICAgIDs7IFBvcCBvZmYgdGhlIG9sZCBzdGFjaw0KKyAgICAgcG9wICBzaQ0KKyAgICAgbW92ICBieCxzcyAgICAgICAgICAgICAgOzsgU2F2ZSBvZmYgdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHN0YWNrLg0KKyAgICAgbW92ICBjeCxzcA0KKyAgICAgbW92ICBzcyxzaSAgICAgICAgICAgICAgOzsgUmVzdG9yZSB0aGUgb2xkIHN0YWNrDQorICAgICBtb3YgIHNwLGRpDQorICAgICBwdXNoIGF4ICAgICAgICAgICAgICAgICA7OyBTYXZlIHRoZSByZXR1cm4gY29kZQ0KKyAgICAgcHVzaCBieCAgICAgICAgICAgICAgICAgOzsgRnJlZSB0aGUgc3RhY2suIFB1c2ggdGhlIHBvaW50ZXIgdG8gaXQNCisgICAgIHB1c2ggY3gNCisgICAgIGNhbGwgX05kaXNGcmVlU3RhY2sNCisgICAgIGFkZCAgc3AsNA0KKyAgICAgcG9wICBheCAgICAgICAgICAgICAgICAgOzsgR2V0IHRoZSByZXR1cm4gY29kZSBiYWNrDQorICAgICBhZGQgIGRpLDMyICAgICAgICAgICAgICA7OyBHZXQgYSBwb2ludGVyIHRvIGF4IG9uIHRoZSBzdGFjaw0KKyAgICAgbW92ICB3b3JkIHB0ciBzczpbZGldLGF4DQorICAgICBwb3AgIGRzDQorICAgICBwb3AgIGVzDQorDQorICAgICBQT1BSRUdTDQorICAgICBwb3BmDQorZW5kbQ0KKw0KKzsNCis7IERlZmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrcyBmb3IgdGhlIE5ESVMgcHJvY3MuDQorOw0KKw0KK1BVQlBST0Mgc3lzdGVtUmVxdWVzdEdsdWUNCitDQUxMQkFDSyBfTmRpc1N5c3RlbVJlcXVlc3QsMTQNCitSRVRGDQorDQorUFVCUFJPQyByZXF1ZXN0Q29uZmlybUdsdWUNCitDQUxMQkFDSyBfTmRpc1JlcXVlc3RDb25maXJtLDEyDQorUkVURg0KKw0KK1BVQlBST0MgdHJhbnNtaXRDb25maXJtR2x1ZQ0KK0NBTExCQUNLIF9OZGlzVHJhbnNtaXRDb25maXJtLDEwDQorUkVURg0KKw0KK1BVQlBST0MgcmVjZWl2ZUxvb2thaGVhZEdsdWUNCitDQUxMQkFDSyBfTmRpc1JlY2VpdmVMb29rYWhlYWQsMTYNCitSRVRGDQorDQorUFVCUFJPQyBpbmRpY2F0aW9uQ29tcGxldGVHbHVlDQorQ0FMTEJBQ0sgX05kaXNJbmRpY2F0aW9uQ29tcGxldGUsNA0KK1JFVEYNCisNCitQVUJQUk9DIHJlY2VpdmVDaGFpbkdsdWUNCitDQUxMQkFDSyBfTmRpc1JlY2VpdmVDaGFpbiwxNg0KK1JFVEYNCisNCitQVUJQUk9DIHN0YXR1c0dsdWUNCitDQUxMQkFDSyBfTmRpc1N0YXR1c1Byb2MsMTINCitSRVRGDQorDQorOw0KKzsgaW50IEZBUiBOZGlzR2V0TGlua2FnZSAoaW50IGhhbmRsZSwgY2hhciAqZGF0YSwgaW50IHNpemUpOw0KKzsNCisNCitpZmRlZiBET1NYDQorICBQVUJQUk9DIE5kaXNHZXRMaW5rYWdlDQorICAgICAgICAgIHB1c2ggZWJ4DQorICAgICAgICAgIG1vdiBlYngsIFtlc3ArOF0gICAgICAgICAgICAgIDsgZGV2aWNlIGhhbmRsZQ0KKyAgICAgICAgICBtb3YgZWF4LCA0NDAyaCAgICAgICAgICAgICAgICA7IElPQ1RSTCByZWFkIGZ1bmN0aW9uDQorICAgICAgICAgIG1vdiBlZHgsIFtlc3ArMTJdICAgICAgICAgICAgIDsgRFM6RURYIC0+IHJlc3VsdCBkYXRhDQorICAgICAgICAgIG1vdiBlY3gsIFtlc3ArMTZdICAgICAgICAgICAgIDsgRUNYID0gbGVuZ3RoDQorICAgICAgICAgIGludCAyMWgNCisgICAgICAgICAgcG9wIGVieA0KKyAgICAgICAgICBqYyAgQGZhaWwNCisgICAgICAgICAgeG9yIGVheCwgZWF4DQorICBAZmFpbDogIHJldA0KKw0KK2Vsc2UNCisgIFBVQlBST0MgTmRpc0dldExpbmthZ2UNCisgICAgICAgICAgZW50ZXIgMCwgMA0KKyAgICAgICAgICBtb3YgYngsIFticCs2XQ0KKyAgICAgICAgICBtb3YgYXgsIDQ0MDJoDQorICAgICAgICAgIG1vdiBkeCwgW2JwKzhdDQorICAgICAgICAgIG1vdiBjeCwgW2JwKzEyXQ0KKyAgICAgICAgICBpbnQgMjFoDQorICAgICAgICAgIGpjICBAZmFpbA0KKyAgICAgICAgICB4b3IgYXgsIGF4DQorICBAZmFpbDogIGxlYXZlDQorICAgICAgICAgIHJldGYNCitlbmRpZg0KKw0KK0VORFMNCisNCitFTkQNCmRpZmYgLS1naXQgYS9tc2Rvcy9wa3RfcngwLmFzbSBiL21zZG9zL3BrdF9yeDAuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjNkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9wa3RfcngwLmFzbQpAQCAtMCwwICsxLDE5NyBAQAorUEFHRSA2MCwxMzINCitOQU1FIFBLVF9SWA0KKw0KK2lmZGVmID8/dmVyc2lvbiAgICAgICAgOyB1c2luZyBUQVNNDQorICBtYXNtDQorICBqdW1wcw0KK2VuZGlmDQorDQorUFVCTElDIF9wa3REcm9wLCBfcGt0UnhCdWYsIF9wa3RUeEJ1ZiwgICAgX3BrdFRlbXANCitQVUJMSUMgX3J4T3V0T2ZzLCBfcnhJbk9mcywgX1BrdFJlY2VpdmVyLCBfcGt0UnhFbmQNCisNCis7DQorOyB0aGVzZSBzaXplcyBNVVNUIGJlIGVxdWFsIHRvIHRoZSBzaXplcyBpbiBQS1REUlZSLkgNCis7DQorDQorUlhfQlVGX1NJWkUgPSAxNTAwICAgICAgOyBtYXggbWVzc2FnZSBzaXplIG9uIEV0aGVybmV0DQorVFhfQlVGX1NJWkUgPSAxNTAwDQorDQoraWZkZWYgRE9TWA0KKyAuMzg2DQorICBOVU1fUlhfQlVGID0gMzIgICAgICAgOyAjIG9mIFJYIGVsZW1lbnQgYnVmZmVycw0KKyAgX1RFWFQgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScNCisgIF9URVhUICAgRU5EUw0KKyAgX0RBVEEgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScNCisgIF9EQVRBICAgRU5EUw0KKyAgRF9TRUcgICBFUVUgPF9URVhUIFNFR01FTlQ+DQorICBEX0VORCAgIEVRVSA8X1RFWFQgRU5EUz4NCisgIEFTU1VNRSAgQ1M6X1RFWFQsRFM6X1RFWFQNCitlbHNlDQorIC4yODYNCisgIE5VTV9SWF9CVUYgPSAxMA0KKyAgX1RFWFQgICBTRUdNRU5UIFBVQkxJQyBEV09SRCAnQ09ERScNCisgIF9URVhUICAgRU5EUw0KKyAgX0RBVEEgICBTRUdNRU5UIFBVQkxJQyBEV09SRCAnREFUQScNCisgIF9EQVRBICAgRU5EUw0KKyAgRF9TRUcgICBFUVUgPF9EQVRBIFNFR01FTlQ+DQorICBEX0VORCAgIEVRVSA8X0RBVEEgRU5EUz4NCisgIEFTU1VNRSAgQ1M6X1RFWFQsRFM6X0RBVEENCitlbmRpZg0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorRF9TRUcNCisNCitSWF9FTEVNRU5UICAgICBTVFJVQw0KKyAgIGZpcnN0Q291bnQgIGR3ICAwICAgICAgICAgICAgICAgICAgICAgICAgICA7ICMgb2YgYnl0ZXMgb24gMXN0IGNhbGwNCisgICBzZWNvbmRDb3VudCBkdyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgOyAjIG9mIGJ5dGVzIG9uIDJuZCBjYWxsDQorICAgaGFuZGxlICAgICAgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaGFuZGxlIGZvciB1cGNhbGwNCisgICBkZXN0aW5BZHIgICBkYiAgNiAgICAgICAgICAgZHVwICgwKSAgICAgICAgOyBwYWNrZXQgZGVzdGluYXRpb24gYWRkcmVzcw0KKyAgIHNvdXJjZUFkciAgIGRiICA2ICAgICAgICAgICBkdXAgKDApICAgICAgICA7IHBhY2tldCBzb3VyY2UgYWRkcmVzcw0KKyAgIHByb3RvY29sICAgIGR3ICAwICAgICAgICAgICAgICAgICAgICAgICAgICA7IHBhY2tldCBwcm90b2NvbCBudW1iZXINCisgICByeEJ1ZmZlciAgICBkYiAgUlhfQlVGX1NJWkUgZHVwICgwKSAgICAgICAgOyBSWCBidWZmZXINCitFTkRTDQorICAgICAgICAgICAgICAgYWxpZ24gNA0KK19yeE91dE9mcyAgICAgIGR3ICBvZmZzZXQgX3BrdFJ4QnVmICAgICAgICAgICA7IHJpbmcgYnVmZmVyIG9mZnNldHMNCitfcnhJbk9mcyAgICAgICBkdyAgb2Zmc2V0IF9wa3RSeEJ1ZiAgICAgICAgICAgOyBpbnRvIF9wa3RSeEJ1Zg0KK19wa3REcm9wICAgICAgIGR3ICAwLDAgICAgICAgICAgICAgICAgICAgICAgICA7IHBhY2tldCBkcm9wIGNvdW50ZXINCitfcGt0VGVtcCAgICAgICBkYiAgMjAgICAgICAgICAgICAgICAgZHVwICgwKSAgOyB0ZW1wIHdvcmsgYXJlYQ0KK19wa3RUeEJ1ZiAgICAgIGRiICAoVFhfQlVGX1NJWkUrMTQpICBkdXAgKDApICA7IFRYIGJ1ZmZlcg0KK19wa3RSeEJ1ZiAgICAgIFJYX0VMRU1FTlQgTlVNX1JYX0JVRiBkdXAgKDw+KSA7IFJYIHN0cnVjdHVyZXMNCisgTEFTVF9PRlMgICAgICA9IG9mZnNldCAkDQorDQorIHNjcmVlblNlZyAgICAgZHcgIDBCODAwaA0KKyBuZXdJbk9mZnNldCAgIGR3ICAwDQorDQorIGZhbkNoYXJzICAgICAgZGIgICctXHwvJw0KKyBmYW5JbmRleCAgICAgIGR3ICAwDQorDQorRF9FTkQNCisNCitfVEVYVCBTRUdNRU5UDQorDQorDQorU0hPV19SWCAgTUFDUk8NCisgICAgICAgICBwdXNoIGVzDQorICAgICAgICAgcHVzaCBieA0KKyAgICAgICAgIG1vdiBieCwgc2NyZWVuU2VnDQorICAgICAgICAgbW92IGVzLCBieCAgICAgICAgICAgICAgICAgICAgOzsgci1tb2RlIHNlZ21lbnQgb2YgY29sb3VyIHNjcmVlbg0KKyAgICAgICAgIG1vdiBkaSwgMTU4ICAgICAgICAgICAgICAgICAgIDs7IHVwcGVyIHJpZ2h0IGNvcm5lciAtIDENCisgICAgICAgICBtb3YgYngsIGZhbkluZGV4DQorICAgICAgICAgbW92IGFsLCBmYW5DaGFyc1tieF0gICAgICAgICAgOzsgZ2V0IHdyaXRlIGNoYXINCisgICAgICAgICBtb3YgYWgsIDE1ICAgICAgICAgICAgICAgICAgICA7OyAgYW5kIHdoaXRlIGNvbG91cg0KKyAgICAgICAgIHN0b3N3ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHdyaXRlIHRvIHNjcmVlbiBhdCBFUzpFREkNCisgICAgICAgICBpbmMgZmFuSW5kZXggICAgICAgICAgICAgICAgICA7OyB1cGRhdGUgbmV4dCBpbmRleA0KKyAgICAgICAgIGFuZCBmYW5JbmRleCwgMw0KKyAgICAgICAgIHBvcCBieA0KKyAgICAgICAgIHBvcCBlcw0KK0VORE0NCisNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorOw0KKzsgVGhpcyBtYWNybyByZXR1cm4gRVM6REkgdG8gdGFpbCBvZiBSeCBxdWV1ZQ0KKw0KK0VOUVVFVUUgIE1BQ1JPDQorICAgICAgICAgTE9DQUwgQG5vV3JhcA0KKyAgICAgICAgIG1vdiBheCwgX3J4SW5PZnMgICAgICAgICAgICAgIDs7IERJID0gY3VycmVudCBpbi1vZmZzZXQNCisgICAgICAgICBhZGQgYXgsIFNJWkUgUlhfRUxFTUVOVCAgICAgICA7OyBwb2ludCB0byBuZXh0IF9wa3RSeEJ1ZiBidWZmZXINCisgICAgICAgICBjbXAgYXgsIExBU1RfT0ZTICAgICAgICAgICAgICA7OyBwb2ludGluZyBwYXN0IGxhc3QgPw0KKyAgICAgICAgIGpiICBAbm9XcmFwICAgICAgICAgICAgICAgICAgIDs7IG5vIC0ganVtcA0KKyAgICAgICAgIGxlYSBheCwgX3BrdFJ4QnVmICAgICAgICAgICAgIDs7IHllcywgcG9pbnQgdG8gMXN0IGJ1ZmZlcg0KKyAgICAgICAgIGFsaWduIDQNCitAbm9XcmFwOiBjbXAgYXgsIF9yeE91dE9mcyAgICAgICAgICAgICA7OyBpbi1vZnMgPSBvdXQtb2ZzID8NCisgICAgICAgICBqZSAgQGR1bXAgICAgICAgICAgICAgICAgICAgICA7OyB5ZXMsIHF1ZXVlIGlzIGZ1bGwNCisgICAgICAgICBtb3YgZGksIF9yeEluT2ZzICAgICAgICAgICAgICA7OyBFUzpESSAtPiBidWZmZXIgYXQgcXVldWUgaW5wdXQNCisgICAgICAgICBtb3YgbmV3SW5PZmZzZXQsIGF4ICAgICAgICAgICA7OyByZW1lbWJlciBuZXcgaW5wdXQgb2Zmc2V0DQorDQorICAgOzsgTk9URS4gcnhJbk9mcyBpcyB1cGRhdGVkIGFmdGVyIHRoZSBwYWNrZXQgaGFzIGJlZW4gY29waWVkDQorICAgOzsgdG8gRVM6REkgKD0gRFM6U0kgb24gMm5kIGNhbGwpIGJ5IHRoZSBwYWNrZXQgZHJpdmVyDQorDQorRU5ETQ0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCis7DQorOyBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYnkgdGhlIHBhY2tldCBkcml2ZXIgdHdpY2U6DQorOyAgIDFzdCB0aW1lIChBWD0wKSBpdCByZXF1ZXN0cyBhbiBhZGRyZXNzIHdoZXJlIHRvIHB1dCB0aGUgcGFja2V0DQorOw0KKzsgICAybmQgdGltZSAoQVg9MSkgdGhlIHBhY2tldCBoYXMgYmVlbiBjb3BpZWQgdG8gdGhpcyBsb2NhdGlvbiAoRFM6U0kpDQorOyAgIEJYIGhhcyBjbGllbnQgaGFuZGxlIChzdG9yZWQgaW4gUlhfRUxFTUVOVC5oYW5kbGUpLg0KKzsgICBDWCBoYXMgIyBvZiBieXRlcyBpbiBwYWNrZXQgb24gYm90aCBjYWxsLiBUaGV5IHNob3VsZCBiZSBlcXVhbC4NCis7DQorOyBBIHRlc3QgZm9yIGVxdWFsaXR5IGlzIGRvbmUgYnkgcHV0dGluZyBDWCBpbiBfcGt0UnhCdWYgW25dLmZpcnN0Q291bnQNCis7IGFuZCBfcGt0UnhCdWZbbl0uc2Vjb25kQ291bnQsIGFuZCBDTCBvbiBmaXJzdCBjYWxsIGluDQorOyBfcGt0UnhCdWZbbl0ucnhCdWZmZXJbQ1hdLiBUaGVzZSB2YWx1ZXMgYXJlIGNoZWNrZWQgaW4gIlBrdFJlY2VpdmUiDQorOyAoUEtURFJWUi5DKQ0KKzsNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorX1BrdFJlY2VpdmVyOg0KKyAgICAgICAgIHB1c2hmDQorICAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgbm8gZGlzdHJhY3Rpb24gd2FudGVkICENCisgICAgICAgICBwdXNoIGRzDQorICAgICAgICAgcHVzaCBieA0KK2lmZGVmIERPU1gNCisgICAgICAgICBtb3YgYngsIGNzDQorZWxzZQ0KKyAgICAgICAgIG1vdiBieCwgU0VHIF9EQVRBDQorZW5kaWYNCisgICAgICAgICBtb3YgZHMsIGJ4DQorICAgICAgICAgbW92IGVzLCBieCAgICAgICAgICAgICAgICAgIDsgRVMgPSBEUyA9IENTIG9yIHNlZyBfREFUQQ0KKyAgICAgICAgIHBvcCBieCAgICAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgaGFuZGxlDQorDQorICAgICAgICAgY21wIGF4LCAwICAgICAgICAgICAgICAgICAgIDsgZmlyc3QgY2FsbD8gKEFYPTApDQorICAgICAgICAgam5lIEBwb3N0ICAgICAgICAgICAgICAgICAgIDsgQVg9MTogc2Vjb25kIGNhbGwsIGRvIHBvc3QgcHJvY2Vzcw0KKw0KK2lmZGVmIERFQlVHDQorICAgICAgICAgU0hPV19SWCAgICAgICAgICAgICAgICAgICAgIDsgc2hvdyB0aGF0IGEgcGFja2V0IGlzIHJlY2VpdmVkDQorZW5kaWYNCisgICAgICAgICBjbXAgY3gsIFJYX0JVRl9TSVpFKzE0ICAgICAgOyBzaXplIE9LID8NCisgICAgICAgICBqYSAgQHNraXAgICAgICAgICAgICAgICAgICAgOyBubywgcGFja2V0IHRvIGxhcmdlIGZvciB1cw0KKw0KKyAgICAgICAgIEVOUVVFVUUgICAgICAgICAgICAgICAgICAgICA7IEVTOkRJIC0+IF9wa3RSeEJ1ZltuXQ0KKw0KKyAgICAgICAgIG1vdiBbZGldLmZpcnN0Q291bnQsIGN4ICAgICA7IHJlbWVtYmVyIHRoZSBmaXJzdCBjb3VudC4NCisgICAgICAgICBtb3YgW2RpXS5oYW5kbGUsIGJ4ICAgICAgICAgOyByZW1lbWJlciB0aGUgaGFuZGxlLg0KKyAgICAgICAgIGFkZCBkaSwgNiAgICAgICAgICAgICAgICAgICA7IEVTOkRJIC0+IF9wa3RSeEJ1ZltuXS5kZXN0aW5BZHINCisgICAgICAgICBwb3AgZHMNCisgICAgICAgICBwb3BmDQorICAgICAgICAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgIDsgZmFyIHJldHVybiB0byBkcml2ZXIgd2l0aCBFUzpESQ0KKw0KKyAgICAgICAgIGFsaWduIDQNCitAZHVtcDogICBpbmMgX3BrdERyb3BbMF0gICAgICAgICAgICAgOyBkaXNjYXJkIHRoZSBwYWNrZXQgb24gMXN0IGNhbGwNCisgICAgICAgICBhZGMgX3BrdERyb3BbMl0sIDAgICAgICAgICAgOyBpbmNyZW1lbnQgcGFja2V0cyBsb3N0DQorDQorQHNraXA6ICAgeG9yIGRpLCBkaSAgICAgICAgICAgICAgICAgIDsgcmV0dXJuIEVTOkRJID0gTklMIHBvaW50ZXINCisgICAgICAgICB4b3IgYXgsIGF4DQorICAgICAgICAgbW92IGVzLCBheA0KKyAgICAgICAgIHBvcCBkcw0KKyAgICAgICAgIHBvcGYNCisgICAgICAgICByZXRmDQorDQorICAgICAgICAgYWxpZ24gNA0KK0Bwb3N0OiAgIG9yIHNpLCBzaSAgICAgICAgICAgICAgICAgICA7IERTOlNJLT5fcGt0UnhCdWZbbl1bbl0uZGVzdGluQWRyDQorICAgICAgICAganogQGRpc2NhcmQgICAgICAgICAgICAgICAgIDsgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSBOVUxMLXBvaW50ZXINCisNCisgICAgICAgICBzdWIgc2ksIDYgICAgICAgICAgICAgICAgICAgOyBEUzpTSSAtPiBfcGt0UnhCdWZbbl0uZGVzdGluQWRyDQorICAgICAgIDsNCisgICAgICAgOyBwdXNoIHNpDQorICAgICAgIDsgcHVzaCBbc2ldLmZpcnN0Q291bnQNCisgICAgICAgOyBjYWxsIGJwZl9maWx0ZXJfbWF0Y2ggICAgICAgOyBydW4gdGhlIGZpbHRlciBoZXJlIHNvbWUgZGF5Pw0KKyAgICAgICA7IGFkZCBzcCwgNA0KKyAgICAgICA7IGNtcCBheCwgMA0KKyAgICAgICA7IGplICBAZGlzY2FyZA0KKw0KKyAgICAgICAgIG1vdiBbc2ldLnNlY29uZENvdW50LCBjeA0KKyAgICAgICAgIG1vdiBheCwgbmV3SW5PZmZzZXQNCisgICAgICAgICBtb3YgX3J4SW5PZnMsIGF4ICAgICAgICAgICAgOyB1cGRhdGUgX3BrdFJ4QnVmIGlucHV0IG9mZnNldA0KKw0KKyAgICAgICAgIGFsaWduIDQNCitAZGlzY2FyZDpwb3AgZHMNCisgICAgICAgICBwb3BmDQorICAgICAgICAgcmV0Zg0KKw0KK19wa3RSeEVuZCAgZGIgMCAgICAgICAgICAgICAgICAgICAgICA7IG1hcmtlciBmb3IgZW5kIG9mIHItbW9kZSBjb2RlL2RhdGENCisNCitfVEVYVCBFTkRTDQorDQorRU5EDQpkaWZmIC0tZ2l0IGEvbXNkb3MvcGt0X3J4MS5zIGIvbXNkb3MvcGt0X3J4MS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTRhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9wa3RfcngxLnMKQEAgLTAsMCArMSwxNTUgQEAKKzsNCis7IFRoaXMgZmlsZSByZXF1aXJlcyBOQVNNIDAuOTcrIHRvIGFzc2VtYmxlDQorOw0KKzsgQ3VycmVudGx5IHVzZWQgb25seSBmb3IgZGpncHAgKyBET1M0R1cgdGFyZ2V0cw0KKzsNCis7IHRoZXNlIHNpemVzIE1VU1QgYmUgZXF1YWwgdG8gdGhlIHNpemVzIGluIFBLVERSVlIuSA0KKzsNCislZGVmaW5lICBFVEhfTVRVICAgICAxNTAwICAgICAgICAgICAgICAgICAgOyBtYXggZGF0YSBzaXplIG9uIEV0aGVybmV0DQorJWRlZmluZSAgRVRIX01JTiAgICAgNjAgICAgICAgICAgICAgICAgICAgIDsgbWluL21heCB0b3RhbCBmcmFtZSBzaXplDQorJWRlZmluZSAgRVRIX01BWCAgICAgKEVUSF9NVFUrMio2KzIpDQorJWRlZmluZSAgTlVNX1JYX0JVRiAgMzIgICAgICAgICAgICAgICAgICAgIDsgIyBvZiBSWCBlbGVtZW50IGJ1ZmZlcnMNCislZGVmaW5lICBSWF9TSVpFICAgICAoRVRIX01BWCs2KSAgICAgICAgICAgOyBzaXplb2YoUlhfRUxFTUVOVCkgPSAxNTE0KzYNCislaWRlZmluZSBvZmZzZXQNCisNCitzdHJ1YyBSWF9FTEVNRU5UDQorICAgICAgLmZpcnN0Q291bnQgIHJlc3cgMSAgICAgICAgICAgICAgICAgIDsgIyBvZiBieXRlcyBvbiAxc3QgY2FsbA0KKyAgICAgIC5zZWNvbmRDb3VudCByZXN3IDEgICAgICAgICAgICAgICAgICA7ICMgb2YgYnl0ZXMgb24gMm5kIGNhbGwNCisgICAgICAuaGFuZGxlICAgICAgcmVzdyAxICAgICAgICAgICAgICAgICAgOyBoYW5kbGUgZm9yIHVwY2FsbA0KKyAgICA7IC50aW1lU3RhbXAgICByZXN3IDQgICAgICAgICAgICAgICAgICA7IDY0LWJpdCBSRFRTQyB2YWx1ZQ0KKyAgICAgIC5kZXN0aW5BZHIgICByZXNiIDYgICAgICAgICAgICAgICAgICA7IHBhY2tldCBkZXN0aW5hdGlvbiBhZGRyZXNzDQorICAgICAgLnNvdXJjZUFkciAgIHJlc2IgNiAgICAgICAgICAgICAgICAgIDsgcGFja2V0IHNvdXJjZSBhZGRyZXNzDQorICAgICAgLnByb3RvY29sICAgIHJlc3cgMSAgICAgICAgICAgICAgICAgIDsgcGFja2V0IHByb3RvY29sIG51bWJlcg0KKyAgICAgIC5yeEJ1ZmZlciAgICByZXNiIEVUSF9NVFUgICAgICAgICAgICA7IFJYIGJ1ZmZlcg0KK2VuZHN0cnVjDQorDQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitbb3JnIDBdICA7IGFzc2VtYmxlIHRvIC5iaW4gZmlsZQ0KKw0KK19yeE91dE9mcyAgIGR3ICAgb2Zmc2V0IF9wa3RSeEJ1ZiAgICAgICAgICA7IHJpbmcgYnVmZmVyIG9mZnNldHMNCitfcnhJbk9mcyAgICBkdyAgIG9mZnNldCBfcGt0UnhCdWYgICAgICAgICAgOyBpbnRvIF9wa3RSeEJ1Zg0KK19wa3REcm9wICAgIGR3ICAgMCwwICAgICAgICAgICAgICAgICAgICAgICA7IHBhY2tldCBkcm9wIGNvdW50ZXINCitfcGt0VGVtcCAgICByZXNiIDIwICAgICAgICAgICAgICAgICAgICAgICAgOyB0ZW1wIHdvcmsgYXJlYQ0KK19wa3RUeEJ1ZiAgIHJlc2IgKEVUSF9NQVgpICAgICAgICAgICAgICAgICA7IFRYIGJ1ZmZlcg0KK19wa3RSeEJ1ZiAgIHJlc2IgKFJYX1NJWkUqTlVNX1JYX0JVRikgICAgICA7IFJYIHN0cnVjdHVyZXMNCisgTEFTVF9PRlMgICBlcXUgICQNCisNCitzY3JlZW5TZWcgICBkdyAgMEI4MDBoDQorbmV3SW5PZmZzZXQgZHcgIDANCisNCitmYW5DaGFycyAgICBkYiAgJy1cfC8nDQorZmFuSW5kZXggICAgZHcgIDANCisNCislbWFjcm8gU0hPV19SWCAwDQorICAgICAgIHB1c2ggZXMNCisgICAgICAgcHVzaCBieA0KKyAgICAgICBtb3YgYngsIFtzY3JlZW5TZWddDQorICAgICAgIG1vdiBlcywgYnggICAgICAgICAgICAgICAgICAgIDs7IHItbW9kZSBzZWdtZW50IG9mIGNvbG91ciBzY3JlZW4NCisgICAgICAgbW92IGRpLCAxNTggICAgICAgICAgICAgICAgICAgOzsgdXBwZXIgcmlnaHQgY29ybmVyIC0gMQ0KKyAgICAgICBtb3YgYngsIFtmYW5JbmRleF0NCisgICAgICAgbW92IGFsLCBbZmFuQ2hhcnMrYnhdICAgICAgICAgOzsgZ2V0IHdyaXRlIGNoYXINCisgICAgICAgbW92IGFoLCAxNSAgICAgICAgICAgICAgICAgICAgOzsgIGFuZCB3aGl0ZSBjb2xvdXINCisgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgTmVlZGVkPw0KKyAgICAgICBzdG9zdyAgICAgICAgICAgICAgICAgICAgICAgICA7OyB3cml0ZSB0byBzY3JlZW4gYXQgRVM6RURJDQorICAgICAgIGluYyB3b3JkIFtmYW5JbmRleF0gICAgICAgICAgIDs7IHVwZGF0ZSBuZXh0IGluZGV4DQorICAgICAgIGFuZCB3b3JkIFtmYW5JbmRleF0sIDMNCisgICAgICAgcG9wIGJ4DQorICAgICAgIHBvcCBlcw0KKyVlbmRtYWNybw0KKw0KKztQdXRUaW1lU3RhbXANCis7ICAgICAgIHJkdHNjDQorOyAgICAgICBtb3YgW3NpXS50aW1lU3RhbXAsIGVheA0KKzsgICAgICAgbW92IFtzaSs0XS50aW1lU3RhbXAsIGVkeA0KKzsgICAgICAgcmV0DQorDQorDQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKzsNCis7IFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBieSB0aGUgcGFja2V0IGRyaXZlciB0d2ljZToNCis7ICAgMXN0IHRpbWUgKEFYPTApIGl0IHJlcXVlc3RzIGFuIGFkZHJlc3Mgd2hlcmUgdG8gcHV0IHRoZSBwYWNrZXQNCis7DQorOyAgIDJuZCB0aW1lIChBWD0xKSB0aGUgcGFja2V0IGhhcyBiZWVuIGNvcGllZCB0byB0aGlzIGxvY2F0aW9uIChEUzpTSSkNCis7ICAgQlggaGFzIGNsaWVudCBoYW5kbGUgKHN0b3JlZCBpbiBSWF9FTEVNRU5ULmhhbmRsZSkuDQorOyAgIENYIGhhcyAjIG9mIGJ5dGVzIGluIHBhY2tldCBvbiBib3RoIGNhbGwuIFRoZXkgc2hvdWxkIGJlIGVxdWFsLg0KKzsgQSB0ZXN0IGZvciBlcXVhbGl0eSBpcyBkb25lIGJ5IHB1dHRpbmcgQ1ggaW4gX3BrdFJ4QnVmIFtuXS5maXJzdENvdW50DQorOyBhbmQgX3BrdFJ4QnVmW25dLnNlY29uZENvdW50LCBhbmQgQ0wgb24gZmlyc3QgY2FsbCBpbg0KKzsgX3BrdFJ4QnVmW25dLnJ4QnVmZmVyW0NYXS4gVGhlc2UgdmFsdWVzIGFyZSBjaGVja2VkIGluICJQa3RSZWNlaXZlIg0KKzsgKFBLVERSVlIuQykNCis7DQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK19Qa3RSZWNlaXZlcjoNCisgICAgICAgICBwdXNoZg0KKyAgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IG5vIGRpc3RyYWN0aW9uIHdhbnRlZCAhDQorICAgICAgICAgcHVzaCBkcw0KKyAgICAgICAgIHB1c2ggYngNCisgICAgICAgICBtb3YgYngsIGNzDQorICAgICAgICAgbW92IGRzLCBieA0KKyAgICAgICAgIG1vdiBlcywgYnggICAgICAgICAgICAgICAgICA7IEVTID0gRFMgPSBDUyBvciBzZWcgX0RBVEENCisgICAgICAgICBwb3AgYnggICAgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIGhhbmRsZQ0KKw0KKyAgICAgICAgIGNtcCBheCwgMCAgICAgICAgICAgICAgICAgICA7IGZpcnN0IGNhbGw/IChBWD0wKQ0KKyAgICAgICAgIGpuZSBAcG9zdCAgICAgICAgICAgICAgICAgICA7IEFYPTE6IHNlY29uZCBjYWxsLCBkbyBwb3N0IHByb2Nlc3MNCisNCislaWZkZWYgREVCVUcNCisgICAgICAgICBTSE9XX1JYICAgICAgICAgICAgICAgICAgICAgOyBzaG93IHRoYXQgYSBwYWNrZXQgaXMgcmVjZWl2ZWQNCislZW5kaWYNCisNCisgICAgICAgICBjbXAgY3gsIEVUSF9NQVggICAgICAgICAgICAgOyBzaXplIE9LID8NCisgICAgICAgICBqYSAgQHNraXAgICAgICAgICAgICAgICAgICAgOyBubywgdG9vIGJpZw0KKw0KKyAgICAgICAgIG1vdiBheCwgW19yeEluT2ZzXQ0KKyAgICAgICAgIGFkZCBheCwgUlhfU0laRQ0KKyAgICAgICAgIGNtcCBheCwgTEFTVF9PRlMNCisgICAgICAgICBqYiAgQG5vV3JhcA0KKyAgICAgICAgIG1vdiBheCwgb2Zmc2V0IF9wa3RSeEJ1Zg0KK0Bub1dyYXA6DQorICAgICAgICAgY21wIGF4LCBbX3J4T3V0T2ZzXQ0KKyAgICAgICAgIGplICBAZHVtcA0KKyAgICAgICAgIG1vdiBkaSwgW19yeEluT2ZzXSAgICAgICAgICA7IEVTOkRJIC0+IF9wa3RSeEJ1ZltuXQ0KKyAgICAgICAgIG1vdiBbbmV3SW5PZmZzZXRdLCBheA0KKw0KKyAgICAgICAgIG1vdiBbZGldLCBjeCAgICAgICAgICAgICAgICA7IHJlbWVtYmVyIGZpcnN0Q291bnQuDQorICAgICAgICAgbW92IFtkaSs0XSwgYnggICAgICAgICAgICAgIDsgcmVtZW1iZXIgaGFuZGxlLg0KKyAgICAgICAgIGFkZCBkaSwgNiAgICAgICAgICAgICAgICAgICA7IEVTOkRJIC0+IF9wa3RSeEJ1ZltuXS5kZXN0aW5BZHINCisgICAgICAgICBwb3AgZHMNCisgICAgICAgICBwb3BmDQorICAgICAgICAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgIDsgZmFyIHJldHVybiB0byBkcml2ZXIgd2l0aCBFUzpESQ0KKw0KK0BkdW1wOiAgIGFkZCB3b3JkIFtfcGt0RHJvcCswXSwgMSAgICA7IGRpc2NhcmQgdGhlIHBhY2tldCBvbiAxc3QgY2FsbA0KKyAgICAgICAgIGFkYyB3b3JkIFtfcGt0RHJvcCsyXSwgMCAgICA7IGluY3JlbWVudCBwYWNrZXRzIGxvc3QNCisNCitAc2tpcDogICB4b3IgZGksIGRpICAgICAgICAgICAgICAgICAgOyByZXR1cm4gRVM6REkgPSBOSUwgcG9pbnRlcg0KKyAgICAgICAgIHhvciBheCwgYXgNCisgICAgICAgICBtb3YgZXMsIGF4DQorICAgICAgICAgcG9wIGRzDQorICAgICAgICAgcG9wZg0KKyAgICAgICAgIHJldGYNCisNCitAcG9zdDogICBvciBzaSwgc2kgICAgICAgICAgICAgICAgICAgOyBEUzpTSS0+X3BrdFJ4QnVmW25dW25dLmRlc3RpbkFkcg0KKyAgICAgICAgIGp6IEBkaXNjYXJkICAgICAgICAgICAgICAgICA7IG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgTlVMTC1wb2ludGVyDQorDQorICAgICAgIDsNCisgICAgICAgOyBwdXNoIHNpDQorICAgICAgIDsgY2FsbCBicGZfZmlsdGVyX21hdGNoICAgICAgIDsgcnVuIHRoZSBmaWx0ZXIgaGVyZSBzb21lIGRheQ0KKyAgICAgICA7IHBvcCBzaQ0KKyAgICAgICA7IGNtcCBheCwgMA0KKyAgICAgICA7IGplICBAZGlzY2FyZA0KKw0KKyAgICAgICAgIG1vdiBbc2ktNisyXSwgY3ggICAgICAgICAgICA7IHN0b3JlIF9wa3RSeEJ1ZltuXS5zZWNvbmRDb3VudA0KKyAgICAgICAgIG1vdiBheCwgW25ld0luT2Zmc2V0XQ0KKyAgICAgICAgIG1vdiBbX3J4SW5PZnNdLCBheCAgICAgICAgICA7IHVwZGF0ZSBfcGt0UnhCdWYgaW5wdXQgb2Zmc2V0DQorDQorICAgICAgIDsgY2FsbCBQdXRUaW1lU3RhbXANCisNCitAZGlzY2FyZDoNCisgICAgICAgICBwb3AgZHMNCisgICAgICAgICBwb3BmDQorICAgICAgICAgcmV0Zg0KKw0KK19wa3RSeEVuZCAgZGIgMCAgICAgICAgICAgICAgICAgICAgICA7IG1hcmtlciBmb3IgZW5kIG9mIHItbW9kZSBjb2RlL2RhdGENCisNCitFTkQNCisNCmRpZmYgLS1naXQgYS9tc2Rvcy9wa3RkcnZyLmMgYi9tc2Rvcy9wa3RkcnZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyMmVlNgotLS0gL2Rldi9udWxsCisrKyBiL21zZG9zL3BrdGRydnIuYwpAQCAtMCwwICsxLDE0MzYgQEAKKy8qDQorICogIEZpbGUuLi4uLi4uLi46IHBrdGRydnIuYw0KKyAqDQorICogIFJlc3BvbnNpYmxlLi46IEdpc2xlIFZhbmVtLCAgZ2l2YUBiZ25ldHQubm8NCisgKg0KKyAqICBDcmVhdGVkLi4uLi4uOiAyNi5TZXB0IDE5OTUNCisgKg0KKyAqICBEZXNjcmlwdGlvbi4uOiBQYWNrZXQtZHJpdmVyIGludGVyZmFjZSBmb3IgMTYvMzItYml0IEMgOg0KKyAqICAgICAgICAgICAgICAgICBCb3JsYW5kIEMvQysrIDMuMCsgc21hbGwvbGFyZ2UgbW9kZWwNCisgKiAgICAgICAgICAgICAgICAgV2F0Y29tIEMvQysrIDExKywgRE9TNEdXIGZsYXQgbW9kZWwNCisgKiAgICAgICAgICAgICAgICAgTWV0YXdhcmUgSGlnaEMgMy4xKyBhbmQgUGhhckxhcCAzODZ8RG9zWA0KKyAqICAgICAgICAgICAgICAgICBHTlUgQy9DKysgMi43KyBhbmQgZGpncHAgMi54IGV4dGVuZGVyDQorICoNCisgKiAgUmVmZXJlbmNlcy4uLjogUEMvVENQIFBhY2tldCBkcml2ZXIgU3BlY2lmaWNhdGlvbi4gcmV2IDEuMDkNCisgKiAgICAgICAgICAgICAgICAgRlRQIFNvZnR3YXJlIEluYy4NCisgKg0KKyAqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPGRvcy5oPg0KKw0KKyNpbmNsdWRlICJwY2FwLWRvcy5oIg0KKyNpbmNsdWRlICJwY2FwLWludC5oIg0KKyNpbmNsdWRlICJtc2Rvcy9wa3RkcnZyLmgiDQorDQorI2lmIChET1NYKQ0KKyNkZWZpbmUgTlVNX1JYX0JVRiAgMzIgICAgICAvKiAjIG9mIGJ1ZmZlcnMgaW4gUnggRklGTyBxdWV1ZSAqLw0KKyNlbHNlDQorI2RlZmluZSBOVU1fUlhfQlVGICAxMA0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgRElNKHgpICAgKHNpemVvZigoeCkpIC8gc2l6ZW9mKHhbMF0pKQ0KKyNkZWZpbmUgUFVUUyhzKSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgICAgIGlmICghcGt0SW5mby5xdWlldCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgICAgICAgcGt0SW5mby5lcnJvciA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiVzOiAlc1xuIiwgcywgcGt0SW5mby5lcnJvcikgOiBcDQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIHBrdEluZm8uZXJyb3IgPSBzKTsgICAgIFwNCisgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApDQorDQorI2lmIGRlZmluZWQoX19ISUdIQ19fKQ0KKyAgZXh0ZXJuIFVJTlQgX213ZW52Ow0KKw0KKyNlbGlmIGRlZmluZWQoX19ESkdQUF9fKQ0KKyAgI2luY2x1ZGUgPHN0ZGRlZi5oPg0KKyAgI2luY2x1ZGUgPGRwbWkuaD4NCisgICNpbmNsdWRlIDxnbzMyLmg+DQorICAjaW5jbHVkZSA8cGMuaD4NCisgICNpbmNsdWRlIDxzeXMvZmFycHRyLmg+DQorDQorI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykNCisgICNpbmNsdWRlIDxpODYuaD4NCisgICNpbmNsdWRlIDxzdGRkZWYuaD4NCisgIGV4dGVybiBjaGFyIF9FeHRlbmRlcjsNCisNCisjZWxzZQ0KKyAgZXh0ZXJuIHZvaWQgZmFyIFBrdFJlY2VpdmVyICh2b2lkKTsNCisjZW5kaWYNCisNCisNCisjaWYgKERPU1ggJiAoREpHUFB8RE9TNEdXKSkNCisgICNpbmNsdWRlIDxzeXMvcGFja19vbi5oPg0KKw0KKyAgc3RydWN0IERQTUlfcmVncyB7DQorICAgICAgICAgRFdPUkQgIHJfZGk7DQorICAgICAgICAgRFdPUkQgIHJfc2k7DQorICAgICAgICAgRFdPUkQgIHJfYnA7DQorICAgICAgICAgRFdPUkQgIHJlc2VydmVkOw0KKyAgICAgICAgIERXT1JEICByX2J4Ow0KKyAgICAgICAgIERXT1JEICByX2R4Ow0KKyAgICAgICAgIERXT1JEICByX2N4Ow0KKyAgICAgICAgIERXT1JEICByX2F4Ow0KKyAgICAgICAgIFdPUkQgICByX2ZsYWdzOw0KKyAgICAgICAgIFdPUkQgICByX2VzLCByX2RzLCByX2ZzLCByX2dzOw0KKyAgICAgICAgIFdPUkQgICByX2lwLCByX2NzLCByX3NwLCByX3NzOw0KKyAgICAgICB9Ow0KKw0KKyAgLyogRGF0YSBsb2NhdGVkIGluIGEgcmVhbC1tb2RlIHNlZ21lbnQuIFRoaXMgYmVjb21lcyBmYXIgYXQgcnVudGltZQ0KKyAgICovDQorICB0eXBlZGVmIHN0cnVjdCAgeyAgICAgICAgICAvKiBtdXN0IG1hdGNoIGRhdGEvY29kZSBpbiBwa3RfcngxLnMgKi8NCisgICAgICAgICAgV09SRCAgICAgICBfcnhPdXRPZnM7DQorICAgICAgICAgIFdPUkQgICAgICAgX3J4SW5PZnM7DQorICAgICAgICAgIERXT1JEICAgICAgX3BrdERyb3A7DQorICAgICAgICAgIEJZVEUgICAgICAgX3BrdFRlbXAgWzIwXTsNCisgICAgICAgICAgVFhfRUxFTUVOVCBfcGt0VHhCdWZbMV07DQorICAgICAgICAgIFJYX0VMRU1FTlQgX3BrdFJ4QnVmW05VTV9SWF9CVUZdOw0KKyAgICAgICAgICBXT1JEICAgICAgIF9kdW1teVsyXTsgICAgICAgIC8qIHNjcmVlblNlZyxuZXdJbk9mZnNldCAqLw0KKyAgICAgICAgICBCWVRFICAgICAgIF9mYW5DaGFyc1s0XTsNCisgICAgICAgICAgV09SRCAgICAgICBfZmFuSW5kZXg7DQorICAgICAgICAgIEJZVEUgICAgICAgX1BrdFJlY2VpdmVyWzE1XTsgLyogc3RhcnRzIG9uIGEgcGFyYWdyYXBoICgxNmJ5dGUpICovDQorICAgICAgICB9IFBrdFJlYWxTdHViOw0KKyAgI2luY2x1ZGUgPHN5cy9wYWNrX29mZi5oPg0KKw0KKyAgc3RhdGljIEJZVEUgcmVhbF9zdHViX2FycmF5IFtdID0gew0KKyAgICAgICAgICNpbmNsdWRlICJwa3Rfc3R1Yi5pbmMiICAgICAgIC8qIGdlbmVyYXRlZCBvcGNvZGUgYXJyYXkgKi8NCisgICAgICAgfTsNCisNCisgICNkZWZpbmUgcnhPdXRPZnMgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3J4T3V0T2ZzKQ0KKyAgI2RlZmluZSByeEluT2ZzICAgICAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfcnhJbk9mcykNCisgICNkZWZpbmUgUGt0UmVjZWl2ZXIgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX1BrdFJlY2VpdmVyIFtwYXJhX3NraXBdKQ0KKyAgI2RlZmluZSBwa3REcm9wICAgICAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfcGt0RHJvcCkNCisgICNkZWZpbmUgcGt0VGVtcCAgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFRlbXApDQorICAjZGVmaW5lIHBrdFR4QnVmICAgICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9wa3RUeEJ1ZikNCisgICNkZWZpbmUgRklSU1RfUlhfQlVGICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFJ4QnVmIFswXSkNCisgICNkZWZpbmUgTEFTVF9SWF9CVUYgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFJ4QnVmIFtOVU1fUlhfQlVGLTFdKQ0KKw0KKyNlbHNlDQorICBleHRlcm4gV09SRCAgICAgICByeE91dE9mczsgICAgLyogb2Zmc2V0cyBpbnRvIHBrdFJ4QnVmIEZJRk8gcXVldWUgICAqLw0KKyAgZXh0ZXJuIFdPUkQgICAgICAgcnhJbk9mczsNCisgIGV4dGVybiBEV09SRCAgICAgIHBrdERyb3A7ICAgICAvKiAjIHBhY2tldHMgZHJvcHBlZCBpbiBQa3RSZWNlaXZlcigpICovDQorICBleHRlcm4gQllURSAgICAgICBwa3RSeEVuZDsgICAgLyogbWFya3MgdGhlIGVuZCBvZiByLW1vZGUgY29kZS9kYXRhICAqLw0KKw0KKyAgZXh0ZXJuIFJYX0VMRU1FTlQgcGt0UnhCdWYgW05VTV9SWF9CVUZdOyAgICAgICAvKiBQa3REcnZyIFJ4IGJ1ZmZlcnMgKi8NCisgIGV4dGVybiBUWF9FTEVNRU5UIHBrdFR4QnVmOyAgICAgICAgICAgICAgICAgICAgLyogUGt0RHJ2ciBUeCBidWZmZXIgICovDQorICBleHRlcm4gY2hhciAgICAgICBwa3RUZW1wWzIwXTsgICAgICAgICAgICAgICAgIC8qIFBrdERydnIgdGVtcCBhcmVhICAqLw0KKw0KKyAgI2RlZmluZSBGSVJTVF9SWF9CVUYgKFdPUkQpICZwa3RSeEJ1ZiBbMF0NCisgICNkZWZpbmUgTEFTVF9SWF9CVUYgIChXT1JEKSAmcGt0UnhCdWYgW05VTV9SWF9CVUYtMV0NCisjZW5kaWYNCisNCisNCisjaWZkZWYgX19CT1JMQU5EQ19fICAgICAgICAgICAvKiBVc2UgQm9ybGFuZCdzIGlubGluZSBmdW5jdGlvbnMgKi8NCisgICNkZWZpbmUgbWVtY3B5ICBfX21lbWNweV9fDQorICAjZGVmaW5lIG1lbWNtcCAgX19tZW1jbXBfXw0KKyAgI2RlZmluZSBtZW1zZXQgIF9fbWVtc2V0X18NCisjZW5kaWYNCisNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgZXh0ZXJuIHZvaWQgUGt0UmVjZWl2ZXIgKHZvaWQpOyAgICAgLyogaW4gcGt0X3J4MC5hc20gKi8NCisgIHN0YXRpYyBpbnQgIFJlYWxDb3B5ICAgIChVTE9ORywgVUxPTkcsIFJFQUxQVFIqLCBGQVJQVFIqLCBVU0hPUlQqKTsNCisNCisgICN1bmRlZiAgRlBfU0VHDQorICAjdW5kZWYgIEZQX09GRg0KKyAgI2RlZmluZSBGUF9PRkYoeCkgICAgICgoV09SRCkoeCkpDQorICAjZGVmaW5lIEZQX1NFRyh4KSAgICAgKChXT1JEKShyZWFsQmFzZSA+PiAxNikpDQorICAjZGVmaW5lIERPU19BRERSKHMsbykgKCgoRFdPUkQpKHMpIDw8IDE2KSArIChXT1JEKShvKSkNCisgICNkZWZpbmUgcl9heCAgICAgICAgICBlYXgNCisgICNkZWZpbmUgcl9ieCAgICAgICAgICBlYngNCisgICNkZWZpbmUgcl9keCAgICAgICAgICBlZHgNCisgICNkZWZpbmUgcl9jeCAgICAgICAgICBlY3gNCisgICNkZWZpbmUgcl9zaSAgICAgICAgICBlc2kNCisgICNkZWZpbmUgcl9kaSAgICAgICAgICBlZGkNCisgICNkZWZpbmUgcl9kcyAgICAgICAgICBkcw0KKyAgI2RlZmluZSByX2VzICAgICAgICAgIGVzDQorICBMT0NBTCBGQVJQVFIgICAgICAgICAgcHJvdEJhc2U7DQorICBMT0NBTCBSRUFMUFRSICAgICAgICAgcmVhbEJhc2U7DQorICBMT0NBTCBXT1JEICAgICAgICAgICAgcmVhbFNlZzsgICAvKiBET1MgcGFyYS1hZGRyZXNzIG9mIGFsbG9jYXRlZCBhcmVhICovDQorICBMT0NBTCBTV0lfUkVHUyAgICAgICAgcmVnOw0KKw0KKyAgc3RhdGljIFdPUkQgX2ZhciAqcnhPdXRPZnNGcCwgKnJ4SW5PZnNGcDsNCisNCisjZWxpZiAoRE9TWCAmIERKR1BQKQ0KKyAgc3RhdGljIF9nbzMyX2RwbWlfc2VnaW5mbyBybV9tZW07DQorICBzdGF0aWMgX19kcG1pX3JlZ3MgICAgICAgIHJlZzsNCisgIHN0YXRpYyBEV09SRCAgICAgICAgICAgICAgcmVhbEJhc2U7DQorICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIHBhcmFfc2tpcCA9IDA7DQorDQorICAjZGVmaW5lIERPU19BRERSKHMsbykgICAgICgoKFdPUkQpKHMpIDw8IDQpICsgKG8pKQ0KKyAgI2RlZmluZSByX2F4ICAgICAgICAgICAgICB4LmF4DQorICAjZGVmaW5lIHJfYnggICAgICAgICAgICAgIHguYngNCisgICNkZWZpbmUgcl9keCAgICAgICAgICAgICAgeC5keA0KKyAgI2RlZmluZSByX2N4ICAgICAgICAgICAgICB4LmN4DQorICAjZGVmaW5lIHJfc2kgICAgICAgICAgICAgIHguc2kNCisgICNkZWZpbmUgcl9kaSAgICAgICAgICAgICAgeC5kaQ0KKyAgI2RlZmluZSByX2RzICAgICAgICAgICAgICB4LmRzDQorICAjZGVmaW5lIHJfZXMgICAgICAgICAgICAgIHguZXMNCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIExPQ0FMIHN0cnVjdCBEUE1JX3JlZ3MgICAgcmVnOw0KKyAgTE9DQUwgV09SRCAgICAgICAgICAgICAgICBybV9iYXNlX3NlZywgcm1fYmFzZV9zZWw7DQorICBMT0NBTCBEV09SRCAgICAgICAgICAgICAgIHJlYWxCYXNlOw0KKyAgTE9DQUwgaW50ICAgICAgICAgICAgICAgICBwYXJhX3NraXAgPSAwOw0KKw0KKyAgTE9DQUwgRFdPUkQgZHBtaV9nZXRfcmVhbF92ZWN0b3IgKGludCBpbnRyKTsNCisgIExPQ0FMIFdPUkQgIGRwbWlfcmVhbF9tYWxsb2MgICAgIChpbnQgc2l6ZSwgV09SRCAqc2VsZWN0b3IpOw0KKyAgTE9DQUwgdm9pZCAgZHBtaV9yZWFsX2ZyZWUgICAgICAgKFdPUkQgc2VsZWN0b3IpOw0KKyAgI2RlZmluZSBET1NfQUREUihzLG8pICgoKERXT1JEKShzKSA8PCA0KSArIChXT1JEKShvKSkNCisNCisjZWxzZSAgICAgICAgICAgICAgLyogcmVhbC1tb2RlIEJvcmxhbmQgZXRjLiAqLw0KKyAgc3RhdGljIHN0cnVjdCAgew0KKyAgICAgICAgIFdPUkQgcl9heCwgcl9ieCwgcl9jeCwgcl9keCwgcl9icDsNCisgICAgICAgICBXT1JEIHJfc2ksIHJfZGksIHJfZHMsIHJfZXMsIHJfZmxhZ3M7DQorICAgICAgIH0gcmVnOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX0hJR0hDX18NCisgICNwcmFnbWEgQWxpYXMgKHBrdERyb3AsICAgICJfcGt0RHJvcCIpDQorICAjcHJhZ21hIEFsaWFzIChwa3RSeEJ1ZiwgICAiX3BrdFJ4QnVmIikNCisgICNwcmFnbWEgQWxpYXMgKHBrdFR4QnVmLCAgICJfcGt0VHhCdWYiKQ0KKyAgI3ByYWdtYSBBbGlhcyAocGt0VGVtcCwgICAgIl9wa3RUZW1wIikNCisgICNwcmFnbWEgQWxpYXMgKHJ4T3V0T2ZzLCAgICJfcnhPdXRPZnMiKQ0KKyAgI3ByYWdtYSBBbGlhcyAocnhJbk9mcywgICAgIl9yeEluT2ZzIikNCisgICNwcmFnbWEgQWxpYXMgKHBrdFJ4RW5kLCAgICJfcGt0UnhFbmQiKQ0KKyAgI3ByYWdtYSBBbGlhcyAoUGt0UmVjZWl2ZXIsIl9Qa3RSZWNlaXZlciIpDQorI2VuZGlmDQorDQorDQorUFVCTElDIFBLVF9TVEFUICAgIHBrdFN0YXQ7ICAgIC8qIHN0YXRpc3RpY3MgZm9yIHBhY2tldHMgICAgKi8NCitQVUJMSUMgUEtUX0lORk8gICAgcGt0SW5mbzsgICAgLyogcGFja2V0LWRyaXZlciBpbmZvcm1hdGlvbiAqLw0KKw0KK1BVQkxJQyBQS1RfUlhfTU9ERSByZWNlaXZlTW9kZSAgPSBQRFJYX0RJUkVDVDsNCitQVUJMSUMgRVRIRVIgICAgICAgbXlBZGRyZXNzICAgID0geyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCB9Ow0KK1BVQkxJQyBFVEhFUiAgICAgICBldGhCcm9hZGNhc3QgPSB7IDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1IH07DQorDQorTE9DQUwgIHN0cnVjdCB7ICAgICAgICAgICAgIC8qIGludGVybmFsIHN0YXRpc3RpY3MgKi8NCisgICAgICAgRFdPUkQgIHRvb1NtYWxsOyAgICAgLyogc2l6ZSA8IEVUSF9NSU4gKi8NCisgICAgICAgRFdPUkQgIHRvb0xhcmdlOyAgICAgLyogc2l6ZSA+IEVUSF9NQVggKi8NCisgICAgICAgRFdPUkQgIGJhZFN5bmM7ICAgICAgLyogY291bnRfMSAhPSBjb3VudF8yICovDQorICAgICAgIERXT1JEICB3cm9uZ0hhbmRsZTsgIC8qIHVwY2FsbCB0byB3cm9uZyBoYW5kbGUgKi8NCisgICAgIH0gaW50U3RhdDsgIA0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIGNvbnN0IGNoYXIgKlBrdEdldEVycm9yU3RyIChpbnQgZXJyTnVtKQ0KK3sNCisgIHN0YXRpYyBjb25zdCBjaGFyICplcnJTdHJbXSA9IHsNCisgICAgICAgICAgICAgICAgICAgICIiLA0KKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaGFuZGxlIG51bWJlciIsDQorICAgICAgICAgICAgICAgICAgICAiTm8gaW50ZXJmYWNlcyBvZiBzcGVjaWZpZWQgY2xhc3MgZm91bmQiLA0KKyAgICAgICAgICAgICAgICAgICAgIk5vIGludGVyZmFjZXMgb2Ygc3BlY2lmaWVkIHR5cGUgZm91bmQiLA0KKyAgICAgICAgICAgICAgICAgICAgIk5vIGludGVyZmFjZXMgb2Ygc3BlY2lmaWVkIG51bWJlciBmb3VuZCIsDQorICAgICAgICAgICAgICAgICAgICAiQmFkIHBhY2tldCB0eXBlIHNwZWNpZmllZCIsDQorICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgbXVsdGljYXN0IiwNCisgICAgICAgICAgICAgICAgICAgICJQYWNrZXQgZHJpdmVyIGNhbm5vdCB0ZXJtaW5hdGUiLA0KKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVjZWl2ZXIgbW9kZSBzcGVjaWZpZWQiLA0KKyAgICAgICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCBtZW1vcnkgc3BhY2UiLA0KKyAgICAgICAgICAgICAgICAgICAgIlR5cGUgcHJldmlvdXNseSBhY2Nlc3NlZCwgYW5kIG5vdCByZWxlYXNlZCIsDQorICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCBvdXQgb2YgcmFuZ2UsIG9yIG5vdCBpbXBsZW1lbnRlZCIsDQorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNlbmQgcGFja2V0ICh1c3VhbGx5IGhhcmR3YXJlIGVycm9yKSIsDQorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNoYW5nZSBoYXJkd2FyZSBhZGRyZXNzICggPiAxIGhhbmRsZSBvcGVuKSIsDQorICAgICAgICAgICAgICAgICAgICAiSGFyZHdhcmUgYWRkcmVzcyBoYXMgYmFkIGxlbmd0aCBvciBmb3JtYXQiLA0KKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZXNldCBpbnRlcmZhY2UgKG1vcmUgdGhhbiAxIGhhbmRsZSBvcGVuKSIsDQorICAgICAgICAgICAgICAgICAgICAiQmFkIENoZWNrLXN1bSIsDQorICAgICAgICAgICAgICAgICAgICAiQmFkIHNpemUiLA0KKyAgICAgICAgICAgICAgICAgICAgIkJhZCBzeW5jIiAsDQorICAgICAgICAgICAgICAgICAgICAiU291cmNlIGhpdCINCisgICAgICAgICAgICAgICAgICB9Ow0KKw0KKyAgaWYgKGVyck51bSA8IDAgfHwgZXJyTnVtID49IERJTShlcnJTdHIpKQ0KKyAgICAgcmV0dXJuICgiVW5rbm93biBkcml2ZXIgZXJyb3IuIik7DQorICByZXR1cm4gKGVyclN0ciBbZXJyTnVtXSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgY29uc3QgY2hhciAqUGt0R2V0Q2xhc3NOYW1lIChXT1JEIGNsYXNzKQ0KK3sNCisgIHN3aXRjaCAoY2xhc3MpDQorICB7IA0KKyAgICBjYXNlIFBEX0VUSEVSOg0KKyAgICAgICAgIHJldHVybiAoIkRJWC1FdGhlciIpOw0KKyAgICBjYXNlIFBEX1BST05FVDEwOg0KKyAgICAgICAgIHJldHVybiAoIlByb05FVC0xMCIpOw0KKyAgICBjYXNlIFBEX0lFRUU4MDI1Og0KKyAgICAgICAgIHJldHVybiAoIklFRUUgODAyLjUiKTsNCisgICAgY2FzZSBQRF9PTU5JTkVUOg0KKyAgICAgICAgIHJldHVybiAoIk9tbmlOZXQiKTsNCisgICAgY2FzZSBQRF9BUFBMRVRBTEs6DQorICAgICAgICAgcmV0dXJuICgiQXBwbGVUYWxrIik7DQorICAgIGNhc2UgUERfU0xJUDoNCisgICAgICAgICByZXR1cm4gKCJTTElQIik7DQorICAgIGNhc2UgUERfU1RBUlRMQU46DQorICAgICAgICAgcmV0dXJuICgiU3RhcnRMQU4iKTsNCisgICAgY2FzZSBQRF9BUkNORVQ6DQorICAgICAgICAgcmV0dXJuICgiQXJjTmV0Iik7DQorICAgIGNhc2UgUERfQVgyNToNCisgICAgICAgICByZXR1cm4gKCJBWC4yNSIpOw0KKyAgICBjYXNlIFBEX0tJU1M6DQorICAgICAgICAgcmV0dXJuICgiS0lTUyIpOw0KKyAgICBjYXNlIFBEX0lFRUU4MDIzXzI6DQorICAgICAgICAgcmV0dXJuICgiSUVFRSA4MDIuMyB3LzgwMi4yIGhkciIpOw0KKyAgICBjYXNlIFBEX0ZEREk4MDIyOg0KKyAgICAgICAgIHJldHVybiAoIkZEREkgdy84MDIuMiBoZHIiKTsNCisgICAgY2FzZSBQRF9YMjU6DQorICAgICAgICAgcmV0dXJuICgiWC4yNSIpOw0KKyAgICBjYXNlIFBEX0xBTnN0YXI6DQorICAgICAgICAgcmV0dXJuICgiTEFOc3RhciIpOw0KKyAgICBjYXNlIFBEX1BQUDoNCisgICAgICAgICByZXR1cm4gKCJQUFAiKTsNCisgICAgZGVmYXVsdDoNCisgICAgICAgICByZXR1cm4gKCJ1bmtub3duIik7DQorICB9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgY2hhciBjb25zdCAqUGt0Ulhtb2RlU3RyIChQS1RfUlhfTU9ERSBtb2RlKQ0KK3sNCisgIHN0YXRpYyBjb25zdCBjaGFyICptb2RlU3RyIFtdID0gew0KKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVyIHR1cm5lZCBvZmYiLA0KKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgb25seSBkaXJlY3RseSBhZGRyZXNzZWQgcGFja2V0cyIsDQorICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBkaXJlY3QgJiBicm9hZGNhc3QgcGFja2V0cyIsDQorICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBkaXJlY3QsYnJvYWRjYXN0IGFuZCBsaW1pdGVkIG11bHRpY2FzdCBwYWNrZXRzIiwNCisgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlIGRpcmVjdCxicm9hZGNhc3QgYW5kIGFsbCBtdWx0aWNhc3QgcGFja2V0cyIsDQorICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBhbGwgcGFja2V0cyAocHJvbWlzY3VvdW9zIG1vZGUpIg0KKyAgICAgICAgICAgICAgICAgIH07DQorDQorICBpZiAobW9kZSA+IERJTShtb2RlU3RyKSkNCisgICAgIHJldHVybiAoIj8/Iik7DQorICByZXR1cm4gKG1vZGVTdHIgW21vZGUtMV0pOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorTE9DQUwgX19pbmxpbmUgQk9PTCBQa3RJbnRlcnJ1cHQgKHZvaWQpDQorew0KKyAgQk9PTCBva2F5Ow0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICBfZHhfcmVhbF9pbnQgKChVSU5UKXBrdEluZm8uaW50ciwgJnJlZyk7DQorICBva2F5ID0gKChyZWcuZmxhZ3MgJiAxKSA9PSAwKTsgIC8qIE9LIGlmIGNhcnJ5IGNsZWFyICovDQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgIF9fZHBtaV9pbnQgKChpbnQpcGt0SW5mby5pbnRyLCAmcmVnKTsNCisgIG9rYXkgPSAoKHJlZy54LmZsYWdzICYgMSkgPT0gMCk7DQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICB1bmlvbiAgUkVHUyAgcjsNCisgIHN0cnVjdCBTUkVHUyBzOw0KKw0KKyAgbWVtc2V0ICgmciwgMCwgc2l6ZW9mKHIpKTsNCisgIHNlZ3JlYWQgKCZzKTsNCisgIHIudy5heCAgPSAweDMwMDsNCisgIHIueC5lYnggPSBwa3RJbmZvLmludHI7DQorICByLncuY3ggID0gMDsNCisgIHMuZXMgICAgPSBGUF9TRUcgKCZyZWcpOw0KKyAgci54LmVkaSA9IEZQX09GRiAoJnJlZyk7DQorICByZWcucl9mbGFncyA9IDA7DQorICByZWcucl9zcyA9IHJlZy5yX3NwID0gMDsgICAgIC8qIERQTUkgaG9zdCBwcm92aWRlcyBzdGFjayAqLw0KKw0KKyAgaW50Mzg2eCAoMHgzMSwgJnIsICZyLCAmcyk7DQorICBva2F5ID0gKCFyLncuY2ZsYWcpOw0KKw0KKyNlbHNlDQorICByZWcucl9mbGFncyA9IDA7DQorICBpbnRyIChwa3RJbmZvLmludHIsIChzdHJ1Y3QgUkVHUEFDSyopJnJlZyk7DQorICBva2F5ID0gKChyZWcucl9mbGFncyAmIDEpID09IDApOw0KKyNlbmRpZg0KKw0KKyAgaWYgKG9rYXkpDQorICAgICAgIHBrdEluZm8uZXJyb3IgPSBOVUxMOw0KKyAgZWxzZSBwa3RJbmZvLmVycm9yID0gUGt0R2V0RXJyb3JTdHIgKHJlZy5yX2R4ID4+IDgpOw0KKyAgcmV0dXJuIChva2F5KTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qDQorICogU2VhcmNoIGZvciBwYWNrZXQgZHJpdmVyIGF0IGludGVycnVwdCA2MGggdGhyb3VnaCA4MGguIElmIEFTQ0lJWg0KKyAqIHN0cmluZyAiUEtUIERSVlIiIGZvdW5kIGF0IG9mZnNldCAzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgcmV0dXJuDQorICogaW50ZXJydXB0IG51bWJlciwgZWxzZSByZXR1cm4gemVybyBpbiBwa3RJbmZvLmludHINCisgKi8NCitQVUJMSUMgQk9PTCBQa3RTZWFyY2hEcml2ZXIgKHZvaWQpDQorew0KKyAgQllURSBpbnRyICA9IDB4MjA7DQorICBCT09MIGZvdW5kID0gRkFMU0U7DQorDQorICB3aGlsZSAoIWZvdW5kICYmIGludHIgPCAweEZGKQ0KKyAgew0KKyAgICBzdGF0aWMgY2hhciBzdHJbMTJdOyAgICAgICAgICAgICAgICAgLyogMyArIHN0cmxlbigiUEtUIERSVlIiKSAqLw0KKyAgICBzdGF0aWMgY2hhciBwa3RTdHJbOV0gPSAiUEtUIERSVlIiOyAgLyogQVNDSUlaIHN0cmluZyBhdCBvZnMgMyAqLw0KKyAgICBEV09SRCAgcnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gaW50ZXJydXB0ICByb3V0aW5lICAqLw0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICAgIF9keF9ybWl2X2dldCAoaW50ciwgJnJwKTsNCisgICAgUmVhZFJlYWxNZW0gKCZzdHIsIChSRUFMUFRSKXJwLCBzaXplb2Yoc3RyKSk7DQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgICAgX19kcG1pX3JhZGRyIHJlYWxBZHI7DQorICAgIF9fZHBtaV9nZXRfcmVhbF9tb2RlX2ludGVycnVwdF92ZWN0b3IgKGludHIsICZyZWFsQWRyKTsNCisgICAgcnAgPSAocmVhbEFkci5zZWdtZW50IDw8IDQpICsgcmVhbEFkci5vZmZzZXQxNjsNCisgICAgZG9zbWVtZ2V0IChycCwgc2l6ZW9mKHN0ciksICZzdHIpOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgICBycCA9IGRwbWlfZ2V0X3JlYWxfdmVjdG9yIChpbnRyKTsNCisgICAgbWVtY3B5ICgmc3RyLCAodm9pZCopcnAsIHNpemVvZihzdHIpKTsNCisNCisjZWxzZQ0KKyAgICBfZm1lbWNweSAoJnN0ciwgZ2V0dmVjdChpbnRyKSwgc2l6ZW9mKHN0cikpOw0KKyNlbmRpZg0KKw0KKyAgICBmb3VuZCA9IG1lbWNtcCAoJnN0clszXSwmcGt0U3RyLHNpemVvZihwa3RTdHIpKSA9PSAwOw0KKyAgICBpbnRyKys7DQorICB9DQorICBwa3RJbmZvLmludHIgPSAoZm91bmQgPyBpbnRyLTEgOiAwKTsNCisgIHJldHVybiAoZm91bmQpOw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIEJPT0wgUGt0U2V0QWNjZXNzICh2b2lkKQ0KK3sNCisgIHJlZy5yX2F4ID0gMHgwMjAwICsgcGt0SW5mby5jbGFzczsNCisgIHJlZy5yX2J4ID0gMHhGRkZGOw0KKyAgcmVnLnJfZHggPSAwOw0KKyAgcmVnLnJfY3ggPSAwOw0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICByZWcuZHMgID0gMDsNCisgIHJlZy5lc2kgPSAwOw0KKyAgcmVnLmVzICA9IFJQX1NFRyAocmVhbEJhc2UpOw0KKyAgcmVnLmVkaSA9IChXT1JEKSAmUGt0UmVjZWl2ZXI7DQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgIHJlZy54LmRzID0gMDsNCisgIHJlZy54LnNpID0gMDsNCisgIHJlZy54LmVzID0gcm1fbWVtLnJtX3NlZ21lbnQ7DQorICByZWcueC5kaSA9IFBrdFJlY2VpdmVyOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgcmVnLnJfZHMgPSAwOw0KKyAgcmVnLnJfc2kgPSAwOw0KKyAgcmVnLnJfZXMgPSBybV9iYXNlX3NlZzsNCisgIHJlZy5yX2RpID0gUGt0UmVjZWl2ZXI7DQorDQorI2Vsc2UNCisgIHJlZy5yX2RzID0gMDsNCisgIHJlZy5yX3NpID0gMDsNCisgIHJlZy5yX2VzID0gRlBfU0VHICgmUGt0UmVjZWl2ZXIpOw0KKyAgcmVnLnJfZGkgPSBGUF9PRkYgKCZQa3RSZWNlaXZlcik7DQorI2VuZGlmDQorDQorICBpZiAoIVBrdEludGVycnVwdCgpKQ0KKyAgICAgcmV0dXJuIChGQUxTRSk7DQorDQorICBwa3RJbmZvLmhhbmRsZSA9IHJlZy5yX2F4Ow0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdFJlbGVhc2VIYW5kbGUgKFdPUkQgaGFuZGxlKQ0KK3sNCisgIHJlZy5yX2F4ID0gMHgwMzAwOw0KKyAgcmVnLnJfYnggPSBoYW5kbGU7DQorICByZXR1cm4gUGt0SW50ZXJydXB0KCk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RUcmFuc21pdCAoY29uc3Qgdm9pZCAqZXRoLCBpbnQgbGVuKQ0KK3sNCisgIGlmIChsZW4gPiBFVEhfTVRVKQ0KKyAgICAgcmV0dXJuIChGQUxTRSk7DQorDQorICByZWcucl9heCA9IDB4MDQwMDsgICAgICAgICAgICAgLyogRnVuY3Rpb24gNCwgc2VuZCBwa3QgKi8NCisgIHJlZy5yX2N4ID0gbGVuOyAgICAgICAgICAgICAgICAvKiB0b3RhbCBzaXplIG9mIGZyYW1lICAqLw0KKw0KKyNpZiAoRE9TWCAmIERKR1BQKQ0KKyAgZG9zbWVtcHV0IChldGgsIGxlbiwgcmVhbEJhc2UrcGt0VHhCdWYpOw0KKyAgcmVnLnguZHMgPSBybV9tZW0ucm1fc2VnbWVudDsgIC8qIERPUyBkYXRhIHNlZ21lbnQgYW5kICovDQorICByZWcueC5zaSA9IHBrdFR4QnVmOyAgICAgICAgICAgLyogRE9TIG9mZnNldCB0byBidWZmZXIgKi8NCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIG1lbWNweSAoKHZvaWQqKShyZWFsQmFzZStwa3RUeEJ1ZiksIGV0aCwgbGVuKTsNCisgIHJlZy5yX2RzID0gcm1fYmFzZV9zZWc7DQorICByZWcucl9zaSA9IHBrdFR4QnVmOw0KKw0KKyNlbGlmIChET1NYICYgUEhBUkxBUCkNCisgIG1lbWNweSAoJnBrdFR4QnVmLCBldGgsIGxlbik7DQorICByZWcucl9kcyA9IEZQX1NFRyAoJnBrdFR4QnVmKTsNCisgIHJlZy5yX3NpID0gRlBfT0ZGICgmcGt0VHhCdWYpOw0KKw0KKyNlbHNlDQorICByZWcucl9kcyA9IEZQX1NFRyAoZXRoKTsNCisgIHJlZy5yX3NpID0gRlBfT0ZGIChldGgpOw0KKyNlbmRpZg0KKw0KKyAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmIChET1NYICYgKERKR1BQfERPUzRHVykpDQorTE9DQUwgX19pbmxpbmUgQk9PTCBDaGVja0VsZW1lbnQgKFJYX0VMRU1FTlQgKnJ4KQ0KKyNlbHNlDQorTE9DQUwgX19pbmxpbmUgQk9PTCBDaGVja0VsZW1lbnQgKFJYX0VMRU1FTlQgX2ZhciAqcngpDQorI2VuZGlmDQorew0KKyAgV09SRCBjb3VudF8xLCBjb3VudF8yOw0KKw0KKyAgLyoNCisgICAqIFdlIGdvdCBhbiB1cGNhbGwgdG8gdGhlIHNhbWUgUk1DQiB3aXRoIHdyb25nIGhhbmRsZS4NCisgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBmYWlsZWQgdG8gcmVsZWFzZSBoYW5kbGUgYXQgcHJvZ3JhbSBleGl0DQorICAgKi8NCisgIGlmIChyeC0+aGFuZGxlICE9IHBrdEluZm8uaGFuZGxlKQ0KKyAgew0KKyAgICBwa3RJbmZvLmVycm9yID0gIldyb25nIGhhbmRsZSI7DQorICAgIGludFN0YXQud3JvbmdIYW5kbGUrKzsNCisgICAgUGt0UmVsZWFzZUhhbmRsZSAocngtPmhhbmRsZSk7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyAgY291bnRfMSA9IHJ4LT5maXJzdENvdW50Ow0KKyAgY291bnRfMiA9IHJ4LT5zZWNvbmRDb3VudDsNCisNCisgIGlmIChjb3VudF8xICE9IGNvdW50XzIpDQorICB7DQorICAgIHBrdEluZm8uZXJyb3IgPSAiQmFkIHN5bmMiOw0KKyAgICBpbnRTdGF0LmJhZFN5bmMrKzsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorICBpZiAoY291bnRfMSA+IEVUSF9NQVgpDQorICB7DQorICAgIHBrdEluZm8uZXJyb3IgPSAiTGFyZ2UgZXNpemUiOw0KKyAgICBpbnRTdGF0LnRvb0xhcmdlKys7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyNpZiAwDQorICBpZiAoY291bnRfMSA8IEVUSF9NSU4pDQorICB7DQorICAgIHBrdEluZm8uZXJyb3IgPSAiU21hbGwgZXNpemUiOw0KKyAgICBpbnRTdGF0LnRvb1NtYWxsKys7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdFRlcm1pbkhhbmRsZSAoV09SRCBoYW5kbGUpDQorew0KKyAgcmVnLnJfYXggPSAweDA1MDA7DQorICByZWcucl9ieCA9IGhhbmRsZTsNCisgIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdFJlc2V0SW50ZXJmYWNlIChXT1JEIGhhbmRsZSkNCit7DQorICByZWcucl9heCA9IDB4MDcwMDsNCisgIHJlZy5yX2J4ID0gaGFuZGxlOw0KKyAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIEJPT0wgUGt0U2V0UmVjZWl2ZXJNb2RlIChQS1RfUlhfTU9ERSBtb2RlKQ0KK3sNCisgIGlmIChwa3RJbmZvLmNsYXNzID09IFBEX1NMSVAgfHwgcGt0SW5mby5jbGFzcyA9PSBQRF9QUFApDQorICAgICByZXR1cm4gKFRSVUUpOw0KKw0KKyAgcmVnLnJfYXggPSAweDE0MDA7DQorICByZWcucl9ieCA9IHBrdEluZm8uaGFuZGxlOw0KKyAgcmVnLnJfY3ggPSAoV09SRCltb2RlOw0KKw0KKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgcmVjZWl2ZU1vZGUgPSBtb2RlOw0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdEdldFJlY2VpdmVyTW9kZSAoUEtUX1JYX01PREUgKm1vZGUpDQorew0KKyAgcmVnLnJfYXggPSAweDE1MDA7DQorICByZWcucl9ieCA9IHBrdEluZm8uaGFuZGxlOw0KKw0KKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgKm1vZGUgPSByZWcucl9heDsNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitzdGF0aWMgUEtUX1NUQVQgaW5pdGlhbFN0YXQ7ICAgICAgICAgLyogc3RhdGlzdGljcyBhdCBzdGFydHVwICovDQorc3RhdGljIEJPT0wgICAgIHJlc2V0U3RhdCA9IEZBTFNFOyAgIC8qIHN0YXRpc3RpY3MgcmVzZXQgPyAqLw0KKw0KK1BVQkxJQyBCT09MIFBrdEdldFN0YXRpc3RpY3MgKFdPUkQgaGFuZGxlKQ0KK3sNCisgIHJlZy5yX2F4ID0gMHgxODAwOw0KKyAgcmVnLnJfYnggPSBoYW5kbGU7DQorDQorICBpZiAoIVBrdEludGVycnVwdCgpKQ0KKyAgICAgcmV0dXJuIChGQUxTRSk7DQorDQorI2lmIChET1NYICYgUEhBUkxBUCkNCisgIFJlYWRSZWFsTWVtICgmcGt0U3RhdCwgRE9TX0FERFIocmVnLmRzLHJlZy5lc2kpLCBzaXplb2YocGt0U3RhdCkpOw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBkb3NtZW1nZXQgKERPU19BRERSKHJlZy54LmRzLHJlZy54LnNpKSwgc2l6ZW9mKHBrdFN0YXQpLCAmcGt0U3RhdCk7DQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBtZW1jcHkgKCZwa3RTdGF0LCAodm9pZCopRE9TX0FERFIocmVnLnJfZHMscmVnLnJfc2kpLCBzaXplb2YocGt0U3RhdCkpOw0KKw0KKyNlbHNlDQorICBfZm1lbWNweSAoJnBrdFN0YXQsIE1LX0ZQKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdFN0YXQpKTsNCisjZW5kaWYNCisNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RTZXNzU3RhdGlzdGljcyAoV09SRCBoYW5kbGUpDQorew0KKyAgaWYgKCFQa3RHZXRTdGF0aXN0aWNzKHBrdEluZm8uaGFuZGxlKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgaWYgKHJlc2V0U3RhdCkNCisgIHsNCisgICAgcGt0U3RhdC5pblBhY2tldHMgIC09IGluaXRpYWxTdGF0LmluUGFja2V0czsNCisgICAgcGt0U3RhdC5vdXRQYWNrZXRzIC09IGluaXRpYWxTdGF0Lm91dFBhY2tldHM7DQorICAgIHBrdFN0YXQuaW5CeXRlcyAgICAtPSBpbml0aWFsU3RhdC5pbkJ5dGVzOw0KKyAgICBwa3RTdGF0Lm91dEJ5dGVzICAgLT0gaW5pdGlhbFN0YXQub3V0Qnl0ZXM7DQorICAgIHBrdFN0YXQuaW5FcnJvcnMgICAtPSBpbml0aWFsU3RhdC5pbkVycm9yczsNCisgICAgcGt0U3RhdC5vdXRFcnJvcnMgIC09IGluaXRpYWxTdGF0Lm91dEVycm9yczsNCisgICAgcGt0U3RhdC5vdXRFcnJvcnMgIC09IGluaXRpYWxTdGF0Lm91dEVycm9yczsNCisgICAgcGt0U3RhdC5sb3N0ICAgICAgIC09IGluaXRpYWxTdGF0Lmxvc3Q7DQorICB9DQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIEJPT0wgUGt0UmVzZXRTdGF0aXN0aWNzIChXT1JEIGhhbmRsZSkNCit7DQorICBpZiAoIVBrdEdldFN0YXRpc3RpY3MocGt0SW5mby5oYW5kbGUpKQ0KKyAgICAgcmV0dXJuIChGQUxTRSk7DQorDQorICBtZW1jcHkgKCZpbml0aWFsU3RhdCwgJnBrdFN0YXQsIHNpemVvZihpbml0aWFsU3RhdCkpOw0KKyAgcmVzZXRTdGF0ID0gVFJVRTsNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RHZXRBZGRyZXNzIChFVEhFUiAqYWRkcikNCit7DQorICByZWcucl9heCA9IDB4MDYwMDsNCisgIHJlZy5yX2J4ID0gcGt0SW5mby5oYW5kbGU7DQorICByZWcucl9jeCA9IHNpemVvZiAoKmFkZHIpOw0KKw0KKyNpZiAoRE9TWCAmIERKR1BQKQ0KKyAgcmVnLnguZXMgPSBybV9tZW0ucm1fc2VnbWVudDsNCisgIHJlZy54LmRpID0gcGt0VGVtcDsNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIHJlZy5yX2VzID0gcm1fYmFzZV9zZWc7DQorICByZWcucl9kaSA9IHBrdFRlbXA7DQorI2Vsc2UNCisgIHJlZy5yX2VzID0gRlBfU0VHICgmcGt0VGVtcCk7DQorICByZWcucl9kaSA9IEZQX09GRiAoJnBrdFRlbXApOyAgLyogRVM6REkgPSBhZGRyZXNzIGZvciByZXN1bHQgKi8NCisjZW5kaWYNCisNCisgIGlmICghUGt0SW50ZXJydXB0KCkpDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgUmVhZFJlYWxNZW0gKGFkZHIsIHJlYWxCYXNlICsgKFdPUkQpJnBrdFRlbXAsIHNpemVvZigqYWRkcikpOw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBkb3NtZW1nZXQgKHJlYWxCYXNlK3BrdFRlbXAsIHNpemVvZigqYWRkciksIGFkZHIpOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgbWVtY3B5IChhZGRyLCAodm9pZCopKHJlYWxCYXNlK3BrdFRlbXApLCBzaXplb2YoKmFkZHIpKTsNCisNCisjZWxzZQ0KKyAgbWVtY3B5ICgodm9pZCopYWRkciwgJnBrdFRlbXAsIHNpemVvZigqYWRkcikpOw0KKyNlbmRpZg0KKw0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdFNldEFkZHJlc3MgKGNvbnN0IEVUSEVSICphZGRyKQ0KK3sNCisgIC8qIGNvcHkgYWRkciB0byByZWFsLW1vZGUgc2NyYXRoIGFyZWEgKi8NCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgV3JpdGVSZWFsTWVtIChyZWFsQmFzZSArIChXT1JEKSZwa3RUZW1wLCAodm9pZCopYWRkciwgc2l6ZW9mKCphZGRyKSk7DQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgIGRvc21lbXB1dCAoYWRkciwgc2l6ZW9mKCphZGRyKSwgcmVhbEJhc2UrcGt0VGVtcCk7DQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBtZW1jcHkgKCh2b2lkKikocmVhbEJhc2UrcGt0VGVtcCksIGFkZHIsIHNpemVvZigqYWRkcikpOw0KKw0KKyNlbHNlDQorICBtZW1jcHkgKCZwa3RUZW1wLCAodm9pZCopYWRkciwgc2l6ZW9mKCphZGRyKSk7DQorI2VuZGlmDQorDQorICByZWcucl9heCA9IDB4MTkwMDsNCisgIHJlZy5yX2N4ID0gc2l6ZW9mICgqYWRkcik7ICAgICAgLyogYWRkcmVzcyBsZW5ndGggICAgICAgKi8NCisNCisjaWYgKERPU1ggJiBESkdQUCkNCisgIHJlZy54LmVzID0gcm1fbWVtLnJtX3NlZ21lbnQ7ICAgLyogRE9TIG9mZnNldCB0byBwYXJhbSAgKi8NCisgIHJlZy54LmRpID0gcGt0VGVtcDsgICAgICAgICAgICAgLyogRE9TIHNlZ21lbnQgdG8gcGFyYW0gKi8NCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIHJlZy5yX2VzID0gcm1fYmFzZV9zZWc7DQorICByZWcucl9kaSA9IHBrdFRlbXA7DQorI2Vsc2UNCisgIHJlZy5yX2VzID0gRlBfU0VHICgmcGt0VGVtcCk7DQorICByZWcucl9kaSA9IEZQX09GRiAoJnBrdFRlbXApOw0KKyNlbmRpZg0KKw0KKyAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIEJPT0wgUGt0R2V0RHJpdmVySW5mbyAodm9pZCkNCit7DQorICBwa3RJbmZvLm1halZlciA9IDA7DQorICBwa3RJbmZvLm1pblZlciA9IDA7DQorICBtZW1zZXQgKCZwa3RJbmZvLm5hbWUsIDAsIHNpemVvZihwa3RJbmZvLm5hbWUpKTsNCisgIHJlZy5yX2F4ID0gMHgwMUZGOw0KKyAgcmVnLnJfYnggPSAwOw0KKw0KKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgcGt0SW5mby5udW1iZXIgPSByZWcucl9jeCAmIDB4RkY7DQorICBwa3RJbmZvLmNsYXNzICA9IHJlZy5yX2N4ID4+IDg7DQorI2lmIDANCisgIHBrdEluZm8ubWluVmVyID0gcmVnLnJfYnggJSAxMDsNCisgIHBrdEluZm8ubWFqVmVyID0gcmVnLnJfYnggLyAxMDsNCisjZWxzZQ0KKyAgcGt0SW5mby5tYWpWZXIgPSByZWcucl9ieDsgIC8vICEhDQorI2VuZGlmDQorICBwa3RJbmZvLmZ1bmNzICA9IHJlZy5yX2F4ICYgMHhGRjsNCisgIHBrdEluZm8udHlwZSAgID0gcmVnLnJfZHggJiAweEZGOw0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICBSZWFkUmVhbE1lbSAoJnBrdEluZm8ubmFtZSwgRE9TX0FERFIocmVnLmRzLHJlZy5lc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSk7DQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgIGRvc21lbWdldCAoRE9TX0FERFIocmVnLnguZHMscmVnLnguc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSwgJnBrdEluZm8ubmFtZSk7DQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBtZW1jcHkgKCZwa3RJbmZvLm5hbWUsICh2b2lkKilET1NfQUREUihyZWcucl9kcyxyZWcucl9zaSksIHNpemVvZihwa3RJbmZvLm5hbWUpKTsNCisNCisjZWxzZQ0KKyAgX2ZtZW1jcHkgKCZwa3RJbmZvLm5hbWUsIE1LX0ZQKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdEluZm8ubmFtZSkpOw0KKyNlbmRpZg0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdEdldERyaXZlclBhcmFtICh2b2lkKQ0KK3sNCisgIHJlZy5yX2F4ID0gMHgwQTAwOw0KKw0KKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICBSZWFkUmVhbE1lbSAoJnBrdEluZm8ubWFqVmVyLCBET1NfQUREUihyZWcuZXMscmVnLmVkaSksIFBLVF9QQVJBTV9TSVpFKTsNCisNCisjZWxpZiAoRE9TWCAmIERKR1BQKQ0KKyAgZG9zbWVtZ2V0IChET1NfQUREUihyZWcueC5lcyxyZWcueC5kaSksIFBLVF9QQVJBTV9TSVpFLCAmcGt0SW5mby5tYWpWZXIpOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgbWVtY3B5ICgmcGt0SW5mby5tYWpWZXIsICh2b2lkKilET1NfQUREUihyZWcucl9lcyxyZWcucl9kaSksIFBLVF9QQVJBTV9TSVpFKTsNCisNCisjZWxzZQ0KKyAgX2ZtZW1jcHkgKCZwa3RJbmZvLm1halZlciwgTUtfRlAocmVnLnJfZXMscmVnLnJfZGkpLCBQS1RfUEFSQU1fU0laRSk7DQorI2VuZGlmDQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmIChET1NYICYgUEhBUkxBUCkNCisgIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQ0KKyAgew0KKyAgICBXT1JEIGluT2ZzICA9ICpyeEluT2ZzRnA7DQorICAgIFdPUkQgb3V0T2ZzID0gKnJ4T3V0T2ZzRnA7DQorDQorICAgIGlmIChvdXRPZnMgIT0gaW5PZnMpDQorICAgIHsNCisgICAgICBSWF9FTEVNRU5UIF9mYXIgKmhlYWQgPSAoUlhfRUxFTUVOVCBfZmFyKikocHJvdEJhc2Urb3V0T2ZzKTsNCisgICAgICBpbnQgc2l6ZSwgbGVuID0gbWF4Ow0KKw0KKyAgICAgIGlmIChDaGVja0VsZW1lbnQoaGVhZCkpDQorICAgICAgew0KKyAgICAgICAgc2l6ZSA9IG1pbiAoaGVhZC0+Zmlyc3RDb3VudCwgc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCisgICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7DQorICAgICAgICBfZm1lbWNweSAoYnVmLCAmaGVhZC0+ZGVzdGluLCBsZW4pOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBzaXplID0gLTE7DQorDQorICAgICAgb3V0T2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQorICAgICAgaWYgKG91dE9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgICBvdXRPZnMgPSBGSVJTVF9SWF9CVUY7DQorICAgICAgKnJ4T3V0T2ZzRnAgPSBvdXRPZnM7DQorICAgICAgcmV0dXJuIChzaXplKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQorICB7DQorICAgICpyeE91dE9mc0ZwID0gYnVzeSA/ICgqcnhJbk9mc0ZwICsgc2l6ZW9mKFJYX0VMRU1FTlQpKSA6ICpyeEluT2ZzRnA7DQorICAgIGlmICgqcnhPdXRPZnNGcCA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgKnJ4T3V0T2ZzRnAgPSBGSVJTVF9SWF9CVUY7DQorICAgICooRFdPUkQgX2ZhciopKHByb3RCYXNlICsgKFdPUkQpJnBrdERyb3ApID0gMDsNCisgIH0NCisNCisgIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQ0KKyAgew0KKyAgICBXT1JEIGluT2ZzICA9ICpyeEluT2ZzRnA7DQorICAgIFdPUkQgb3V0T2ZzID0gKnJ4T3V0T2ZzRnA7DQorDQorICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpDQorICAgICAgIHJldHVybiAoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpOw0KKyAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCisgIH0NCisNCisgIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpDQorICB7DQorICAgIHJldHVybiAoKihEV09SRCBfZmFyKikocHJvdEJhc2UgKyAoV09SRCkmcGt0RHJvcCkpOw0KKyAgfQ0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkNCisgIHsNCisgICAgV09SRCBvZnMgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzKTsNCisNCisgICAgaWYgKG9mcyAhPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK3J4SW5PZnMpKQ0KKyAgICB7DQorICAgICAgUlhfRUxFTUVOVCBoZWFkOw0KKyAgICAgIGludCAgc2l6ZSwgbGVuID0gbWF4Ow0KKw0KKyAgICAgIGhlYWQuZmlyc3RDb3VudCAgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK29mcyk7DQorICAgICAgaGVhZC5zZWNvbmRDb3VudCA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2Urb2ZzKzIpOw0KKyAgICAgIGhlYWQuaGFuZGxlICAgICAgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK29mcys0KTsNCisNCisgICAgICBpZiAoQ2hlY2tFbGVtZW50KCZoZWFkKSkNCisgICAgICB7DQorICAgICAgICBzaXplID0gbWluIChoZWFkLmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICAgICAgICBsZW4gID0gbWluIChzaXplLCBtYXgpOw0KKyAgICAgICAgZG9zbWVtZ2V0IChyZWFsQmFzZStvZnMrNiwgbGVuLCBidWYpOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBzaXplID0gLTE7DQorDQorICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQorICAgICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgICAgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgRklSU1RfUlhfQlVGKTsNCisgICAgICBlbHNlIF9mYXJwb2tldyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMsIG9mcyk7DQorICAgICAgcmV0dXJuIChzaXplKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQorICB7DQorICAgIFdPUkQgb2ZzOw0KKw0KKyAgICBkaXNhYmxlKCk7DQorICAgIG9mcyA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhJbk9mcyk7DQorICAgIGlmIChidXN5KQ0KKyAgICAgICBvZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsNCisNCisgICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgIF9mYXJwb2tldyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMsIEZJUlNUX1JYX0JVRik7DQorICAgIGVsc2UgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgb2ZzKTsNCisgICAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStwa3REcm9wLCAwVUwpOw0KKyAgICBlbmFibGUoKTsNCisgIH0NCisNCisgIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQ0KKyAgew0KKyAgICBXT1JEIGluT2ZzLCBvdXRPZnM7DQorDQorICAgIGRpc2FibGUoKTsNCisgICAgaW5PZnMgID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeEluT2ZzKTsNCisgICAgb3V0T2ZzID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcyk7DQorICAgIGVuYWJsZSgpOw0KKyAgICBpZiAoaW5PZnMgPj0gb3V0T2ZzKQ0KKyAgICAgICByZXR1cm4gKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKTsNCisgICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICB9DQorDQorICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQ0KKyAgew0KKyAgICByZXR1cm4gX2ZhcnBlZWtsIChfZG9zX2RzLCByZWFsQmFzZStwa3REcm9wKTsNCisgIH0NCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQ0KKyAgew0KKyAgICBXT1JEIG9mcyA9ICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcyk7DQorDQorICAgIGlmIChvZnMgIT0gKihXT1JEKikgKHJlYWxCYXNlK3J4SW5PZnMpKQ0KKyAgICB7DQorICAgICAgUlhfRUxFTUVOVCBoZWFkOw0KKyAgICAgIGludCAgc2l6ZSwgbGVuID0gbWF4Ow0KKw0KKyAgICAgIGhlYWQuZmlyc3RDb3VudCAgPSAqKFdPUkQqKSAocmVhbEJhc2Urb2ZzKTsNCisgICAgICBoZWFkLnNlY29uZENvdW50ID0gKihXT1JEKikgKHJlYWxCYXNlK29mcysyKTsNCisgICAgICBoZWFkLmhhbmRsZSAgICAgID0gKihXT1JEKikgKHJlYWxCYXNlK29mcys0KTsNCisNCisgICAgICBpZiAoQ2hlY2tFbGVtZW50KCZoZWFkKSkNCisgICAgICB7DQorICAgICAgICBzaXplID0gbWluIChoZWFkLmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICAgICAgICBsZW4gID0gbWluIChzaXplLCBtYXgpOw0KKyAgICAgICAgbWVtY3B5IChidWYsIChjb25zdCB2b2lkKikocmVhbEJhc2Urb2ZzKzYpLCBsZW4pOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBzaXplID0gLTE7DQorDQorICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQorICAgICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgICAgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IEZJUlNUX1JYX0JVRjsNCisgICAgICBlbHNlICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBvZnM7DQorICAgICAgcmV0dXJuIChzaXplKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQorICB7DQorICAgIFdPUkQgb2ZzOw0KKw0KKyAgICBfZGlzYWJsZSgpOw0KKyAgICBvZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcyk7DQorICAgIGlmIChidXN5KQ0KKyAgICAgICBvZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsNCisNCisgICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBGSVJTVF9SWF9CVUY7DQorICAgIGVsc2UgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IG9mczsNCisgICAgKihEV09SRCopIChyZWFsQmFzZStwa3REcm9wKSA9IDBVTDsNCisgICAgX2VuYWJsZSgpOw0KKyAgfQ0KKw0KKyAgUFVCTElDIFdPUkQgUGt0QnVmZmVyc1VzZWQgKHZvaWQpDQorICB7DQorICAgIFdPUkQgaW5PZnMsIG91dE9mczsNCisNCisgICAgX2Rpc2FibGUoKTsNCisgICAgaW5PZnMgID0gKihXT1JEKikgKHJlYWxCYXNlK3J4SW5PZnMpOw0KKyAgICBvdXRPZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpOw0KKyAgICBfZW5hYmxlKCk7DQorICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpDQorICAgICAgIHJldHVybiAoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpOw0KKyAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCisgIH0NCisNCisgIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpDQorICB7DQorICAgIHJldHVybiAqKERXT1JEKikgKHJlYWxCYXNlK3BrdERyb3ApOw0KKyAgfQ0KKw0KKyNlbHNlICAgICAvKiByZWFsLW1vZGUgc21hbGwvbGFyZ2UgbW9kZWwgKi8NCisNCisgIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQ0KKyAgew0KKyAgICBpZiAocnhPdXRPZnMgIT0gcnhJbk9mcykNCisgICAgew0KKyAgICAgIFJYX0VMRU1FTlQgZmFyICpoZWFkID0gKFJYX0VMRU1FTlQgZmFyKikgTUtfRlAgKF9EUyxyeE91dE9mcyk7DQorICAgICAgaW50ICBzaXplLCBsZW4gPSBtYXg7DQorDQorICAgICAgaWYgKENoZWNrRWxlbWVudChoZWFkKSkNCisgICAgICB7DQorICAgICAgICBzaXplID0gbWluIChoZWFkLT5maXJzdENvdW50LCBzaXplb2YoUlhfRUxFTUVOVCkpOw0KKyAgICAgICAgbGVuICA9IG1pbiAoc2l6ZSwgbWF4KTsNCisgICAgICAgIF9mbWVtY3B5IChidWYsICZoZWFkLT5kZXN0aW4sIGxlbik7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICAgIHNpemUgPSAtMTsNCisNCisgICAgICByeE91dE9mcyArPSBzaXplb2YgKFJYX0VMRU1FTlQpOw0KKyAgICAgIGlmIChyeE91dE9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgICByeE91dE9mcyA9IEZJUlNUX1JYX0JVRjsNCisgICAgICByZXR1cm4gKHNpemUpOw0KKyAgICB9DQorICAgIHJldHVybiAoMCk7DQorICB9DQorDQorICBQVUJMSUMgdm9pZCBQa3RRdWV1ZUJ1c3kgKEJPT0wgYnVzeSkNCisgIHsNCisgICAgcnhPdXRPZnMgPSBidXN5ID8gKHJ4SW5PZnMgKyBzaXplb2YoUlhfRUxFTUVOVCkpIDogcnhJbk9mczsNCisgICAgaWYgKHJ4T3V0T2ZzID4gTEFTVF9SWF9CVUYpDQorICAgICAgICByeE91dE9mcyA9IEZJUlNUX1JYX0JVRjsNCisgICAgcGt0RHJvcCA9IDBMOw0KKyAgfQ0KKw0KKyAgUFVCTElDIFdPUkQgUGt0QnVmZmVyc1VzZWQgKHZvaWQpDQorICB7DQorICAgIFdPUkQgaW5PZnMgID0gcnhJbk9mczsNCisgICAgV09SRCBvdXRPZnMgPSByeE91dE9mczsNCisNCisgICAgaWYgKGluT2ZzID49IG91dE9mcykNCisgICAgICAgcmV0dXJuICgoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCisgICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICB9DQorDQorICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQ0KKyAgew0KKyAgICByZXR1cm4gKHBrdERyb3ApOw0KKyAgfQ0KKyNlbmRpZg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitMT0NBTCBfX2lubGluZSB2b2lkIFBrdEZyZWVNZW0gKHZvaWQpDQorew0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICBpZiAocmVhbFNlZykNCisgIHsNCisgICAgX2R4X3JlYWxfZnJlZSAocmVhbFNlZyk7DQorICAgIHJlYWxTZWcgPSAwOw0KKyAgfQ0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBpZiAocm1fbWVtLnJtX3NlZ21lbnQpDQorICB7DQorICAgIHVuc2lnbmVkIG9mczsgIC8qIGNsZWFyIHRoZSBET1MtbWVtIHRvIHByZXZlbnQgZnVydGhlciB1cGNhbGxzICovDQorDQorICAgIGZvciAob2ZzID0gMDsgb2ZzIDwgMTYgKiBybV9tZW0uc2l6ZSAvIDQ7IG9mcyArPSA0KQ0KKyAgICAgICBfZmFycG9rZWwgKF9kb3NfZHMsIHJlYWxCYXNlICsgb2ZzLCAwKTsNCisgICAgX2dvMzJfZHBtaV9mcmVlX2Rvc19tZW1vcnkgKCZybV9tZW0pOw0KKyAgICBybV9tZW0ucm1fc2VnbWVudCA9IDA7DQorICB9DQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBpZiAocm1fYmFzZV9zZWwpDQorICB7DQorICAgIGRwbWlfcmVhbF9mcmVlIChybV9iYXNlX3NlbCk7DQorICAgIHJtX2Jhc2Vfc2VsID0gMDsNCisgIH0NCisjZW5kaWYNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdEV4aXREcml2ZXIgKHZvaWQpDQoreyAgICAgICAgICAgDQorICBpZiAocGt0SW5mby5oYW5kbGUpDQorICB7DQorICAgIGlmICghUGt0U2V0UmVjZWl2ZXJNb2RlKFBEUlhfQlJPQURDQVNUKSkNCisgICAgICAgUFVUUyAoIkVycm9yIHJlc3RvcmluZyByZWNlaXZlciBtb2RlLiIpOw0KKw0KKyAgICBpZiAoIVBrdFJlbGVhc2VIYW5kbGUocGt0SW5mby5oYW5kbGUpKQ0KKyAgICAgICBQVVRTICgiRXJyb3IgcmVsZWFzaW5nIFBLVC1EUlZSIGhhbmRsZS4iKTsNCisNCisgICAgUGt0RnJlZU1lbSgpOw0KKyAgICBwa3RJbmZvLmhhbmRsZSA9IDA7DQorICB9DQorDQorICBpZiAocGNhcF9wa3RfZGVidWcgPj0gMSkNCisgICAgIHByaW50ZiAoIkludGVybmFsIHN0YXRzOiB0b28tc21hbGwgJWx1LCB0b28tbGFyZ2UgJWx1LCBiYWQtc3luYyAlbHUsICINCisgICAgICAgICAgICAgIndyb25nLWhhbmRsZSAlbHVcbiIsDQorICAgICAgICAgICAgIGludFN0YXQudG9vU21hbGwsIGludFN0YXQudG9vTGFyZ2UsDQorICAgICAgICAgICAgIGludFN0YXQuYmFkU3luYywgaW50U3RhdC53cm9uZ0hhbmRsZSk7DQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisjaWYgKERPU1ggJiAoREpHUFB8RE9TNEdXKSkNCitzdGF0aWMgdm9pZCBkdW1wX3BrdF9zdHViICh2b2lkKQ0KK3sNCisgIGludCBpOw0KKw0KKyAgZnByaW50ZiAoc3RkZXJyLCAiUGt0UmVjZWl2ZXIgJWx1LCBwa3Rfc3R1YltQa3RSZWNlaXZlcl0gPVxuIiwNCisgICAgICAgICAgIFBrdFJlY2VpdmVyKTsNCisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQ0KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMlgsICIsIHJlYWxfc3R1Yl9hcnJheVtpK1BrdFJlY2VpdmVyXSk7DQorICBmcHV0cyAoIlxuIiwgc3RkZXJyKTsNCit9DQorI2VuZGlmDQorDQorLyoNCisgKiBGcm9udCBlbmQgaW5pdGlhbGl6YXRpb24gcm91dGluZQ0KKyAqLw0KK1BVQkxJQyBCT09MIFBrdEluaXREcml2ZXIgKFBLVF9SWF9NT0RFIG1vZGUpDQorew0KKyAgUEtUX1JYX01PREUgcnhNb2RlOw0KKyAgQk9PTCAgIHdyaXRlSW5mbyA9IChwY2FwX3BrdF9kZWJ1ZyA+PSAzKTsNCisNCisgIHBrdEluZm8ucXVpZXQgPSAocGNhcF9wa3RfZGVidWcgPCAzKTsNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKSAmJiBkZWZpbmVkKF9fSElHSENfXykNCisgIGlmIChfbXdlbnYgIT0gMikNCisgIHsNCisgICAgZnByaW50ZiAoc3RkZXJyLCAiT25seSBQaGFybGFwIERPUyBleHRlbmRlciBzdXBwb3J0ZWQuXG4iKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorI2VuZGlmDQorDQorI2lmIChET1NYICYgUEhBUkxBUCkgJiYgZGVmaW5lZChfX1dBVENPTUNfXykNCisgIGlmIChfRXh0ZW5kZXIgIT0gMSkNCisgIHsNCisgICAgZnByaW50ZiAoc3RkZXJyLCAiT25seSBET1M0R1cgc3R5bGUgZXh0ZW5kZXJzIHN1cHBvcnRlZC5cbiIpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisjZW5kaWYNCisNCisgIGlmICghUGt0U2VhcmNoRHJpdmVyKCkpDQorICB7DQorICAgIFBVVFMgKCJQYWNrZXQgZHJpdmVyIG5vdCBmb3VuZC4iKTsNCisgICAgUGt0RnJlZU1lbSgpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisgIGlmICghUGt0R2V0RHJpdmVySW5mbygpKQ0KKyAgew0KKyAgICBQVVRTICgiRXJyb3IgZ2V0dGluZyBwa3QtZHJ2ciBpbmZvcm1hdGlvbi4iKTsNCisgICAgUGt0RnJlZU1lbSgpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgaWYgKFJlYWxDb3B5KChVTE9ORykmcnhPdXRPZnMsIChVTE9ORykmcGt0UnhFbmQsDQorICAgICAgICAgICAgICAgJnJlYWxCYXNlLCAmcHJvdEJhc2UsIChVU0hPUlQqKSZyZWFsU2VnKSkNCisgIHsNCisgICAgcnhPdXRPZnNGcCAgPSAoV09SRCBfZmFyICopIChwcm90QmFzZSArIChXT1JEKSAmcnhPdXRPZnMpOw0KKyAgICByeEluT2ZzRnAgICA9IChXT1JEIF9mYXIgKikgKHByb3RCYXNlICsgKFdPUkQpICZyeEluT2ZzKTsNCisgICAgKnJ4T3V0T2ZzRnAgPSBGSVJTVF9SWF9CVUY7DQorICAgICpyeEluT2ZzRnAgID0gRklSU1RfUlhfQlVGOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBQVVRTICgiQ2Fubm90IGFsbG9jYXRlIHJlYWwtbW9kZSBzdHViLiIpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisjZWxpZiAoRE9TWCAmIChESkdQUHxET1M0R1cpKQ0KKyAgaWYgKHNpemVvZihyZWFsX3N0dWJfYXJyYXkpID4gMHhGRkZGKQ0KKyAgew0KKyAgICBmcHJpbnRmIChzdGRlcnIsICJgcmVhbF9zdHViX2FycmF5W10nIHRvbyBiaWcuXG4iKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorI2lmIChET1NYICYgREpHUFApDQorICBybV9tZW0uc2l6ZSA9IChzaXplb2YocmVhbF9zdHViX2FycmF5KSArIDE1KSAvIDE2Ow0KKw0KKyAgaWYgKF9nbzMyX2RwbWlfYWxsb2NhdGVfZG9zX21lbW9yeSgmcm1fbWVtKSB8fCBybV9tZW0ucm1fb2Zmc2V0ICE9IDApDQorICB7DQorICAgIFBVVFMgKCJyZWFsLW1vZGUgaW5pdCBmYWlsZWQuIik7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyAgcmVhbEJhc2UgPSAocm1fbWVtLnJtX3NlZ21lbnQgPDwgNCk7DQorICBkb3NtZW1wdXQgKCZyZWFsX3N0dWJfYXJyYXksIHNpemVvZihyZWFsX3N0dWJfYXJyYXkpLCByZWFsQmFzZSk7DQorICBfZmFycG9rZWwgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzLCBGSVJTVF9SWF9CVUYpOw0KKyAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStyeEluT2ZzLCAgRklSU1RfUlhfQlVGKTsNCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIHJtX2Jhc2Vfc2VnID0gZHBtaV9yZWFsX21hbGxvYyAoc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSksICZybV9iYXNlX3NlbCk7DQorICBpZiAoIXJtX2Jhc2Vfc2VnKQ0KKyAgew0KKyAgICBQVVRTICgicmVhbC1tb2RlIGluaXQgZmFpbGVkLiIpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisgIHJlYWxCYXNlID0gKHJtX2Jhc2Vfc2VnIDw8IDQpOw0KKyAgbWVtY3B5ICgodm9pZCopcmVhbEJhc2UsICZyZWFsX3N0dWJfYXJyYXksIHNpemVvZihyZWFsX3N0dWJfYXJyYXkpKTsNCisgICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBGSVJTVF9SWF9CVUY7DQorICAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcykgID0gRklSU1RfUlhfQlVGOw0KKw0KKyNlbmRpZg0KKyAgew0KKyAgICBpbnQgcHVzaGYgPSBQa3RSZWNlaXZlcjsNCisNCisgICAgd2hpbGUgKHJlYWxfc3R1Yl9hcnJheVtwdXNoZisrXSAhPSAweDlDICYmICAgIC8qIHB1c2hmICovDQorICAgICAgICAgICByZWFsX3N0dWJfYXJyYXlbcHVzaGZdICAgIT0gMHhGQSkgICAgICAvKiBjbGkgICAqLw0KKyAgICB7DQorICAgICAgaWYgKCsrcGFyYV9za2lwID4gMTYpDQorICAgICAgew0KKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU29tZXRoaW5nIHdyb25nIHdpdGggYHBrdF9zdHViLmluYycuXG4iKTsNCisgICAgICAgIHBhcmFfc2tpcCA9IDA7DQorICAgICAgICBkdW1wX3BrdF9zdHViKCk7DQorICAgICAgICByZXR1cm4gKEZBTFNFKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCooV09SRCopKHJlYWxfc3R1Yl9hcnJheSArIG9mZnNldG9mKFBrdFJlYWxTdHViLF9kdW1teSkpICE9IDB4QjgwMCkNCisgICAgew0KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImByZWFsX3N0dWJfYXJyYXlbXScgaXMgbWlzYWxpZ25lZC5cbiIpOw0KKyAgICAgIHJldHVybiAoRkFMU0UpOw0KKyAgICB9DQorICB9DQorDQorICBpZiAocGNhcF9wa3RfZGVidWcgPiAyKQ0KKyAgICAgIGR1bXBfcGt0X3N0dWIoKTsNCisNCisjZWxzZQ0KKyAgcnhPdXRPZnMgPSBGSVJTVF9SWF9CVUY7DQorICByeEluT2ZzICA9IEZJUlNUX1JYX0JVRjsNCisjZW5kaWYNCisNCisgIGlmICghUGt0U2V0QWNjZXNzKCkpDQorICB7DQorICAgIFBVVFMgKCJFcnJvciBzZXR0aW5nIHBrdC1kcnZyIGFjY2Vzcy4iKTsNCisgICAgUGt0RnJlZU1lbSgpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisgIGlmICghUGt0R2V0QWRkcmVzcygmbXlBZGRyZXNzKSkNCisgIHsNCisgICAgUFVUUyAoIkVycm9yIGZldGNoaW5nIGFkYXB0ZXIgYWRkcmVzcy4iKTsNCisgICAgUGt0RnJlZU1lbSgpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisgIGlmICghUGt0U2V0UmVjZWl2ZXJNb2RlKG1vZGUpKQ0KKyAgew0KKyAgICBQVVRTICgiRXJyb3Igc2V0dGluZyByZWNlaXZlciBtb2RlLiIpOw0KKyAgICBQa3RGcmVlTWVtKCk7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKw0KKyAgaWYgKCFQa3RHZXRSZWNlaXZlck1vZGUoJnJ4TW9kZSkpDQorICB7DQorICAgIFBVVFMgKCJFcnJvciBnZXR0aW5nIHJlY2VpdmVyIG1vZGUuIik7DQorICAgIFBrdEZyZWVNZW0oKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorDQorICBpZiAod3JpdGVJbmZvKQ0KKyAgICAgcHJpbnRmICgiUGt0LWRyaXZlciBpbmZvcm1hdGlvbjpcbiINCisgICAgICAgICAgICAgIiAgVmVyc2lvbiAgOiAlZC4lZFxuIg0KKyAgICAgICAgICAgICAiICBOYW1lICAgICA6ICUuMTVzXG4iDQorICAgICAgICAgICAgICIgIENsYXNzICAgIDogJXUgKCVzKVxuIg0KKyAgICAgICAgICAgICAiICBUeXBlICAgICA6ICV1XG4iDQorICAgICAgICAgICAgICIgIE51bWJlciAgIDogJXVcbiINCisgICAgICAgICAgICAgIiAgRnVuY3MgICAgOiAldVxuIg0KKyAgICAgICAgICAgICAiICBJbnRyICAgICA6ICVYaFxuIg0KKyAgICAgICAgICAgICAiICBIYW5kbGUgICA6ICV1XG4iDQorICAgICAgICAgICAgICIgIEV4dGVuZGVkIDogJXNcbiINCisgICAgICAgICAgICAgIiAgSGktcGVyZiAgOiAlc1xuIg0KKyAgICAgICAgICAgICAiICBSWCBtb2RlICA6ICVzXG4iDQorICAgICAgICAgICAgICIgIEV0aC1hZGRyIDogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsDQorDQorICAgICAgICAgICAgIHBrdEluZm8ubWFqVmVyLCBwa3RJbmZvLm1pblZlciwgcGt0SW5mby5uYW1lLA0KKyAgICAgICAgICAgICBwa3RJbmZvLmNsYXNzLCAgUGt0R2V0Q2xhc3NOYW1lKHBrdEluZm8uY2xhc3MpLA0KKyAgICAgICAgICAgICBwa3RJbmZvLnR5cGUsICAgcGt0SW5mby5udW1iZXIsDQorICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MsICBwa3RJbmZvLmludHIsICAgcGt0SW5mby5oYW5kbGUsDQorICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MgPT0gMiB8fCBwa3RJbmZvLmZ1bmNzID09IDYgPyAiWWVzIiA6ICJObyIsDQorICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MgPT0gNSB8fCBwa3RJbmZvLmZ1bmNzID09IDYgPyAiWWVzIiA6ICJObyIsDQorICAgICAgICAgICAgIFBrdFJYbW9kZVN0cihyeE1vZGUpLA0KKyAgICAgICAgICAgICBteUFkZHJlc3NbMF0sIG15QWRkcmVzc1sxXSwgbXlBZGRyZXNzWzJdLA0KKyAgICAgICAgICAgICBteUFkZHJlc3NbM10sIG15QWRkcmVzc1s0XSwgbXlBZGRyZXNzWzVdKTsNCisNCisjaWYgZGVmaW5lZChERUJVRykgJiYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgaWYgKHdyaXRlSW5mbykNCisgIHsNCisgICAgRFdPUkQgICAgckFkciA9IHJlYWxCYXNlICsgKFdPUkQpJlBrdFJlY2VpdmVyOw0KKyAgICB1bnNpZ25lZCBzZWwsIG9mczsNCisNCisgICAgcHJpbnRmICgiXG5SZWNlaXZlciBhdCAgICUwNFg6JTA0WFxuIiwgUlBfU0VHKHJBZHIpLCAgICBSUF9PRkYockFkcikpOw0KKyAgICBwcmludGYgKCJSZWFsYmFzZSAgICA9ICUwNFg6JTA0WFxuIiwgICBSUF9TRUcocmVhbEJhc2UpLFJQX09GRihyZWFsQmFzZSkpOw0KKw0KKyAgICBzZWwgPSBfRlBfU0VHIChwcm90QmFzZSk7DQorICAgIG9mcyA9IF9GUF9PRkYgKHByb3RCYXNlKTsNCisgICAgcHJpbnRmICgiUHJvdGJhc2UgICAgPSAlMDRYOiUwOFhcbiIsIHNlbCxvZnMpOw0KKyAgICBwcmludGYgKCJSZWFsU2VnICAgICA9ICUwNFhcbiIsIHJlYWxTZWcpOw0KKw0KKyAgICBzZWwgPSBfRlBfU0VHIChyeE91dE9mc0ZwKTsNCisgICAgb2ZzID0gX0ZQX09GRiAocnhPdXRPZnNGcCk7DQorICAgIHByaW50ZiAoInJ4T3V0T2ZzRnAgID0gJTA0WDolMDhYXG4iLCBzZWwsb2ZzKTsNCisNCisgICAgc2VsID0gX0ZQX1NFRyAocnhJbk9mc0ZwKTsNCisgICAgb2ZzID0gX0ZQX09GRiAocnhJbk9mc0ZwKTsNCisgICAgcHJpbnRmICgicnhJbk9mc0ZwICAgPSAlMDRYOiUwOFhcbiIsIHNlbCxvZnMpOw0KKw0KKyAgICBwcmludGYgKCJSZWFkeTogKnJ4T3V0T2ZzRnAgPSAlMDRYICpyeEluT2ZzRnAgPSAlMDRYXG4iLA0KKyAgICAgICAgICAgICpyeE91dE9mc0ZwLCAqcnhJbk9mc0ZwKTsNCisNCisgICAgUGt0UXVldWVCdXN5IChUUlVFKTsNCisgICAgcHJpbnRmICgiQnVzeTogICpyeE91dE9mc0ZwID0gJTA0WCAqcnhJbk9mc0ZwID0gJTA0WFxuIiwNCisgICAgICAgICAgICAqcnhPdXRPZnNGcCwgKnJ4SW5PZnNGcCk7DQorICB9DQorI2VuZGlmDQorDQorICBtZW1zZXQgKCZwa3RTdGF0LCAwLCBzaXplb2YocGt0U3RhdCkpOyAgLyogY2xlYXIgc3RhdGlzdGljcyAqLw0KKyAgUGt0UXVldWVCdXN5IChUUlVFKTsNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKw0KKy8qDQorICogRFBNSSBmdW5jdGlvbnMgb25seSBmb3IgV2F0Y29tICsgRE9TNEdXIGV4dGVuZGVycw0KKyAqLw0KKyNpZiAoRE9TWCAmIERPUzRHVykNCitMT0NBTCBEV09SRCBkcG1pX2dldF9yZWFsX3ZlY3RvciAoaW50IGludHIpDQorew0KKyAgdW5pb24gUkVHUyByOw0KKw0KKyAgci54LmVheCA9IDB4MjAwOw0KKyAgci54LmVieCA9IChEV09SRCkgaW50cjsNCisgIGludDM4NiAoMHgzMSwgJnIsICZyKTsNCisgIHJldHVybiAoKHIudy5jeCA8PCA0KSArIHIudy5keCk7DQorfQ0KKw0KK0xPQ0FMIFdPUkQgZHBtaV9yZWFsX21hbGxvYyAoaW50IHNpemUsIFdPUkQgKnNlbGVjdG9yKQ0KK3sNCisgIHVuaW9uIFJFR1MgcjsNCisNCisgIHIueC5lYXggPSAweDAxMDA7ICAgICAgICAgICAgIC8qIERQTUkgYWxsb2NhdGUgRE9TIG1lbW9yeSAqLw0KKyAgci54LmVieCA9IChzaXplICsgMTUpIC8gMTY7ICAgLyogTnVtYmVyIG9mIHBhcmFncmFwaHMgcmVxdWVzdGVkICovDQorICBpbnQzODYgKDB4MzEsICZyLCAmcik7DQorICBpZiAoci53LmNmbGFnICYgMSkNCisgICAgIHJldHVybiAoMCk7DQorDQorICAqc2VsZWN0b3IgPSByLncuZHg7DQorICByZXR1cm4gKHIudy5heCk7ICAgICAgICAgICAgICAvKiBSZXR1cm4gc2VnbWVudCBhZGRyZXNzICovDQorfQ0KKw0KK0xPQ0FMIHZvaWQgZHBtaV9yZWFsX2ZyZWUgKFdPUkQgc2VsZWN0b3IpDQorew0KKyAgdW5pb24gUkVHUyByOw0KKw0KKyAgci54LmVheCA9IDB4MTAxOyAgICAgICAgICAgICAgLyogRFBNSSBmcmVlIERPUyBtZW1vcnkgKi8NCisgIHIueC5lYnggPSBzZWxlY3RvcjsgICAgICAgICAgIC8qIFNlbGVjdG9yIHRvIGZyZWUgKi8NCisgIGludDM4NiAoMHgzMSwgJnIsICZyKTsNCit9DQorI2VuZGlmDQorDQorDQorI2lmIGRlZmluZWQoRE9TWCkgJiYgKERPU1ggJiBQSEFSTEFQKQ0KKy8qDQorICogRGVzY3JpcHRpb246DQorICogICAgIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgY29udmVudGlvbmFsIG1lbW9yeSBmb3IgdGhlIHNwZWNpZmllZCBibG9jaw0KKyAqICAgICBvZiBjb2RlICh3aGljaCBtdXN0IGJlIHdpdGhpbiB0aGUgZmlyc3QgNjRLIG9mIHRoZSBwcm90ZWN0ZWQgbW9kZQ0KKyAqICAgICBwcm9ncmFtIHNlZ21lbnQpIGFuZCBjb3BpZXMgdGhlIGNvZGUgdG8gaXQuDQorICoNCisgKiAgICAgVGhlIGNhbGxlciBzaG91bGQgZnJlZSB1cCB0aGUgY29udmVudGlvbmFsIG1lbW9yeSBibG9jayB3aGVuIGl0DQorICogICAgIGlzIGRvbmUgd2l0aCB0aGUgY29udmVudGlvbmFsIG1lbW9yeS4NCisgKg0KKyAqICAgICBOT1RFIFRISVMgUk9VVElORSBSRVFVSVJFUyAzODZ8RE9TLUVYVEVOREVSIDMuMCBPUiBMQVRFUi4NCisgKg0KKyAqIENhbGxpbmcgYXJndW1lbnRzOg0KKyAqICAgICBzdGFydF9vZmZzICAgICAgc3RhcnQgb2YgcmVhbCBtb2RlIGNvZGUgaW4gcHJvZ3JhbSBzZWdtZW50DQorICogICAgIGVuZF9vZmZzICAgICAgICAxIGJ5dGUgcGFzdCBlbmQgb2YgcmVhbCBtb2RlIGNvZGUgaW4gcHJvZ3JhbSBzZWdtZW50DQorICogICAgIHJlYWxfYmFzZXAgICAgICByZXR1cm5lZDsgIHJlYWwgbW9kZSBwdHIgdG8gdXNlIGFzIGEgYmFzZSBmb3IgdGhlDQorICogICAgICAgICAgICAgICAgICAgICAgICByZWFsIG1vZGUgY29kZSAoZWcsIHRvIGdldCB0aGUgcmVhbCBtb2RlIEZBUg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgYWRkciBvZiBhIGZ1bmN0aW9uIGZvbygpLCB0YWtlDQorICogICAgICAgICAgICAgICAgICAgICAgICByZWFsX2Jhc2VwICsgKFVMT05HKSBmb28pLg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwb2ludGVyIGlzIGNvbnN0cnVjdGVkIHN1Y2ggdGhhdA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyB3aXRoaW4gdGhlIHJlYWwgbW9kZSBzZWdtZW50IGFyZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIGxpbmstdGltZSBvZmZzZXRzIGluIHRoZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG1vZGUgcHJvZ3JhbSBzZWdtZW50DQorICogICAgIHByb3RfYmFzZXAgICAgICByZXR1cm5lZDsgIHByb3QgbW9kZSBwdHIgdG8gdXNlIGFzIGEgYmFzZSBmb3IgZ2V0dGluZw0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNvbnZlbnRpb25hbCBtZW1vcnksIGFsc28gY29uc3RydWN0ZWQNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgYWRkaW5nIHRoZSBwcm90IG1vZGUgb2Zmc2V0IG9mIGENCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIHRvIHRoZSBiYXNlIGdldHMgeW91IGENCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHB0ciB0byB0aGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW4gdGhlDQorICogICAgICAgICAgICAgICAgICAgICAgICBjb252ZW50aW9uYWwgbWVtb3J5IGJsb2NrLg0KKyAqICAgICBybWVtX2FkcnAgICAgICAgcmV0dXJuZWQ7ICByZWFsIG1vZGUgcGFyYSBhZGRyIG9mIGFsbG9jYXRlZA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29udmVudGlvbmFsIG1lbW9yeSBibG9jaywgdG8gYmUgdXNlZCB0byBmcmVlDQorICogICAgICAgICAgICAgICAgICAgICAgICB1cCB0aGUgY29udmVudGlvbmFsIG1lbW9yeSB3aGVuIGRvbmUuICBETyBOT1QNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFVTRSBUSElTIFRPIENPTlNUUlVDVCBBIFJFQUwgTU9ERSBQVFIsIFVTRQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgUkVBTF9CQVNFUCBJTlNURUFEIFNPIFRIQVQgT0ZGU0VUUyBXT1JLIE9VVA0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVDVExZLg0KKyAqDQorICogUmV0dXJuZWQgdmFsdWVzOg0KKyAqICAgICAwICAgICAgaWYgZXJyb3INCisgKiAgICAgMSAgICAgIGlmIHN1Y2Nlc3MNCisgKi8NCitpbnQgUmVhbENvcHkgKFVMT05HICAgIHN0YXJ0X29mZnMsDQorICAgICAgICAgICAgICBVTE9ORyAgICBlbmRfb2ZmcywNCisgICAgICAgICAgICAgIFJFQUxQVFIgKnJlYWxfYmFzZXAsDQorICAgICAgICAgICAgICBGQVJQVFIgICpwcm90X2Jhc2VwLA0KKyAgICAgICAgICAgICAgVVNIT1JUICAqcm1lbV9hZHJwKQ0KK3sNCisgIFVMT05HICAgcm1fYmFzZTsgICAgLyogYmFzZSByZWFsIG1vZGUgcGFyYSBhZGRyIGZvciBhY2Nlc3NpbmcgKi8NCisgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIGNvbnZlbnRpb25hbCBtZW1vcnkgICAgICAgICAgKi8NCisgIFVDSEFSICAqc291cmNlOyAgICAgLyogc291cmNlIHBvaW50ZXIgZm9yIGNvcHkgICAgICAgICAgICAgICAgKi8NCisgIEZBUlBUUiAgZGVzdGluOyAgICAgLyogZGVzdGluYXRpb24gcG9pbnRlciBmb3IgY29weSAgICAgICAgICAgKi8NCisgIFVMT05HICAgbGVuOyAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgICAgICAgICAgICAgICAgKi8NCisgIFVMT05HICAgdGVtcDsNCisgIFVTSE9SVCAgc3RlbXA7DQorDQorICAvKiBGaXJzdCBjaGVjayBmb3IgdmFsaWQgaW5wdXRzDQorICAgKi8NCisgIGlmIChzdGFydF9vZmZzID49IGVuZF9vZmZzIHx8IGVuZF9vZmZzID4gMHgxMDAwMCkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgLyogUm91bmQgc3RhcnRfb2ZmcyBkb3duIHRvIGEgcGFyYWdyYXBoICgxNi1ieXRlKSBib3VuZGFyeSBzbyB3ZSBjYW4gc2V0IHVwDQorICAgKiB0aGUgcmVhbCBtb2RlIHBvaW50ZXIgZWFzaWx5LiBSb3VuZCB1cCBlbmRfb2ZmcyB0byBtYWtlIHN1cmUgd2UgYWxsb2NhdGUNCisgICAqIGVub3VnaCBwYXJhZ3JhcGhzDQorICAgKi8NCisgIHN0YXJ0X29mZnMgJj0gfjE1Ow0KKyAgZW5kX29mZnMgPSAoMTUgKyAoZW5kX29mZnMgPDwgNCkpID4+IDQ7DQorDQorICAvKiBBbGxvY2F0ZSB0aGUgY29udmVudGlvbmFsIG1lbW9yeSBmb3Igb3VyIHJlYWwgbW9kZSBjb2RlLiAgUmVtZW1iZXIgdG8NCisgICAqIHJvdW5kIGJ5dGUgY291bnQgVVAgdG8gMTYtYnl0ZSBwYXJhZ3JhcGggc2l6ZS4gIFdlIGFsbG9jIGl0DQorICAgKiBhYm92ZSB0aGUgRE9TIGRhdGEgYnVmZmVyIHNvIGJvdGggdGhlIERPUyBkYXRhIGJ1ZmZlciBhbmQgdGhlIGFwcGwNCisgICAqIGNvbnZlbnRpb25hbCBtZW0gYmxvY2sgY2FuIHN0aWxsIGJlIHJlc2l6ZWQuDQorICAgKg0KKyAgICogRmlyc3QganVzdCB0cnkgdG8gYWxsb2MgaXQ7ICBpZiB3ZSBjYW4ndCBnZXQgaXQsIHNocmluayB0aGUgYXBwbCBtZW0NCisgICAqIGJsb2NrIGRvd24gdG8gdGhlIG1pbmltdW0sIHRyeSB0byBhbGxvYyB0aGUgbWVtb3J5IGFnYWluLCB0aGVuIGdyb3cgdGhlDQorICAgKiBhcHBsIG1lbSBibG9jayBiYWNrIHRvIHRoZSBtYXhpbXVtLiAgKERvbid0IHRyeSB0byBzaHJpbmsgdGhlIERPUyBkYXRhDQorICAgKiBidWZmZXIgdG8gZnJlZSBjb252ZW50aW9uYWwgbWVtb3J5OyAgaXQgd291bGRuJ3QgYmUgZ29vZCBmb3IgdGhpcyByb3V0aW5lDQorICAgKiB0byBoYXZlIHRoZSBwb3NzaWJsZSBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgZmlsZSBJL08gcnVuIHNsb3dlci4pDQorICAgKi8NCisgIGxlbiA9ICgoZW5kX29mZnMgLSBzdGFydF9vZmZzKSArIDE1KSA+PiA0Ow0KKyAgaWYgKF9keF9yZWFsX2Fib3ZlKGxlbiwgcm1lbV9hZHJwLCAmc3RlbXApICE9IF9ET1NFX05PTkUpDQorICB7DQorICAgIGlmIChfZHhfY21lbV91c2FnZSgwLCAwLCAmdGVtcCwgJnRlbXApICE9IF9ET1NFX05PTkUpDQorICAgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgICBpZiAoX2R4X3JlYWxfYWJvdmUobGVuLCBybWVtX2FkcnAsICZzdGVtcCkgIT0gX0RPU0VfTk9ORSkNCisgICAgICAgKnJtZW1fYWRycCA9IDA7DQorDQorICAgIGlmIChfZHhfY21lbV91c2FnZSgwLCAxLCAmdGVtcCwgJnRlbXApICE9IF9ET1NFX05PTkUpDQorICAgIHsNCisgICAgICBpZiAoKnJtZW1fYWRycCAhPSAwKQ0KKyAgICAgICAgIF9keF9yZWFsX2ZyZWUgKCpybWVtX2FkcnApOw0KKyAgICAgIHJldHVybiAoRkFMU0UpOw0KKyAgICB9DQorDQorICAgIGlmICgqcm1lbV9hZHJwID09IDApDQorICAgICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKw0KKyAgLyogQ29uc3RydWN0IHJlYWwgbW9kZSAmIHByb3RlY3RlZCBtb2RlIHBvaW50ZXJzIHRvIGFjY2VzcyB0aGUgYWxsb2NhdGVkDQorICAgKiBtZW1vcnkuICBOb3RlIHdlIGtub3cgc3RhcnRfb2ZmcyBpcyBhbGlnbmVkIG9uIGEgcGFyYWdyYXBoICgxNi1ieXRlKQ0KKyAgICogYm91bmRhcnksIGJlY2F1c2Ugd2Ugcm91bmRlZCBpdCBkb3duLg0KKyAgICoNCisgICAqIFdlIG1ha2UgdGhlIG9mZnNldHMgY29tZSBvdXQgcmlnaHRzIGJ5IGJhY2tpbmcgb2ZmIHRoZSByZWFsIG1vZGUgc2VsZWN0b3INCisgICAqIGJ5IHN0YXJ0X29mZnMuDQorICAgKi8NCisgIHJtX2Jhc2UgPSAoKFVMT05HKSAqcm1lbV9hZHJwKSAtIChzdGFydF9vZmZzID4+IDQpOw0KKyAgUlBfU0VUICgqcmVhbF9iYXNlcCwgMCwgcm1fYmFzZSk7DQorICBGUF9TRVQgKCpwcm90X2Jhc2VwLCBybV9iYXNlIDw8IDQsIFNTX0RPU01FTSk7DQorDQorICAvKiBDb3B5IHRoZSByZWFsIG1vZGUgY29kZS9kYXRhIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5DQorICAgKi8NCisgIHNvdXJjZSA9IChVQ0hBUiAqKSBzdGFydF9vZmZzOw0KKyAgZGVzdGluID0gKnByb3RfYmFzZXA7DQorICBGUF9TRVQgKGRlc3RpbiwgRlBfT0ZGKCpwcm90X2Jhc2VwKSArIHN0YXJ0X29mZnMsIEZQX1NFTCgqcHJvdF9iYXNlcCkpOw0KKyAgbGVuID0gZW5kX29mZnMgLSBzdGFydF9vZmZzOw0KKyAgV3JpdGVGYXJNZW0gKGRlc3Rpbiwgc291cmNlLCBsZW4pOw0KKw0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorI2VuZGlmIC8qIERPU1ggJiYgKERPU1ggJiBQSEFSTEFQKSAqLw0KZGlmZiAtLWdpdCBhL21zZG9zL3BrdGRydnIuaCBiL21zZG9zL3BrdGRydnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODg5OGFlCi0tLSAvZGV2L251bGwKKysrIGIvbXNkb3MvcGt0ZHJ2ci5oCkBAIC0wLDAgKzEsMTUzIEBACisjaWZuZGVmIF9fUEtURFJWUl9IDQorI2RlZmluZSBfX1BLVERSVlJfSA0KKw0KKyNkZWZpbmUgUFVCTElDDQorI2RlZmluZSBMT0NBTCAgICAgICAgc3RhdGljDQorDQorI2RlZmluZSBSWF9CVUZfU0laRSAgRVRIX01UVSAgIC8qIGJ1ZmZlciBzaXplIHZhcmlhYmxlcy4gTkIgISEgKi8NCisjZGVmaW5lIFRYX0JVRl9TSVpFICBFVEhfTVRVICAgLyogbXVzdCBiZSBzYW1lIGFzIGluIHBrdF9yeCouKiAqLw0KKw0KKyNpZmRlZiBfX0hJR0hDX18NCisjcHJhZ21hIE9mZihBbGlnbl9tZW1iZXJzKQ0KKyNlbHNlDQorI3ByYWdtYSBwYWNrKDEpDQorI2VuZGlmDQorDQordHlwZWRlZiBlbnVtICB7ICAgICAgICAgICAgICAgIC8qIFBhY2tldC1kcml2ZXIgY2xhc3NlcyAqLw0KKyAgICAgICAgUERfRVRIRVIgICAgICA9IDEsDQorICAgICAgICBQRF9QUk9ORVQxMCAgID0gMiwNCisgICAgICAgIFBEX0lFRUU4MDI1ICAgPSAzLA0KKyAgICAgICAgUERfT01OSU5FVCAgICA9IDQsDQorICAgICAgICBQRF9BUFBMRVRBTEsgID0gNSwNCisgICAgICAgIFBEX1NMSVAgICAgICAgPSA2LA0KKyAgICAgICAgUERfU1RBUlRMQU4gICA9IDcsDQorICAgICAgICBQRF9BUkNORVQgICAgID0gOCwNCisgICAgICAgIFBEX0FYMjUgICAgICAgPSA5LA0KKyAgICAgICAgUERfS0lTUyAgICAgICA9IDEwLA0KKyAgICAgICAgUERfSUVFRTgwMjNfMiA9IDExLA0KKyAgICAgICAgUERfRkRESTgwMjIgICA9IDEyLA0KKyAgICAgICAgUERfWDI1ICAgICAgICA9IDEzLA0KKyAgICAgICAgUERfTEFOc3RhciAgICA9IDE0LA0KKyAgICAgICAgUERfUFBQICAgICAgICA9IDE4DQorICAgICAgfSBQS1RfQ0xBU1M7DQorDQordHlwZWRlZiBlbnVtICB7ICAgICAgICAgICAgIC8qIFBhY2tldC1kcml2ZXIgcmVjZWl2ZSBtb2RlcyAgICAqLw0KKyAgICAgICAgUERSWF9PRkYgICAgPSAxLCAgICAvKiB0dXJuIG9mZiByZWNlaXZlciAgICAgICAgICAgICAgKi8NCisgICAgICAgIFBEUlhfRElSRUNULCAgICAgICAgLyogcmVjZWl2ZSBvbmx5IHRvIHRoaXMgaW50ZXJmYWNlICovDQorICAgICAgICBQRFJYX0JST0FEQ0FTVCwgICAgIC8qIERJUkVDVCArIGJyb2FkY2FzdCBwYWNrZXRzICAgICAqLw0KKyAgICAgICAgUERSWF9NVUxUSUNBU1QxLCAgICAvKiBCUk9BRENBU1QgKyBsaW1pdGVkIG11bHRpY2FzdCAgKi8NCisgICAgICAgIFBEUlhfTVVMVElDQVNUMiwgICAgLyogQlJPQURDQVNUICsgYWxsIG11bHRpY2FzdCAgICAgICovDQorICAgICAgICBQRFJYX0FMTF9QQUNLRVRTLCAgIC8qIHJlY2VpdmUgYWxsIHBhY2tldHMgb24gbmV0d29yayAqLw0KKyAgICAgIH0gUEtUX1JYX01PREU7DQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKyAgICAgICAgY2hhciB0eXBlWzhdOw0KKyAgICAgICAgY2hhciBsZW47DQorICAgICAgfSBQS1RfRlJBTUU7DQorDQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKyAgICAgICAgQllURSAgY2xhc3M7ICAgICAgICAvKiA9IDEgZm9yIERFQy9JbnRlcmwvWGVyb3ggRXRoZXJuZXQgKi8NCisgICAgICAgIEJZVEUgIG51bWJlcjsgICAgICAgLyogPSAwIGZvciBzaW5nbGUgTEFOIGFkYXB0ZXIgICAgICAgICovDQorICAgICAgICBXT1JEICB0eXBlOyAgICAgICAgIC8qID0gMTMgZm9yIDNDNTIzICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgQllURSAgZnVuY3M7ICAgICAgICAvKiBCYXNpYy9FeHRlbmRlZC9IaVBlcmYgZnVuY3Rpb25zICAgKi8NCisgICAgICAgIFdPUkQgIGludHI7ICAgICAgICAgLyogdXNlciBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlciAgICAgICovDQorICAgICAgICBXT1JEICBoYW5kbGU7ICAgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAgICAqLw0KKyAgICAgICAgQllURSAgbmFtZSBbMTVdOyAgICAvKiBOYW1lIG9mIGFkYXB0ZXIgaW50ZXJmYWNlLGllLjNDNTIzKi8NCisgICAgICAgIEJPT0wgIHF1aWV0OyAgICAgICAgLyogKGRvbid0KSBwcmludCBlcnJvcnMgdG8gc3Rkb3V0ICAgICovDQorICAgICAgICBjb25zdCBjaGFyICplcnJvcjsgIC8qIGFkZHJlc3Mgb2YgZXJyb3Igc3RyaW5nICAgICAgICAgICAqLw0KKyAgICAgICAgQllURSAgbWFqVmVyOyAgICAgICAvKiBNYWpvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gdmVyLiAgKi8NCisgICAgICAgIEJZVEUgIG1pblZlcjsgICAgICAgLyogTWlub3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIHZlci4gICovDQorICAgICAgICBCWVRFICBkdW1teUxlbjsgICAgIC8qIGxlbmd0aCBvZiBmb2xsb3dpbmcgZGF0YSAgICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgTUFDbGVuZ3RoOyAgICAvKiBIaVBlcmZvcm1hbmNlIGRhdGEsIE4vQSAgICAgICAgICAgKi8NCisgICAgICAgIFdPUkQgIE1UVTsgICAgICAgICAgLyogSGlQZXJmb3JtYW5jZSBkYXRhLCBOL0EgICAgICAgICAgICovDQorICAgICAgICBXT1JEICBtdWx0aWNhc3Q7ICAgIC8qIEhpUGVyZm9ybWFuY2UgZGF0YSwgTi9BICAgICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgcmN2ckJ1ZmZlcnM7ICAvKiB2YWxpZCBmb3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgIFdPUkQgIFVNVGJ1ZnM7ICAgICAgLyogICBIaWdoIFBlcmZvcm1hbmNlIGRyaXZlcnMgb25seSAgICovDQorICAgICAgICBXT1JEICBwb3N0RU9JaW50cjsgIC8qICAgICAgICAgICAgICAgICAgVXNhZ2UgPz8gICAgICAgICAqLw0KKyAgICAgIH0gUEtUX0lORk87DQorDQorI2RlZmluZSBQS1RfUEFSQU1fU0laRSAgMTQgICAgLyogbWVtYmVycyBtYWpWZXIgLSBwb3N0RU9JaW50ciAqLw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgICAgIERXT1JEIGluUGFja2V0czsgICAgICAgICAgLyogIyBvZiBwYWNrZXRzIHJlY2VpdmVkICAgICovDQorICAgICAgICBEV09SRCBvdXRQYWNrZXRzOyAgICAgICAgIC8qICMgb2YgcGFja2V0cyB0cmFuc21pdHRlZCAqLw0KKyAgICAgICAgRFdPUkQgaW5CeXRlczsgICAgICAgICAgICAvKiAjIG9mIGJ5dGVzIHJlY2VpdmVkICAgICAgKi8NCisgICAgICAgIERXT1JEIG91dEJ5dGVzOyAgICAgICAgICAgLyogIyBvZiBieXRlcyB0cmFuc21pdHRlZCAgICovDQorICAgICAgICBEV09SRCBpbkVycm9yczsgICAgICAgICAgIC8qICMgb2YgcmVjZXB0aW9uIGVycm9ycyAgICAqLw0KKyAgICAgICAgRFdPUkQgb3V0RXJyb3JzOyAgICAgICAgICAvKiAjIG9mIHRyYW5zbWlzc2lvbiBlcnJvcnMgKi8NCisgICAgICAgIERXT1JEIGxvc3Q7ICAgICAgICAgICAgICAgLyogIyBvZiBwYWNrZXRzIGxvc3QgKFJYKSAgICovDQorICAgICAgfSBQS1RfU1RBVDsNCisgICAgICAgICAgICAgICAgICAgDQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKyAgICAgICAgRVRIRVIgZGVzdGluOw0KKyAgICAgICAgRVRIRVIgc291cmNlOw0KKyAgICAgICAgV09SRCAgcHJvdG87DQorICAgICAgICBCWVRFICBkYXRhIFtUWF9CVUZfU0laRV07DQorICAgICAgfSBUWF9FTEVNRU5UOw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgICAgIFdPUkQgIGZpcnN0Q291bnQ7ICAgICAgICAgLyogIyBvZiBieXRlcyBvbiAxc3QgICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgc2Vjb25kQ291bnQ7ICAgICAgICAvKiBhbmQgMm5kIHVwY2FsbCAgICAgICAgICAgICovDQorICAgICAgICBXT1JEICBoYW5kbGU7ICAgICAgICAgICAgIC8qIGluc3RhbmNlIHRoYXQgdXBjYWxsZWQgICAgKi8NCisgICAgICAgIEVUSEVSIGRlc3RpbjsgICAgICAgICAgICAgLyogRS1uZXQgZGVzdGluYXRpb24gYWRkcmVzcyAqLw0KKyAgICAgICAgRVRIRVIgc291cmNlOyAgICAgICAgICAgICAvKiBFLW5ldCBzb3VyY2UgYWRkcmVzcyAgICAgICovDQorICAgICAgICBXT1JEICBwcm90bzsgICAgICAgICAgICAgIC8qIHByb3RvY29sIG51bWJlciAgICAgICAgICAgKi8NCisgICAgICAgIEJZVEUgIGRhdGEgW1JYX0JVRl9TSVpFXTsNCisgICAgICB9IFJYX0VMRU1FTlQ7DQorDQorDQorI2lmZGVmIF9fSElHSENfXw0KKyNwcmFnbWEgcG9wKEFsaWduX21lbWJlcnMpDQorI2Vsc2UNCisjcHJhZ21hIHBhY2soKQ0KKyNlbmRpZg0KKw0KKw0KKy8qDQorICogUHJvdG90eXBlcyBmb3IgcHVibGljcw0KKyAqLw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KK2V4dGVybiBQS1RfU1RBVCAgICBwa3RTdGF0OyAgICAgLyogc3RhdGlzdGljcyBmb3IgcGFja2V0cyAqLw0KK2V4dGVybiBQS1RfSU5GTyAgICBwa3RJbmZvOyAgICAgLyogcGFja2V0LWRyaXZlciBpbmZvcm1hdGlvbiAqLw0KKw0KK2V4dGVybiBQS1RfUlhfTU9ERSByZWNlaXZlTW9kZTsNCitleHRlcm4gRVRIRVIgICAgICAgbXlBZGRyZXNzLCBldGhCcm9hZGNhc3Q7DQorDQorZXh0ZXJuIEJPT0wgIFBrdEluaXREcml2ZXIgKFBLVF9SWF9NT0RFIG1vZGUpOw0KK2V4dGVybiBCT09MICBQa3RFeGl0RHJpdmVyICh2b2lkKTsNCisNCitleHRlcm4gY29uc3QgY2hhciAqUGt0R2V0RXJyb3JTdHIgICAgKGludCBlcnJOdW0pOw0KK2V4dGVybiBjb25zdCBjaGFyICpQa3RHZXRDbGFzc05hbWUgICAoV09SRCBjbGFzcyk7DQorZXh0ZXJuIGNvbnN0IGNoYXIgKlBrdFJYbW9kZVN0ciAgICAgIChQS1RfUlhfTU9ERSBtb2RlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0U2VhcmNoRHJpdmVyICAgKHZvaWQpOw0KK2V4dGVybiBpbnQgICAgICAgICBQa3RSZWNlaXZlICAgICAgICAoQllURSAqYnVmLCBpbnQgbWF4KTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0VHJhbnNtaXQgICAgICAgKGNvbnN0IHZvaWQgKmV0aCwgaW50IGxlbik7DQorZXh0ZXJuIERXT1JEICAgICAgIFBrdFJ4RHJvcHBlZCAgICAgICh2b2lkKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0UmVsZWFzZUhhbmRsZSAgKFdPUkQgaGFuZGxlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0VGVybWluSGFuZGxlICAgKFdPUkQgaGFuZGxlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0UmVzZXRJbnRlcmZhY2UgKFdPUkQgaGFuZGxlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0U2V0UmVjZWl2ZXJNb2RlKFBLVF9SWF9NT0RFICBtb2RlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0UmVjZWl2ZXJNb2RlKFBLVF9SWF9NT0RFICptb2RlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0U3RhdGlzdGljcyAgKFdPUkQgaGFuZGxlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0U2Vzc1N0YXRpc3RpY3MgKFdPUkQgaGFuZGxlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0UmVzZXRTdGF0aXN0aWNzKFdPUkQgaGFuZGxlKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0QWRkcmVzcyAgICAgKEVUSEVSICphZGRyKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0U2V0QWRkcmVzcyAgICAgKGNvbnN0IEVUSEVSICphZGRyKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0RHJpdmVySW5mbyAgKHZvaWQpOw0KK2V4dGVybiBCT09MICAgICAgICBQa3RHZXREcml2ZXJQYXJhbSAodm9pZCk7DQorZXh0ZXJuIHZvaWQgICAgICAgIFBrdFF1ZXVlQnVzeSAgICAgIChCT09MIGJ1c3kpOw0KK2V4dGVybiBXT1JEICAgICAgICBQa3RCdWZmZXJzVXNlZCAgICAodm9pZCk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiBfX1BLVERSVlJfSCAqLw0KKw0KZGlmZiAtLWdpdCBhL21zZG9zL3JlYWRtZS5kb3MgYi9tc2Rvcy9yZWFkbWUuZG9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZWYxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tc2Rvcy9yZWFkbWUuZG9zCkBAIC0wLDAgKzEsMTYyIEBACitAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL21zZG9zL3JlYWRtZS5kb3MsdiAxLjMgMjAwNC0xMi0xOSAxOTo0NzowMSBndXkgRXhwICQgKExCTCkKKworbGlicGNhcCBmb3IgRE9TCistLS0tLS0tLS0tLS0tLS0KKworVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgbm90ZXMgb24gYnVpbGRpbmcgYW5kIHVzaW5nIGxpYnBjYXAgZm9yIE1TLURPUy4KK0xvb2sgaW4gYFJFQURNRScgYW5kIGBwY2FwLm1hbicgZm9yIHVzYWdlIGFuZCBkZXRhaWxzLiBUaGVzZSB0YXJnZXRzIGFyZQorc3VwcG9ydGVkOgorCisgLSBCb3JsYW5kIEMgNC4wKyBzbWFsbCBvciBsYXJnZSBtb2RlbC4KKyAtIE1ldGF3YXJlIEhpZ2hDIDMuMSsgd2l0aCBQaGFyTGFwIERPUy1leHRlbmRlcgorIC0gR05VIEMgMi43KyB3aXRoIGRqZ3BwIDIuMDErIERPUyBleHRlbmRlcgorIC0gV2F0Y29tIEMgMTEueCB3aXRoIERPUzRHVyBleHRlbmRlcgorCitOb3RlOiB0aGUgZmlsZXMgaW4gdGhlIGxpYnBjYXAuemlwIGNvbnRhaW5zIHNob3J0IHRydWNhdGVkIGZpbGVuYW1lcy4KKyAgU28gZm9yIGRqZ3BwIHRvIHdvcmsgd2l0aCB0aGVzZSwgZGlzYWJsZSB0aGUgdXNlIG9mIGxvbmcgZmlsZSBuYW1lcyBieQorICBzZXR0aW5nICJMRk49biIgaW4gdGhlIGVudmlyb25tZW50LgorCitGaWxlcyBzcGVjaWZpYyB0byBET1MgYXJlIHBjYXAtZG9zLltjaF0gYW5kIHRoZSBhc3NlbWJseSBhbmQgQyBmaWxlcyBpbgordGhlIE1TRE9TIHN1Yi1kaXJlY3RvcnkuIFJlbWVtYmVyIHRvIGJ1aWx0IGxpcGNhcCBsaWJyYXJpZXMgZnJvbSB0aGUgdG9wCitpbnN0YWxsIGRpcmVjdG9yeS4gQW5kIG5vdCBmcm9tIHRoZSBNU0RPUyBzdWItZGlyZWN0b3J5LgorCitOb3RlIGZvciBkamdwcCB1c2VyczoKKyAgSWYgeW91IGdvdCB0aGUgbGlicGNhcCBmcm9tIHRoZSBvZmZpY2lhbCBzaXRlIHd3dy50Y3BkdW1wLCB0aGVuIHRoYXQKKyAgZGlzdHJpYnV0aW9uIGRvZXMgTk9UIGNvbnRhaW4gYW55IHNvdXJjZXMgZm9yIGJ1aWxkaW5nIDMyLWJpdCBkcml2ZXJzLgorICBJbnN0ZWFkIGdldCB0aGUgZnVsbCB2ZXJzaW9uIGF0CisgICAgIGh0dHA6Ly93d3cuYmduZXR0Lm5vL35naXZhL3BjYXAvbGlicGNhcC56aXAKKworICBhbmQgc2V0ICJVU0VfMzJCSVRfRFJJVkVSUyA9IDEiIGluIG1zZG9zXGNvbW1vbi5kai4KKworCisKK1JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKK0RPUy1saWJwY2FwIGN1cnJlbnRseSBvbmx5IHdvcmtzIHJlbGlhYmx5IHdpdGggYSByZWFsLW1vZGUgRXRoZXJuZXQgcGFja2V0LQorZHJpdmVyLiBUaGlzIGRyaXZlciBtdXN0IGJlIGluc3RhbGxlZCBwcmlvciB0byB1c2luZyBhbnkgcHJvZ3JhbSAoZS5nLgordGNwZHVtcCkgY29tcGlsZWQgd2l0aCBsaWJwY2FwLiBXb3JrIGlzIHVuZGVyd2F5IHRvIGltcGxlbWVudCBwcm90ZWN0ZWQtCittb2RlIGRyaXZlcnMgZm9yIDMyLWJpdCB0YXJnZXRzIChkamdwcCBvbmx5KS4gVGhlIDNDb20gM2M1MDkgZHJpdmVyIGlzCit3b3JraW5nIGFsbW9zdCBwZXJmZWN0bHkuIER1ZSB0byBsYWNrIG9mIExBTi1jYXJkcywgSSd2ZSBub3QgaGFkIHRoZQorb3Bwb3J0dW5pdHkgdG8gdGVzdCBvdGhlciBkcml2ZXJzLiBUaGVzZSAzMi1iaXQgZHJpdmVycyBhcmUgbW9kaWZpZWQKK0xpbnV4IGRyaXZlcnMuCisKKworUmVxdWlyZWQgcGFja2FnZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgcGFja2FnZXMgYW5kIHRvb2xzIG11c3QgYmUgcHJlc2VudCBmb3IgYWxsIHRhcmdldHMuCisKKzEuIFdhdHQtMzIgdGNwL2lwIGxpYnJhcnkuIFRoaXMgbGlicmFyeSBpcyAqbm90KiB1c2VkIHRvIHNlbmQgb3IKKyAgIHJlY2VpdmUgbmV0d29yayBkYXRhLiBJdCdzIG1vc3RseSB1c2VkIHRvIGFjY2VzcyB0aGUgJ2hvc3RzJworICAgZmlsZSBhbmQgb3RoZXIgPG5ldGRiLmg+IGZlYXR1cmVzLiBHZXQgJ3dhdHQzMnMqLnppcCcgYXQ6CisKKyAgICAgaHR0cDovL3d3dy5iZ25ldHQubm8vfmdpdmEvCisKKzIuIEV4Y2VwdGlvbiBoYW5kbGVyIGFuZCBkaXNhc3NlbWJlciBsaWJyYXJ5IChsaWJleGMuYSkgaXMgbmVlZGVkIGlmCisgICAiVVNFX0VYQ0VQVCA9IDEiIGluIGNvbW1vbi5kai4gQXZhaWxhYmxlIGF0OgorCisgICAgIGh0dHA6Ly93d3cuYmduZXR0Lm5vL35naXZhL21pc2MvZXhjX2R4MDcuemlwCisKKzMuIEZsZXggJiBCaXNvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIHBhcnNlciBmb3IgdGhlIGZpbHRlciBoYW5kbGVyCisgICBwY2FwX2NvbXBpbGU6CisKKyAgICAgZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9nbnUvZGpncHAvdjJnbnUvZmx4MjU0Yi56aXAKKyAgICAgZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9nbnUvZGpncHAvdjJnbnUvYnNuMTI4Yi56aXAKKworNC4gTkFTTSBhc3NlbWJsZXIgdiAwLjk4IG9yIGxhdGVyIGlzIHJlcXVpcmVkIHdoZW4gYnVpbGRpbmcgZGpncHAgYW5kCisgICBXYXRjb20gdGFyZ2V0czoKKworICAgICBmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC92MnRrL25hc20wOThwLnppcAorCis1LiBzZWQgKFN0cmVhbSBFZGl0b3IpIGlzIHJlcXVpcmVkIGZvciBkb2luZyBgbWFrZSBkZXBlbmQnLgorICAgSXQncyBhdmFpbGFibGUgYXQKKyAgICAgZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9nbnUvZGpncHAvdjJnbnUvc2VkKi56aXAKKworICAgQSB0b3VjaCB0b29sIHRvIHVwZGF0ZSB0aGUgdGltZS1zdGFtcCBvZiBhIGZpbGUuIEUuZy4KKyAgICAgZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9nbnUvZGpncHAvdjJnbnUvZ3JlcCouemlwCisKKzYuIEZvciBkamdwcCBybS5leGUgYW5kIGNwLmV4ZSBhcmUgcmVxdWlyZWQuIFRoZXNlIHNob3VsZCBhbHJlYWR5IGJlCisgICBwYXJ0IG9mIHlvdXIgZGpncHAgaW5zdGFsbGF0aW9uLiBBbHNvIHJlcXVpcmVkIChleHBlcmltZW50YWwgYXQgdGhlCisgICB0aW1lKSBmb3IgZGpncHAgaXMgRExYIDIuOTEgb3IgbGF0ZXIuIFRoaXMgdG9vbCBpcyBmb3IgdGhlIGdlbmVyYXRpb24KKyAgIG9mIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMuCisKKworQ29tcGlsaW5nIGxpYnBjYXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvbGxvdyB0aGVzZSBzdGVwcyBpbiBidWlsZGluZyBsaWJwY2FwOgorCisxLiBNYWtlIHN1cmUgeW91J3ZlIGluc3RhbGxlZCBXYXR0LTMyIHByb3Blcmx5IChzZWUgaXQncyBgSU5TVEFMTCcgZmlsZSkuCisgICBEdXJpbmcgdGhhdCBpbnN0YWxsYXRpb24gYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgV0FUVF9ST09UJyBpcyBzZXQuCisgICBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGJ1aWxkaW5nIGxpYnBjYXAgYWxzbyAoYFdBVFRfSU5DJyBpcworICAgZGVkdWN0ZWQgZnJvbSBgV0FUVF9ST09UJykuIGRqZ3BwIHVzZXJzIHNob3VsZCBhbHNvIGRlZmluZSBlbnZpcm9ubWVudAorICAgdmFyaWFibGVzIGBDX0lOQ0xVREVfUEFUSCcgYW5kIGBMSUJSQVJZX1BBVEgnIHRvIHBvaW50IHRvIHRoZSBpbmNsdWRlCisgICBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgZGlyZWN0b3J5IHJlc3BlY3RpdmVseS4gIEUuZy4gcHV0IHRoaXMgaW4geW91cgorICAgQVVUT0VYRUMuQkFUOgorICAgICBzZXQgQ19JTkNMVURFX1BBVEg9YzovbmV0L3dhdHQvaW5jCisgICAgIHNldCBMSUJSQVJZX1BBVEg9YzovbmV0L3dhdHQvbGliCisKKzIuIFJldmlzZSB0aGUgbXNkb3MvY29tbW9uLmRqIGZpbGUgZm9yIHlvdXIgZGpncHAvZ2NjIGluc3RhbGxhdGlvbjsKKyAgIC0gY2hhbmdlIHRoZSB2YWx1ZSBvZiBgR0NDTElCJyB0byBtYXRjaCBsb2NhdGlvbiBvZiBsaWJnY2MuYS4KKyAgIC0gc2V0IGBVU0VfMzJCSVRfRFJJVkVSUyA9IDEnIHRvIGJ1aWxkIDMyLWJpdCBkcml2ZXIgb2JqZWN0cy4KKworCiszLiBCdWlsZCBwY2FwIGJ5IHVzaW5nIGFwcHJvcHJpYXRlIG1ha2VmaWxlLiBGb3IgZGpncHAsIHVzZToKKyAgICAgYG1ha2UgLWYgbXNkb3MvbWFrZWZpbGUuZGonICAoaS5lLiBHTlUgYG1ha2UnKQorCisgICBGb3IgYSBXYXRjb20gdGFyZ2V0IHNheToKKyAgICAgYHdtYWtlIC1mIG1zZG9zXG1ha2VmaWxlLndjJworCisgICBGb3IgYSBCb3JsYW5kIHRhcmdldCBzYXk6CisgICAgIGBtYWtlciAtZiBtc2Rvc1xNYWtlZmlsZSBwY2FwX2JjLmxpYicgIChCb3JsYW5kJ3MgYG1ha2VyLmV4ZScpCisKKyAgIEFuZCBmb3IgYSBIaWdoQy9QaGFybGFwIHRhcmdldCBzYXk6CisgICAgIGBtYWtlciAtZiBtc2Rvc1xNYWtlZmlsZSBwY2FwX2hjLmxpYicgIChCb3JsYW5kJ3MgYG1ha2VyLmV4ZScpCisKKyAgIFlvdSBtaWdodCBsaWtlIHRvIGNoYW5nZSBzb21lIGBDRkxBR1MnIC0tIG9ubHkgYERFQlVHJyBkZWZpbmUgY3VycmVudGx5CisgICBoYXZlIGFueSBlZmZlY3QuIEl0IHNob3dzIGEgcm90YXRpbmcgImZhbiIgaW4gdXBwZXIgcmlnaHQgY29ybmVyIG9mCisgICBzY3JlZW4uICBSZW1vdmUgYERFQlVHJyBpZiB5b3UgZG9uJ3QgbGlrZSBpdC4gWW91IGNvdWxkIGFkZAorICAgYC1mb21pdC1mcmFtZS1wb2ludGVyJyB0byBgQ0ZMQUdTJyB0byBzcGVlZCB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgICBCdXQgbm90ZSwgdGhpcyBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGNyYXNoLXRyYWNlYmFjayBkaWZmaWN1bHQuIE9ubHkKKyAgIGFkZCBpdCBpZiB5b3UncmUgZnVsbHkgY29uZmlkZW50IHlvdXIgYXBwbGljYXRpb24gaXMgMTAwJSBzdGFibGUuCisKKyAgIE5vdGU6IENvZGUgaW4gYFVTRV9ORElTMicgZG9lcyBub3Qgd29yayBhdCB0aGUgbW9tZW50LgorCis0LiBUaGUgcmVzdWx0aW5nIGxpYnJhcmllcyBhcmUgcHV0IGluIGN1cnJlbnQgZGlyZWN0b3J5LiBUaGVyZSdzIG5vCisgICB0ZXN0LXByb2dyYW0gZm9yIGBsaWJwY2FwJy4gTGlua2luZyB0aGUgbGlicmFyeSB3aXRoIGB0Y3BkdW1wJyBpcworICAgdGhlIHVsdGltYXRlIHRlc3QgYW55d2F5LgorCisKKworRXh0ZW5zaW9ucyB0byBsaWJwY2FwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSSd2ZSBpbmNsdWRlZCBzb21lIGV4dHJhIGZ1bmN0aW9ucyB0byBET1MtbGlicGNhcDoKKworICBgcGNhcF9jb25maWdfaG9vayAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpJyAKKworICAgIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZXQgdmFsdWVzIG9mIGludGVybmFsIGxpYnBjYXAgdmFyaWFibGVzLgorICAgIGBuYW1lJyBpcyB0eXBpY2FsbHkgYSBsZWZ0LXNpZGUga2V5d29yZCB3aXRoIGFuIGFzc29jaWF0ZWQgYHZhbHVlJworICAgIHRoYXQgaXMgY2FsbGVkIGZyb20gYXBwbGljYXRpb24ncyBjb25maWd1cmUgcHJvY2VzcyAoc2VlIHRjcGR1bXAncworICAgIGNvbmZpZy5jIGZpbGUpLiBsaWJwY2FwIGtlZXBzIGEgc2V0IG9mIHRhYmxlcyB0aGF0IGFyZSBzZWFyY2hlZCBmb3IKKyAgICBhIG5hbWUvdmFsdWUgbWF0Y2guIEN1cnJlbnRseSBvbmx5IHVzZWQgdG8gc2V0IGRlYnVnLWxldmVscyBhbmQKKyAgICBwYXJhbWV0ZXJzIGZvciB0aGUgMzItYml0IG5ldHdvcmsgZHJpdmVycy4KKworICBgcGNhcF9zZXRfd2FpdCAocGNhcF90ICosIHZvaWQgKCopKHZvaWQpLCBpbnQpJyA6CisKKyAgICBPbmx5IGVmZmVjdGl2ZSB3aGVuIHJlYWRpbmcgb2ZmbGluZSB0cmFmZmljIGZyb20gZHVtcC1maWxlcy4KKyAgICBGdW5jdGlvbiBgcGNhcF9vZmZsaW5lX3JlYWQoKScgd2lsbCB3YWl0IChhbmQgb3B0aW9uYWxseSB5aWVsZCkKKyAgICBiZWZvcmUgcHJpbnRpbmcgbmV4dCBwYWNrZXQuIFRoaXMgd2lsbCBzaW11bGF0ZSB0aGUgcGFjZSB0aGUgcGFja2V0cworICAgIHdoZXJlIGFjdHVhbGx5IHJlY29yZGVkLgorCisKKworSGFwcHkgc25pZmZpbmcgIQorCisKK0dpc2xlIFZhbmVtIDxnaXZhQGJnbmV0dC5ubz4KKyAgICAgICAgICAgIDxndmFuZW1AYnJvYWRwYXJrLm5vPgorCitPY3RvYmVyIDE5OTksIDIwMDQKKwpkaWZmIC0tZ2l0IGEvbmFtZXRvYWRkci5jIGIvbmFtZXRvYWRkci5jCmluZGV4IGQ2MGU5M2QuLjU1NDM5ZjcgMTAwNjQ0Ci0tLSBhL25hbWV0b2FkZHIuYworKysgYi9uYW1ldG9hZGRyLmMKQEAgLTI0LDEzICsyNCwxOCBAQAogCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9uYW1ldG9hZGRyLmMsdiAxLjc3LjIuNCAyMDA3LzA2LzExIDA5OjUyOjA1IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbmFtZXRvYWRkci5jLHYgMS44MyAyMDA4LTAyLTA2IDEwOjIxOjMwIGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCisjaWZkZWYgREVDTkVUTElCCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0ZG5ldC9kbmV0ZGIuaD4KKyNlbmRpZgorCiAjaWZkZWYgV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgogCkBAIC00NCwxMyArNDksNiBAQAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KICNlbmRpZiAvKiBXSU4zMiAqLwogCi0vKgotICogWFhYIC0gd2h5IHdhcyB0aGlzIGluY2x1ZGVkIGV2ZW4gb24gVU5JWD8KLSAqLwotI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSAiSVA2X21pc2MuaCIKLSNlbmRpZgotCiAjaWZuZGVmIFdJTjMyCiAjaWZkZWYgSEFWRV9FVEhFUl9IT1NUVE9OCiAvKgpAQCAtODAsNyArNzgsNyBAQAogI2luY2x1ZGUgInBjYXAtaW50LmgiCiAKICNpbmNsdWRlICJnZW5jb2RlLmgiCi0jaW5jbHVkZSA8cGNhcC1uYW1lZGIuaD4KKyNpbmNsdWRlIDxwY2FwL25hbWVkYi5oPgogCiAjaWZkZWYgSEFWRV9PU19QUk9UT19ICiAjaW5jbHVkZSAib3MtcHJvdG8uaCIKQEAgLTI0OSw2ICsyNDcsNyBAQAogCQkJZnJlZShjcHkpOwogCQkJcmV0dXJuIDA7CiAJCX0KKwkJZnJlZShjcHkpOwogCiAJCWlmICgqcHJvdG8gIT0gc2F2ZV9wcm90bykKIAkJCSpwcm90byA9IFBST1RPX1VOREVGOwpAQCAtMzk4LDcgKzM5NywxNSBAQAogfQogCiAvKgotICogQ29udmVydCAncycgd2hpY2ggaGFzIHRoZSBmb3JtICJ4eDp4eDp4eDp4eDp4eDp4eCIgaW50byBhIG5ldworICogQ29udmVydCAncycsIHdoaWNoIGNhbiBoYXZlIHRoZSBvbmUgb2YgdGhlIGZvcm1zOgorICoKKyAqCSJ4eDp4eDp4eDp4eDp4eDp4eCIKKyAqCSJ4eC54eC54eC54eC54eC54eCIKKyAqCSJ4eC14eC14eC14eC14eC14eCIKKyAqCSJ4eHh4Lnh4eHgueHh4eCIKKyAqCSJ4eHh4eHh4eHh4eHgiCisgKgorICogKG9yIHZhcmlvdXMgbWl4ZXMgb2YgJzonLCAnLicsIGFuZCAnLScpIGludG8gYSBuZXcKICAqIGV0aGVybmV0IGFkZHJlc3MuICBBc3N1bWVzICdzJyBpcyB3ZWxsIGZvcm1lZC4KICAqLwogdV9jaGFyICoKQEAgLTQwOCw5ICs0MTUsMTEgQEAKIAlyZWdpc3RlciB1X2ludCBkOwogCiAJZSA9IGVwID0gKHVfY2hhciAqKW1hbGxvYyg2KTsKKwlpZiAoZSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOwogCiAJd2hpbGUgKCpzKSB7Ci0JCWlmICgqcyA9PSAnOicpCisJCWlmICgqcyA9PSAnOicgfHwgKnMgPT0gJy4nIHx8ICpzID09ICctJykKIAkJCXMgKz0gMTsKIAkJZCA9IHhkdG9pKCpzKyspOwogCQlpZiAoaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnMpKSB7CmRpZmYgLS1naXQgYS9ubHBpZC5oIGIvbmxwaWQuaAppbmRleCBjM2FiOGMyLi41MzI3YTM2IDEwMDY0NAotLS0gYS9ubHBpZC5oCisrKyBiL25scGlkLmgKQEAgLTE1LDcgKzE1LDcgQEAKICAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbmxwaWQuaCx2IDEuMiAyMDAyLzEyLzA2IDAwOjAxOjM0IGhhbm5lcyBFeHAgJCAoSnVuaXBlcikKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbmxwaWQuaCx2IDEuMiAyMDAyLTEyLTA2IDAwOjAxOjM0IGhhbm5lcyBFeHAgJCAoSnVuaXBlcikKICAqLwogCiAvKiBUeXBlcyBtaXNzaW5nIGZyb20gc29tZSBzeXN0ZW1zICovCmRpZmYgLS1naXQgYS9vcHRpbWl6ZS5jIGIvb3B0aW1pemUuYwppbmRleCBiYzNhYzVkLi44MjE1NTQzIDEwMDY0NAotLS0gYS9vcHRpbWl6ZS5jCisrKyBiL29wdGltaXplLmMKQEAgLTIyLDEzICsyMiwyNyBAQAogICovCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9vcHRpbWl6ZS5jLHYgMS44NS4yLjMgMjAwNy8wOS8xMiAyMToyOTo0NSBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL29wdGltaXplLmMsdiAxLjkxIDIwMDgtMDEtMDIgMDQ6MTY6NDYgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8bWVtb3J5Lmg+CkBAIC01Myw2ICs2NywxMCBAQAogI2RlZmluZSBmZnMgX3czMl9mZnMKICNlbmRpZgogCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZCAoX01TQ19WRVIpCitpbnQgZmZzKGludCBtYXNrKTsKKyNlbmRpZgorCiAvKgogICogUmVwcmVzZW50cyBhIGRlbGV0ZWQgaW5zdHJ1Y3Rpb24uCiAgKi8KQEAgLTk0LDUxICsxMTIsOSBAQAogc3RhdGljIHZvaWQgb3B0X2luaXQoc3RydWN0IGJsb2NrICopOwogc3RhdGljIHZvaWQgb3B0X2NsZWFudXAodm9pZCk7CiAKLXN0YXRpYyB2b2lkIG1ha2VfbWFya3Moc3RydWN0IGJsb2NrICopOwotc3RhdGljIHZvaWQgbWFya19jb2RlKHN0cnVjdCBibG9jayAqKTsKLQogc3RhdGljIHZvaWQgaW50ZXJuX2Jsb2NrcyhzdHJ1Y3QgYmxvY2sgKik7CiAKLXN0YXRpYyBpbnQgZXFfc2xpc3Qoc3RydWN0IHNsaXN0ICosIHN0cnVjdCBzbGlzdCAqKTsKLQotc3RhdGljIHZvaWQgZmluZF9sZXZlbHNfcihzdHJ1Y3QgYmxvY2sgKik7Ci0KLXN0YXRpYyB2b2lkIGZpbmRfbGV2ZWxzKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIGZpbmRfZG9tKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIHByb3BlZG9tKHN0cnVjdCBlZGdlICopOwotc3RhdGljIHZvaWQgZmluZF9lZG9tKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIGZpbmRfY2xvc3VyZShzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgaW50IGF0b211c2Uoc3RydWN0IHN0bXQgKik7Ci1zdGF0aWMgaW50IGF0b21kZWYoc3RydWN0IHN0bXQgKik7Ci1zdGF0aWMgdm9pZCBjb21wdXRlX2xvY2FsX3VkKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIGZpbmRfdWQoc3RydWN0IGJsb2NrICopOwotc3RhdGljIHZvaWQgaW5pdF92YWwodm9pZCk7Ci1zdGF0aWMgaW50IEYoaW50LCBpbnQsIGludCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgdnN0b3JlKHN0cnVjdCBzdG10ICosIGludCAqLCBpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBvcHRfYmxrKHN0cnVjdCBibG9jayAqLCBpbnQpOwotc3RhdGljIGludCB1c2VfY29uZmxpY3Qoc3RydWN0IGJsb2NrICosIHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIG9wdF9qKHN0cnVjdCBlZGdlICopOwotc3RhdGljIHZvaWQgb3JfcHVsbHVwKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIGFuZF9wdWxsdXAoc3RydWN0IGJsb2NrICopOwotc3RhdGljIHZvaWQgb3B0X2Jsa3Moc3RydWN0IGJsb2NrICosIGludCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgbGlua19pbmVkZ2Uoc3RydWN0IGVkZ2UgKiwgc3RydWN0IGJsb2NrICopOwogc3RhdGljIHZvaWQgZmluZF9pbmVkZ2VzKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIG9wdF9yb290KHN0cnVjdCBibG9jayAqKik7Ci1zdGF0aWMgdm9pZCBvcHRfbG9vcChzdHJ1Y3QgYmxvY2sgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGZvbGRfb3Aoc3RydWN0IHN0bXQgKiwgaW50LCBpbnQpOwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2xpc3QgKnRoaXNfb3Aoc3RydWN0IHNsaXN0ICopOwotc3RhdGljIHZvaWQgb3B0X25vdChzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgdm9pZCBvcHRfcGVlcChzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgdm9pZCBvcHRfc3RtdChzdHJ1Y3Qgc3RtdCAqLCBpbnRbXSwgaW50KTsKLXN0YXRpYyB2b2lkIGRlYWRzdG10KHN0cnVjdCBzdG10ICosIHN0cnVjdCBzdG10ICpbXSk7Ci1zdGF0aWMgdm9pZCBvcHRfZGVhZHN0b3JlcyhzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpmb2xkX2VkZ2Uoc3RydWN0IGJsb2NrICosIHN0cnVjdCBlZGdlICopOwotc3RhdGljIGlubGluZSBpbnQgZXFfYmxrKHN0cnVjdCBibG9jayAqLCBzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgaW50IHNsZW5ndGgoc3RydWN0IHNsaXN0ICopOwotc3RhdGljIGludCBjb3VudF9ibG9ja3Moc3RydWN0IGJsb2NrICopOwotc3RhdGljIHZvaWQgbnVtYmVyX2Jsa3NfcihzdHJ1Y3QgYmxvY2sgKik7Ci1zdGF0aWMgaW50IGNvdW50X3N0bXRzKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyBpbnQgY29udmVydF9jb2RlX3Ioc3RydWN0IGJsb2NrICopOwogI2lmZGVmIEJERUJVRwogc3RhdGljIHZvaWQgb3B0X2R1bXAoc3RydWN0IGJsb2NrICopOwogI2VuZGlmCkBAIC0yMTQsOCArMTkwLDcgQEAKICNlbmRpZgogCiBzdGF0aWMgdm9pZAotZmluZF9sZXZlbHNfcihiKQotCXN0cnVjdCBibG9jayAqYjsKK2ZpbmRfbGV2ZWxzX3Ioc3RydWN0IGJsb2NrICpiKQogewogCWludCBsZXZlbDsKIApAQCAtMjQzLDggKzIxOCw3IEBACiAgKiB3aXRoIHRoZSAnbGluaycgZmllbGQgb2YgdGhlIHN0cnVjdCBibG9jay4KICAqLwogc3RhdGljIHZvaWQKLWZpbmRfbGV2ZWxzKHJvb3QpCi0Jc3RydWN0IGJsb2NrICpyb290OworZmluZF9sZXZlbHMoc3RydWN0IGJsb2NrICpyb290KQogewogCW1lbXNldCgoY2hhciAqKWxldmVscywgMCwgbl9ibG9ja3MgKiBzaXplb2YoKmxldmVscykpOwogCXVuTWFya0FsbCgpOwpAQCAtMjU2LDggKzIzMCw3IEBACiAgKiBBc3N1bWVzIGdyYXBoIGhhcyBiZWVuIGxldmVsZWQuCiAgKi8KIHN0YXRpYyB2b2lkCi1maW5kX2RvbShyb290KQotCXN0cnVjdCBibG9jayAqcm9vdDsKK2ZpbmRfZG9tKHN0cnVjdCBibG9jayAqcm9vdCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgYmxvY2sgKmI7CkBAIC0yODcsOCArMjYwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXByb3BlZG9tKGVwKQotCXN0cnVjdCBlZGdlICplcDsKK3Byb3BlZG9tKHN0cnVjdCBlZGdlICplcCkKIHsKIAlTRVRfSU5TRVJUKGVwLT5lZG9tLCBlcC0+aWQpOwogCWlmIChlcC0+c3VjYykgewpAQCAtMzAyLDggKzI3NCw3IEBACiAgKiBBc3N1bWVzIGdyYXBoIGhhcyBiZWVuIGxldmVsZWQgYW5kIHByZWRlY2Vzc29ycyBlc3RhYmxpc2hlZC4KICAqLwogc3RhdGljIHZvaWQKLWZpbmRfZWRvbShyb290KQotCXN0cnVjdCBibG9jayAqcm9vdDsKK2ZpbmRfZWRvbShzdHJ1Y3QgYmxvY2sgKnJvb3QpCiB7CiAJaW50IGk7CiAJdXNldCB4OwpAQCAtMzMyLDggKzMwMyw3IEBACiAgKiBBc3N1bWVzIGdyYXBoIGhhcyBiZWVuIGxldmVsZWQuCiAgKi8KIHN0YXRpYyB2b2lkCi1maW5kX2Nsb3N1cmUocm9vdCkKLQlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CitmaW5kX2Nsb3N1cmUoc3RydWN0IGJsb2NrICpyb290KQogewogCWludCBpOwogCXN0cnVjdCBibG9jayAqYjsKQEAgLTM2Myw4ICszMzMsNyBAQAogICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBwcm9iYWJseSBjaGFuZ2UgdG8gYW4gYXJyYXkgYWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1hdG9tdXNlKHMpCi0Jc3RydWN0IHN0bXQgKnM7CithdG9tdXNlKHN0cnVjdCBzdG10ICpzKQogewogCXJlZ2lzdGVyIGludCBjID0gcy0+Y29kZTsKIApAQCAtNDA5LDggKzM3OCw3IEBACiAgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBhbiBhcnJheSBhY2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLWF0b21kZWYocykKLQlzdHJ1Y3Qgc3RtdCAqczsKK2F0b21kZWYoc3RydWN0IHN0bXQgKnMpCiB7CiAJaWYgKHMtPmNvZGUgPT0gTk9QKQogCQlyZXR1cm4gLTE7CkBAIC00NDYsOCArNDE0LDcgQEAKICAqIHJlZ2lzdGVyIGJ5IGEgcHJlZGVjZXNzb3IgYmxvY2sgb2YgdGhpcyBibG9jay4KICAqLwogc3RhdGljIHZvaWQKLWNvbXB1dGVfbG9jYWxfdWQoYikKLQlzdHJ1Y3QgYmxvY2sgKmI7Citjb21wdXRlX2xvY2FsX3VkKHN0cnVjdCBibG9jayAqYikKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnM7CiAJYXRvbXNldCBkZWYgPSAwLCB1c2UgPSAwLCBraWxsID0gMDsKQEAgLTUwOCw4ICs0NzUsNyBAQAogICogQXNzdW1lIGdyYXBoIGlzIGFscmVhZHkgbGV2ZWxlZC4KICAqLwogc3RhdGljIHZvaWQKLWZpbmRfdWQocm9vdCkKLQlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CitmaW5kX3VkKHN0cnVjdCBibG9jayAqcm9vdCkKIHsKIAlpbnQgaSwgbWF4bGV2ZWw7CiAJc3RydWN0IGJsb2NrICpwOwpAQCAtNTY0LDcgKzUzMCw3IEBACiBzdHJ1Y3QgdmFsbm9kZSAqbmV4dF92bm9kZTsKIAogc3RhdGljIHZvaWQKLWluaXRfdmFsKCkKK2luaXRfdmFsKHZvaWQpCiB7CiAJY3VydmFsID0gMDsKIAluZXh0X3Zub2RlID0gdm5vZGVfYmFzZTsKQEAgLTU3NCw5ICs1NDAsNyBAQAogCiAvKiBCZWNhdXNlIHdlIHJlYWxseSBkb24ndCBoYXZlIGFuIElSLCB0aGlzIHN0dWZmIGlzIGEgbGl0dGxlIG1lc3N5LiAqLwogc3RhdGljIGludAotRihjb2RlLCB2MCwgdjEpCi0JaW50IGNvZGU7Ci0JaW50IHYwLCB2MTsKK0YoaW50IGNvZGUsIGludCB2MCwgaW50IHYxKQogewogCXVfaW50IGhhc2g7CiAJaW50IHZhbDsKQEAgLTYwNywxMSArNTcxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi12c3RvcmUocywgdmFscCwgbmV3dmFsLCBhbHRlcikKLQlzdHJ1Y3Qgc3RtdCAqczsKLQlpbnQgKnZhbHA7Ci0JaW50IG5ld3ZhbDsKLQlpbnQgYWx0ZXI7Cit2c3RvcmUoc3RydWN0IHN0bXQgKnMsIGludCAqdmFscCwgaW50IG5ld3ZhbCwgaW50IGFsdGVyKQogewogCWlmIChhbHRlciAmJiAqdmFscCA9PSBuZXd2YWwpCiAJCXMtPmNvZGUgPSBOT1A7CkBAIC02MTksMTAgKzU3OSwxMiBAQAogCQkqdmFscCA9IG5ld3ZhbDsKIH0KIAorLyoKKyAqIERvIGNvbnN0YW50LWZvbGRpbmcgb24gYmluYXJ5IG9wZXJhdG9ycy4KKyAqIChVbmFyeSBvcGVyYXRvcnMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlLikKKyAqLwogc3RhdGljIHZvaWQKLWZvbGRfb3AocywgdjAsIHYxKQotCXN0cnVjdCBzdG10ICpzOwotCWludCB2MCwgdjE7Citmb2xkX29wKHN0cnVjdCBzdG10ICpzLCBpbnQgdjAsIGludCB2MSkKIHsKIAlicGZfdV9pbnQzMiBhLCBiOwogCkBAIC02NjQsMTAgKzYyNiw2IEBACiAJCWEgPj49IGI7CiAJCWJyZWFrOwogCi0JY2FzZSBCUEZfTkVHOgotCQlhID0gLWE7Ci0JCWJyZWFrOwotCiAJZGVmYXVsdDoKIAkJYWJvcnQoKTsKIAl9CkBAIC02NzcsOCArNjM1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2xpc3QgKgotdGhpc19vcChzKQotCXN0cnVjdCBzbGlzdCAqczsKK3RoaXNfb3Aoc3RydWN0IHNsaXN0ICpzKQogewogCXdoaWxlIChzICE9IDAgJiYgcy0+cy5jb2RlID09IE5PUCkKIAkJcyA9IHMtPm5leHQ7CkBAIC02ODYsOCArNjQzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9ub3QoYikKLQlzdHJ1Y3QgYmxvY2sgKmI7CitvcHRfbm90KHN0cnVjdCBibG9jayAqYikKIHsKIAlzdHJ1Y3QgYmxvY2sgKnRtcCA9IEpUKGIpOwogCkBAIC02OTYsOCArNjUyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9wZWVwKGIpCi0Jc3RydWN0IGJsb2NrICpiOworb3B0X3BlZXAoc3RydWN0IGJsb2NrICpiKQogewogCXN0cnVjdCBzbGlzdCAqczsKIAlzdHJ1Y3Qgc2xpc3QgKm5leHQsICpsYXN0OwpAQCAtOTA2LDYgKzg2MSwxNyBAQAogCQkJSkYoYikgPSBKVChiKTsKIAl9CiAJLyoKKwkgKiBJZiB3ZSdyZSBjb21wYXJpbmcgYWdhaW5zdCB0aGUgaW5kZXggcmVnaXN0ZXIsIGFuZCB0aGUgaW5kZXgKKwkgKiByZWdpc3RlciBpcyBhIGtub3duIGNvbnN0YW50LCB3ZSBjYW4ganVzdCBjb21wYXJlIGFnYWluc3QgdGhhdAorCSAqIGNvbnN0YW50LgorCSAqLworCXZhbCA9IGItPnZhbFtYX0FUT01dOworCWlmICh2bWFwW3ZhbF0uaXNfY29uc3QgJiYgQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9YKSB7CisJCWJwZl9pbnQzMiB2ID0gdm1hcFt2YWxdLmNvbnN0X3ZhbDsKKwkJYi0+cy5jb2RlICY9IH5CUEZfWDsKKwkJYi0+cy5rID0gdjsKKwl9CisJLyoKIAkgKiBJZiB0aGUgYWNjdW11bGF0b3IgaXMgYSBrbm93biBjb25zdGFudCwgd2UgY2FuIGNvbXB1dGUgdGhlCiAJICogY29tcGFyaXNvbiByZXN1bHQuCiAJICovCkBAIC05NDksMTAgKzkxNSw3IEBACiAgKiBldmFsdWF0aW9uIGFuZCBjb2RlIHRyYW5zZm9ybWF0aW9ucyB3ZXJlbid0IGZvbGRlZCB0b2dldGhlci4KICAqLwogc3RhdGljIHZvaWQKLW9wdF9zdG10KHMsIHZhbCwgYWx0ZXIpCi0Jc3RydWN0IHN0bXQgKnM7Ci0JaW50IHZhbFtdOwotCWludCBhbHRlcjsKK29wdF9zdG10KHN0cnVjdCBzdG10ICpzLCBpbnQgdmFsW10sIGludCBhbHRlcikKIHsKIAlpbnQgb3A7CiAJaW50IHY7CkBAIC0xMTM3LDkgKzExMDAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotZGVhZHN0bXQocywgbGFzdCkKLQlyZWdpc3RlciBzdHJ1Y3Qgc3RtdCAqczsKLQlyZWdpc3RlciBzdHJ1Y3Qgc3RtdCAqbGFzdFtdOworZGVhZHN0bXQocmVnaXN0ZXIgc3RydWN0IHN0bXQgKnMsIHJlZ2lzdGVyIHN0cnVjdCBzdG10ICpsYXN0W10pCiB7CiAJcmVnaXN0ZXIgaW50IGF0b207CiAKQEAgLTExNjMsOCArMTEyNCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1vcHRfZGVhZHN0b3JlcyhiKQotCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjsKK29wdF9kZWFkc3RvcmVzKHJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYikKIHsKIAlyZWdpc3RlciBzdHJ1Y3Qgc2xpc3QgKnM7CiAJcmVnaXN0ZXIgaW50IGF0b207CkBAIC0xMTg0LDkgKzExNDQsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotb3B0X2JsayhiLCBkb19zdG10cykKLQlzdHJ1Y3QgYmxvY2sgKmI7Ci0JaW50IGRvX3N0bXRzOworb3B0X2JsayhzdHJ1Y3QgYmxvY2sgKmIsIGludCBkb19zdG10cykKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnM7CiAJc3RydWN0IGVkZ2UgKnA7CkBAIC0xMjkwLDggKzEyNDgsNyBAQAogICogZnJvbSAnYicuCiAgKi8KIHN0YXRpYyBpbnQKLXVzZV9jb25mbGljdChiLCBzdWNjKQotCXN0cnVjdCBibG9jayAqYiwgKnN1Y2M7Cit1c2VfY29uZmxpY3Qoc3RydWN0IGJsb2NrICpiLCBzdHJ1Y3QgYmxvY2sgKnN1Y2MpCiB7CiAJaW50IGF0b207CiAJYXRvbXNldCB1c2UgPSBzdWNjLT5vdXRfdXNlOwpAQCAtMTMwNyw5ICsxMjY0LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1mb2xkX2VkZ2UoY2hpbGQsIGVwKQotCXN0cnVjdCBibG9jayAqY2hpbGQ7Ci0Jc3RydWN0IGVkZ2UgKmVwOworZm9sZF9lZGdlKHN0cnVjdCBibG9jayAqY2hpbGQsIHN0cnVjdCBlZGdlICplcCkKIHsKIAlpbnQgc2Vuc2U7CiAJaW50IGF2YWwwLCBhdmFsMSwgb3ZhbDAsIG92YWwxOwpAQCAtMTM2MCwxMCArMTMxNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpbmNsdWRlICJmZnMuaCIKIHN0YXRpYyB2b2lkCi1vcHRfaihlcCkKLQlzdHJ1Y3QgZWRnZSAqZXA7CitvcHRfaihzdHJ1Y3QgZWRnZSAqZXApCiB7CiAJcmVnaXN0ZXIgaW50IGksIGs7CiAJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICp0YXJnZXQ7CkBAIC0xNDE4LDggKzEzNzEsNyBAQAogCiAKIHN0YXRpYyB2b2lkCi1vcl9wdWxsdXAoYikKLQlzdHJ1Y3QgYmxvY2sgKmI7Citvcl9wdWxsdXAoc3RydWN0IGJsb2NrICpiKQogewogCWludCB2YWwsIGF0X3RvcDsKIAlzdHJ1Y3QgYmxvY2sgKnB1bGw7CkBAIC0xNTExLDggKzE0NjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYW5kX3B1bGx1cChiKQotCXN0cnVjdCBibG9jayAqYjsKK2FuZF9wdWxsdXAoc3RydWN0IGJsb2NrICpiKQogewogCWludCB2YWwsIGF0X3RvcDsKIAlzdHJ1Y3QgYmxvY2sgKnB1bGw7CkBAIC0xNjAzLDkgKzE1NTQsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotb3B0X2Jsa3Mocm9vdCwgZG9fc3RtdHMpCi0Jc3RydWN0IGJsb2NrICpyb290OwotCWludCBkb19zdG10czsKK29wdF9ibGtzKHN0cnVjdCBibG9jayAqcm9vdCwgaW50IGRvX3N0bXRzKQogewogCWludCBpLCBtYXhsZXZlbDsKIAlzdHJ1Y3QgYmxvY2sgKnA7CkBAIC0xNjQyLDE3ICsxNTkxLDE0IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotbGlua19pbmVkZ2UocGFyZW50LCBjaGlsZCkKLQlzdHJ1Y3QgZWRnZSAqcGFyZW50OwotCXN0cnVjdCBibG9jayAqY2hpbGQ7CitsaW5rX2luZWRnZShzdHJ1Y3QgZWRnZSAqcGFyZW50LCBzdHJ1Y3QgYmxvY2sgKmNoaWxkKQogewogCXBhcmVudC0+bmV4dCA9IGNoaWxkLT5pbl9lZGdlczsKIAljaGlsZC0+aW5fZWRnZXMgPSBwYXJlbnQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1maW5kX2luZWRnZXMocm9vdCkKLQlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CitmaW5kX2luZWRnZXMoc3RydWN0IGJsb2NrICpyb290KQogewogCWludCBpOwogCXN0cnVjdCBibG9jayAqYjsKQEAgLTE2NzMsOCArMTYxOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1vcHRfcm9vdChiKQotCXN0cnVjdCBibG9jayAqKmI7CitvcHRfcm9vdChzdHJ1Y3QgYmxvY2sgKipiKQogewogCXN0cnVjdCBzbGlzdCAqdG1wLCAqczsKIApAQCAtMTY5OCw5ICsxNjQzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9sb29wKHJvb3QsIGRvX3N0bXRzKQotCXN0cnVjdCBibG9jayAqcm9vdDsKLQlpbnQgZG9fc3RtdHM7CitvcHRfbG9vcChzdHJ1Y3QgYmxvY2sgKnJvb3QsIGludCBkb19zdG10cykKIHsKIAogI2lmZGVmIEJERUJVRwpAQCAtMTczMCw4ICsxNjczLDcgQEAKICAqIE9wdGltaXplIHRoZSBmaWx0ZXIgY29kZSBpbiBpdHMgZGFnIHJlcHJlc2VudGF0aW9uLgogICovCiB2b2lkCi1icGZfb3B0aW1pemUocm9vdHApCi0Jc3RydWN0IGJsb2NrICoqcm9vdHA7CiticGZfb3B0aW1pemUoc3RydWN0IGJsb2NrICoqcm9vdHApCiB7CiAJc3RydWN0IGJsb2NrICpyb290OwogCkBAIC0xNzU4LDggKzE3MDAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbWFrZV9tYXJrcyhwKQotCXN0cnVjdCBibG9jayAqcDsKK21ha2VfbWFya3Moc3RydWN0IGJsb2NrICpwKQogewogCWlmICghaXNNYXJrZWQocCkpIHsKIAkJTWFyayhwKTsKQEAgLTE3NzUsOCArMTcxNiw3IEBACiAgKiBvbmx5IGZvciBub2RlcyB0aGF0IGFyZSBhbGl2ZS4KICAqLwogc3RhdGljIHZvaWQKLW1hcmtfY29kZShwKQotCXN0cnVjdCBibG9jayAqcDsKK21hcmtfY29kZShzdHJ1Y3QgYmxvY2sgKnApCiB7CiAJY3VyX21hcmsgKz0gMTsKIAltYWtlX21hcmtzKHApOwpAQCAtMTc4Nyw4ICsxNzI3LDcgQEAKICAqIHRoZSBhY2N1bXVsYXRvci4KICAqLwogc3RhdGljIGludAotZXFfc2xpc3QoeCwgeSkKLQlzdHJ1Y3Qgc2xpc3QgKngsICp5OworZXFfc2xpc3Qoc3RydWN0IHNsaXN0ICp4LCBzdHJ1Y3Qgc2xpc3QgKnkpCiB7CiAJd2hpbGUgKDEpIHsKIAkJd2hpbGUgKHggJiYgeC0+cy5jb2RlID09IE5PUCkKQEAgLTE4MDcsOCArMTc0Niw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1lcV9ibGsoYjAsIGIxKQotCXN0cnVjdCBibG9jayAqYjAsICpiMTsKK2VxX2JsayhzdHJ1Y3QgYmxvY2sgKmIwLCBzdHJ1Y3QgYmxvY2sgKmIxKQogewogCWlmIChiMC0+cy5jb2RlID09IGIxLT5zLmNvZGUgJiYKIAkgICAgYjAtPnMuayA9PSBiMS0+cy5rICYmCkBAIC0xODE5LDggKzE3NTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotaW50ZXJuX2Jsb2Nrcyhyb290KQotCXN0cnVjdCBibG9jayAqcm9vdDsKK2ludGVybl9ibG9ja3Moc3RydWN0IGJsb2NrICpyb290KQogewogCXN0cnVjdCBibG9jayAqcDsKIAlpbnQgaSwgajsKQEAgLTE4NjMsNyArMTgwMCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1vcHRfY2xlYW51cCgpCitvcHRfY2xlYW51cCh2b2lkKQogewogCWZyZWUoKHZvaWQgKil2bm9kZV9iYXNlKTsKIAlmcmVlKCh2b2lkICopdm1hcCk7CkBAIC0xODc2LDExICsxODEzLDEwIEBACiAvKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3RtdHMgaW4gJ3MnLgogICovCi1zdGF0aWMgaW50Ci1zbGVuZ3RoKHMpCi0Jc3RydWN0IHNsaXN0ICpzOworc3RhdGljIHVfaW50CitzbGVuZ3RoKHN0cnVjdCBzbGlzdCAqcykKIHsKLQlpbnQgbiA9IDA7CisJdV9pbnQgbiA9IDA7CiAKIAlmb3IgKDsgczsgcyA9IHMtPm5leHQpCiAJCWlmIChzLT5zLmNvZGUgIT0gTk9QKQpAQCAtMTg5Myw4ICsxODI5LDcgQEAKICAqIEFsbCBub2RlcyBzaG91bGQgYmUgaW5pdGlhbGx5IHVubWFya2VkLgogICovCiBzdGF0aWMgaW50Ci1jb3VudF9ibG9ja3MocCkKLQlzdHJ1Y3QgYmxvY2sgKnA7Citjb3VudF9ibG9ja3Moc3RydWN0IGJsb2NrICpwKQogewogCWlmIChwID09IDAgfHwgaXNNYXJrZWQocCkpCiAJCXJldHVybiAwOwpAQCAtMTkwNyw4ICsxODQyLDcgQEAKICAqIHRoZSBiYXNpYyBibG9ja3MsIGFuZCBlbnRlcmluZyB0aGVtIGludG8gdGhlICdibG9ja3MnIGFycmF5LmAKICAqLwogc3RhdGljIHZvaWQKLW51bWJlcl9ibGtzX3IocCkKLQlzdHJ1Y3QgYmxvY2sgKnA7CitudW1iZXJfYmxrc19yKHN0cnVjdCBibG9jayAqcCkKIHsKIAlpbnQgbjsKIApAQCAtMTk0MiwxMSArMTg3NiwxMCBAQAogICoKICAqCWFuIGV4dHJhIGxvbmcganVtcCBpZiB0aGUgZmFsc2UgYnJhbmNoIHJlcXVpcmVzIGl0IChwLT5sb25namYpLgogICovCi1zdGF0aWMgaW50Ci1jb3VudF9zdG10cyhwKQotCXN0cnVjdCBibG9jayAqcDsKK3N0YXRpYyB1X2ludAorY291bnRfc3RtdHMoc3RydWN0IGJsb2NrICpwKQogewotCWludCBuOworCXVfaW50IG47CiAKIAlpZiAocCA9PSAwIHx8IGlzTWFya2VkKHApKQogCQlyZXR1cm4gMDsKQEAgLTE5NjEsOCArMTg5NCw3IEBACiAgKiBmcm9tIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGFuZC9vciBzdGF0ZW1lbnRzLgogICovCiBzdGF0aWMgdm9pZAotb3B0X2luaXQocm9vdCkKLQlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CitvcHRfaW5pdChzdHJ1Y3QgYmxvY2sgKnJvb3QpCiB7CiAJYnBmX3VfaW50MzIgKnA7CiAJaW50IGksIG4sIG1heF9zdG10czsKQEAgLTIwNjAsOCArMTk5Miw3IEBACiAgKiBwcm9wZXJseS4KICAqLwogc3RhdGljIGludAotY29udmVydF9jb2RlX3IocCkKLQlzdHJ1Y3QgYmxvY2sgKnA7Citjb252ZXJ0X2NvZGVfcihzdHJ1Y3QgYmxvY2sgKnApCiB7CiAJc3RydWN0IGJwZl9pbnNuICpkc3Q7CiAJc3RydWN0IHNsaXN0ICpzcmM7CkBAIC0yMjMzLDExICsyMTY0LDkgQEAKICAqIGRvbmUgd2l0aCB0aGUgZmlsdGVyIHByb2dyYW0uICBTZWUgdGhlIHBjYXAgbWFuIHBhZ2UuCiAgKi8KIHN0cnVjdCBicGZfaW5zbiAqCi1pY29kZV90b19mY29kZShyb290LCBsZW5wKQotCXN0cnVjdCBibG9jayAqcm9vdDsKLQlpbnQgKmxlbnA7CitpY29kZV90b19mY29kZShzdHJ1Y3QgYmxvY2sgKnJvb3QsIHVfaW50ICpsZW5wKQogewotCWludCBuOworCXVfaW50IG47CiAJc3RydWN0IGJwZl9pbnNuICpmcDsKIAogCS8qCkBAIC0yMjc4LDYgKzIyMDcsMTUgQEAKIAlzaXplX3QgcHJvZ19zaXplOwogCiAJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgcHJvZ3JhbS4KKwkgKi8KKwlpZiAoIWJwZl92YWxpZGF0ZShmcC0+YmZfaW5zbnMsIGZwLT5iZl9sZW4pKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkiQlBGIHByb2dyYW0gaXMgbm90IHZhbGlkIik7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qCiAJICogRnJlZSB1cCBhbnkgYWxyZWFkeSBpbnN0YWxsZWQgcHJvZ3JhbS4KIAkgKi8KIAlwY2FwX2ZyZWVjb2RlKCZwLT5mY29kZSk7CkBAIC0yMjk2LDggKzIyMzQsNyBAQAogCiAjaWZkZWYgQkRFQlVHCiBzdGF0aWMgdm9pZAotb3B0X2R1bXAocm9vdCkKLQlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CitvcHRfZHVtcChzdHJ1Y3QgYmxvY2sgKnJvb3QpCiB7CiAJc3RydWN0IGJwZl9wcm9ncmFtIGY7CiAKZGlmZiAtLWdpdCBhL29yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdCBiL29yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ2ODUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLnRjcGR1bXAuY2htb2RfYnBmLnBsaXN0CkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5MYWJlbDwva2V5PgorCTxzdHJpbmc+b3JnLnRjcGR1bXAuY2htb2RfYnBmPC9zdHJpbmc+CisJPGtleT5SdW5BdExvYWQ8L2tleT4KKwk8dHJ1ZS8+CisJPGtleT5Qcm9ncmFtPC9rZXk+CisJPHN0cmluZz4vdXNyL2xvY2FsL2Jpbi9jaG1vZF9icGY8L3N0cmluZz4KKwk8a2V5PlByb2dyYW1Bcmd1bWVudHM8L2tleT4KKwk8YXJyYXk+CisJCTxzdHJpbmc+L3Vzci9sb2NhbC9iaW4vY2htb2RfYnBmPC9zdHJpbmc+CisJPC9hcnJheT4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdpbmcvcGNhcC5zcGVjIGIvcGFja2FnaW5nL3BjYXAuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmN2FiYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdpbmcvcGNhcC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotJWRlZmluZSBwcmVmaXggICAvdXNyCi0lZGVmaW5lIHZlcnNpb24gMC45LjQKLQotU3VtbWFyeTogcGFja2V0IGNhcHR1cmUgbGlicmFyeQotTmFtZTogbGlicGNhcAotVmVyc2lvbjogJXZlcnNpb24KLVJlbGVhc2U6IDEKLUdyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKLUNvcHlyaWdodDogQlNECi1Tb3VyY2U6IGxpYnBjYXAtMC45LjQudGFyLmd6Ci1CdWlsZFJvb3Q6IC90bXAvJXtuYW1lfS1idWlsZHJvb3QKLVVSTDogaHR0cDovL3d3dy50Y3BkdW1wLm9yZwotCi0lZGVzY3JpcHRpb24KLVBhY2tldC1jYXB0dXJlIGxpYnJhcnkgTElCUENBUCAwLjkuNAotTm93IG1haW50YWluZWQgYnkgIlRoZSBUY3BkdW1wIEdyb3VwIgotU2VlIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcKLVBsZWFzZSBzZW5kIGlucXVpcmllcy9jb21tZW50cy9yZXBvcnRzIHRvIHRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZwotCi0lcHJlcAotJXNldHVwCi0KLSVwb3N0Ci1sZGNvbmZpZwotCi0lYnVpbGQKLUNGTEFHUz0iJFJQTV9PUFRfRkxBR1MiIC4vY29uZmlndXJlIC0tcHJlZml4PSVwcmVmaXgKLW1ha2UKLQotJWluc3RhbGwKLXJtIC1yZiAkUlBNX0JVSUxEX1JPT1QKLW1rZGlyIC1wICRSUE1fQlVJTERfUk9PVC91c3Ive2xpYixpbmNsdWRlfQotbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UL3Vzci9zaGFyZS9tYW4KLW1rZGlyIC1wICRSUE1fQlVJTERfUk9PVC91c3IvaW5jbHVkZS9uZXQKLW1rZGlyIC1wICRSUE1fQlVJTERfUk9PVC91c3IvbWFuL21hbjMKLW1ha2UgaW5zdGFsbCBERVNURElSPSRSUE1fQlVJTERfUk9PVCBtYW5kaXI9L3Vzci9zaGFyZS9tYW4KLWNkICRSUE1fQlVJTERfUk9PVC91c3IvbGliCi1WMT1gZWNobyAwLjkuNCB8IHNlZCAncy9cXC5bXlwuXSokLy9nJ2AKLVYyPWBlY2hvIDAuOS40IHwgc2VkICdzL1xcLlteXC5dKlwuW15cLl0qJC8vZydgCi1sbiAtc2YgbGlicGNhcC5zby4wLjkuNCBsaWJwY2FwLnNvLiRWMQotaWYgdGVzdCAiJFYyIiAtbmUgIiRWMSI7IHRoZW4KLSAgICBsbiAtc2YgbGlicGNhcC5zby4kVjEgbGlicGNhcC5zby4kVjIKLSAgICBsbiAtc2YgbGlicGNhcC5zby4kVjIgbGlicGNhcC5zbwotZWxzZQotICAgIGxuIC1zZiBsaWJwY2FwLnNvLiRWMSBsaWJwY2FwLnNvCi1maQotCi0jaW5zdGFsbCAtbSA3NTUgLW8gcm9vdCBsaWJwY2FwLmEgJFJQTV9CVUlMRF9ST09UL3Vzci9saWIKLSNpbnN0YWxsIC1tIDY0NCAtbyByb290IHBjYXAuMyAkUlBNX0JVSUxEX1JPT1QvdXNyL21hbi9tYW4zCi0jaW5zdGFsbCAtbSA2NDQgLW8gcm9vdCBwY2FwLmggJFJQTV9CVUlMRF9ST09UL3Vzci9pbmNsdWRlCi0jaW5zdGFsbCAtbSA2NDQgLW8gcm9vdCBwY2FwLWJwZi5oICRSUE1fQlVJTERfUk9PVC91c3IvaW5jbHVkZS9uZXQKLSNpbnN0YWxsIC1tIDY0NCAtbyByb290IHBjYXAtbmFtZWRiLmggJFJQTV9CVUlMRF9ST09UL3Vzci9pbmNsdWRlCi0KLSVjbGVhbgotcm0gLXJmICRSUE1fQlVJTERfUk9PVAotCi0lZmlsZXMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWRvYyBMSUNFTlNFIENIQU5HRVMgSU5TVEFMTC50eHQgUkVBRE1FLmxpbnV4IFRPRE8gVkVSU0lPTiBDUkVESVRTIHBhY2thZ2luZy9wY2FwLnNwZWMKLS91c3IvbGliL2xpYnBjYXAuYQotL3Vzci9zaGFyZS9tYW4vbWFuMy8qCi0vdXNyL2luY2x1ZGUvcGNhcC5oCi0vdXNyL2luY2x1ZGUvcGNhcC1icGYuaAotL3Vzci9pbmNsdWRlL3BjYXAtbmFtZWRiLmgKLS91c3IvbGliL2xpYnBjYXAuc28qCmRpZmYgLS1naXQgYS9wYWNrYWdpbmcvcGNhcC5zcGVjLmluIGIvcGFja2FnaW5nL3BjYXAuc3BlYy5pbgppbmRleCAzODg0MjdlLi5mZjdiOTk2IDEwMDY0NAotLS0gYS9wYWNrYWdpbmcvcGNhcC5zcGVjLmluCisrKyBiL3BhY2thZ2luZy9wY2FwLnNwZWMuaW4KQEAgLTEsNjUgKzEsNzcgQEAKICVkZWZpbmUgcHJlZml4ICAgL3VzcgogJWRlZmluZSB2ZXJzaW9uIEBWRVJTSU9OQAogCi1TdW1tYXJ5OiBwYWNrZXQgY2FwdHVyZSBsaWJyYXJ5CitTdW1tYXJ5OiBBIHN5c3RlbS1pbmRlcGVuZGVudCBpbnRlcmZhY2UgZm9yIHVzZXItbGV2ZWwgcGFja2V0IGNhcHR1cmUKIE5hbWU6IGxpYnBjYXAKIFZlcnNpb246ICV2ZXJzaW9uCiBSZWxlYXNlOiAxCiBHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCi1Db3B5cmlnaHQ6IEJTRAorTGljZW5zZTogQlNEIHdpdGggYWR2ZXJ0aXNpbmcKIFNvdXJjZTogQE5BTUVALnRhci5negogQnVpbGRSb290OiAvdG1wLyV7bmFtZX0tYnVpbGRyb290CiBVUkw6IGh0dHA6Ly93d3cudGNwZHVtcC5vcmcKIAorU291cmNlOiBodHRwOi8vd3d3LnRjcGR1bXAub3JnL3JlbGVhc2UvJXtuYW1lfS0le3ZlcnNpb259LnRhci5negorCiAlZGVzY3JpcHRpb24KLVBhY2tldC1jYXB0dXJlIGxpYnJhcnkgTElCUENBUCBAVkVSU0lPTkAKLU5vdyBtYWludGFpbmVkIGJ5ICJUaGUgVGNwZHVtcCBHcm91cCIKLVNlZSBodHRwOi8vd3d3LnRjcGR1bXAub3JnCi1QbGVhc2Ugc2VuZCBpbnF1aXJpZXMvY29tbWVudHMvcmVwb3J0cyB0byB0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmcKK0xpYnBjYXAgcHJvdmlkZXMgYSBwb3J0YWJsZSBmcmFtZXdvcmsgZm9yIGxvdy1sZXZlbCBuZXR3b3JrCittb25pdG9yaW5nLiAgTGlicGNhcCBjYW4gcHJvdmlkZSBuZXR3b3JrIHN0YXRpc3RpY3MgY29sbGVjdGlvbiwKK3NlY3VyaXR5IG1vbml0b3JpbmcgYW5kIG5ldHdvcmsgZGVidWdnaW5nLiAgU2luY2UgYWxtb3N0IGV2ZXJ5IHN5c3RlbQordmVuZG9yIHByb3ZpZGVzIGEgZGlmZmVyZW50IGludGVyZmFjZSBmb3IgcGFja2V0IGNhcHR1cmUsIHRoZSBsaWJwY2FwCithdXRob3JzIGNyZWF0ZWQgdGhpcyBzeXN0ZW0taW5kZXBlbmRlbnQgQVBJIHRvIGVhc2UgaW4gcG9ydGluZyBhbmQgdG8KK2FsbGV2aWF0ZSB0aGUgbmVlZCBmb3Igc2V2ZXJhbCBzeXN0ZW0tZGVwZW5kZW50IHBhY2tldCBjYXB0dXJlIG1vZHVsZXMKK2luIGVhY2ggYXBwbGljYXRpb24uCiAKK0luc3RhbGwgbGlicGNhcCBpZiB5b3UgbmVlZCB0byBkbyBsb3ctbGV2ZWwgbmV0d29yayB0cmFmZmljIG1vbml0b3JpbmcKK29uIHlvdXIgbmV0d29yay4KKworJXBhY2thZ2UgZGV2ZWwKK1N1bW1hcnk6IExpYnJhcmllcyBhbmQgaGVhZGVyIGZpbGVzIGZvciB0aGUgbGlicGNhcCBsaWJyYXJ5CitHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCisKKyVkZXNjcmlwdGlvbiBkZXZlbAorTGlicGNhcCBwcm92aWRlcyBhIHBvcnRhYmxlIGZyYW1ld29yayBmb3IgbG93LWxldmVsIG5ldHdvcmsKK21vbml0b3JpbmcuICBMaWJwY2FwIGNhbiBwcm92aWRlIG5ldHdvcmsgc3RhdGlzdGljcyBjb2xsZWN0aW9uLAorc2VjdXJpdHkgbW9uaXRvcmluZyBhbmQgbmV0d29yayBkZWJ1Z2dpbmcuICBTaW5jZSBhbG1vc3QgZXZlcnkgc3lzdGVtCit2ZW5kb3IgcHJvdmlkZXMgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIGZvciBwYWNrZXQgY2FwdHVyZSwgdGhlIGxpYnBjYXAKK2F1dGhvcnMgY3JlYXRlZCB0aGlzIHN5c3RlbS1pbmRlcGVuZGVudCBBUEkgdG8gZWFzZSBpbiBwb3J0aW5nIGFuZCB0bworYWxsZXZpYXRlIHRoZSBuZWVkIGZvciBzZXZlcmFsIHN5c3RlbS1kZXBlbmRlbnQgcGFja2V0IGNhcHR1cmUgbW9kdWxlcworaW4gZWFjaCBhcHBsaWNhdGlvbi4KKworVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHRoZSBsaWJyYXJpZXMsIGluY2x1ZGUgZmlsZXMsIGFuZCBvdGhlciAKK3Jlc291cmNlcyBuZWVkZWQgZm9yIGRldmVsb3BpbmcgbGlicGNhcCBhcHBsaWNhdGlvbnMuCisgCiAlcHJlcAotJXNldHVwCi0KLSVwb3N0Ci1sZGNvbmZpZworJXNldHVwIC1xCiAKICVidWlsZAotQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyIgLi9jb25maWd1cmUgLS1wcmVmaXg9JXByZWZpeAotbWFrZQorZXhwb3J0IENGTEFHUz0iJFJQTV9PUFRfRkxBR1MgLWZuby1zdHJpY3QtYWxpYXNpbmciCislY29uZmlndXJlCittYWtlICV7P19zbXBfbWZsYWdzfQogCiAlaW5zdGFsbAogcm0gLXJmICRSUE1fQlVJTERfUk9PVAotbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UL3Vzci97bGliLGluY2x1ZGV9Ci1ta2RpciAtcCAkUlBNX0JVSUxEX1JPT1QvdXNyL3NoYXJlL21hbgotbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UL3Vzci9pbmNsdWRlL25ldAotbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UL3Vzci9tYW4vbWFuMwotbWFrZSBpbnN0YWxsIERFU1RESVI9JFJQTV9CVUlMRF9ST09UIG1hbmRpcj0vdXNyL3NoYXJlL21hbgotY2QgJFJQTV9CVUlMRF9ST09UL3Vzci9saWIKLVYxPWBlY2hvIEBWRVJTSU9OQCB8IHNlZCAncy9cXC5bXlwuXSokLy9nJ2AKLVYyPWBlY2hvIEBWRVJTSU9OQCB8IHNlZCAncy9cXC5bXlwuXSpcLlteXC5dKiQvL2cnYAotbG4gLXNmIGxpYnBjYXAuc28uQFZFUlNJT05AIGxpYnBjYXAuc28uJFYxCi1pZiB0ZXN0ICIkVjIiIC1uZSAiJFYxIjsgdGhlbgotICAgIGxuIC1zZiBsaWJwY2FwLnNvLiRWMSBsaWJwY2FwLnNvLiRWMgotICAgIGxuIC1zZiBsaWJwY2FwLnNvLiRWMiBsaWJwY2FwLnNvCi1lbHNlCi0gICAgbG4gLXNmIGxpYnBjYXAuc28uJFYxIGxpYnBjYXAuc28KLWZpCiAKLSNpbnN0YWxsIC1tIDc1NSAtbyByb290IGxpYnBjYXAuYSAkUlBNX0JVSUxEX1JPT1QvdXNyL2xpYgotI2luc3RhbGwgLW0gNjQ0IC1vIHJvb3QgcGNhcC4zICRSUE1fQlVJTERfUk9PVC91c3IvbWFuL21hbjMKLSNpbnN0YWxsIC1tIDY0NCAtbyByb290IHBjYXAuaCAkUlBNX0JVSUxEX1JPT1QvdXNyL2luY2x1ZGUKLSNpbnN0YWxsIC1tIDY0NCAtbyByb290IHBjYXAtYnBmLmggJFJQTV9CVUlMRF9ST09UL3Vzci9pbmNsdWRlL25ldAotI2luc3RhbGwgLW0gNjQ0IC1vIHJvb3QgcGNhcC1uYW1lZGIuaCAkUlBNX0JVSUxEX1JPT1QvdXNyL2luY2x1ZGUKK21ha2UgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QgaW5zdGFsbAogCiAlY2xlYW4KIHJtIC1yZiAkUlBNX0JVSUxEX1JPT1QKIAogJWZpbGVzCiAlZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkb2MgTElDRU5TRSBDSEFOR0VTIElOU1RBTEwudHh0IFJFQURNRS5saW51eCBUT0RPIFZFUlNJT04gQ1JFRElUUyBwYWNrYWdpbmcvcGNhcC5zcGVjCi0vdXNyL2xpYi9saWJwY2FwLmEKLS91c3Ivc2hhcmUvbWFuL21hbjMvKgotL3Vzci9pbmNsdWRlL3BjYXAuaAotL3Vzci9pbmNsdWRlL3BjYXAtYnBmLmgKLS91c3IvaW5jbHVkZS9wY2FwLW5hbWVkYi5oCi0vdXNyL2xpYi9saWJwY2FwLnNvKgorJWRvYyBMSUNFTlNFIFJFQURNRSBDSEFOR0VTIElOU1RBTEwudHh0IFJFQURNRS5saW51eCBUT0RPIFZFUlNJT04gQ1JFRElUUyBwYWNrYWdpbmcvcGNhcC5zcGVjCisle19saWJkaXJ9L2xpYnBjYXAuc28uKgorJXtfbWFuZGlyfS9tYW43L3BjYXAqLjcqCisKKyVmaWxlcyBkZXZlbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19iaW5kaXJ9L3BjYXAtY29uZmlnCisle19pbmNsdWRlZGlyfS9wY2FwLyouaAorJXtfaW5jbHVkZWRpcn0vcGNhcC5oCisle19pbmNsdWRlZGlyfS9wY2FwLWJwZi5oCisle19pbmNsdWRlZGlyfS9wY2FwLW5hbWVkYi5oCisle19saWJkaXJ9L2xpYnBjYXAuc28KKyV7X2xpYmRpcn0vbGlicGNhcC5hCisle19tYW5kaXJ9L21hbjEvcGNhcC1jb25maWcuMSoKKyV7X21hbmRpcn0vbWFuMy9wY2FwKi4zKgorJXtfbWFuZGlyfS9tYW41L3BjYXAqLjUqCmRpZmYgLS1naXQgYS9wY2FwLWJwZi5jIGIvcGNhcC1icGYuYwppbmRleCAwMjc5MTNlLi4yNTAyOThhIDEwMDY0NAotLS0gYS9wY2FwLWJwZi5jCisrKyBiL3BjYXAtYnBmLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqLwogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1icGYuYyx2IDEuODYuMi4xMiAyMDA3LzA2LzE1IDE3OjU3OjI3IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1icGYuYyx2IDEuMTE2IDIwMDgtMDktMTYgMTg6NDI6MjkgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtMjgsMTkgKzI4LDQwIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkJCS8qIG9wdGlvbmFsbHkgZ2V0IEJTRCBkZWZpbmUgKi8KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKy8qCisgKiA8bmV0L2JwZi5oPiBkZWZpbmVzIGlvY3RscywgYnV0IGRvZXNuJ3QgaW5jbHVkZSA8c3lzL2lvY2NvbS5oPi4KKyAqCisgKiBXZSBpbmNsdWRlIDxzeXMvaW9jdGwuaD4gYXMgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgaW9jdGwoKTsKKyAqIGF0IGxlYXN0IG9uICpCU0QgYW5kIE1hYyBPUyBYLCBpdCBhbHNvIGRlZmluZXMgdmFyaW91cyBTSU9DIGlvY3RscyAtCisgKiB3ZSBjb3VsZCBpbmNsdWRlIDxzeXMvc29ja2lvLmg+LCBidXQgaWYgd2UncmUgYWxyZWFkeSBpbmNsdWRpbmcKKyAqIDxzeXMvaW9jdGwuaD4sIHdoaWNoIGluY2x1ZGVzIDxzeXMvc29ja2lvLmg+IG9uIHRob3NlIHBsYXRmb3JtcywKKyAqIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gZG9pbmcgc28uCisgKgorICogSWYgd2UgaGF2ZSA8c3lzL2lvY2NvbS5oPiwgd2UgaW5jbHVkZSBpdCBhcyB3ZWxsLCB0byBoYW5kbGUgc3lzdGVtcworICogc3VjaCBhcyBTb2xhcmlzIHdoaWNoIGRvbid0IGFycmFuZ2UgdG8gaW5jbHVkZSA8c3lzL2lvY2NvbS5oPiBpZiB5b3UKKyAqIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorICovCiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaWZkZWYgSEFWRV9TWVNfSU9DQ09NX0gKKyNpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjZW5kaWYKICNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgogCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKyNpbmNsdWRlIDxtYWNoaW5lL2F0b21pYy5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxuZXQvaWYuaD4KIAogI2lmZGVmIF9BSVgKIAogLyoKLSAqIE1ha2UgInBjYXAuaCIgbm90IGluY2x1ZGUgInBjYXAtYnBmLmgiOyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZSB0aGUKKyAqIE1ha2UgInBjYXAuaCIgbm90IGluY2x1ZGUgInBjYXAvYnBmLmgiOyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZSB0aGUKICAqIG5hdGl2ZSBPUyB2ZXJzaW9uLCBhcyB3ZSBuZWVkICJzdHJ1Y3QgYnBmX2NvbmZpZyIgZnJvbSBpdC4KICAqLwogI2RlZmluZSBQQ0FQX0RPTlRfSU5DTFVERV9QQ0FQX0JQRl9ICkBAIC03OCw2ICs5OSw4IEBACiBzdGF0aWMgaW50IGJwZmxvYWRlZGZsYWcgPSAwOwogc3RhdGljIGludCBvZG1sb2NraWQgPSAwOwogCitzdGF0aWMgaW50IGJwZl9sb2FkKGNoYXIgKmVycmJ1Zik7CisKICNlbHNlIC8qIF9BSVggKi8KIAogI2luY2x1ZGUgPG5ldC9icGYuaD4KQEAgLTg1LDYgKzEwOCw3IEBACiAjZW5kaWYgLyogX0FJWCAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtOTIsMjIgKzExNiw2ODAgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaWZkZWYgSEFWRV9ORVRfSUZfTUVESUFfSAorIyBpbmNsdWRlIDxuZXQvaWZfbWVkaWEuaD4KKyNlbmRpZgogCi0jaWZkZWYgSEFWRV9EQUdfQVBJCi0jaW5jbHVkZSAicGNhcC1kYWcuaCIKLSNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KKyNpbmNsdWRlICJwY2FwLWludC5oIgogCiAjaWZkZWYgSEFWRV9PU19QUk9UT19ICiAjaW5jbHVkZSAib3MtcHJvdG8uaCIKICNlbmRpZgogCi0jaW5jbHVkZSAiZ2VuY29kZS5oIgkvKiBmb3IgIm5vX29wdGltaXplIiAqLworLyoKKyAqIExhdGVyIHZlcnNpb25zIG9mIE5ldEJTRCBzdGljayBwYWRkaW5nIGluIGZyb250IG9mIEZEREkgZnJhbWVzCisgKiB0byBhbGlnbiB0aGUgSVAgaGVhZGVyIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorICovCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSAmJiBfX05ldEJTRF9WZXJzaW9uX18gPiAxMDYwMDAwMDAKKyNkZWZpbmUgICAgICAgUENBUF9GRERJUEFEIDMKKyNlbmRpZgogCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gQlBGIGRldmljZXMuCisgKi8KK3N0cnVjdCBwY2FwX2JwZiB7CisjaWZkZWYgUENBUF9GRERJUEFECisJaW50IGZkZGlwYWQ7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJLyoKKwkgKiBaZXJvLWNvcHkgcmVhZCBidWZmZXIgLS0gZm9yIHplcm8tY29weSBCUEYuICAnYnVmZmVyJyBhYm92ZSB3aWxsCisJICogYWx0ZXJuYXRpdmUgYmV0d2VlbiB0aGVzZSB0d28gYWN0dWFsIG1tYXAnZCBidWZmZXJzIGFzIHJlcXVpcmVkLgorCSAqIEFzIHRoZXJlIGlzIGEgaGVhZGVyIG9uIHRoZSBmcm9udCBzaXplIG9mIHRoZSBtbWFwJ2QgYnVmZmVyLCBvbmx5CisJICogc29tZSBvZiB0aGUgYnVmZmVyIGlzIGV4cG9zZWQgdG8gbGlicGNhcCBhcyBhIHdob2xlIHZpYSBidWZzaXplOworCSAqIHpidWZzaXplIGlzIHRoZSB0cnVlIHNpemUuICB6YnVmZmVyIHRyYWNrcyB0aGUgY3VycmVudCB6YnVmCisJICogYXNzb2NhdGVkIHdpdGggYnVmZmVyIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIHRoZQorCSAqIG5leHQgYnVmZmVyIHRvIHJlYWQgd2lsbCBiZS4KKwkgKi8KKwl1X2NoYXIgKnpidWYxLCAqemJ1ZjIsICp6YnVmZmVyOworCXVfaW50IHpidWZzaXplOworCXVfaW50IHplcm9jb3B5OworCXVfaW50IGludGVycnVwdGVkOworCXN0cnVjdCB0aW1lc3BlYyBmaXJzdHNlbDsKKwkvKgorCSAqIElmIHRoZXJlJ3MgY3VycmVudGx5IGEgYnVmZmVyIGJlaW5nIGFjdGl2ZWx5IHByb2Nlc3NlZCwgdGhlbiBpdCBpcworCSAqIHJlZmVyZW5jZWQgaGVyZTsgJ2J1ZmZlcicgaXMgYWxzbyBwb2ludGVkIGF0IGl0LCBidXQgb2Zmc2V0IGJ5IHRoZQorCSAqIHNpemUgb2YgdGhlIGhlYWRlci4KKwkgKi8KKwlzdHJ1Y3QgYnBmX3pidWZfaGVhZGVyICpiemg7CisJaW50IG5vbmJsb2NrOwkJLyogdHJ1ZSBpZiBpbiBub25ibG9ja2luZyBtb2RlICovCisjZW5kaWYgLyogSEFWRV9aRVJPQ09QWV9CUEYgKi8KKworCWNoYXIgKmRldmljZTsJCS8qIGRldmljZSBuYW1lICovCisJaW50IGZpbHRlcmluZ19pbl9rZXJuZWw7IC8qIHVzaW5nIGtlcm5lbCBmaWx0ZXIgKi8KKwlpbnQgbXVzdF9kb19vbl9jbG9zZTsJLyogc3R1ZmYgd2UgbXVzdCBkbyB3aGVuIHdlIGNsb3NlICovCit9OworCisvKgorICogU3R1ZmYgdG8gZG8gd2hlbiB3ZSBjbG9zZS4KKyAqLworI2RlZmluZSBNVVNUX0NMRUFSX1JGTU9OCTB4MDAwMDAwMDEJLyogY2xlYXIgcmZtb24gKG1vbml0b3IpIG1vZGUgKi8KKworI2lmZGVmIEJJT0NHRExUTElTVAorIyBpZiAoZGVmaW5lZChIQVZFX05FVF9JRl9NRURJQV9IKSAmJiBkZWZpbmVkKElGTV9JRUVFODAyMTEpKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIEhBVkVfQlNEX0lFRUU4MDIxMQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkKK3N0YXRpYyBpbnQgZmluZF84MDJfMTEoc3RydWN0IGJwZl9kbHRsaXN0ICopOworCisjICBpZmRlZiBIQVZFX0JTRF9JRUVFODAyMTEKK3N0YXRpYyBpbnQgbW9uaXRvcl9tb2RlKHBjYXBfdCAqLCBpbnQpOworIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZChfX0FQUExFX18pCitzdGF0aWMgdm9pZCByZW1vdmVfZW4ocGNhcF90ICopOworc3RhdGljIHZvaWQgcmVtb3ZlXzgwMl8xMShwY2FwX3QgKik7CisjICBlbmRpZgorCisjIGVuZGlmIC8qIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkgKi8KKworI2VuZGlmIC8qIEJJT0NHRExUTElTVCAqLworCisjaWYgZGVmaW5lZChzdW4pICYmIGRlZmluZWQoTElGTkFNU0laKSAmJiBkZWZpbmVkKGxpZnJfem9uZWlkKQorI2luY2x1ZGUgPHpvbmUuaD4KKyNlbmRpZgorCisvKgorICogV2UgaW5jbHVkZSB0aGUgT1MncyA8bmV0L2JwZi5oPiwgbm90IG91ciAicGNhcC9icGYuaCIsIHNvIHdlIHByb2JhYmx5CisgKiBkb24ndCBnZXQgRExUX0RPQ1NJUyBkZWZpbmVkLgorICovCisjaWZuZGVmIERMVF9ET0NTSVMKKyNkZWZpbmUgRExUX0RPQ1NJUwkxNDMKKyNlbmRpZgorCisvKgorICogT24gT1MgWCwgd2UgZG9uJ3QgZXZlbiBnZXQgYW55IG9mIHRoZSA4MDIuMTEtcGx1cy1yYWRpby1oZWFkZXIgRExUXydzCisgKiBkZWZpbmVkLCBldmVuIHRob3VnaCBzb21lIG9mIHRoZW0gYXJlIHVzZWQgYnkgdmFyaW91cyBBaXJwb3J0IGRyaXZlcnMuCisgKi8KKyNpZm5kZWYgRExUX1BSSVNNX0hFQURFUgorI2RlZmluZSBETFRfUFJJU01fSEVBREVSCTExOQorI2VuZGlmCisjaWZuZGVmIERMVF9BSVJPTkVUX0hFQURFUgorI2RlZmluZSBETFRfQUlST05FVF9IRUFERVIJMTIwCisjZW5kaWYKKyNpZm5kZWYgRExUX0lFRUU4MDJfMTFfUkFESU8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTFfUkFESU8JMTI3CisjZW5kaWYKKyNpZm5kZWYgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTCisjZGVmaW5lIERMVF9JRUVFODAyXzExX1JBRElPX0FWUyAxNjMKKyNlbmRpZgorCitzdGF0aWMgaW50IHBjYXBfY2FuX3NldF9yZm1vbl9icGYocGNhcF90ICpwKTsKK3N0YXRpYyBpbnQgcGNhcF9hY3RpdmF0ZV9icGYocGNhcF90ICpwKTsKIHN0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfYnBmKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCk7CiBzdGF0aWMgaW50IHBjYXBfc2V0ZGlyZWN0aW9uX2JwZihwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7CiBzdGF0aWMgaW50IHBjYXBfc2V0X2RhdGFsaW5rX2JwZihwY2FwX3QgKnAsIGludCBkbHQpOwogCisvKgorICogRm9yIHplcm9jb3B5IGJwZiwgdGhlIHNldG5vbmJsb2NrL2dldG5vbmJsb2NrIHJvdXRpbmVzIG5lZWQgdG8gbW9kaWZ5CisgKiBwYi0+bm9uYmxvY2sgc28gd2UgZG9uJ3QgY2FsbCBzZWxlY3QoMikgaWYgdGhlIHBjYXAgaGFuZGxlIGlzIGluIG5vbi0KKyAqIGJsb2NraW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfZ2V0bm9uYmxvY2tfYnBmKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreyAKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCXN0cnVjdCBwY2FwX2JwZiAqcGIgPSBwLT5wcml2OworCisJaWYgKHBiLT56ZXJvY29weSkKKwkJcmV0dXJuIChwYi0+bm9uYmxvY2spOworI2VuZGlmCisJcmV0dXJuIChwY2FwX2dldG5vbmJsb2NrX2ZkKHAsIGVycmJ1ZikpOworfQorCitzdGF0aWMgaW50CitwY2FwX3NldG5vbmJsb2NrX2JwZihwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQoreyAgIAorI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJc3RydWN0IHBjYXBfYnBmICpwYiA9IHAtPnByaXY7CisKKwlpZiAocGItPnplcm9jb3B5KSB7CisJCXBiLT5ub25ibG9jayA9IG5vbmJsb2NrOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgorCXJldHVybiAocGNhcF9zZXRub25ibG9ja19mZChwLCBub25ibG9jaywgZXJyYnVmKSk7Cit9CisKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorLyoKKyAqIFplcm8tY29weSBCUEYgYnVmZmVyIHJvdXRpbmVzIHRvIGNoZWNrIGZvciBhbmQgYWNrbm93bGVkZ2UgQlBGIGRhdGEgaW4KKyAqIHNoYXJlZCBtZW1vcnkgYnVmZmVycy4KKyAqCisgKiBwY2FwX25leHRfemJ1Zl9zaG0oKTogQ2hlY2sgZm9yIGEgbmV3bHkgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgYnVmZmVyLAorICogYW5kIHNldCB1cCBwLT5idWZmZXIgYW5kIGNjIHRvIHJlZmxlY3Qgb25lIGlmIGF2YWlsYWJsZS4gIE5vdGljZSB0aGF0IGlmCisgKiB0aGVyZSB3YXMgbm8gcHJpb3IgYnVmZmVyLCB3ZSBzZWxlY3QgemJ1ZjEgYXMgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdAorICogYnVmZmVyIGZpbGxlZCBmb3IgYSBmcmVzaCBCUEYgc2Vzc2lvbi4KKyAqLworc3RhdGljIGludAorcGNhcF9uZXh0X3pidWZfc2htKHBjYXBfdCAqcCwgaW50ICpjYykKK3sKKwlzdHJ1Y3QgcGNhcF9icGYgKnBiID0gcC0+cHJpdjsKKwlzdHJ1Y3QgYnBmX3pidWZfaGVhZGVyICpiemg7CisKKwlpZiAocGItPnpidWZmZXIgPT0gcGItPnpidWYyIHx8IHBiLT56YnVmZmVyID09IE5VTEwpIHsKKwkJYnpoID0gKHN0cnVjdCBicGZfemJ1Zl9oZWFkZXIgKilwYi0+emJ1ZjE7CisJCWlmIChiemgtPmJ6aF91c2VyX2dlbiAhPQorCQkgICAgYXRvbWljX2xvYWRfYWNxX2ludCgmYnpoLT5iemhfa2VybmVsX2dlbikpIHsKKwkJCXBiLT5iemggPSBiemg7CisJCQlwYi0+emJ1ZmZlciA9ICh1X2NoYXIgKilwYi0+emJ1ZjE7CisJCQlwLT5idWZmZXIgPSBwYi0+emJ1ZmZlciArIHNpemVvZigqYnpoKTsKKwkJCSpjYyA9IGJ6aC0+YnpoX2tlcm5lbF9sZW47CisJCQlyZXR1cm4gKDEpOworCQl9CisJfSBlbHNlIGlmIChwYi0+emJ1ZmZlciA9PSBwYi0+emJ1ZjEpIHsKKwkJYnpoID0gKHN0cnVjdCBicGZfemJ1Zl9oZWFkZXIgKilwYi0+emJ1ZjI7CisJCWlmIChiemgtPmJ6aF91c2VyX2dlbiAhPQorCQkgICAgYXRvbWljX2xvYWRfYWNxX2ludCgmYnpoLT5iemhfa2VybmVsX2dlbikpIHsKKwkJCXBiLT5iemggPSBiemg7CisJCQlwYi0+emJ1ZmZlciA9ICh1X2NoYXIgKilwYi0+emJ1ZjI7CisgIAkJCXAtPmJ1ZmZlciA9IHBiLT56YnVmZmVyICsgc2l6ZW9mKCpiemgpOworCQkJKmNjID0gYnpoLT5iemhfa2VybmVsX2xlbjsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJKmNjID0gMDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcGNhcF9uZXh0X3pidWYoKSAtLSBTaW1pbGFyIHRvIHBjYXBfbmV4dF96YnVmX3NobSgpLCBleGNlcHQgd2FpdCB1c2luZworICogc2VsZWN0KCkgZm9yIGRhdGEgb3IgYSB0aW1lb3V0LCBhbmQgcG9zc2libHkgZm9yY2Ugcm90YXRpb24gb2YgdGhlIGJ1ZmZlcgorICogaW4gdGhlIGV2ZW50IHdlIHRpbWUgb3V0IG9yIGFyZSBpbiBpbW1lZGlhdGUgbW9kZS4gIEludm9rZSB0aGUgc2hhcmVkCisgKiBtZW1vcnkgY2hlY2sgYmVmb3JlIGRvaW5nIHN5c3RlbSBjYWxscyBpbiBvcmRlciB0byBhdm9pZCBkb2luZyBhdm9pZGFibGUKKyAqIHdvcmsuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfbmV4dF96YnVmKHBjYXBfdCAqcCwgaW50ICpjYykKK3sKKwlzdHJ1Y3QgcGNhcF9icGYgKnBiID0gcC0+cHJpdjsKKwlzdHJ1Y3QgYnBmX3pidWYgYno7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHRpbWVzcGVjIGN1cjsKKwlmZF9zZXQgcl9zZXQ7CisJaW50IGRhdGEsIHI7CisJaW50IGV4cGlyZSwgdG1vdXQ7CisKKyNkZWZpbmUgVFNUT01JTExJKHRzKSAoKCh0cyktPnR2X3NlYyAqIDEwMDApICsgKCh0cyktPnR2X25zZWMgLyAxMDAwMDAwKSkKKwkvKgorCSAqIFN0YXJ0IG91dCBieSBzZWVpbmcgd2hldGhlciBhbnl0aGluZyBpcyB3YWl0aW5nIGJ5IGNoZWNraW5nIHRoZQorCSAqIG5leHQgc2hhcmVkIG1lbW9yeSBidWZmZXIgZm9yIGRhdGEuCisJICovCisJZGF0YSA9IHBjYXBfbmV4dF96YnVmX3NobShwLCBjYyk7CisJaWYgKGRhdGEpCisJCXJldHVybiAoZGF0YSk7CisJLyoKKwkgKiBJZiBhIHByZXZpb3VzIHNsZWVwIHdhcyBpbnRlcnJ1cHRlZCBkdWUgdG8gc2lnbmFsIGRlbGl2ZXJ5LCBtYWtlCisJICogc3VyZSB0aGF0IHRoZSB0aW1lb3V0IGdldHMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuICBUaGlzIHJlcXVpcmVzCisJICogdGhhdCB3ZSBhbmFseXplIHdoZW4gdGhlIHRpbWVvdXQgc2hvdWxkIGJlIGJlZW4gZXhwaXJlZCwgYW5kCisJICogc3VidHJhY3QgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoYXQuICBJZiBhZnRlciB0aGlzIG9wZXJhdGlvbiwKKwkgKiBvdXIgdGltZW91dCBpcyBsZXNzIHRoZW4gb3IgZXF1YWwgdG8gemVybywgaGFuZGxlIGl0IGxpa2UgYQorCSAqIHJlZ3VsYXIgdGltZW91dC4KKwkgKi8KKwl0bW91dCA9IHAtPm9wdC50aW1lb3V0OworCWlmICh0bW91dCkKKwkJKHZvaWQpIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmY3VyKTsKKwlpZiAocGItPmludGVycnVwdGVkICYmIHAtPm9wdC50aW1lb3V0KSB7CisJCWV4cGlyZSA9IFRTVE9NSUxMSSgmcGItPmZpcnN0c2VsKSArIHAtPm9wdC50aW1lb3V0OworCQl0bW91dCA9IGV4cGlyZSAtIFRTVE9NSUxMSSgmY3VyKTsKKyN1bmRlZiBUU1RPTUlMTEkKKwkJaWYgKHRtb3V0IDw9IDApIHsKKwkJCXBiLT5pbnRlcnJ1cHRlZCA9IDA7CisJCQlkYXRhID0gcGNhcF9uZXh0X3pidWZfc2htKHAsIGNjKTsKKwkJCWlmIChkYXRhKQorCQkJCXJldHVybiAoZGF0YSk7CisJCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NST1RaQlVGLCAmYnopIDwgMCkgeworCQkJCSh2b2lkKSBzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJCSU9DUk9UWkJVRjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCQl9CisJCQlyZXR1cm4gKHBjYXBfbmV4dF96YnVmX3NobShwLCBjYykpOworCQl9CisJfQorCS8qCisJICogTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBzbyBtdXN0IHVzZSBzZWxlY3QoKSB0byB3YWl0IGZvciBkYXRhIG9yCisJICogdGhlIG5leHQgdGltZW91dC4gIE5vdGUgdGhhdCB3ZSBvbmx5IGNhbGwgc2VsZWN0IGlmIHRoZSBoYW5kbGUKKwkgKiBpcyBpbiBibG9ja2luZyBtb2RlLgorCSAqLworCWlmICghcGItPm5vbmJsb2NrKSB7CisJCUZEX1pFUk8oJnJfc2V0KTsKKwkJRkRfU0VUKHAtPmZkLCAmcl9zZXQpOworCQlpZiAodG1vdXQgIT0gMCkgeworCQkJdHYudHZfc2VjID0gdG1vdXQgLyAxMDAwOworCQkJdHYudHZfdXNlYyA9ICh0bW91dCAqIDEwMDApICUgMTAwMDAwMDsKKwkJfQorCQlyID0gc2VsZWN0KHAtPmZkICsgMSwgJnJfc2V0LCBOVUxMLCBOVUxMLAorCQkgICAgcC0+b3B0LnRpbWVvdXQgIT0gMCA/ICZ0diA6IE5VTEwpOworCQlpZiAociA8IDAgJiYgZXJybm8gPT0gRUlOVFIpIHsKKwkJCWlmICghcGItPmludGVycnVwdGVkICYmIHAtPm9wdC50aW1lb3V0KSB7CisJCQkJcGItPmludGVycnVwdGVkID0gMTsKKwkJCQlwYi0+Zmlyc3RzZWwgPSBjdXI7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgaWYgKHIgPCAwKSB7CisJCQkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJzZWxlY3Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisJcGItPmludGVycnVwdGVkID0gMDsKKwkvKgorCSAqIENoZWNrIGFnYWluIGZvciBkYXRhLCB3aGljaCBtYXkgZXhpc3Qgbm93IHRoYXQgd2UndmUgZWl0aGVyIGJlZW4KKwkgKiB3b2tlbiB1cCBhcyBhIHJlc3VsdCBvZiBkYXRhIG9yIHRpbWVkIG91dC4gIFRyeSB0aGUgInRoZXJlJ3MgZGF0YSIKKwkgKiBjYXNlIGZpcnN0IHNpbmNlIGl0IGRvZXNuJ3QgcmVxdWlyZSBhIHN5c3RlbSBjYWxsLgorCSAqLworCWRhdGEgPSBwY2FwX25leHRfemJ1Zl9zaG0ocCwgY2MpOworCWlmIChkYXRhKQorCQlyZXR1cm4gKGRhdGEpOworCS8qCisJICogVHJ5IGZvcmNpbmcgYSBidWZmZXIgcm90YXRpb24gdG8gZGlzbG9kZ2UgdGltZWQgb3V0IG9yIGltbWVkaWF0ZQorCSAqIGRhdGEuCisJICovCisJaWYgKGlvY3RsKHAtPmZkLCBCSU9DUk9UWkJVRiwgJmJ6KSA8IDApIHsKKwkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJCSU9DUk9UWkJVRjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKwlyZXR1cm4gKHBjYXBfbmV4dF96YnVmX3NobShwLCBjYykpOworfQorCisvKgorICogTm90aWZ5IGtlcm5lbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJ1ZmZlci4gIFdlIGRvbid0IHJlc2V0IHpidWZmZXIgc28KKyAqIHRoYXQgd2Uga25vdyB3aGljaCBidWZmZXIgdG8gdXNlIG5leHQgdGltZSBhcm91bmQuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfYWNrX3pidWYocGNhcF90ICpwKQoreworCXN0cnVjdCBwY2FwX2JwZiAqcGIgPSBwLT5wcml2OworCisJYXRvbWljX3N0b3JlX3JlbF9pbnQoJnBiLT5iemgtPmJ6aF91c2VyX2dlbiwKKwkgICAgcGItPmJ6aC0+YnpoX2tlcm5lbF9nZW4pOworCXBiLT5iemggPSBOVUxMOworCXAtPmJ1ZmZlciA9IE5VTEw7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBIQVZFX1pFUk9DT1BZX0JQRiAqLworCitwY2FwX3QgKgorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sKKwlwY2FwX3QgKnA7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9icGYpKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX2JwZjsKKwlwLT5jYW5fc2V0X3JmbW9uX29wID0gcGNhcF9jYW5fc2V0X3JmbW9uX2JwZjsKKwlyZXR1cm4gKHApOworfQorCisvKgorICogT24gc3VjY2VzcywgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBCUEYgZGV2aWNlLgorICogT24gZmFpbHVyZSwgcmV0dXJucyBhIFBDQVBfRVJST1JfIHZhbHVlLCBhbmQgc2V0cyBwLT5lcnJidWYuCisgKi8KK3N0YXRpYyBpbnQKK2JwZl9vcGVuKHBjYXBfdCAqcCkKK3sKKwlpbnQgZmQ7CisjaWZkZWYgSEFWRV9DTE9OSU5HX0JQRgorCXN0YXRpYyBjb25zdCBjaGFyIGRldmljZVtdID0gIi9kZXYvYnBmIjsKKyNlbHNlCisJaW50IG4gPSAwOworCWNoYXIgZGV2aWNlW3NpemVvZiAiL2Rldi9icGYwMDAwMDAwMDAwIl07CisjZW5kaWYKKworI2lmZGVmIF9BSVgKKwkvKgorCSAqIExvYWQgdGhlIGJwZiBkcml2ZXIsIGlmIGl0IGlzbid0IGFscmVhZHkgbG9hZGVkLAorCSAqIGFuZCBjcmVhdGUgdGhlIEJQRiBkZXZpY2UgZW50cmllcywgaWYgdGhleSBkb24ndAorCSAqIGFscmVhZHkgZXhpc3QuCisJICovCisJaWYgKGJwZl9sb2FkKHAtPmVycmJ1ZikgPT0gUENBUF9FUlJPUikKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DTE9OSU5HX0JQRgorCWlmICgoZmQgPSBvcGVuKGRldmljZSwgT19SRFdSKSkgPT0gLTEgJiYKKwkgICAgKGVycm5vICE9IEVBQ0NFUyB8fCAoZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFkpKSA9PSAtMSkpIHsKKwkJaWYgKGVycm5vID09IEVBQ0NFUykKKwkJCWZkID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJZWxzZQorCQkJZmQgPSBQQ0FQX0VSUk9SOworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgIihjYW5ub3Qgb3BlbiBkZXZpY2UpICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCX0KKyNlbHNlCisJLyoKKwkgKiBHbyB0aHJvdWdoIGFsbCB0aGUgbWlub3JzIGFuZCBmaW5kIG9uZSB0aGF0IGlzbid0IGluIHVzZS4KKwkgKi8KKwlkbyB7CisJCSh2b2lkKXNucHJpbnRmKGRldmljZSwgc2l6ZW9mKGRldmljZSksICIvZGV2L2JwZiVkIiwgbisrKTsKKwkJLyoKKwkJICogSW5pdGlhbGx5IHRyeSBhIHJlYWQvd3JpdGUgb3BlbiAodG8gYWxsb3cgdGhlIGluamVjdAorCQkgKiBtZXRob2QgdG8gd29yaykuICBJZiB0aGF0IGZhaWxzIGR1ZSB0byBwZXJtaXNzaW9uCisJCSAqIGlzc3VlcywgZmFsbCBiYWNrIHRvIHJlYWQtb25seS4gIFRoaXMgYWxsb3dzIGEKKwkJICogbm9uLXJvb3QgdXNlciB0byBiZSBncmFudGVkIHNwZWNpZmljIGFjY2VzcyB0byBwY2FwCisJCSAqIGNhcGFiaWxpdGllcyB2aWEgZmlsZSBwZXJtaXNzaW9ucy4KKwkJICoKKwkJICogWFhYIC0gd2Ugc2hvdWxkIGhhdmUgYW4gQVBJIHRoYXQgaGFzIGEgZmxhZyB0aGF0CisJCSAqIGNvbnRyb2xzIHdoZXRoZXIgdG8gb3BlbiByZWFkLW9ubHkgb3IgcmVhZC13cml0ZSwKKwkJICogc28gdGhhdCBkZW5pYWwgb2YgcGVybWlzc2lvbiB0byBzZW5kIChvciBpbmFiaWxpdHkKKwkJICogdG8gc2VuZCwgaWYgc2VuZGluZyBwYWNrZXRzIGlzbid0IHN1cHBvcnRlZCBvbgorCQkgKiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uKSBjYW4gYmUgaW5kaWNhdGVkIGF0IG9wZW4KKwkJICogdGltZS4KKwkJICovCisJCWZkID0gb3BlbihkZXZpY2UsIE9fUkRXUik7CisJCWlmIChmZCA9PSAtMSAmJiBlcnJubyA9PSBFQUNDRVMpCisJCQlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJfSB3aGlsZSAoZmQgPCAwICYmIGVycm5vID09IEVCVVNZKTsKKworCS8qCisJICogWFhYIGJldHRlciBtZXNzYWdlIGZvciBhbGwgbWlub3JzIHVzZWQKKwkgKi8KKwlpZiAoZmQgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVOT0VOVDoKKwkJCWZkID0gUENBUF9FUlJPUjsKKwkJCWlmIChuID09IDEpIHsKKwkJCQkvKgorCQkJCSAqIC9kZXYvYnBmMCBkb2Vzbid0IGV4aXN0LCB3aGljaAorCQkJCSAqIG1lYW5zIHdlIHByb2JhYmx5IGhhdmUgbm8gQlBGCisJCQkJICogZGV2aWNlcy4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICIodGhlcmUgYXJlIG5vIEJQRiBkZXZpY2VzKSIpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFdlIGdvdCBFQlVTWSBvbiBhdCBsZWFzdCBvbmUKKwkJCQkgKiBCUEYgZGV2aWNlLCBzbyB3ZSBoYXZlIEJQRgorCQkJCSAqIGRldmljZXMsIGJ1dCBhbGwgdGhlIG9uZXMKKwkJCQkgKiB0aGF0IGV4aXN0IGFyZSBidXN5LgorCQkJCSAqLworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIihhbGwgQlBGIGRldmljZXMgYXJlIGJ1c3kpIik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEVBQ0NFUzoKKwkJCS8qCisJCQkgKiBHb3QgRUFDQ0VTIG9uIHRoZSBsYXN0IGRldmljZSB3ZSB0cmllZCwKKwkJCSAqIGFuZCBFQlVTWSBvbiBhbGwgZGV2aWNlcyBiZWZvcmUgdGhhdCwKKwkJCSAqIGlmIGFueS4KKwkJCSAqLworCQkJZmQgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIoY2Fubm90IG9wZW4gQlBGIGRldmljZSkgJXM6ICVzIiwgZGV2aWNlLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogU29tZSBvdGhlciBwcm9ibGVtLgorCQkJICovCisJCQlmZCA9IFBDQVBfRVJST1I7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIihjYW5ub3Qgb3BlbiBCUEYgZGV2aWNlKSAlczogJXMiLCBkZXZpY2UsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiAoZmQpOworfQorCisjaWZkZWYgQklPQ0dETFRMSVNUCitzdGF0aWMgaW50CitnZXRfZGx0X2xpc3QoaW50IGZkLCBpbnQgdiwgc3RydWN0IGJwZl9kbHRsaXN0ICpiZGxwLCBjaGFyICplYnVmKQoreworCW1lbXNldChiZGxwLCAwLCBzaXplb2YoKmJkbHApKTsKKwlpZiAoaW9jdGwoZmQsIEJJT0NHRExUTElTVCwgKGNhZGRyX3QpYmRscCkgPT0gMCkgeworCQl1X2ludCBpOworCQlpbnQgaXNfZXRoZXJuZXQ7CisKKwkJYmRscC0+YmZsX2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAoYmRscC0+YmZsX2xlbiArIDEpKTsKKwkJaWYgKGJkbHAtPmJmbF9saXN0ID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQl9CisKKwkJaWYgKGlvY3RsKGZkLCBCSU9DR0RMVExJU1QsIChjYWRkcl90KWJkbHApIDwgMCkgeworCQkJKHZvaWQpc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiQklPQ0dETFRMSVNUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZyZWUoYmRscC0+YmZsX2xpc3QpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCisJCS8qCisJCSAqIE9LLCBmb3IgcmVhbCBFdGhlcm5ldCBkZXZpY2VzLCBhZGQgRExUX0RPQ1NJUyB0byB0aGUKKwkJICogbGlzdCwgc28gdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gbGV0IHlvdSBjaG9vc2UgaXQsCisJCSAqIGluIGNhc2UgeW91J3JlIGNhcHR1cmluZyBET0NTSVMgdHJhZmZpYyB0aGF0IGEgQ2lzY28KKwkJICogQ2FibGUgTW9kZW0gVGVybWluYXRpb24gU3lzdGVtIGlzIHB1dHRpbmcgb3V0IG9udG8KKwkJICogYW4gRXRoZXJuZXQgKGl0IGRvZXNuJ3QgcHV0IGFuIEV0aGVybmV0IGhlYWRlciBvbnRvCisJCSAqIHRoZSB3aXJlLCBpdCBwdXRzIHJhdyBET0NTSVMgZnJhbWVzIG91dCBvbiB0aGUgd2lyZQorCQkgKiBpbnNpZGUgdGhlIGxvdy1sZXZlbCBFdGhlcm5ldCBmcmFtaW5nKS4KKwkJICoKKwkJICogQSAicmVhbCBFdGhlcm5ldCBkZXZpY2UiIGlzIGRlZmluZWQgaGVyZSBhcyBhIGRldmljZQorCQkgKiB0aGF0IGhhcyBhIGxpbmstbGF5ZXIgdHlwZSBvZiBETFRfRU4xME1CIGFuZCB0aGF0IGhhcworCQkgKiBubyBhbHRlcm5hdGUgbGluay1sYXllciB0eXBlczsgdGhhdCdzIGRvbmUgdG8gZXhjbHVkZQorCQkgKiA4MDIuMTEgaW50ZXJmYWNlcyAod2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IGJlIHRoZQorCQkgKiByaWdodCB0aGluZyB0byBkbywgYnV0IEkgc3VzcGVjdCBpdCBpcyAtIEV0aGVybmV0IDwtPgorCQkgKiA4MDIuMTEgYnJpZGdlcyB3b3VsZCBwcm9iYWJseSBiYWRseSBtaXNoYW5kbGUgZnJhbWVzCisJCSAqIHRoYXQgZG9uJ3QgaGF2ZSBFdGhlcm5ldCBoZWFkZXJzKS4KKwkJICoKKwkJICogT24gU29sYXJpcyB3aXRoIEJQRiwgRXRoZXJuZXQgZGV2aWNlcyBhbHNvIG9mZmVyCisJCSAqIERMVF9JUE5FVCwgc28gd2UsIGlmIERMVF9JUE5FVCBpcyBkZWZpbmVkLCB3ZSBkb24ndAorCQkgKiB0cmVhdCBpdCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGRldmljZSBpc24ndCBhbgorCQkgKiBFdGhlcm5ldC4KKwkJICovCisJCWlmICh2ID09IERMVF9FTjEwTUIpIHsKKwkJCWlzX2V0aGVybmV0ID0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBiZGxwLT5iZmxfbGVuOyBpKyspIHsKKwkJCQlpZiAoYmRscC0+YmZsX2xpc3RbaV0gIT0gRExUX0VOMTBNQgorI2lmZGVmIERMVF9JUE5FVAorCQkJCSAgICAmJiBiZGxwLT5iZmxfbGlzdFtpXSAhPSBETFRfSVBORVQKKyNlbmRpZgorCQkJCSAgICApIHsKKwkJCQkJaXNfZXRoZXJuZXQgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXNfZXRoZXJuZXQpIHsKKwkJCQkvKgorCQkJCSAqIFdlIHJlc2VydmVkIG9uZSBtb3JlIHNsb3QgYXQgdGhlIGVuZCBvZgorCQkJCSAqIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWJkbHAtPmJmbF9saXN0W2JkbHAtPmJmbF9sZW5dID0gRExUX0RPQ1NJUzsKKwkJCQliZGxwLT5iZmxfbGVuKys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBFSU5WQUwganVzdCBtZWFucyAid2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGlvY3RsIG9uCisJCSAqIHRoaXMgZGV2aWNlIjsgZG9uJ3QgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCisJCSAqLworCQlpZiAoZXJybm8gIT0gRUlOVkFMKSB7CisJCQkodm9pZClzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJCSU9DR0RMVExJU1Q6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3BjYXBfY2FuX3NldF9yZm1vbl9icGYocGNhcF90ICpwKQoreworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorCXN0cnVjdCB1dHNuYW1lIG9zaW5mbzsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKyNpZmRlZiBCSU9DR0RMVExJU1QKKwlzdHJ1Y3QgYnBmX2RsdGxpc3QgYmRsOworI2VuZGlmCisKKwkvKgorCSAqIFRoZSBqb3lzIG9mIG1vbml0b3IgbW9kZSBvbiBPUyBYLgorCSAqCisJICogUHJpb3IgdG8gMTAuNCwgaXQncyBub3Qgc3VwcG9ydGVkIGF0IGFsbC4KKwkgKgorCSAqIEluIDEwLjQsIGlmIGFkYXB0ZXIgZW5OIHN1cHBvcnRzIG1vbml0b3IgbW9kZSwgdGhlcmUncyBhCisJICogd2x0TiBhZGFwdGVyIGNvcnJlc3BvbmRpbmcgdG8gaXQ7IHlvdSBvcGVuIGl0LCBpbnN0ZWFkIG9mCisJICogZW5OLCB0byBnZXQgbW9uaXRvciBtb2RlLiAgWW91IGdldCB3aGF0ZXZlciBsaW5rLWxheWVyCisJICogaGVhZGVycyBpdCBzdXBwbGllcy4KKwkgKgorCSAqIEluIDEwLjUsIGFuZCwgd2UgYXNzdW1lLCBsYXRlciByZWxlYXNlcywgaWYgYWRhcHRlciBlbk4KKwkgKiBzdXBwb3J0cyBtb25pdG9yIG1vZGUsIGl0IG9mZmVycywgYW1vbmcgaXRzIHNlbGVjdGFibGUKKwkgKiBETFRfIHZhbHVlcywgdmFsdWVzIHRoYXQgbGV0IHlvdSBnZXQgdGhlIDgwMi4xMSBoZWFkZXI7CisJICogc2VsZWN0aW5nIG9uZSBvZiB0aG9zZSB2YWx1ZXMgcHV0cyB0aGUgYWRhcHRlciBpbnRvIG1vbml0b3IKKwkgKiBtb2RlIChpLmUuLCB5b3UgY2FuJ3QgZ2V0IDgwMi4xMSBoZWFkZXJzIGV4Y2VwdCBpbiBtb25pdG9yCisJICogbW9kZSwgYW5kIHlvdSBjYW4ndCBnZXQgRXRoZXJuZXQgaGVhZGVycyBpbiBtb25pdG9yIG1vZGUpLgorCSAqLworCWlmICh1bmFtZSgmb3NpbmZvKSA9PSAtMSkgeworCQkvKgorCQkgKiBDYW4ndCBnZXQgdGhlIE9TIHZlcnNpb247IGp1c3Qgc2F5ICJubyIuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIFdlIGFzc3VtZSBvc2luZm8uc3lzbmFtZSBpcyAiRGFyd2luIiwgYmVjYXVzZQorCSAqIF9fQVBQTEVfXyBpcyBkZWZpbmVkLiAgV2UganVzdCBjaGVjayB0aGUgdmVyc2lvbi4KKwkgKi8KKwlpZiAob3NpbmZvLnJlbGVhc2VbMF0gPCAnOCcgJiYgb3NpbmZvLnJlbGVhc2VbMV0gPT0gJy4nKSB7CisJCS8qCisJCSAqIDEwLjMgKERhcndpbiA3LngpIG9yIGVhcmxpZXIuCisJCSAqIE1vbml0b3IgbW9kZSBub3Qgc3VwcG9ydGVkLgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKG9zaW5mby5yZWxlYXNlWzBdID09ICc4JyAmJiBvc2luZm8ucmVsZWFzZVsxXSA9PSAnLicpIHsKKwkJLyoKKwkJICogMTAuNCAoRGFyd2luIDgueCkuICBzL2VuL3dsdC8sIGFuZCBjaGVjaworCQkgKiB3aGV0aGVyIHRoZSBkZXZpY2UgZXhpc3RzLgorCQkgKi8KKwkJaWYgKHN0cm5jbXAocC0+b3B0LnNvdXJjZSwgImVuIiwgMikgIT0gMCkgeworCQkJLyoKKwkJCSAqIE5vdCBhbiBlbk4gZGV2aWNlOyBubyBtb25pdG9yIG1vZGUuCisJCQkgKi8KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJCWlmIChmZCA9PSAtMSkgeworCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgIndsdCIsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJc3RybGNhdChpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UgKyAyLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnIpIDwgMCkgeworCQkJLyoKKwkJCSAqIE5vIHN1Y2ggZGV2aWNlPworCQkJICovCisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKyNpZmRlZiBCSU9DR0RMVExJU1QKKwkvKgorCSAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyAxMC41IG9yIGxhdGVyOyBmb3IgdGhvc2UsCisJICogd2UganVzdCBvcGVuIHRoZSBlbk4gZGV2aWNlLCBhbmQgY2hlY2sgd2hldGhlcgorCSAqIHdlIGhhdmUgYW55IDgwMi4xMSBkZXZpY2VzLgorCSAqCisJICogRmlyc3QsIG9wZW4gYSBCUEYgZGV2aWNlLgorCSAqLworCWZkID0gYnBmX29wZW4ocCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIChmZCk7CS8qIGZkIGlzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlICovCisKKwkvKgorCSAqIE5vdyBiaW5kIHRvIHRoZSBkZXZpY2UuCisJICovCisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlpZiAoaW9jdGwoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVOWElPOgorCQkJLyoKKwkJCSAqIFRoZXJlJ3Mgbm8gc3VjaCBkZXZpY2UuCisJCQkgKi8KKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSk7CisKKwkJY2FzZSBFTkVURE9XTjoKKwkJCS8qCisJCQkgKiBSZXR1cm4gYSAibmV0d29yayBkb3duIiBpbmRpY2F0aW9uLCBzbyB0aGF0CisJCQkgKiB0aGUgYXBwbGljYXRpb24gY2FuIHJlcG9ydCB0aGF0IHJhdGhlciB0aGFuCisJCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkJICogc3VnZ2VzdCB0aGF0IHRoZXkgcmVwb3J0IGEgcHJvYmxlbSB0byB0aGUKKwkJCSAqIGxpYnBjYXAgZGV2ZWxvcGVycy4KKwkJCSAqLworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCk7CisKKwkJZGVmYXVsdDoKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiQklPQ1NFVElGOiAlczogJXMiLAorCQkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGRlZmF1bHQgbGluayB0eXBlIC0tIG5vdyBkZXRlcm1pbmUgYWxsIHRoZSBETFRzCisJICogdGhpcyBpbnRlcmZhY2Ugc3VwcG9ydHMuICBJZiB0aGlzIGZhaWxzIHdpdGggRUlOVkFMLCBpdCdzCisJICogbm90IGZhdGFsOyB3ZSBqdXN0IGRvbid0IGdldCB0byB1c2UgdGhlIGZlYXR1cmUgbGF0ZXIuCisJICogKFdlIGRvbid0IGNhcmUgYWJvdXQgRExUX0RPQ1NJUywgc28gd2UgcGFzcyBETFRfTlVMTAorCSAqIGFzIHRoZSBkZWZhdWx0IERMVCBmb3IgdGhpcyBhZGFwdGVyLikKKwkgKi8KKwlpZiAoZ2V0X2RsdF9saXN0KGZkLCBETFRfTlVMTCwgJmJkbCwgcC0+ZXJyYnVmKSA9PSBQQ0FQX0VSUk9SKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisJaWYgKGZpbmRfODAyXzExKCZiZGwpICE9IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYW4gODAyLjExIERMVCwgc28gd2UgY2FuIHNldCBtb25pdG9yIG1vZGUuCisJCSAqLworCQlmcmVlKGJkbC5iZmxfbGlzdCk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJZnJlZShiZGwuYmZsX2xpc3QpOworI2VuZGlmIC8qIEJJT0NHRExUTElTVCAqLworCXJldHVybiAoMCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkKKwlpbnQgcmV0OworCisJcmV0ID0gbW9uaXRvcl9tb2RlKHAsIDApOworCWlmIChyZXQgPT0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApCisJCXJldHVybiAoMCk7CS8qIG5vdCBhbiBlcnJvciwganVzdCBhICJjYW4ndCBkbyIgKi8KKwlpZiAocmV0ID09IDApCisJCXJldHVybiAoMSk7CS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gKHJldCk7CisjZWxzZQorCXJldHVybiAoMCk7CisjZW5kaWYKK30KKwogc3RhdGljIGludAogcGNhcF9zdGF0c19icGYocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykKIHsKQEAgLTEyOSwyNyArODExLDMwIEBACiAJaWYgKGlvY3RsKHAtPmZkLCBCSU9DR1NUQVRTLCAoY2FkZHJfdCkmcykgPCAwKSB7CiAJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NHU1RBVFM6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAJfQogCiAJcHMtPnBzX3JlY3YgPSBzLmJzX3JlY3Y7CiAJcHMtPnBzX2Ryb3AgPSBzLmJzX2Ryb3A7CisJcHMtPnBzX2lmZHJvcCA9IDA7CiAJcmV0dXJuICgwKTsKIH0KIAogc3RhdGljIGludAogcGNhcF9yZWFkX2JwZihwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQogeworCXN0cnVjdCBwY2FwX2JwZiAqcGIgPSBwLT5wcml2OwogCWludCBjYzsKIAlpbnQgbiA9IDA7CiAJcmVnaXN0ZXIgdV9jaGFyICpicCwgKmVwOwogCXVfY2hhciAqZGF0YXA7Ci0Jc3RydWN0IGJwZl9pbnNuICpmY29kZTsKICNpZmRlZiBQQ0FQX0ZERElQQUQKIAlyZWdpc3RlciBpbnQgcGFkOwogI2VuZGlmCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKwlpbnQgaTsKKyNlbmRpZgogCi0JZmNvZGUgPSBwLT5tZC51c2VfYnBmID8gTlVMTCA6IHAtPmZjb2RlLmJmX2luc25zOwogIGFnYWluOgogCS8qCiAJICogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8KQEAgLTE1NywxNSArODQyLDM2IEBACiAJaWYgKHAtPmJyZWFrX2xvb3ApIHsKIAkJLyoKIAkJICogWWVzIC0gY2xlYXIgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdAotCQkgKiBoYXMsIGFuZCByZXR1cm4gLTIgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3ZXJlCi0JCSAqIHRvbGQgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkgKiBoYXMsIGFuZCByZXR1cm4gUENBUF9FUlJPUl9CUkVBSyB0byBpbmRpY2F0ZQorCQkgKiB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCiAJCSAqLwogCQlwLT5icmVha19sb29wID0gMDsKLQkJcmV0dXJuICgtMik7CisJCXJldHVybiAoUENBUF9FUlJPUl9CUkVBSyk7CiAJfQogCWNjID0gcC0+Y2M7CiAJaWYgKHAtPmNjID09IDApIHsKLQkJY2MgPSByZWFkKHAtPmZkLCAoY2hhciAqKXAtPmJ1ZmZlciwgcC0+YnVmc2l6ZSk7CisJCS8qCisJCSAqIFdoZW4gcmVhZGluZyB3aXRob3V0IHplcm8tY29weSBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLCB3ZQorCQkgKiB1c2UgYSBzaW5nbGUgYnVmZmVyIGFuZCByZXR1cm4gYSBsZW5ndGggb2YgZGF0YSBpbiB0aGUKKwkJICogYnVmZmVyLiAgV2l0aCB6ZXJvLWNvcHksIHdlIHVwZGF0ZSB0aGUgcC0+YnVmZmVyIHBvaW50ZXIKKwkJICogdG8gcG9pbnQgYXQgd2hhdGV2ZXIgdW5kZXJseWluZyBidWZmZXIgY29udGFpbnMgdGhlIG5leHQKKwkJICogZGF0YSBhbmQgdXBkYXRlIGNjIHRvIHJlZmxlY3QgdGhlIGRhdGEgZm91bmQgaW4gdGhlCisJCSAqIGJ1ZmZlci4KKwkJICovCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKwkJaWYgKHBiLT56ZXJvY29weSkgeworCQkJaWYgKHAtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCXBjYXBfYWNrX3pidWYocCk7CisJCQlpID0gcGNhcF9uZXh0X3pidWYocCwgJmNjKTsKKwkJCWlmIChpID09IDApCisJCQkJZ290byBhZ2FpbjsKKwkJCWlmIChpIDwgMCkKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQljYyA9IHJlYWQocC0+ZmQsIChjaGFyICopcC0+YnVmZmVyLCBwLT5idWZzaXplKTsKKwkJfQogCQlpZiAoY2MgPCAwKSB7CiAJCQkvKiBEb24ndCBjaG9rZSB3aGVuIHdlIGdldCBwdHJhY2VkICovCiAJCQlzd2l0Y2ggKGVycm5vKSB7CkBAIC0xODAsMTYgKzg4NiwxNiBAQAogCQkJCSAqCiAJCQkJICogRm9yIHNvbWUgdW5rbm93biByZWFzb24gdGhlIHVpb21vdmUoKQogCQkJCSAqIG9wZXJhdGlvbiBpbiB0aGUgYnBmIGtlcm5lbCBleHRlbnNpb24KLQkJCQkgKiB1c2VkIHRvIGNvcHkgdGhlIGJ1ZmZlciBpbnRvIHVzZXIgCisJCQkJICogdXNlZCB0byBjb3B5IHRoZSBidWZmZXIgaW50byB1c2VyCiAJCQkJICogc3BhY2Ugc29tZXRpbWVzIHJldHVybnMgRUZBVUxULiBJIGhhdmUKIAkJCQkgKiBubyBpZGVhIHdoeSB0aGlzIGlzIHRoZSBjYXNlIGdpdmVuIHRoYXQKLQkJCQkgKiBhIGtlcm5lbCBkZWJ1Z2dlciBzaG93cyB0aGUgdXNlciBidWZmZXIgCi0JCQkJICogaXMgY29ycmVjdC4gVGhpcyBwcm9ibGVtIGFwcGVhcnMgdG8gCi0JCQkJICogYmUgbW9zdGx5IG1pdGlnYXRlZCBieSB0aGUgbWVtc2V0IG9mIAotCQkJCSAqIHRoZSBidWZmZXIgYmVmb3JlIGl0IGlzIGZpcnN0IHVzZWQuIAorCQkJCSAqIGEga2VybmVsIGRlYnVnZ2VyIHNob3dzIHRoZSB1c2VyIGJ1ZmZlcgorCQkJCSAqIGlzIGNvcnJlY3QuIFRoaXMgcHJvYmxlbSBhcHBlYXJzIHRvCisJCQkJICogYmUgbW9zdGx5IG1pdGlnYXRlZCBieSB0aGUgbWVtc2V0IG9mCisJCQkJICogdGhlIGJ1ZmZlciBiZWZvcmUgaXQgaXMgZmlyc3QgdXNlZC4KIAkJCQkgKiBWZXJ5IHN0cmFuZ2UuLi4uIFNoYXVuIENsb3dlcwogCQkJCSAqCi0JCQkJICogSW4gYW55IGNhc2UgdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZG4ndCAKKwkJCQkgKiBJbiBhbnkgY2FzZSB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkbid0CiAJCQkJICogdHJlYXQgRUZBVUxUIGFzIGEgZmF0YWwgZXJyb3I7IGFzIHdlCiAJCQkJICogZG9uJ3QgaGF2ZSBhbiBBUEkgZm9yIHJldHVybmluZwogCQkJCSAqIGEgInNvbWUgcGFja2V0cyB3ZXJlIGRyb3BwZWQgc2luY2UKQEAgLTE5NywxMSArOTAzLDI2IEBACiAJCQkJICogd2UganVzdCBpZ25vcmUgRUZBVUxUIGFuZCBrZWVwIHJlYWRpbmcuCiAJCQkJICovCiAJCQkJZ290byBhZ2FpbjsKLSNlbmRpZiAKLSAgCisjZW5kaWYKKwogCQkJY2FzZSBFV09VTERCTE9DSzoKIAkJCQlyZXR1cm4gKDApOwotI2lmIGRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChCU0QpCisKKwkJCWNhc2UgRU5YSU86CisJCQkJLyoKKwkJCQkgKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHdlJ3JlIGNhcHR1cmluZworCQkJCSAqIHdlbnQgYXdheS4KKwkJCQkgKgorCQkJCSAqIFhYWCAtIHdlIHNob3VsZCByZWFsbHkgcmV0dXJuCisJCQkJICogUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAsIGJ1dAorCQkJCSAqIHBjYXBfZGlzcGF0Y2goKSBldGMuIGFyZW4ndAorCQkJCSAqIGRlZmluZWQgdG8gcmV0dXIgdGhhdC4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJUaGUgaW50ZXJmYWNlIHdlbnQgZG93biIpOworCQkJCXJldHVybiAoUENBUF9FUlJPUik7CisKKyNpZiBkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoQlNEKSAmJiAhZGVmaW5lZChfX3N2cjRfXykgJiYgIWRlZmluZWQoX19TVlI0KQogCQkJLyoKIAkJCSAqIER1ZSB0byBhIFN1bk9TIGJ1ZywgYWZ0ZXIgMl4zMSBieXRlcywgdGhlIGtlcm5lbAogCQkJICogZmlsZSBvZmZzZXQgb3ZlcmZsb3dzIGFuZCByZWFkIGZhaWxzIHdpdGggRUlOVkFMLgpAQCAtMjE4LDcgKzkzOSw3IEBACiAJCQl9CiAJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWFkOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuICgtMSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CiAJCWJwID0gcC0+YnVmZmVyOwogCX0gZWxzZQpAQCAtMjM4LDIxICs5NTksMzYgQEAKIAkJLyoKIAkJICogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8KIAkJICogSWYgc28sIHJldHVybiBpbW1lZGlhdGVseSAtIGlmIHdlIGhhdmVuJ3QgcmVhZCBhbnkKLQkJICogcGFja2V0cywgY2xlYXIgdGhlIGZsYWcgYW5kIHJldHVybiAtMiB0byBpbmRpY2F0ZQotCQkgKiB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG90aGVyd2lzZQotCQkgKiBsZWF2ZSB0aGUgZmxhZyBzZXQsIHNvIHRoYXQgdGhlICpuZXh0KiBjYWxsIHdpbGwgYnJlYWsKLQkJICogb3V0IG9mIHRoZSBsb29wIHdpdGhvdXQgaGF2aW5nIHJlYWQgYW55IHBhY2tldHMsIGFuZAotCQkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzIHdlJ3ZlIHByb2Nlc3NlZCBzbyBmYXIuCisJCSAqIHBhY2tldHMsIGNsZWFyIHRoZSBmbGFnIGFuZCByZXR1cm4gUENBUF9FUlJPUl9CUkVBSworCQkgKiB0byBpbmRpY2F0ZSB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsCisJCSAqIG90aGVyd2lzZSBsZWF2ZSB0aGUgZmxhZyBzZXQsIHNvIHRoYXQgdGhlICpuZXh0KiBjYWxsCisJCSAqIHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdpdGhvdXQgaGF2aW5nIHJlYWQgYW55CisJCSAqIHBhY2tldHMsIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzIHdlJ3ZlCisJCSAqIHByb2Nlc3NlZCBzbyBmYXIuCiAJCSAqLwogCQlpZiAocC0+YnJlYWtfbG9vcCkgeworCQkJcC0+YnAgPSBicDsKKwkJCXAtPmNjID0gZXAgLSBicDsKKwkJCS8qCisJCQkgKiBlcCBpcyBzZXQgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBvZiByZWFkKCksCisJCQkgKiBidXQgcmVhZCgpIGZyb20gYSBCUEYgZGV2aWNlIGRvZXNuJ3QgbmVjZXNzYXJpbHkKKwkJCSAqIHJldHVybiBhIHZhbHVlIHRoYXQncyBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQKKwkJCSAqIHZhbHVlIGZvciBCUEZfV09SREFMSUdOKCkuICBIb3dldmVyLCB3aGVuZXZlciB3ZQorCQkJICogaW5jcmVtZW50IGJwLCB3ZSByb3VuZCB1cCB0aGUgaW5jcmVtZW50IHZhbHVlIGJ5CisJCQkgKiBhIHZhbHVlIHJvdW5kZWQgdXAgYnkgQlBGX1dPUkRBTElHTigpLCBzbyB3ZQorCQkJICogY291bGQgaW5jcmVtZW50IGJwIHBhc3QgZXAgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUKKwkJCSAqIGxhc3QgcGFja2V0IGluIHRoZSBidWZmZXIuCisJCQkgKgorCQkJICogV2UgdHJlYXQgZXAgPCBicCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhpcworCQkJICogaGFwcGVuZWQsIGFuZCBqdXN0IHNldCBwLT5jYyB0byAwLgorCQkJICovCisJCQlpZiAocC0+Y2MgPCAwKQorCQkJCXAtPmNjID0gMDsKIAkJCWlmIChuID09IDApIHsKIAkJCQlwLT5icmVha19sb29wID0gMDsKLQkJCQlyZXR1cm4gKC0yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcC0+YnAgPSBicDsKLQkJCQlwLT5jYyA9IGVwIC0gYnA7CisJCQkJcmV0dXJuIChQQ0FQX0VSUk9SX0JSRUFLKTsKKwkJCX0gZWxzZQogCQkJCXJldHVybiAobik7Ci0JCQl9CiAJCX0KIAogCQljYXBsZW4gPSBiaHAtPmJoX2NhcGxlbjsKQEAgLTI2MCw3ICs5OTYsOCBAQAogCQlkYXRhcCA9IGJwICsgaGRybGVuOwogCQkvKgogCQkgKiBTaG9ydC1jaXJjdWl0IGV2YWx1YXRpb246IGlmIHVzaW5nIEJQRiBmaWx0ZXIKLQkJICogaW4ga2VybmVsLCBubyBuZWVkIHRvIGRvIGl0IG5vdy4KKwkJICogaW4ga2VybmVsLCBubyBuZWVkIHRvIGRvIGl0IG5vdyAtIHdlIGFscmVhZHkga25vdworCQkgKiB0aGUgcGFja2V0IHBhc3NlZCB0aGUgZmlsdGVyLgogCQkgKgogI2lmZGVmIFBDQVBfRkRESVBBRAogCQkgKiBOb3RlOiB0aGUgZmlsdGVyIGNvZGUgd2FzIGdlbmVyYXRlZCBhc3N1bWluZwpAQCAtMjcwLDggKzEwMDcsOCBAQAogCQkgKiBza2lwcGluZyB0aGF0IHBhZGRpbmcuCiAjZW5kaWYKIAkJICovCi0JCWlmIChmY29kZSA9PSBOVUxMIHx8Ci0JCSAgICBicGZfZmlsdGVyKGZjb2RlLCBkYXRhcCwgYmhwLT5iaF9kYXRhbGVuLCBjYXBsZW4pKSB7CisJCWlmIChwYi0+ZmlsdGVyaW5nX2luX2tlcm5lbCB8fAorCQkgICAgYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgZGF0YXAsIGJocC0+YmhfZGF0YWxlbiwgY2FwbGVuKSkgewogCQkJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGhkcjsKIAogCQkJcGt0aGRyLnRzLnR2X3NlYyA9IGJocC0+YmhfdHN0YW1wLnR2X3NlYzsKQEAgLTMwMCw5ICsxMDM3LDE0IEBACiAjZW5kaWYKIAkJCSgqY2FsbGJhY2spKHVzZXIsICZwa3RoZHIsIGRhdGFwKTsKIAkJCWJwICs9IEJQRl9XT1JEQUxJR04oY2FwbGVuICsgaGRybGVuKTsKLQkJCWlmICgrK24gPj0gY250ICYmIGNudCA+IDApIHsKKwkJCWlmICgrK24gPj0gY250ICYmICFQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKGNudCkpIHsKIAkJCQlwLT5icCA9IGJwOwogCQkJCXAtPmNjID0gZXAgLSBicDsKKwkJCQkvKgorCQkJCSAqIFNlZSBjb21tZW50IGFib3ZlIGFib3V0IHAtPmNjIDwgMC4KKwkJCQkgKi8KKwkJCQlpZiAocC0+Y2MgPCAwKQorCQkJCQlwLT5jYyA9IDA7CiAJCQkJcmV0dXJuIChuKTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTM0OSw3ICsxMDkxLDcgQEAKIAkJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAic2VuZDogY2FuJ3QgdHVybiBvZmYgQklPQ1NIRFJDTVBMVDogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybiAoLTEpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJfQogCiAJCS8qCkBAIC0zNjEsMTMgKzExMDMsMTMgQEAKIAlpZiAocmV0ID09IC0xKSB7CiAJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAJfQogCXJldHVybiAocmV0KTsKIH0KIAogI2lmZGVmIF9BSVgKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBicGZfb2RtaW5pdChjaGFyICplcnJidWYpCiB7CiAJY2hhciAqZXJyc3RyOwpAQCAtMzc4LDcgKzExMjAsNyBAQAogCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiYnBmX2xvYWQ6IG9kbV9pbml0aWFsaXplIGZhaWxlZDogJXMiLAogCQkgICAgZXJyc3RyKTsKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAJfQogCiAJaWYgKChvZG1sb2NraWQgPSBvZG1fbG9jaygiL2V0Yy9vYmpyZXBvcy9jb25maWdfbG9jayIsIE9ETV9XQUlUKSkgPT0gLTEpIHsKQEAgLTM4NywzMyArMTEyOSwzOCBAQAogCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiYnBmX2xvYWQ6IG9kbV9sb2NrIG9mIC9ldGMvb2JqcmVwb3MvY29uZmlnX2xvY2sgZmFpbGVkOiAlcyIsCiAJCSAgICBlcnJzdHIpOwotCQlyZXR1cm4gKC0xKTsKKwkJKHZvaWQpb2RtX3Rlcm1pbmF0ZSgpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBicGZfb2RtY2xlYW51cChjaGFyICplcnJidWYpCiB7CiAJY2hhciAqZXJyc3RyOwogCiAJaWYgKG9kbV91bmxvY2sob2RtbG9ja2lkKSA9PSAtMSkgewotCQlpZiAob2RtX2Vycl9tc2cob2RtZXJybm8sICZlcnJzdHIpID09IC0xKQotCQkJZXJyc3RyID0gIlVua25vd24gZXJyb3IiOwotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgICAiYnBmX2xvYWQ6IG9kbV91bmxvY2sgZmFpbGVkOiAlcyIsCi0JCSAgICBlcnJzdHIpOwotCQlyZXR1cm4gKC0xKTsKKwkJaWYgKGVycmJ1ZiAhPSBOVUxMKSB7CisJCQlpZiAob2RtX2Vycl9tc2cob2RtZXJybm8sICZlcnJzdHIpID09IC0xKQorCQkJCWVycnN0ciA9ICJVbmtub3duIGVycm9yIjsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiYnBmX2xvYWQ6IG9kbV91bmxvY2sgZmFpbGVkOiAlcyIsCisJCQkgICAgZXJyc3RyKTsKKwkJfQorCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCWlmIChvZG1fdGVybWluYXRlKCkgPT0gLTEpIHsKLQkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKLQkJCWVycnN0ciA9ICJVbmtub3duIGVycm9yIjsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkgICAgImJwZl9sb2FkOiBvZG1fdGVybWluYXRlIGZhaWxlZDogJXMiLAotCQkgICAgZXJyc3RyKTsKLQkJcmV0dXJuICgtMSk7CisJCWlmIChlcnJidWYgIT0gTlVMTCkgeworCQkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKKwkJCQllcnJzdHIgPSAiVW5rbm93biBlcnJvciI7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImJwZl9sb2FkOiBvZG1fdGVybWluYXRlIGZhaWxlZDogJXMiLAorCQkJICAgIGVycnN0cik7CisJCX0KKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlyZXR1cm4gKDApOwpAQCAtNDM4LDE0ICsxMTg1LDE1IEBACiAJaWYgKGJwZmxvYWRlZGZsYWcpCiAJCXJldHVybiAoMCk7CiAKLQlpZiAoYnBmX29kbWluaXQoZXJyYnVmKSAhPSAwKQotCQlyZXR1cm4gKC0xKTsKKwlpZiAoYnBmX29kbWluaXQoZXJyYnVmKSA9PSBQQ0FQX0VSUk9SKQorCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCiAJbWFqb3IgPSBnZW5tYWpvcihCUEZfTkFNRSk7CiAJaWYgKG1ham9yID09IC0xKSB7CiAJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJicGZfbG9hZDogZ2VubWFqb3IgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7CisJCSh2b2lkKWJwZl9vZG1jbGVhbnVwKE5VTEwpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCW1pbm9ycyA9IGdldG1pbm9yKG1ham9yLCAmbnVtbWlub3JzLCBCUEZfTkFNRSk7CkBAIC00NTUsMTkgKzEyMDMsMjAgQEAKIAkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiYnBmX2xvYWQ6IGdlbm1pbm9yIGZhaWxlZDogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybiAoLTEpOworCQkJKHZvaWQpYnBmX29kbWNsZWFudXAoTlVMTCk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CiAJfQogCi0JaWYgKGJwZl9vZG1jbGVhbnVwKGVycmJ1ZikpCi0JCXJldHVybiAoLTEpOworCWlmIChicGZfb2RtY2xlYW51cChlcnJidWYpID09IFBDQVBfRVJST1IpCisJCXJldHVybiAoUENBUF9FUlJPUik7CiAKIAlyYyA9IHN0YXQoQlBGX05PREUgIjAiLCAmc2J1Zik7CiAJaWYgKHJjID09IC0xICYmIGVycm5vICE9IEVOT0VOVCkgewogCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiYnBmX2xvYWQ6IGNhbid0IHN0YXQgJXM6ICVzIiwKIAkJICAgIEJQRl9OT0RFICIwIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlpZiAocmMgPT0gLTEgfHwgZ2V0bWFqb3Ioc2J1Zi5zdF9yZGV2KSAhPSBtYWpvcikgewpAQCAtNDc4LDcgKzEyMjcsNyBAQAogCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgImJwZl9sb2FkOiBjYW4ndCBta25vZCAlczogJXMiLAogCQkJCSAgICBidWYsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQkJfQogCQl9CiAJfQpAQCAtNDk0LDcgKzEyNDMsNyBAQAogCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJicGZfbG9hZDogY291bGQgbm90IGxvYWQgZHJpdmVyOiAlcyIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybiAoLTEpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJfQogCX0KIApAQCAtNTAyLDE5MCArMTI1MSw1NzAgQEAKIAljZmdfa20uY21kID0gQ0ZHX0lOSVQ7CiAJY2ZnX2ttLmttaWQgPSBjZmdfbGQua21pZDsKIAljZmdfa20ubWRpbGVuID0gc2l6ZW9mKGNmZ19icGYpOwotCWNmZ19rbS5tZGlwdHIgPSAodm9pZCAqKSZjZmdfYnBmOyAKKwljZmdfa20ubWRpcHRyID0gKHZvaWQgKikmY2ZnX2JwZjsKIAlmb3IgKGkgPSAwOyBpIDwgQlBGX01JTk9SUzsgaSsrKSB7CiAJCWNmZ19icGYuZGV2bm8gPSBkb21ha2VkZXYobWFqb3IsIGkpOwogCQlpZiAoc3lzY29uZmlnKFNZU19DRkdLTU9ELCAodm9pZCAqKSZjZmdfa20sIHNpemVvZihjZmdfa20pKSA9PSAtMSkgewogCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJicGZfbG9hZDogY291bGQgbm90IGNvbmZpZ3VyZSBkcml2ZXI6ICVzIiwKIAkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuICgtMSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CiAJfQotCQorCiAJYnBmbG9hZGVkZmxhZyA9IDE7CiAKIAlyZXR1cm4gKDApOwogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1icGZfb3BlbihwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKKy8qCisgKiBUdXJuIG9mZiByZm1vbiBtb2RlIGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIHZvaWQKK3BjYXBfY2xlYW51cF9icGYocGNhcF90ICpwKQogewotCWludCBmZDsKLSNpZmRlZiBIQVZFX0NMT05JTkdfQlBGCi0Jc3RhdGljIGNvbnN0IGNoYXIgZGV2aWNlW10gPSAiL2Rldi9icGYiOwotI2Vsc2UKLQlpbnQgbiA9IDA7Ci0JY2hhciBkZXZpY2Vbc2l6ZW9mICIvZGV2L2JwZjAwMDAwMDAwMDAiXTsKKwlzdHJ1Y3QgcGNhcF9icGYgKnBiID0gcC0+cHJpdjsKKyNpZmRlZiBIQVZFX0JTRF9JRUVFODAyMTEKKwlpbnQgc29jazsKKwlzdHJ1Y3QgaWZtZWRpYXJlcSByZXE7CisJc3RydWN0IGlmcmVxIGlmcjsKICNlbmRpZgogCi0jaWZkZWYgX0FJWAotCS8qCi0JICogTG9hZCB0aGUgYnBmIGRyaXZlciwgaWYgaXQgaXNuJ3QgYWxyZWFkeSBsb2FkZWQsCi0JICogYW5kIGNyZWF0ZSB0aGUgQlBGIGRldmljZSBlbnRyaWVzLCBpZiB0aGV5IGRvbid0Ci0JICogYWxyZWFkeSBleGlzdC4KLQkgKi8KLQlpZiAoYnBmX2xvYWQoZXJyYnVmKSA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ0xPTklOR19CUEYKLQlpZiAoKGZkID0gb3BlbihkZXZpY2UsIE9fUkRXUikpID09IC0xICYmCi0JICAgIChlcnJubyAhPSBFQUNDRVMgfHwgKGZkID0gb3BlbihkZXZpY2UsIE9fUkRPTkxZKSkgPT0gLTEpKQotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgIihjYW5ub3Qgb3BlbiBkZXZpY2UpICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotI2Vsc2UKLQkvKgotCSAqIEdvIHRocm91Z2ggYWxsIHRoZSBtaW5vcnMgYW5kIGZpbmQgb25lIHRoYXQgaXNuJ3QgaW4gdXNlLgotCSAqLwotCWRvIHsKLQkJKHZvaWQpc25wcmludGYoZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgIi9kZXYvYnBmJWQiLCBuKyspOworCWlmIChwYi0+bXVzdF9kb19vbl9jbG9zZSAhPSAwKSB7CiAJCS8qCi0JCSAqIEluaXRpYWxseSB0cnkgYSByZWFkL3dyaXRlIG9wZW4gKHRvIGFsbG93IHRoZSBpbmplY3QKLQkJICogbWV0aG9kIHRvIHdvcmspLiAgSWYgdGhhdCBmYWlscyBkdWUgdG8gcGVybWlzc2lvbgotCQkgKiBpc3N1ZXMsIGZhbGwgYmFjayB0byByZWFkLW9ubHkuICBUaGlzIGFsbG93cyBhCi0JCSAqIG5vbi1yb290IHVzZXIgdG8gYmUgZ3JhbnRlZCBzcGVjaWZpYyBhY2Nlc3MgdG8gcGNhcAotCQkgKiBjYXBhYmlsaXRpZXMgdmlhIGZpbGUgcGVybWlzc2lvbnMuCi0JCSAqCi0JCSAqIFhYWCAtIHdlIHNob3VsZCBoYXZlIGFuIEFQSSB0aGF0IGhhcyBhIGZsYWcgdGhhdAotCQkgKiBjb250cm9scyB3aGV0aGVyIHRvIG9wZW4gcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUsCi0JCSAqIHNvIHRoYXQgZGVuaWFsIG9mIHBlcm1pc3Npb24gdG8gc2VuZCAob3IgaW5hYmlsaXR5Ci0JCSAqIHRvIHNlbmQsIGlmIHNlbmRpbmcgcGFja2V0cyBpc24ndCBzdXBwb3J0ZWQgb24KLQkJICogdGhlIGRldmljZSBpbiBxdWVzdGlvbikgY2FuIGJlIGluZGljYXRlZCBhdCBvcGVuCi0JCSAqIHRpbWUuCisJCSAqIFRoZXJlJ3Mgc29tZXRoaW5nIHdlIGhhdmUgdG8gZG8gd2hlbiBjbG9zaW5nIHRoaXMKKwkJICogcGNhcF90LgogCQkgKi8KLQkJZmQgPSBvcGVuKGRldmljZSwgT19SRFdSKTsKLQkJaWYgKGZkID09IC0xICYmIGVycm5vID09IEVBQ0NFUykKLQkJCWZkID0gb3BlbihkZXZpY2UsIE9fUkRPTkxZKTsKLQl9IHdoaWxlIChmZCA8IDAgJiYgZXJybm8gPT0gRUJVU1kpOworI2lmZGVmIEhBVkVfQlNEX0lFRUU4MDIxMQorCQlpZiAocGItPm11c3RfZG9fb25fY2xvc2UgJiBNVVNUX0NMRUFSX1JGTU9OKSB7CisJCQkvKgorCQkJICogV2UgcHV0IHRoZSBpbnRlcmZhY2UgaW50byByZm1vbiBtb2RlOworCQkJICogdGFrZSBpdCBvdXQgb2YgcmZtb24gbW9kZS4KKwkJCSAqCisJCQkgKiBYWFggLSBpZiBzb21lYm9keSBlbHNlIHdhbnRzIGl0IGluIHJmbW9uCisJCQkgKiBtb2RlLCB0aGlzIGNvZGUgY2Fubm90IGtub3cgdGhhdCwgc28gaXQnbGwgdGFrZQorCQkJICogaXQgb3V0IG9mIHJmbW9uIG1vZGUuCisJCQkgKi8KKwkJCXNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJCQlpZiAoc29jayA9PSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQ2FuJ3QgcmVzdG9yZSBpbnRlcmZhY2UgZmxhZ3MgKHNvY2tldCgpIGZhaWxlZDogJXMpLlxuIgorCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgeworCQkJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJCQkJc3RybmNweShyZXEuaWZtX25hbWUsIHBiLT5kZXZpY2UsCisJCQkJICAgIHNpemVvZihyZXEuaWZtX25hbWUpKTsKKwkJCQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRk1FRElBLCAmcmVxKSA8IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSAgICAiQ2FuJ3QgcmVzdG9yZSBpbnRlcmZhY2UgZmxhZ3MgKFNJT0NHSUZNRURJQSBmYWlsZWQ6ICVzKS5cbiIKKwkJCQkJICAgICJQbGVhc2UgYWRqdXN0IG1hbnVhbGx5LlxuIiwKKwkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHJlcS5pZm1fY3VycmVudCAmIElGTV9JRUVFODAyMTFfTU9OSVRPUikgeworCQkJCQkJLyoKKwkJCQkJCSAqIFJmbW9uIG1vZGUgaXMgY3VycmVudGx5IG9uOworCQkJCQkJICogdHVybiBpdCBvZmYuCisJCQkJCQkgKi8KKwkJCQkJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCQkJCQkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwKKwkJCQkJCSAgICBwYi0+ZGV2aWNlLAorCQkJCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCQkJCWlmci5pZnJfbWVkaWEgPQorCQkJCQkJICAgIHJlcS5pZm1fY3VycmVudCAmIH5JRk1fSUVFRTgwMjExX01PTklUT1I7CisJCQkJCQlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRk1FRElBLAorCQkJCQkJICAgICZpZnIpID09IC0xKSB7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSBmbGFncyAoU0lPQ1NJRk1FRElBIGZhaWxlZDogJXMpLlxuIgorCQkJCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIsCisJCQkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJY2xvc2Uoc29jayk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBIQVZFX0JTRF9JRUVFODAyMTEgKi8KIAotCS8qCi0JICogWFhYIGJldHRlciBtZXNzYWdlIGZvciBhbGwgbWlub3JzIHVzZWQKLQkgKi8KLQlpZiAoZmQgPCAwKQotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIobm8gZGV2aWNlcyBmb3VuZCkgJXM6ICVzIiwKLQkJICAgIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkvKgorCQkgKiBUYWtlIHRoaXMgcGNhcCBvdXQgb2YgdGhlIGxpc3Qgb2YgcGNhcHMgZm9yIHdoaWNoIHdlCisJCSAqIGhhdmUgdG8gdGFrZSB0aGUgaW50ZXJmYWNlIG91dCBvZiBzb21lIG1vZGUuCisJCSAqLworCQlwY2FwX3JlbW92ZV9mcm9tX3BjYXBzX3RvX2Nsb3NlKHApOworCQlwYi0+bXVzdF9kb19vbl9jbG9zZSA9IDA7CisJfQorCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKwlpZiAocGItPnplcm9jb3B5KSB7CisJCS8qCisJCSAqIERlbGV0ZSB0aGUgbWFwcGluZ3MuICBOb3RlIHRoYXQgcC0+YnVmZmVyIGdldHMKKwkJICogaW5pdGlhbGl6ZWQgdG8gb25lIG9mIHRoZSBtbWFwcGVkIHJlZ2lvbnMgaW4KKwkJICogdGhpcyBjYXNlLCBzbyBkbyBub3QgdHJ5IGFuZCBmcmVlIGl0IGRpcmVjdGx5OworCQkgKiBudWxsIGl0IG91dCBzbyB0aGF0IHBjYXBfY2xlYW51cF9saXZlX2NvbW1vbigpCisJCSAqIGRvZXNuJ3QgdHJ5IHRvIGZyZWUgaXQuCisJCSAqLworCQlpZiAocGItPnpidWYxICE9IE1BUF9GQUlMRUQgJiYgcGItPnpidWYxICE9IE5VTEwpCisJCQkodm9pZCkgbXVubWFwKHBiLT56YnVmMSwgcGItPnpidWZzaXplKTsKKwkJaWYgKHBiLT56YnVmMiAhPSBNQVBfRkFJTEVEICYmIHBiLT56YnVmMiAhPSBOVUxMKQorCQkJKHZvaWQpIG11bm1hcChwYi0+emJ1ZjIsIHBiLT56YnVmc2l6ZSk7CisJCXAtPmJ1ZmZlciA9IE5VTEw7CisJfQorI2VuZGlmCisJaWYgKHBiLT5kZXZpY2UgIT0gTlVMTCkgeworCQlmcmVlKHBiLT5kZXZpY2UpOworCQlwYi0+ZGV2aWNlID0gTlVMTDsKKwl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworfQorCitzdGF0aWMgaW50CitjaGVja19zZXRpZl9mYWlsdXJlKHBjYXBfdCAqcCwgaW50IGVycm9yKQoreworI2lmZGVmIF9fQVBQTEVfXworCWludCBmZDsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBlcnI7CiAjZW5kaWYKIAotCXJldHVybiAoZmQpOworCWlmIChlcnJvciA9PSBFTlhJTykgeworCQkvKgorCQkgKiBObyBzdWNoIGRldmljZSBleGlzdHMuCisJCSAqLworI2lmZGVmIF9fQVBQTEVfXworCQlpZiAocC0+b3B0LnJmbW9uICYmIHN0cm5jbXAocC0+b3B0LnNvdXJjZSwgIndsdCIsIDMpID09IDApIHsKKwkJCS8qCisJCQkgKiBNb25pdG9yIG1vZGUgd2FzIHJlcXVlc3RlZCwgYW5kIHdlJ3JlIHRyeWluZworCQkJICogdG8gb3BlbiBhICJ3bHROIiBkZXZpY2UuICBBc3N1bWUgdGhhdCB0aGlzCisJCQkgKiBpcyAxMC40IGFuZCB0aGF0IHdlIHdlcmUgYXNrZWQgdG8gb3BlbiBhbgorCQkJICogImVuTiIgZGV2aWNlOyBpZiB0aGF0IGRldmljZSBleGlzdHMsIHJldHVybgorCQkJICogIm1vbml0b3IgbW9kZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UiLgorCQkJICovCisJCQlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJCWlmIChmZCAhPSAtMSkgeworCQkJCXN0cmxjcHkoaWZyLmlmcl9uYW1lLCAiZW4iLAorCQkJCSAgICBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCQkJc3RybGNhdChpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UgKyAzLAorCQkJCSAgICBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCQkJaWYgKGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmcikgPCAwKSB7CisJCQkJCS8qCisJCQkJCSAqIFdlIGFzc3VtZSB0aGlzIGZhaWxlZCBiZWNhdXNlCisJCQkJCSAqIHRoZSB1bmRlcmx5aW5nIGRldmljZSBkb2Vzbid0CisJCQkJCSAqIGV4aXN0LgorCQkJCQkgKi8KKwkJCQkJZXJyID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwkJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgICAgIlNJT0NHSUZGTEFHUyBvbiAlcyBmYWlsZWQ6ICVzIiwKKwkJCQkJICAgIGlmci5pZnJfbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSB1bmRlcmx5aW5nICJlbk4iIGRldmljZQorCQkJCQkgKiBleGlzdHMsIGJ1dCB0aGVyZSdzIG5vCisJCQkJCSAqIGNvcnJlc3BvbmRpbmcgIndsdE4iIGRldmljZTsKKwkJCQkJICogdGhhdCBtZWFucyB0aGF0IHRoZSAiZW5OIgorCQkJCQkgKiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0CisJCQkJCSAqIG1vbml0b3IgbW9kZSwgcHJvYmFibHkgYmVjYXVzZQorCQkJCQkgKiBpdCdzIGFuIEV0aGVybmV0IGRldmljZSByYXRoZXIKKwkJCQkJICogdGhhbiBhIHdpcmVsZXNzIGRldmljZS4KKwkJCQkJICovCisJCQkJCWVyciA9IFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCQkJCX0KKwkJCQljbG9zZShmZCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogV2UgY2FuJ3QgZmluZCBvdXQgd2hldGhlciB0aGVyZSdzCisJCQkJICogYW4gdW5kZXJseWluZyAiZW5OIiBkZXZpY2UsIHNvCisJCQkJICoganVzdCByZXBvcnQgIm5vIHN1Y2ggZGV2aWNlIi4KKwkJCQkgKi8KKwkJCQllcnIgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgInNvY2tldCgpIGZhaWxlZDogJXMiLAorCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlyZXR1cm4gKGVycik7CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKiBObyBzdWNoIGRldmljZS4KKwkJICovCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRJRiBmYWlsZWQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKKwl9IGVsc2UgaWYgKGVycm5vID09IEVORVRET1dOKSB7CisJCS8qCisJCSAqIFJldHVybiBhICJuZXR3b3JrIGRvd24iIGluZGljYXRpb24sIHNvIHRoYXQKKwkJICogdGhlIGFwcGxpY2F0aW9uIGNhbiByZXBvcnQgdGhhdCByYXRoZXIgdGhhbgorCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkgKiBzdWdnZXN0IHRoYXQgdGhleSByZXBvcnQgYSBwcm9ibGVtIHRvIHRoZQorCQkgKiBsaWJwY2FwIGRldmVsb3BlcnMuCisJCSAqLworCQlyZXR1cm4gKFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTb21lIG90aGVyIGVycm9yOyBmaWxsIGluIHRoZSBlcnJvciBzdHJpbmcsIGFuZAorCQkgKiByZXR1cm4gUENBUF9FUlJPUi4KKwkJICovCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRJRjogJXM6ICVzIiwKKwkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CiB9CiAKIC8qCi0gKiBXZSBpbmNsdWRlIHRoZSBPUydzIDxuZXQvYnBmLmg+LCBub3Qgb3VyICJwY2FwLWJwZi5oIiwgc28gd2UgcHJvYmFibHkKLSAqIGRvbid0IGdldCBETFRfRE9DU0lTIGRlZmluZWQuCisgKiBEZWZhdWx0IGNhcHR1cmUgYnVmZmVyIHNpemUuCisgKiAzMksgaXNuJ3QgdmVyeSBtdWNoIGZvciBtb2Rlcm4gbWFjaGluZXMgd2l0aCBmYXN0IG5ldHdvcmtzOyB3ZQorICogcGljayAuNU0sIGFzIHRoYXQncyB0aGUgbWF4aW11bSBvbiBhdCBsZWFzdCBzb21lIHN5c3RlbXMgd2l0aCBCUEYuCisgKgorICogSG93ZXZlciwgb24gQUlYIDMuNSwgdGhlIGxhcmdlciBidWZmZXIgc2l6ZWQgY2F1c2VkIHVucmVjb3ZlcmFibGUKKyAqIHJlYWQgZmFpbHVyZXMgdW5kZXIgc3RyZXNzLCBzbyB3ZSBsZWF2ZSBpdCBhcyAzMks7IHlldCBhbm90aGVyCisgKiBwbGFjZSB3aGVyZSBBSVgncyBCUEYgaXMgYnJva2VuLgogICovCi0jaWZuZGVmIERMVF9ET0NTSVMKLSNkZWZpbmUgRExUX0RPQ1NJUwkxNDMKKyNpZmRlZiBfQUlYCisjZGVmaW5lIERFRkFVTFRfQlVGU0laRQkzMjc2OAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9CVUZTSVpFCTUyNDI4OAogI2VuZGlmCiAKLXBjYXBfdCAqCi1wY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICpkZXZpY2UsIGludCBzbmFwbGVuLCBpbnQgcHJvbWlzYywgaW50IHRvX21zLAotICAgIGNoYXIgKmVidWYpCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX2JwZihwY2FwX3QgKnApCiB7CisJc3RydWN0IHBjYXBfYnBmICpwYiA9IHAtPnByaXY7CisJaW50IHN0YXR1cyA9IDA7CiAJaW50IGZkOworI2lmZGVmIExJRk5BTVNJWgorCWNoYXIgKnpvbmVzZXA7CisJc3RydWN0IGxpZnJlcSBpZnI7CisJY2hhciAqaWZybmFtZSA9IGlmci5saWZyX25hbWU7CisJY29uc3Qgc2l6ZV90IGlmbmFtc2l6ID0gc2l6ZW9mKGlmci5saWZyX25hbWUpOworI2Vsc2UKIAlzdHJ1Y3QgaWZyZXEgaWZyOworCWNoYXIgKmlmcm5hbWUgPSBpZnIuaWZyX25hbWU7CisJY29uc3Qgc2l6ZV90IGlmbmFtc2l6ID0gc2l6ZW9mKGlmci5pZnJfbmFtZSk7CisjZW5kaWYKIAlzdHJ1Y3QgYnBmX3ZlcnNpb24gYnY7CisjaWZkZWYgX19BUFBMRV9fCisJaW50IHNvY2tmZDsKKwljaGFyICp3bHRkZXYgPSBOVUxMOworI2VuZGlmCiAjaWZkZWYgQklPQ0dETFRMSVNUCiAJc3RydWN0IGJwZl9kbHRsaXN0IGJkbDsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChIQVZFX0JTRF9JRUVFODAyMTEpCisJaW50IG5ld19kbHQ7CiAjZW5kaWYKKyNlbmRpZiAvKiBCSU9DR0RMVExJU1QgKi8KICNpZiBkZWZpbmVkKEJJT0NHSERSQ01QTFQpICYmIGRlZmluZWQoQklPQ1NIRFJDTVBMVCkKIAl1X2ludCBzcG9vZl9ldGhfc3JjID0gMTsKICNlbmRpZgogCXVfaW50IHY7Ci0JcGNhcF90ICpwOwogCXN0cnVjdCBicGZfaW5zbiB0b3RhbF9pbnNuOwogCXN0cnVjdCBicGZfcHJvZ3JhbSB0b3RhbF9wcm9nOwogCXN0cnVjdCB1dHNuYW1lIG9zaW5mbzsKLQotI2lmZGVmIEhBVkVfREFHX0FQSQotCWlmIChzdHJzdHIoZGV2aWNlLCAiZGFnIikpIHsKLQkJcmV0dXJuIGRhZ19vcGVuX2xpdmUoZGV2aWNlLCBzbmFwbGVuLCBwcm9taXNjLCB0b19tcywgZWJ1Zik7Ci0JfQotI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLwotCi0jaWZkZWYgQklPQ0dETFRMSVNUCi0JbWVtc2V0KCZiZGwsIDAsIHNpemVvZihiZGwpKTsKKwlpbnQgaGF2ZV9vc2luZm8gPSAwOworI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJc3RydWN0IGJwZl96YnVmIGJ6OworCXVfaW50IGJ1Zm1vZGUsIHpidWZtYXg7CiAjZW5kaWYKIAotCXAgPSAocGNhcF90ICopbWFsbG9jKHNpemVvZigqcCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAotCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7Ci0JZmQgPSBicGZfb3BlbihwLCBlYnVmKTsKLQlpZiAoZmQgPCAwKQorCWZkID0gYnBmX29wZW4ocCk7CisJaWYgKGZkIDwgMCkgeworCQlzdGF0dXMgPSBmZDsKIAkJZ290byBiYWQ7CisJfQogCiAJcC0+ZmQgPSBmZDsKLQlwLT5zbmFwc2hvdCA9IHNuYXBsZW47CiAKIAlpZiAoaW9jdGwoZmQsIEJJT0NWRVJTSU9OLCAoY2FkZHJfdCkmYnYpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1ZFUlNJT046ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1ZFUlNJT046ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJZ290byBiYWQ7CiAJfQogCWlmIChidi5idl9tYWpvciAhPSBCUEZfTUFKT1JfVkVSU0lPTiB8fAogCSAgICBidi5idl9taW5vciA8IEJQRl9NSU5PUl9WRVJTSU9OKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJrZXJuZWwgYnBmIGZpbHRlciBvdXQgb2YgZGF0ZSIpOworCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQlnb3RvIGJhZDsKKwl9CisKKyNpZiBkZWZpbmVkKExJRk5BTVNJWikgJiYgZGVmaW5lZChaT05FTkFNRV9NQVgpICYmIGRlZmluZWQobGlmcl96b25laWQpCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc291cmNlIG5ldHdvcmsgZGV2aWNlIGhhcyBhICcvJyBzZXBhcmF0ZWQKKwkgKiB6b25lbmFtZSBwcmVmaXggc3RyaW5nLiBUaGUgem9uZW5hbWUgcHJlZml4ZWQgc291cmNlIGRldmljZQorCSAqIGNhbiBiZSB1c2VkIGJ5IGxpYnBjYXAgY29uc3VtZXJzIHRvIGNhcHR1cmUgbmV0d29yayB0cmFmZmljCisJICogaW4gbm9uLWdsb2JhbCB6b25lcyBmcm9tIHRoZSBnbG9iYWwgem9uZSBvbiBTb2xhcmlzIDExIGFuZAorCSAqIGFib3ZlLiBJZiB0aGUgem9uZW5hbWUgcHJlZml4IGlzIHByZXNlbnQgdGhlbiB3ZSBzdHJpcCB0aGUKKwkgKiBwcmVmaXggYW5kIHBhc3MgdGhlIHpvbmUgSUQgYXMgcGFydCBvZiBsaWZyX3pvbmVpZC4KKwkgKi8KKwlpZiAoKHpvbmVzZXAgPSBzdHJjaHIocC0+b3B0LnNvdXJjZSwgJy8nKSkgIT0gTlVMTCkgeworCQljaGFyIHpvbmVuYW1lW1pPTkVOQU1FX01BWF07CisJCWludCAgem5hbWVsZW47CisJCWNoYXIgKmxuYW1lcDsKKworCQl6bmFtZWxlbiA9IHpvbmVzZXAgLSBwLT5vcHQuc291cmNlOworCQkodm9pZCkgc3RybGNweSh6b25lbmFtZSwgcC0+b3B0LnNvdXJjZSwgem5hbWVsZW4gKyAxKTsKKwkJbG5hbWVwID0gc3RyZHVwKHpvbmVzZXAgKyAxKTsKKwkJaWZyLmxpZnJfem9uZWlkID0gZ2V0em9uZWlkYnluYW1lKHpvbmVuYW1lKTsKKwkJZnJlZShwLT5vcHQuc291cmNlKTsKKwkJcC0+b3B0LnNvdXJjZSA9IGxuYW1lcDsKKwl9CisjZW5kaWYKKworCXBiLT5kZXZpY2UgPSBzdHJkdXAocC0+b3B0LnNvdXJjZSk7CisJaWYgKHBiLT5kZXZpY2UgPT0gTlVMTCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzdHJkdXA6ICVzIiwKKwkJICAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KIAogCS8qCi0JICogVHJ5IGZpbmRpbmcgYSBnb29kIHNpemUgZm9yIHRoZSBidWZmZXI7IDMyNzY4IG1heSBiZSB0b28KLQkgKiBiaWcsIHNvIGtlZXAgY3V0dGluZyBpdCBpbiBoYWxmIHVudGlsIHdlIGZpbmQgYSBzaXplCi0JICogdGhhdCB3b3Jrcywgb3IgcnVuIG91dCBvZiBzaXplcyB0byB0cnkuICBJZiB0aGUgZGVmYXVsdAotCSAqIGlzIGxhcmdlciwgZG9uJ3QgbWFrZSBpdCBzbWFsbGVyLgotCSAqCi0JICogWFhYIC0gdGhlcmUgc2hvdWxkIGJlIGEgdXNlci1hY2Nlc3NpYmxlIGhvb2sgdG8gc2V0IHRoZQotCSAqIGluaXRpYWwgYnVmZmVyIHNpemUuCisJICogQXR0ZW1wdCB0byBmaW5kIG91dCB0aGUgdmVyc2lvbiBvZiB0aGUgT1Mgb24gd2hpY2ggd2UncmUgcnVubmluZy4KIAkgKi8KLQlpZiAoKGlvY3RsKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSZ2KSA8IDApIHx8IHYgPCAzMjc2OCkKLQkJdiA9IDMyNzY4OwotCWZvciAoIDsgdiAhPSAwOyB2ID4+PSAxKSB7Ci0JCS8qIElnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIC0gdGhpcyBpcyBiZWNhdXNlIHRoZSBjYWxsIGZhaWxzCi0JCSAqIG9uIEJQRiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBrZXJuZWwgbWFsbG9jLiAgQW5kIGlmCi0JCSAqIHRoZSBjYWxsIGZhaWxzLCBpdCdzIG5vIGJpZyBkZWFsLCB3ZSBqdXN0IGNvbnRpbnVlIHRvCi0JCSAqIHVzZSB0aGUgc3RhbmRhcmQgYnVmZmVyIHNpemUuCi0JCSAqLwotCQkodm9pZCkgaW9jdGwoZmQsIEJJT0NTQkxFTiwgKGNhZGRyX3QpJnYpOworCWlmICh1bmFtZSgmb3NpbmZvKSA9PSAwKQorCQloYXZlX29zaW5mbyA9IDE7CiAKLQkJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCQlpZiAoaW9jdGwoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPj0gMCkKLQkJCWJyZWFrOwkvKiB0aGF0IHNpemUgd29ya2VkOyB3ZSdyZSBkb25lICovCi0KLQkJaWYgKGVycm5vICE9IEVOT0JVRlMpIHsKLQkJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DU0VUSUY6ICVzOiAlcyIsCi0JCQkgICAgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGJhZDsKKyNpZmRlZiBfX0FQUExFX18KKwkvKgorCSAqIFNlZSBjb21tZW50IGluIHBjYXBfY2FuX3NldF9yZm1vbl9icGYoKSBmb3IgYW4gZXhwbGFuYXRpb24KKwkgKiBvZiB3aHkgd2UgY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyLgorCSAqLworCWlmIChwLT5vcHQucmZtb24pIHsKKwkJaWYgKGhhdmVfb3NpbmZvKSB7CisJCQkvKgorCQkJICogV2UgYXNzdW1lIG9zaW5mby5zeXNuYW1lIGlzICJEYXJ3aW4iLCBiZWNhdXNlCisJCQkgKiBfX0FQUExFX18gaXMgZGVmaW5lZC4gIFdlIGp1c3QgY2hlY2sgdGhlIHZlcnNpb24uCisJCQkgKi8KKwkJCWlmIChvc2luZm8ucmVsZWFzZVswXSA8ICc4JyAmJgorCQkJICAgIG9zaW5mby5yZWxlYXNlWzFdID09ICcuJykgeworCQkJCS8qCisJCQkJICogMTAuMyAoRGFyd2luIDcueCkgb3IgZWFybGllci4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChvc2luZm8ucmVsZWFzZVswXSA9PSAnOCcgJiYKKwkJCSAgICBvc2luZm8ucmVsZWFzZVsxXSA9PSAnLicpIHsKKwkJCQkvKgorCQkJCSAqIDEwLjQgKERhcndpbiA4LngpLiAgcy9lbi93bHQvCisJCQkJICovCisJCQkJaWYgKHN0cm5jbXAocC0+b3B0LnNvdXJjZSwgImVuIiwgMikgIT0gMCkgeworCQkJCQkvKgorCQkJCQkgKiBOb3QgYW4gZW5OIGRldmljZTsgY2hlY2sKKwkJCQkJICogd2hldGhlciB0aGUgZGV2aWNlIGV2ZW4gZXhpc3RzLgorCQkJCQkgKi8KKwkJCQkJc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCQkJCQlpZiAoc29ja2ZkICE9IC0xKSB7CisJCQkJCQlzdHJsY3B5KGlmcm5hbWUsCisJCQkJCQkgICAgcC0+b3B0LnNvdXJjZSwgaWZuYW1zaXopOworCQkJCQkJaWYgKGlvY3RsKHNvY2tmZCwgU0lPQ0dJRkZMQUdTLAorCQkJCQkJICAgIChjaGFyICopJmlmcikgPCAwKSB7CisJCQkJCQkJLyoKKwkJCQkJCQkgKiBXZSBhc3N1bWUgdGhpcworCQkJCQkJCSAqIGZhaWxlZCBiZWNhdXNlCisJCQkJCQkJICogdGhlIHVuZGVybHlpbmcKKwkJCQkJCQkgKiBkZXZpY2UgZG9lc24ndAorCQkJCQkJCSAqIGV4aXN0LgorCQkJCQkJCSAqLworCQkJCQkJCXN0YXR1cyA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7CisJCQkJCQkJc25wcmludGYocC0+ZXJyYnVmLAorCQkJCQkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkJCSAgICAiU0lPQ0dJRkZMQUdTIGZhaWxlZDogJXMiLAorCQkJCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJCQkJCWNsb3NlKHNvY2tmZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKgorCQkJCQkJICogV2UgY2FuJ3QgZmluZCBvdXQgd2hldGhlcgorCQkJCQkJICogdGhlIGRldmljZSBleGlzdHMsIHNvIGp1c3QKKwkJCQkJCSAqIHJlcG9ydCAibm8gc3VjaCBkZXZpY2UiLgorCQkJCQkJICovCisJCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCQkJCQkJc25wcmludGYocC0+ZXJyYnVmLAorCQkJCQkJICAgIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkgICAgInNvY2tldCgpIGZhaWxlZDogJXMiLAorCQkJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJfQorCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJd2x0ZGV2ID0gbWFsbG9jKHN0cmxlbihwLT5vcHQuc291cmNlKSArIDIpOworCQkJCWlmICh3bHRkZXYgPT0gTlVMTCkgeworCQkJCQkodm9pZClzbnByaW50ZihwLT5lcnJidWYsCisJCQkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCQlzdHJjcHkod2x0ZGV2LCAid2x0Iik7CisJCQkJc3RyY2F0KHdsdGRldiwgcC0+b3B0LnNvdXJjZSArIDIpOworCQkJCWZyZWUocC0+b3B0LnNvdXJjZSk7CisJCQkJcC0+b3B0LnNvdXJjZSA9IHdsdGRldjsKKwkJCX0KKwkJCS8qCisJCQkgKiBFdmVyeXRoaW5nIGVsc2UgaXMgMTAuNSBvciBsYXRlcjsgZm9yIHRob3NlLAorCQkJICogd2UganVzdCBvcGVuIHRoZSBlbk4gZGV2aWNlLCBhbmQgc2V0IHRoZSBETFQuCisJCQkgKi8KIAkJfQogCX0KKyNlbmRpZiAvKiBfX0FQUExFX18gKi8KKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCS8qCisJICogSWYgdGhlIEJQRiBleHRlbnNpb24gdG8gc2V0IGJ1ZmZlciBtb2RlIGlzIHByZXNlbnQsIHRyeSBzZXR0aW5nCisJICogdGhlIG1vZGUgdG8gemVyby1jb3B5LiAgSWYgdGhhdCBmYWlscywgdXNlIHJlZ3VsYXIgYnVmZmVyaW5nLiAgSWYKKwkgKiBpdCBzdWNjZWVkcyBidXQgb3RoZXIgc2V0dXAgZmFpbHMsIHJldHVybiBhbiBlcnJvciB0byB0aGUgdXNlci4KKwkgKi8KKwlidWZtb2RlID0gQlBGX0JVRk1PREVfWkJVRjsKKwlpZiAoaW9jdGwoZmQsIEJJT0NTRVRCVUZNT0RFLCAoY2FkZHJfdCkmYnVmbW9kZSkgPT0gMCkgeworCQkvKgorCQkgKiBXZSBoYXZlIHplcm9jb3B5IEJQRjsgdXNlIGl0LgorCQkgKi8KKwkJcGItPnplcm9jb3B5ID0gMTsKIAotCWlmICh2ID09IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAiQklPQ1NCTEVOOiAlczogTm8gYnVmZmVyIHNpemUgd29ya2VkIiwgZGV2aWNlKTsKLQkJZ290byBiYWQ7CisJCS8qCisJCSAqIEhvdyB0byBwaWNrIGEgYnVmZmVyIHNpemU6IGZpcnN0LCBxdWVyeSB0aGUgbWF4aW11bSBidWZmZXIKKwkJICogc2l6ZSBzdXBwb3J0ZWQgYnkgemVyby1jb3B5LiAgVGhpcyBhbHNvIGxldHMgdXMgcXVpY2tseQorCQkgKiBkZXRlcm1pbmUgd2hldGhlciB0aGUga2VybmVsIGdlbmVyYWxseSBzdXBwb3J0cyB6ZXJvLWNvcHkuCisJCSAqIFRoZW4sIGlmIGEgYnVmZmVyIHNpemUgd2FzIHNwZWNpZmllZCwgdXNlIHRoYXQsIG90aGVyd2lzZQorCQkgKiBxdWVyeSB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZSwgd2hpY2ggcmVmbGVjdHMga2VybmVsCisJCSAqIHBvbGljeSBmb3IgYSBkZXNpcmVkIGRlZmF1bHQuICBSb3VuZCB0byB0aGUgbmVhcmVzdCBwYWdlCisJCSAqIHNpemUuCisJCSAqLworCQlpZiAoaW9jdGwoZmQsIEJJT0NHRVRaTUFYLCAoY2FkZHJfdCkmemJ1Zm1heCkgPCAwKSB7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DR0VUWk1BWDogJXMiLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJaWYgKHAtPm9wdC5idWZmZXJfc2l6ZSAhPSAwKSB7CisJCQkvKgorCQkJICogQSBidWZmZXIgc2l6ZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQ7IHVzZSBpdC4KKwkJCSAqLworCQkJdiA9IHAtPm9wdC5idWZmZXJfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoaW9jdGwoZmQsIEJJT0NHQkxFTiwgKGNhZGRyX3QpJnYpIDwgMCkgfHwKKwkJCSAgICB2IDwgREVGQVVMVF9CVUZTSVpFKQorCQkJCXYgPSBERUZBVUxUX0JVRlNJWkU7CisJCX0KKyNpZm5kZWYgcm91bmR1cAorI2RlZmluZSByb3VuZHVwKHgsIHkpICAgKCgoKHgpKygoeSktMSkpLyh5KSkqKHkpKSAgLyogdG8gYW55IHkgKi8KKyNlbmRpZgorCQlwYi0+emJ1ZnNpemUgPSByb3VuZHVwKHYsIGdldHBhZ2VzaXplKCkpOworCQlpZiAocGItPnpidWZzaXplID4gemJ1Zm1heCkKKwkJCXBiLT56YnVmc2l6ZSA9IHpidWZtYXg7CisJCXBiLT56YnVmMSA9IG1tYXAoTlVMTCwgcGItPnpidWZzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkgICAgTUFQX0FOT04sIC0xLCAwKTsKKwkJcGItPnpidWYyID0gbW1hcChOVUxMLCBwYi0+emJ1ZnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICBNQVBfQU5PTiwgLTEsIDApOworCQlpZiAocGItPnpidWYxID09IE1BUF9GQUlMRUQgfHwgcGItPnpidWYyID09IE1BUF9GQUlMRUQpIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1tYXA6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQltZW1zZXQoJmJ6LCAwLCBzaXplb2YoYnopKTsgLyogYnplcm8oKSBkZXByZWNhdGVkLCByZXBsYWNlZCB3aXRoIG1lbXNldCgpICovCisJCWJ6LmJ6X2J1ZmEgPSBwYi0+emJ1ZjE7CisJCWJ6LmJ6X2J1ZmIgPSBwYi0+emJ1ZjI7CisJCWJ6LmJ6X2J1ZmxlbiA9IHBiLT56YnVmc2l6ZTsKKwkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUWkJVRiwgKGNhZGRyX3QpJmJ6KSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRaQlVGOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBiYWQ7CisJCX0KKwkJKHZvaWQpc3RybmNweShpZnJuYW1lLCBwLT5vcHQuc291cmNlLCBpZm5hbXNpeik7CisJCWlmIChpb2N0bChmZCwgQklPQ1NFVElGLCAoY2FkZHJfdCkmaWZyKSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRJRjogJXM6ICVzIiwKKwkJCSAgICBwLT5vcHQuc291cmNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQl2ID0gcGItPnpidWZzaXplIC0gc2l6ZW9mKHN0cnVjdCBicGZfemJ1Zl9oZWFkZXIpOworCX0gZWxzZQorI2VuZGlmCisJeworCQkvKgorCQkgKiBXZSBkb24ndCBoYXZlIHplcm9jb3B5IEJQRi4KKwkJICogU2V0IHRoZSBidWZmZXIgc2l6ZS4KKwkJICovCisJCWlmIChwLT5vcHQuYnVmZmVyX3NpemUgIT0gMCkgeworCQkJLyoKKwkJCSAqIEEgYnVmZmVyIHNpemUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB1c2UgaXQuCisJCQkgKi8KKwkJCWlmIChpb2N0bChmZCwgQklPQ1NCTEVOLAorCQkJICAgIChjYWRkcl90KSZwLT5vcHQuYnVmZmVyX3NpemUpIDwgMCkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkJJT0NTQkxFTjogJXM6ICVzIiwgcC0+b3B0LnNvdXJjZSwKKwkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgYmluZCB0byB0aGUgZGV2aWNlLgorCQkJICovCisJCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5zb3VyY2UsIGlmbmFtc2l6KTsKKyNpZmRlZiBCSU9DU0VUTElGCisJCQlpZiAoaW9jdGwoZmQsIEJJT0NTRVRMSUYsIChjYWRkcl90KSZpZnIpIDwgMCkKKyNlbHNlCisJCQlpZiAoaW9jdGwoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPCAwKQorI2VuZGlmCisJCQl7CisJCQkJc3RhdHVzID0gY2hlY2tfc2V0aWZfZmFpbHVyZShwLCBlcnJubyk7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm8gYnVmZmVyIHNpemUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorCQkJICoKKwkJCSAqIFRyeSBmaW5kaW5nIGEgZ29vZCBzaXplIGZvciB0aGUgYnVmZmVyOworCQkJICogREVGQVVMVF9CVUZTSVpFIG1heSBiZSB0b28gYmlnLCBzbyBrZWVwCisJCQkgKiBjdXR0aW5nIGl0IGluIGhhbGYgdW50aWwgd2UgZmluZCBhIHNpemUKKwkJCSAqIHRoYXQgd29ya3MsIG9yIHJ1biBvdXQgb2Ygc2l6ZXMgdG8gdHJ5LgorCQkJICogSWYgdGhlIGRlZmF1bHQgaXMgbGFyZ2VyLCBkb24ndCBtYWtlIGl0IHNtYWxsZXIuCisJCQkgKi8KKwkJCWlmICgoaW9jdGwoZmQsIEJJT0NHQkxFTiwgKGNhZGRyX3QpJnYpIDwgMCkgfHwKKwkJCSAgICB2IDwgREVGQVVMVF9CVUZTSVpFKQorCQkJCXYgPSBERUZBVUxUX0JVRlNJWkU7CisJCQlmb3IgKCA7IHYgIT0gMDsgdiA+Pj0gMSkgeworCQkJCS8qCisJCQkJICogSWdub3JlIHRoZSByZXR1cm4gdmFsdWUgLSB0aGlzIGlzIGJlY2F1c2UgdGhlCisJCQkJICogY2FsbCBmYWlscyBvbiBCUEYgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUKKwkJCQkgKiBrZXJuZWwgbWFsbG9jLiAgQW5kIGlmIHRoZSBjYWxsIGZhaWxzLCBpdCdzCisJCQkJICogbm8gYmlnIGRlYWwsIHdlIGp1c3QgY29udGludWUgdG8gdXNlIHRoZQorCQkJCSAqIHN0YW5kYXJkIGJ1ZmZlciBzaXplLgorCQkJCSAqLworCQkJCSh2b2lkKSBpb2N0bChmZCwgQklPQ1NCTEVOLCAoY2FkZHJfdCkmdik7CisKKwkJCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5zb3VyY2UsIGlmbmFtc2l6KTsKKyNpZmRlZiBCSU9DU0VUTElGCisJCQkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUTElGLCAoY2FkZHJfdCkmaWZyKSA+PSAwKQorI2Vsc2UKKwkJCQlpZiAoaW9jdGwoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPj0gMCkKKyNlbmRpZgorCQkJCQlicmVhazsJLyogdGhhdCBzaXplIHdvcmtlZDsgd2UncmUgZG9uZSAqLworCisJCQkJaWYgKGVycm5vICE9IEVOT0JVRlMpIHsKKwkJCQkJc3RhdHVzID0gY2hlY2tfc2V0aWZfZmFpbHVyZShwLCBlcnJubyk7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHYgPT0gMCkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkJJT0NTQkxFTjogJXM6IE5vIGJ1ZmZlciBzaXplIHdvcmtlZCIsCisJCQkJICAgIHAtPm9wdC5zb3VyY2UpOworCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KIAl9CiAKIAkvKiBHZXQgdGhlIGRhdGEgbGluayBsYXllciB0eXBlLiAqLwogCWlmIChpb2N0bChmZCwgQklPQ0dETFQsIChjYWRkcl90KSZ2KSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NHRExUOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NHRExUOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KKwogI2lmZGVmIF9BSVgKIAkvKgogCSAqIEFJWCdzIEJQRiByZXR1cm5zIElGRl8gdHlwZXMsIG5vdCBETFRfIHR5cGVzLCBpbiBCSU9DR0RMVC4KQEAgLTcxMyw4ICsxODQyLDkgQEAKIAkJLyoKIAkJICogV2UgZG9uJ3Qga25vdyB3aGF0IHRvIG1hcCB0aGlzIHRvIHlldC4KIAkJICovCi0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJ1bmtub3duIGludGVyZmFjZSB0eXBlICV1IiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAidW5rbm93biBpbnRlcmZhY2UgdHlwZSAldSIsCiAJCSAgICB2KTsKKwkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJZ290byBiYWQ7CiAJfQogI2VuZGlmCkBAIC03MzksMTMgKzE4NjksNiBAQAogCQlicmVhazsKIAl9CiAjZW5kaWYKLSNpZmRlZiBQQ0FQX0ZERElQQUQKLQlpZiAodiA9PSBETFRfRkRESSkKLQkJcC0+ZmRkaXBhZCA9IFBDQVBfRkRESVBBRDsKLQllbHNlCi0JCXAtPmZkZGlwYWQgPSAwOwotI2VuZGlmCi0JcC0+bGlua3R5cGUgPSB2OwogCiAjaWZkZWYgQklPQ0dETFRMSVNUCiAJLyoKQEAgLTc1Myw2OCArMTg3NiwxNDQgQEAKIAkgKiB0aGlzIGludGVyZmFjZSBzdXBwb3J0cy4gIElmIHRoaXMgZmFpbHMgd2l0aCBFSU5WQUwsIGl0J3MKIAkgKiBub3QgZmF0YWw7IHdlIGp1c3QgZG9uJ3QgZ2V0IHRvIHVzZSB0aGUgZmVhdHVyZSBsYXRlci4KIAkgKi8KLQlpZiAoaW9jdGwoZmQsIEJJT0NHRExUTElTVCwgKGNhZGRyX3QpJmJkbCkgPT0gMCkgewotCQl1X2ludCBpOwotCQlpbnQgaXNfZXRoZXJuZXQ7CisJaWYgKGdldF9kbHRfbGlzdChmZCwgdiwgJmJkbCwgcC0+ZXJyYnVmKSA9PSAtMSkgeworCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQlnb3RvIGJhZDsKKwl9CisJcC0+ZGx0X2NvdW50ID0gYmRsLmJmbF9sZW47CisJcC0+ZGx0X2xpc3QgPSBiZGwuYmZsX2xpc3Q7CiAKLQkJYmRsLmJmbF9saXN0ID0gKHVfaW50ICopIG1hbGxvYyhzaXplb2YodV9pbnQpICogKGJkbC5iZmxfbGVuICsgMSkpOwotCQlpZiAoYmRsLmJmbF9saXN0ID09IE5VTEwpIHsKLQkJCSh2b2lkKXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKLQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGJhZDsKKyNpZmRlZiBfX0FQUExFX18KKwkvKgorCSAqIE1vbml0b3IgbW9kZSBmdW4sIGNvbnRpbnVlZC4KKwkgKgorCSAqIEZvciAxMC41IGFuZCwgd2UncmUgYXNzdW1pbmcsIGxhdGVyIHJlbGVhc2VzLCBhcyBub3RlZCBhYm92ZSwKKwkgKiA4MDIuMSBhZGFwdGVycyB0aGF0IHN1cHBvcnQgbW9uaXRvciBtb2RlIG9mZmVyIGJvdGggRExUX0VOMTBNQiwKKwkgKiBETFRfSUVFRTgwMl8xMSwgYW5kIHBvc3NpYmx5IHNvbWUgODAyLjExLXBsdXMtcmFkaW8taW5mb3JtYXRpb24KKwkgKiBETFRfIHZhbHVlLiAgQ2hvb3Npbmcgb25lIG9mIHRoZSA4MDIuMTEgRExUXyB2YWx1ZXMgd2lsbCB0dXJuCisJICogbW9uaXRvciBtb2RlIG9uLgorCSAqCisJICogVGhlcmVmb3JlLCBpZiB0aGUgdXNlciBhc2tlZCBmb3IgbW9uaXRvciBtb2RlLCB3ZSBmaWx0ZXIgb3V0CisJICogdGhlIERMVF9FTjEwTUIgdmFsdWUsIGFzIHlvdSBjYW4ndCBnZXQgdGhhdCBpbiBtb25pdG9yIG1vZGUsCisJICogYW5kLCBpZiB0aGUgdXNlciBkaWRuJ3QgYXNrIGZvciBtb25pdG9yIG1vZGUsIHdlIGZpbHRlciBvdXQKKwkgKiB0aGUgODAyLjExIERMVF8gdmFsdWVzLCBiZWNhdXNlIHNlbGVjdGluZyB0aG9zZSB3aWxsIHR1cm4KKwkgKiBtb25pdG9yIG1vZGUgb24uICBUaGVuLCBmb3IgbW9uaXRvciBtb2RlLCBpZiBhbiA4MDIuMTEtcGx1cy0KKwkgKiByYWRpbyBETFRfIHZhbHVlIGlzIG9mZmVyZWQsIHdlIHRyeSB0byBzZWxlY3QgdGhhdCwgb3RoZXJ3aXNlCisJICogd2UgdHJ5IHRvIHNlbGVjdCBETFRfSUVFRTgwMl8xMS4KKwkgKi8KKwlpZiAoaGF2ZV9vc2luZm8pIHsKKwkJaWYgKGlzZGlnaXQoKHVuc2lnbmVkKW9zaW5mby5yZWxlYXNlWzBdKSAmJgorCQkgICAgIChvc2luZm8ucmVsZWFzZVswXSA9PSAnOScgfHwKKwkJICAgICBpc2RpZ2l0KCh1bnNpZ25lZClvc2luZm8ucmVsZWFzZVsxXSkpKSB7CisJCQkvKgorCQkJICogMTAuNSAoRGFyd2luIDkueCksIG9yIGxhdGVyLgorCQkJICovCisJCQluZXdfZGx0ID0gZmluZF84MDJfMTEoJmJkbCk7CisJCQlpZiAobmV3X2RsdCAhPSAtMSkgeworCQkJCS8qCisJCQkJICogV2UgaGF2ZSBhdCBsZWFzdCBvbmUgODAyLjExIERMVF8gdmFsdWUsCisJCQkJICogc28gdGhpcyBpcyBhbiA4MDIuMTEgaW50ZXJmYWNlLgorCQkJCSAqIG5ld19kbHQgaXMgdGhlIGJlc3Qgb2YgdGhlIDgwMi4xMQorCQkJCSAqIERMVF8gdmFsdWVzIGluIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWlmIChwLT5vcHQucmZtb24pIHsKKwkJCQkJLyoKKwkJCQkJICogT3VyIGNhbGxlciB3YW50cyBtb25pdG9yIG1vZGUuCisJCQkJCSAqIFB1cmdlIERMVF9FTjEwTUIgZnJvbSB0aGUgbGlzdAorCQkJCQkgKiBvZiBsaW5rLWxheWVyIHR5cGVzLCBhcyBzZWxlY3RpbmcKKwkJCQkJICogaXQgd2lsbCBrZWVwIG1vbml0b3IgbW9kZSBvZmYuCisJCQkJCSAqLworCQkJCQlyZW1vdmVfZW4ocCk7CisKKwkJCQkJLyoKKwkJCQkJICogSWYgdGhlIG5ldyBtb2RlIHdlIHdhbnQgaXNuJ3QKKwkJCQkJICogdGhlIGRlZmF1bHQgbW9kZSwgYXR0ZW1wdCB0bworCQkJCQkgKiBzZWxlY3QgdGhlIG5ldyBtb2RlLgorCQkJCQkgKi8KKwkJCQkJaWYgKG5ld19kbHQgIT0gdikgeworCQkJCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU0RMVCwKKwkJCQkJCSAgICAmbmV3X2RsdCkgIT0gLTEpIHsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIFdlIHN1Y2NlZWRlZDsKKwkJCQkJCQkgKiBtYWtlIHRoaXMgdGhlCisJCQkJCQkJICogbmV3IERMVF8gdmFsdWUuCisJCQkJCQkJICovCisJCQkJCQkJdiA9IG5ld19kbHQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBPdXIgY2FsbGVyIGRvZXNuJ3Qgd2FudAorCQkJCQkgKiBtb25pdG9yIG1vZGUuICBVbmxlc3MgdGhpcworCQkJCQkgKiBpcyBiZWluZyBkb25lIGJ5IHBjYXBfb3Blbl9saXZlKCksCisJCQkJCSAqIHB1cmdlIHRoZSA4MDIuMTEgbGluay1sYXllciB0eXBlcworCQkJCQkgKiBmcm9tIHRoZSBsaXN0LCBhcyBzZWxlY3RpbmcKKwkJCQkJICogb25lIG9mIHRoZW0gd2lsbCB0dXJuIG1vbml0b3IKKwkJCQkJICogbW9kZSBvbi4KKwkJCQkJICovCisJCQkJCWlmICghcC0+b2xkc3R5bGUpCisJCQkJCQlyZW1vdmVfODAyXzExKHApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHAtPm9wdC5yZm1vbikgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgY2FsbGVyIHJlcXVlc3RlZCBtb25pdG9yCisJCQkJCSAqIG1vZGUsIGJ1dCB3ZSBoYXZlIG5vIDgwMi4xMQorCQkJCQkgKiBsaW5rLWxheWVyIHR5cGVzLCBzbyB0aGV5CisJCQkJCSAqIGNhbid0IGhhdmUgaXQuCisJCQkJCSAqLworCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJfQogCQl9Ci0KLQkJaWYgKGlvY3RsKGZkLCBCSU9DR0RMVExJU1QsIChjYWRkcl90KSZiZGwpIDwgMCkgewotCQkJKHZvaWQpc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAgICAiQklPQ0dETFRMSVNUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCWZyZWUoYmRsLmJmbF9saXN0KTsKKwl9CisjZWxpZiBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkKKwkvKgorCSAqICpCU0Qgd2l0aCB0aGUgbmV3IDgwMi4xMSBpb2N0bHMuCisJICogRG8gd2Ugd2FudCBtb25pdG9yIG1vZGU/CisJICovCisJaWYgKHAtPm9wdC5yZm1vbikgeworCQkvKgorCQkgKiBUcnkgdG8gcHV0IHRoZSBpbnRlcmZhY2UgaW50byBtb25pdG9yIG1vZGUuCisJCSAqLworCQlzdGF0dXMgPSBtb25pdG9yX21vZGUocCwgMSk7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJLyoKKwkJCSAqIFdlIGZhaWxlZC4KKwkJCSAqLwogCQkJZ290byBiYWQ7CiAJCX0KIAogCQkvKgotCQkgKiBPSywgZm9yIHJlYWwgRXRoZXJuZXQgZGV2aWNlcywgYWRkIERMVF9ET0NTSVMgdG8gdGhlCi0JCSAqIGxpc3QsIHNvIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGxldCB5b3UgY2hvb3NlIGl0LAotCQkgKiBpbiBjYXNlIHlvdSdyZSBjYXB0dXJpbmcgRE9DU0lTIHRyYWZmaWMgdGhhdCBhIENpc2NvCi0JCSAqIENhYmxlIE1vZGVtIFRlcm1pbmF0aW9uIFN5c3RlbSBpcyBwdXR0aW5nIG91dCBvbnRvCi0JCSAqIGFuIEV0aGVybmV0IChpdCBkb2Vzbid0IHB1dCBhbiBFdGhlcm5ldCBoZWFkZXIgb250bwotCQkgKiB0aGUgd2lyZSwgaXQgcHV0cyByYXcgRE9DU0lTIGZyYW1lcyBvdXQgb24gdGhlIHdpcmUKLQkJICogaW5zaWRlIHRoZSBsb3ctbGV2ZWwgRXRoZXJuZXQgZnJhbWluZykuCi0JCSAqCi0JCSAqIEEgInJlYWwgRXRoZXJuZXQgZGV2aWNlIiBpcyBkZWZpbmVkIGhlcmUgYXMgYSBkZXZpY2UKLQkJICogdGhhdCBoYXMgYSBsaW5rLWxheWVyIHR5cGUgb2YgRExUX0VOMTBNQiBhbmQgdGhhdCBoYXMKLQkJICogbm8gYWx0ZXJuYXRlIGxpbmstbGF5ZXIgdHlwZXM7IHRoYXQncyBkb25lIHRvIGV4Y2x1ZGUKLQkJICogODAyLjExIGludGVyZmFjZXMgKHdoaWNoIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSB0aGUKLQkJICogcmlnaHQgdGhpbmcgdG8gZG8sIGJ1dCBJIHN1c3BlY3QgaXQgaXMgLSBFdGhlcm5ldCA8LT4KLQkJICogODAyLjExIGJyaWRnZXMgd291bGQgcHJvYmFibHkgYmFkbHkgbWlzaGFuZGxlIGZyYW1lcwotCQkgKiB0aGF0IGRvbid0IGhhdmUgRXRoZXJuZXQgaGVhZGVycykuCisJCSAqIFdlJ3JlIGluIG1vbml0b3IgbW9kZS4KKwkJICogVHJ5IHRvIGZpbmQgdGhlIGJlc3QgODAyLjExIERMVF8gdmFsdWUgYW5kLCBpZiB3ZQorCQkgKiBzdWNjZWVkLCB0cnkgdG8gc3dpdGNoIHRvIHRoYXQgbW9kZSBpZiB3ZSdyZSBub3QKKwkJICogYWxyZWFkeSBpbiB0aGF0IG1vZGUuCiAJCSAqLwotCQlpZiAocC0+bGlua3R5cGUgPT0gRExUX0VOMTBNQikgewotCQkJaXNfZXRoZXJuZXQgPSAxOwotCQkJZm9yIChpID0gMDsgaSA8IGJkbC5iZmxfbGVuOyBpKyspIHsKLQkJCQlpZiAoYmRsLmJmbF9saXN0W2ldICE9IERMVF9FTjEwTUIpIHsKLQkJCQkJaXNfZXRoZXJuZXQgPSAwOwotCQkJCQlicmVhazsKKwkJbmV3X2RsdCA9IGZpbmRfODAyXzExKCZiZGwpOworCQlpZiAobmV3X2RsdCAhPSAtMSkgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgYXQgbGVhc3Qgb25lIDgwMi4xMSBETFRfIHZhbHVlLgorCQkJICogbmV3X2RsdCBpcyB0aGUgYmVzdCBvZiB0aGUgODAyLjExCisJCQkgKiBETFRfIHZhbHVlcyBpbiB0aGUgbGlzdC4KKwkJCSAqCisJCQkgKiBJZiB0aGUgbmV3IG1vZGUgd2Ugd2FudCBpc24ndCB0aGUgZGVmYXVsdCBtb2RlLAorCQkJICogYXR0ZW1wdCB0byBzZWxlY3QgdGhlIG5ldyBtb2RlLgorCQkJICovCisJCQlpZiAobmV3X2RsdCAhPSB2KSB7CisJCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU0RMVCwgJm5ld19kbHQpICE9IC0xKSB7CisJCQkJCS8qCisJCQkJCSAqIFdlIHN1Y2NlZWRlZDsgbWFrZSB0aGlzIHRoZQorCQkJCQkgKiBuZXcgRExUXyB2YWx1ZS4KKwkJCQkJICovCisJCQkJCXYgPSBuZXdfZGx0OwogCQkJCX0KIAkJCX0KLQkJCWlmIChpc19ldGhlcm5ldCkgewotCQkJCS8qCi0JCQkJICogV2UgcmVzZXJ2ZWQgb25lIG1vcmUgc2xvdCBhdCB0aGUgZW5kIG9mCi0JCQkJICogdGhlIGxpc3QuCi0JCQkJICovCi0JCQkJYmRsLmJmbF9saXN0W2JkbC5iZmxfbGVuXSA9IERMVF9ET0NTSVM7Ci0JCQkJYmRsLmJmbF9sZW4rKzsKLQkJCX0KLQkJfQotCQlwLT5kbHRfY291bnQgPSBiZGwuYmZsX2xlbjsKLQkJcC0+ZGx0X2xpc3QgPSBiZGwuYmZsX2xpc3Q7Ci0JfSBlbHNlIHsKLQkJaWYgKGVycm5vICE9IEVJTlZBTCkgewotCQkJKHZvaWQpc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAgICAiQklPQ0dETFRMSVNUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCWdvdG8gYmFkOwogCQl9CiAJfQotI2VuZGlmCisjZW5kaWYgLyogdmFyaW91cyBwbGF0Zm9ybXMgKi8KKyNlbmRpZiAvKiBCSU9DR0RMVExJU1QgKi8KIAogCS8qCiAJICogSWYgdGhpcyBpcyBhbiBFdGhlcm5ldCBkZXZpY2UsIGFuZCB3ZSBkb24ndCBoYXZlIGEgRExUXyBsaXN0LApAQCAtODI0LDcgKzIwMjMsNyBAQAogCSAqIHNvbWUgb3RoZXIgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgaXQncyBhbiBFdGhlcm5ldCBvciA4MDIuMTEKIAkgKiBkZXZpY2UuKQogCSAqLwotCWlmIChwLT5saW5rdHlwZSA9PSBETFRfRU4xME1CICYmIHAtPmRsdF9jb3VudCA9PSAwKSB7CisJaWYgKHYgPT0gRExUX0VOMTBNQiAmJiBwLT5kbHRfY291bnQgPT0gMCkgewogCQlwLT5kbHRfbGlzdCA9ICh1X2ludCAqKSBtYWxsb2Moc2l6ZW9mKHVfaW50KSAqIDIpOwogCQkvKgogCQkgKiBJZiB0aGF0IGZhaWxzLCBqdXN0IGxlYXZlIHRoZSBsaXN0IGVtcHR5LgpAQCAtODM1LDcgKzIwMzQsMTQgQEAKIAkJCXAtPmRsdF9jb3VudCA9IDI7CiAJCX0KIAl9Ci0JCQorI2lmZGVmIFBDQVBfRkRESVBBRAorCWlmICh2ID09IERMVF9GRERJKQorCQlwLT5mZGRpcGFkID0gUENBUF9GRERJUEFEOworCWVsc2UKKyNlbmRpZgorCQlwLT5mZGRpcGFkID0gMDsKKwlwLT5saW5rdHlwZSA9IHY7CisKICNpZiBkZWZpbmVkKEJJT0NHSERSQ01QTFQpICYmIGRlZmluZWQoQklPQ1NIRFJDTVBMVCkKIAkvKgogCSAqIERvIGEgQklPQ1NIRFJDTVBMVCwgaWYgZGVmaW5lZCwgdG8gdHVybiB0aGF0IGZsYWcgb24sIHNvCkBAIC04NDcsMjkgKzIwNTMsNjggQEAKIAkgKiBCU0RzIC0gY2hlY2sgQ1ZTIGxvZyBmb3IgImJwZi5jIj8KIAkgKi8KIAlpZiAoaW9jdGwoZmQsIEJJT0NTSERSQ01QTFQsICZzcG9vZl9ldGhfc3JjKSA9PSAtMSkgewotCQkodm9pZClzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiQklPQ1NIRFJDTVBMVDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KICNlbmRpZgogCS8qIHNldCB0aW1lb3V0ICovCi0JaWYgKHRvX21zICE9IDApIHsKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCS8qCisJICogSW4gemVyby1jb3B5IG1vZGUsIHdlIGp1c3QgdXNlIHRoZSB0aW1lb3V0IGluIHNlbGVjdCgpLgorCSAqIFhYWCAtIHdoYXQgaWYgd2UncmUgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIHRoZSAqYXBwbGljYXRpb24qCisJICogaXMgdXNpbmcgc2VsZWN0KCkgb3IgcG9sbCgpIG9yIGtxdWV1ZXMgb3IuLi4uPworCSAqLworCWlmIChwLT5vcHQudGltZW91dCAmJiAhcGItPnplcm9jb3B5KSB7CisjZWxzZQorCWlmIChwLT5vcHQudGltZW91dCkgeworI2VuZGlmCiAJCS8qCiAJCSAqIFhYWCAtIGlzIHRoaXMgc2Vjb25kcy9uYW5vc2Vjb25kcyBpbiBBSVg/CiAJCSAqIChUcmVhdGluZyBpdCBhcyBzdWNoIGRvZXNuJ3QgZml4IHRoZSB0aW1lb3V0CiAJCSAqIHByb2JsZW0gZGVzY3JpYmVkIGJlbG93LikKKwkJICoKKwkJICogWFhYIC0gTWFjIE9TIFggMTAuNiBtaXNoYW5kbGVzIEJJT0NTUlRJTUVPVVQgaW4KKwkJICogNjQtYml0IHVzZXJsYW5kIC0gaXQgdGFrZXMsIGFzIGFuIGFyZ3VtZW50LCBhCisJCSAqICJzdHJ1Y3QgQlBGX1RJTUVWQUwiLCB3aGljaCBoYXMgMzItYml0IHR2X3NlYworCQkgKiBhbmQgdHZfdXNlYywgcmF0aGVyIHRoYW4gYSAic3RydWN0IHRpbWV2YWwiLgorCQkgKgorCQkgKiBJZiB0aGlzIHBsYXRmb3JtIGRlZmluZXMgInN0cnVjdCBCUEZfVElNRVZBTCIsCisJCSAqIHdlIGNoZWNrIHdoZXRoZXIgdGhlIHN0cnVjdHVyZSBzaXplIGluIEJJT0NTUlRJTUVPVVQKKwkJICogaXMgdGhhdCBvZiBhICJzdHJ1Y3QgdGltZXZhbCIgYW5kLCBpZiBub3QsIHdlIHVzZQorCQkgKiBhICJzdHJ1Y3QgQlBGX1RJTUVWQUwiIHJhdGhlciB0aGFuIGEgInN0cnVjdCB0aW1ldmFsIi4KKwkJICogKFRoYXQgd2F5LCBpZiB0aGUgYnVnIGlzIGZpeGVkIGluIGEgZnV0dXJlIHJlbGVhc2UsCisJCSAqIHdlIHdpbGwgc3RpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLikKIAkJICovCiAJCXN0cnVjdCB0aW1ldmFsIHRvOwotCQl0by50dl9zZWMgPSB0b19tcyAvIDEwMDA7Ci0JCXRvLnR2X3VzZWMgPSAodG9fbXMgKiAxMDAwKSAlIDEwMDAwMDA7Ci0JCWlmIChpb2N0bChwLT5mZCwgQklPQ1NSVElNRU9VVCwgKGNhZGRyX3QpJnRvKSA8IDApIHsKLQkJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DU1JUSU1FT1VUOiAlcyIsCi0JCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJZ290byBiYWQ7CisjaWZkZWYgSEFWRV9TVFJVQ1RfQlBGX1RJTUVWQUwKKwkJc3RydWN0IEJQRl9USU1FVkFMIGJwZl90bzsKKworCQlpZiAoSU9DUEFSTV9MRU4oQklPQ1NSVElNRU9VVCkgIT0gc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgeworCQkJYnBmX3RvLnR2X3NlYyA9IHAtPm9wdC50aW1lb3V0IC8gMTAwMDsKKwkJCWJwZl90by50dl91c2VjID0gKHAtPm9wdC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOworCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU1JUSU1FT1VULCAoY2FkZHJfdCkmYnBmX3RvKSA8IDApIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJCSU9DU1JUSU1FT1VUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9IGVsc2UgeworI2VuZGlmCisJCQl0by50dl9zZWMgPSBwLT5vcHQudGltZW91dCAvIDEwMDA7CisJCQl0by50dl91c2VjID0gKHAtPm9wdC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOworCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU1JUSU1FT1VULCAoY2FkZHJfdCkmdG8pIDwgMCkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkJJT0NTUlRJTUVPVVQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJZ290byBiYWQ7CisJCQl9CisjaWZkZWYgSEFWRV9TVFJVQ1RfQlBGX1RJTUVWQUwKIAkJfQorI2VuZGlmCiAJfQogCi0jaWZkZWYgX0FJWAogI2lmZGVmCUJJT0NJTU1FRElBVEUKIAkvKgogCSAqIERhcnJlbiBSZWVkIG5vdGVzIHRoYXQKQEAgLTg4MSw3NiArMjEyNiw3MyBAQAogCSAqCWlzIHJlZHVjaW5nIHRoaW5ncyB0byBvbmx5IGEgZmV3IHBhY2tldHMgKGkuZS4gb25lIGV2ZXJ5CiAJICoJc2Vjb25kIG9yIHNvKS4KIAkgKgotCSAqIHNvIHdlIHR1cm4gQklPQ0lNTUVESUFURSBtb2RlIG9uIGlmIHRoaXMgaXMgQUlYLgorCSAqIHNvIHdlIGFsd2F5cyB0dXJuIEJJT0NJTU1FRElBVEUgbW9kZSBvbiBpZiB0aGlzIGlzIEFJWC4KIAkgKgotCSAqIFdlIGRvbid0IHR1cm4gaXQgb24gZm9yIG90aGVyIHBsYXRmb3JtcywgYXMgdGhhdCBtZWFucyB3ZQotCSAqIGdldCB3b2tlbiB1cCBmb3IgZXZlcnkgcGFja2V0LCB3aGljaCBtYXkgbm90IGJlIHdoYXQgd2Ugd2FudDsKLQkgKiBpbiB0aGUgV2ludGVyIDE5OTMgVVNFTklYIHBhcGVyIG9uIEJQRiwgdGhleSBzYXk6CisJICogRm9yIG90aGVyIHBsYXRmb3Jtcywgd2UgZG9uJ3QgdHVybiBpbW1lZGlhdGUgbW9kZSBvbiBieSBkZWZhdWx0LAorCSAqIGFzIHRoYXQgd291bGQgbWVhbiB3ZSBnZXQgd29rZW4gdXAgZm9yIGV2ZXJ5IHBhY2tldCwgd2hpY2gKKwkgKiBwcm9iYWJseSBpc24ndCB3aGF0IHlvdSB3YW50IGZvciBhIHBhY2tldCBzbmlmZmVyLgogCSAqCi0JICoJU2luY2UgYSBwcm9jZXNzIG1pZ2h0IHdhbnQgdG8gbG9vayBhdCBldmVyeSBwYWNrZXQgb24gYQotCSAqCW5ldHdvcmsgYW5kIHRoZSB0aW1lIGJldHdlZW4gcGFja2V0cyBjYW4gYmUgb25seSBhIGZldwotCSAqCW1pY3Jvc2Vjb25kcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGEgcmVhZCBzeXN0ZW0gY2FsbAotCSAqCXBlciBwYWNrZXQgYW5kIEJQRiBtdXN0IGNvbGxlY3QgdGhlIGRhdGEgZnJvbSBzZXZlcmFsCi0JICoJcGFja2V0cyBhbmQgcmV0dXJuIGl0IGFzIGEgdW5pdCB3aGVuIHRoZSBtb25pdG9yaW5nCi0JICoJYXBwbGljYXRpb24gZG9lcyBhIHJlYWQuCi0JICoKLQkgKiB3aGljaCBJIGluZmVyIGlzIHRoZSByZWFzb24gZm9yIHRoZSB0aW1lb3V0IC0gaXQgbWVhbnMgd2UKLQkgKiB3YWl0IHRoYXQgYW1vdW50IG9mIHRpbWUsIGluIHRoZSBob3BlcyB0aGF0IG1vcmUgcGFja2V0cwotCSAqIHdpbGwgYXJyaXZlIGFuZCB3ZSdsbCBnZXQgdGhlbSBhbGwgd2l0aCBvbmUgcmVhZC4KLQkgKgotCSAqIFNldHRpbmcgQklPQ0lNTUVESUFURSBtb2RlIG9uIEZyZWVCU0QgKGFuZCBwcm9iYWJseSBvdGhlcgotCSAqIEJTRHMpIGNhdXNlcyB0aGUgdGltZW91dCB0byBiZSBpZ25vcmVkLgotCSAqCi0JICogT24gdGhlIG90aGVyIGhhbmQsIHNvbWUgcGxhdGZvcm1zIChlLmcuLCBMaW51eCkgZG9uJ3Qgc3VwcG9ydAotCSAqIHRpbWVvdXRzLCB0aGV5IGp1c3QgaGFuZCBzdHVmZiB0byB5b3UgYXMgc29vbiBhcyBpdCBhcnJpdmVzOwotCSAqIGlmIHRoYXQgZG9lc24ndCBjYXVzZSBhIHByb2JsZW0gb24gdGhvc2UgcGxhdGZvcm1zLCBpdCBtYXkKLQkgKiBiZSBPSyB0byBoYXZlIEJJT0NJTU1FRElBVEUgbW9kZSBvbiBCU0QgYXMgd2VsbC4KLQkgKgotCSAqIChOb3RlLCB0aG91Z2gsIHRoYXQgYXBwbGljYXRpb25zIG1heSBkZXBlbmQgb24gdGhlIHJlYWQKLQkgKiBjb21wbGV0aW5nLCBldmVuIGlmIG5vIHBhY2tldHMgaGF2ZSBhcnJpdmVkLCB3aGVuIHRoZSB0aW1lb3V0Ci0JICogZXhwaXJlcywgZS5nLiBHVUkgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaW5wdXQKLQkgKiB3aGlsZSB3YWl0aW5nIGZvciBwYWNrZXRzIHRvIGFycml2ZTsgYSBub24temVybyB0aW1lb3V0Ci0JICogcHJldmVudHMgInNlbGVjdCgpIiBmcm9tIHdvcmtpbmcgcmlnaHQgb24gRnJlZUJTRCBhbmQKLQkgKiBwb3NzaWJseSBvdGhlciBCU0RzLCBhcyB0aGUgdGltZXIgZG9lc24ndCBzdGFydCB1bnRpbCBhCi0JICogInJlYWQoKSIgaXMgZG9uZSwgc28gdGhlIHRpbWVyIGlzbid0IGluIGVmZmVjdCBpZiB0aGUKLQkgKiBhcHBsaWNhdGlvbiBpcyBibG9ja2VkIG9uIGEgInNlbGVjdCgpIiwgYW5kIHRoZSAic2VsZWN0KCkiCi0JICogZG9lc24ndCBnZXQgd29rZW4gdXAgZm9yIGEgQlBGIGRldmljZSB1bnRpbCB0aGUgYnVmZmVyCi0JICogZmlsbHMgdXAuKQorCSAqIFdlIHNldCBpbW1lZGlhdGUgbW9kZSBpZiB0aGUgY2FsbGVyIHJlcXVlc3RlZCBpdCBieSBjYWxsaW5nCisJICogcGNhcF9zZXRfaW1tZWRpYXRlKCkgYmVmb3JlIGNhbGxpbmcgcGNhcF9hY3RpdmF0ZSgpLgogCSAqLwotCXYgPSAxOwotCWlmIChpb2N0bChwLT5mZCwgQklPQ0lNTUVESUFURSwgJnYpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0lNTUVESUFURTogJXMiLAotCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworI2lmbmRlZiBfQUlYCisJaWYgKHAtPm9wdC5pbW1lZGlhdGUpIHsKKyNlbmRpZiAvKiBfQUlYICovCisJCXYgPSAxOworCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NJTU1FRElBVEUsICZ2KSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiQklPQ0lNTUVESUFURTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJZ290byBiYWQ7CisJCX0KKyNpZm5kZWYgX0FJWAorCX0KKyNlbmRpZiAvKiBfQUlYICovCisjZWxzZSAvKiBCSU9DSU1NRURJQVRFICovCisJaWYgKHAtPm9wdC5pbW1lZGlhdGUpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc3VwcG9ydCBpbW1lZGlhdGUgbW9kZS4gIEZhaWwuCisJCSAqLworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJJbW1lZGlhdGUgbW9kZSBub3Qgc3VwcG9ydGVkIik7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KLSNlbmRpZgkvKiBCSU9DSU1NRURJQVRFICovCi0jZW5kaWYJLyogX0FJWCAqLworI2VuZGlmIC8qIEJJT0NJTU1FRElBVEUgKi8KIAotCWlmIChwcm9taXNjKSB7Ci0JCS8qIHNldCBwcm9taXNjdW91cyBtb2RlLCBva2F5IGlmIGl0IGZhaWxzICovCisJaWYgKHAtPm9wdC5wcm9taXNjKSB7CisJCS8qIHNldCBwcm9taXNjdW91cyBtb2RlLCBqdXN0IHdhcm4gaWYgaXQgZmFpbHMgKi8KIAkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DUFJPTUlTQywgTlVMTCkgPCAwKSB7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1BST01JU0M6ICVzIiwKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NQUk9NSVNDOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJc3RhdHVzID0gUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQOwogCQl9CiAJfQogCiAJaWYgKGlvY3RsKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSZ2KSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NHQkxFTjogJXMiLAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DR0JMRU46ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJZ290byBiYWQ7CiAJfQogCXAtPmJ1ZnNpemUgPSB2OworI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJaWYgKCFwYi0+emVyb2NvcHkpIHsKKyNlbmRpZgogCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KICNpZmRlZiBfQUlYCi0JLyogRm9yIHNvbWUgc3RyYW5nZSByZWFzb24gdGhpcyBzZWVtcyB0byBwcmV2ZW50IHRoZSBFRkFVTFQgCisJLyogRm9yIHNvbWUgc3RyYW5nZSByZWFzb24gdGhpcyBzZWVtcyB0byBwcmV2ZW50IHRoZSBFRkFVTFQKIAkgKiBwcm9ibGVtcyB3ZSBoYXZlIGV4cGVyaWVuY2VkIGZyb20gQUlYIEJQRi4gKi8KIAltZW1zZXQocC0+YnVmZmVyLCAweDAsIHAtPmJ1ZnNpemUpOwogI2VuZGlmCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKwl9CisjZW5kaWYKIAogCS8qCiAJICogSWYgdGhlcmUncyBubyBmaWx0ZXIgcHJvZ3JhbSBpbnN0YWxsZWQsIHRoZXJlJ3MKQEAgLTk2NCwxMyArMjIwNiwxNCBAQAogCXRvdGFsX2luc24uY29kZSA9ICh1X3Nob3J0KShCUEZfUkVUIHwgQlBGX0spOwogCXRvdGFsX2luc24uanQgPSAwOwogCXRvdGFsX2luc24uamYgPSAwOwotCXRvdGFsX2luc24uayA9IHNuYXBsZW47CisJdG90YWxfaW5zbi5rID0gcC0+c25hcHNob3Q7CiAKIAl0b3RhbF9wcm9nLmJmX2xlbiA9IDE7CiAJdG90YWxfcHJvZy5iZl9pbnNucyA9ICZ0b3RhbF9pbnNuOwogCWlmIChpb2N0bChwLT5mZCwgQklPQ1NFVEYsIChjYWRkcl90KSZ0b3RhbF9wcm9nKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRGOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRGOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KIApAQCAtMTAxMSw3ICsyMjU0LDcgQEAKIAkgKiBYWFggLSB3aGF0IGFib3V0IEFJWD8KIAkgKi8KIAlwLT5zZWxlY3RhYmxlX2ZkID0gcC0+ZmQ7CS8qIGFzc3VtZSBzZWxlY3QoKSB3b3JrcyB1bnRpbCB3ZSBrbm93IG90aGVyd2lzZSAqLwotCWlmICh1bmFtZSgmb3NpbmZvKSA9PSAwKSB7CisJaWYgKGhhdmVfb3NpbmZvKSB7CiAJCS8qCiAJCSAqIFdlIGNhbiBjaGVjayB3aGF0IE9TIHRoaXMgaXMuCiAJCSAqLwpAQCAtMTAyNyw0OCArMjI3MCwzNDMgQEAKIAlwLT5zZXRmaWx0ZXJfb3AgPSBwY2FwX3NldGZpbHRlcl9icGY7CiAJcC0+c2V0ZGlyZWN0aW9uX29wID0gcGNhcF9zZXRkaXJlY3Rpb25fYnBmOwogCXAtPnNldF9kYXRhbGlua19vcCA9IHBjYXBfc2V0X2RhdGFsaW5rX2JwZjsKLQlwLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7Ci0JcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCXAtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19icGY7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2JwZjsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfYnBmOwotCXAtPmNsb3NlX29wID0gcGNhcF9jbG9zZV9jb21tb247CisJcC0+Y2xlYW51cF9vcCA9IHBjYXBfY2xlYW51cF9icGY7CiAKLQlyZXR1cm4gKHApOworCXJldHVybiAoc3RhdHVzKTsKICBiYWQ6Ci0JKHZvaWQpY2xvc2UoZmQpOwotCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKQotCQlmcmVlKHAtPmRsdF9saXN0KTsKLQlmcmVlKHApOwotCXJldHVybiAoTlVMTCk7CisJcGNhcF9jbGVhbnVwX2JwZihwKTsKKwlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKIGludAogcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogewotI2lmZGVmIEhBVkVfREFHX0FQSQotCWlmIChkYWdfcGxhdGZvcm1fZmluZGRldnMoYWxsZGV2c3AsIGVycmJ1ZikgPCAwKQotCQlyZXR1cm4gKC0xKTsKLSNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KLQogCXJldHVybiAoMCk7CiB9CiAKKyNpZmRlZiBIQVZFX0JTRF9JRUVFODAyMTEKK3N0YXRpYyBpbnQKK21vbml0b3JfbW9kZShwY2FwX3QgKnAsIGludCBzZXQpCit7CisJc3RydWN0IHBjYXBfYnBmICpwYiA9IHAtPnByaXY7CisJaW50IHNvY2s7CisJc3RydWN0IGlmbWVkaWFyZXEgcmVxOworCWludCAqbWVkaWFfbGlzdDsKKwlpbnQgaTsKKwlpbnQgY2FuX2RvOworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChzb2NrID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImNhbid0IG9wZW4gc29ja2V0OiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZiByZXEpOworCXN0cm5jcHkocmVxLmlmbV9uYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2YgcmVxLmlmbV9uYW1lKTsKKworCS8qCisJICogRmluZCBvdXQgaG93IG1hbnkgbWVkaWEgdHlwZXMgd2UgaGF2ZS4KKwkgKi8KKwlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRk1FRElBLCAmcmVxKSA8IDApIHsKKwkJLyoKKwkJICogQ2FuJ3QgZ2V0IHRoZSBtZWRpYSB0eXBlcy4KKwkJICovCisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVOWElPOgorCQkJLyoKKwkJCSAqIFRoZXJlJ3Mgbm8gc3VjaCBkZXZpY2UuCisJCQkgKi8KKwkJCWNsb3NlKHNvY2spOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKKworCQljYXNlIEVJTlZBTDoKKwkJCS8qCisJCQkgKiBJbnRlcmZhY2UgZG9lc24ndCBzdXBwb3J0IFNJT0N7RyxTfUlGTUVESUEuCisJCQkgKi8KKwkJCWNsb3NlKHNvY2spOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUCk7CisKKwkJZGVmYXVsdDoKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiU0lPQ0dJRk1FRElBIDE6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJY2xvc2Uoc29jayk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQl9CisJfQorCWlmIChyZXEuaWZtX2NvdW50ID09IDApIHsKKwkJLyoKKwkJICogTm8gbWVkaWEgdHlwZXMuCisJCSAqLworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUCk7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIGFsbCB0aGUgbWVkaWEgdHlwZXMsIGFuZAorCSAqIGdldCB0aGUgbWVkaWEgdHlwZXMuCisJICovCisJbWVkaWFfbGlzdCA9IG1hbGxvYyhyZXEuaWZtX2NvdW50ICogc2l6ZW9mKGludCkpOworCWlmIChtZWRpYV9saXN0ID09IE5VTEwpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKwlyZXEuaWZtX3VsaXN0ID0gbWVkaWFfbGlzdDsKKwlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRk1FRElBLCAmcmVxKSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ0dJRk1FRElBOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWZyZWUobWVkaWFfbGlzdCk7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKworCS8qCisJICogTG9vayBmb3IgYW4gODAyLjExICJhdXRvbWF0aWMiIG1lZGlhIHR5cGUuCisJICogV2UgYXNzdW1lIHRoYXQgYWxsIDgwMi4xMSBhZGFwdGVycyBoYXZlIHRoYXQgbWVkaWEgdHlwZSwKKwkgKiBhbmQgdGhhdCBpdCB3aWxsIGNhcnJ5IHRoZSBtb25pdG9yIG1vZGUgc3VwcG9ydGVkIGZsYWcuCisJICovCisJY2FuX2RvID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcmVxLmlmbV9jb3VudDsgaSsrKSB7CisJCWlmIChJRk1fVFlQRShtZWRpYV9saXN0W2ldKSA9PSBJRk1fSUVFRTgwMjExCisJCSAgICAmJiBJRk1fU1VCVFlQRShtZWRpYV9saXN0W2ldKSA9PSBJRk1fQVVUTykgeworCQkJLyogT0ssIGRvZXMgaXQgZG8gbW9uaXRvciBtb2RlPyAqLworCQkJaWYgKG1lZGlhX2xpc3RbaV0gJiBJRk1fSUVFRTgwMjExX01PTklUT1IpIHsKKwkJCQljYW5fZG8gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWZyZWUobWVkaWFfbGlzdCk7CisJaWYgKCFjYW5fZG8pIHsKKwkJLyoKKwkJICogVGhpcyBhZGFwdGVyIGRvZXNuJ3Qgc3VwcG9ydCBtb25pdG9yIG1vZGUuCisJCSAqLworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUCk7CisJfQorCisJaWYgKHNldCkgeworCQkvKgorCQkgKiBEb24ndCBqdXN0IGNoZWNrIHdoZXRoZXIgd2UgY2FuIGVuYWJsZSBtb25pdG9yIG1vZGUsCisJCSAqIGRvIHNvLCBpZiBpdCdzIG5vdCBhbHJlYWR5IGVuYWJsZWQuCisJCSAqLworCQlpZiAoKHJlcS5pZm1fY3VycmVudCAmIElGTV9JRUVFODAyMTFfTU9OSVRPUikgPT0gMCkgeworCQkJLyoKKwkJCSAqIE1vbml0b3IgbW9kZSBpc24ndCBjdXJyZW50bHkgb24sIHNvIHR1cm4gaXQgb24sCisJCQkgKiBhbmQgcmVtZW1iZXIgdGhhdCB3ZSBzaG91bGQgdHVybiBpdCBvZmYgd2hlbiB0aGUKKwkJCSAqIHBjYXBfdCBpcyBjbG9zZWQuCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLCBhcnJhbmdlIHRvIGhhdmUKKwkJCSAqICJwY2FwX2Nsb3NlX2FsbCgpIiBjYWxsZWQgd2hlbiB3ZSBleGl0LgorCQkJICovCisJCQlpZiAoIXBjYXBfZG9fYWRkZXhpdChwKSkgeworCQkJCS8qCisJCQkJICogImF0ZXhpdCgpIiBmYWlsZWQ7IGRvbid0IHB1dCB0aGUgaW50ZXJmYWNlCisJCQkJICogaW4gbW9uaXRvciBtb2RlLCBqdXN0IGdpdmUgdXAuCisJCQkJICovCisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAgImF0ZXhpdCBmYWlsZWQiKTsKKwkJCQljbG9zZShzb2NrKTsKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQkJfQorCQkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJCSh2b2lkKXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBwLT5vcHQuc291cmNlLAorCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCWlmci5pZnJfbWVkaWEgPSByZXEuaWZtX2N1cnJlbnQgfCBJRk1fSUVFRTgwMjExX01PTklUT1I7CisJCQlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRk1FRElBLCAmaWZyKSA9PSAtMSkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgICJTSU9DU0lGTUVESUE6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCWNsb3NlKHNvY2spOworCQkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCQl9CisKKwkJCXBiLT5tdXN0X2RvX29uX2Nsb3NlIHw9IE1VU1RfQ0xFQVJfUkZNT047CisKKwkJCS8qCisJCQkgKiBBZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBwY2FwcyB0byBjbG9zZSB3aGVuIHdlIGV4aXQuCisJCQkgKi8KKwkJCXBjYXBfYWRkX3RvX3BjYXBzX3RvX2Nsb3NlKHApOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogSEFWRV9CU0RfSUVFRTgwMjExICovCisKKyNpZiBkZWZpbmVkKEJJT0NHRExUTElTVCkgJiYgKGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkpCisvKgorICogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFueSA4MDIuMTEgbGluay1sYXllciB0eXBlczsgcmV0dXJuIHRoZSBiZXN0CisgKiBvZiB0aGUgODAyLjExIGxpbmstbGF5ZXIgdHlwZXMgaWYgd2UgZmluZCBvbmUsIGFuZCByZXR1cm4gLTEKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBETFRfSUVFRTgwMl8xMV9SQURJTywgd2l0aCB0aGUgcmFkaW90YXAgaGVhZGVyLCBpcyBjb25zaWRlcmVkIHRoZQorICogYmVzdCA4MDIuMTEgbGluay1sYXllciB0eXBlOyBhbnkgb2YgdGhlIG90aGVyIDgwMi4xMS1wbHVzLXJhZGlvCisgKiBoZWFkZXJzIGFyZSBzZWNvbmQtYmVzdDsgODAyLjExIHdpdGggbm8gcmFkaW8gaW5mb3JtYXRpb24gaXMKKyAqIHRoZSBsZWFzdCBnb29kLgorICovCitzdGF0aWMgaW50CitmaW5kXzgwMl8xMShzdHJ1Y3QgYnBmX2RsdGxpc3QgKmJkbHApCit7CisJaW50IG5ld19kbHQ7CisJaW50IGk7CisKKwkvKgorCSAqIFNjYW4gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGxvb2tpbmcgZm9yIDgwMi4xMSB2YWx1ZXMsCisJICogYW5kLCBpZiB3ZSBmaW5kIGFueSwgY2hvb3NlIHRoZSBiZXN0IG9mIHRoZW0uCisJICovCisJbmV3X2RsdCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBiZGxwLT5iZmxfbGVuOyBpKyspIHsKKwkJc3dpdGNoIChiZGxwLT5iZmxfbGlzdFtpXSkgeworCisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCQkvKgorCQkJICogODAyLjExLCBidXQgbm8gcmFkaW8uCisJCQkgKgorCQkJICogT2ZmZXIgdGhpcywgYW5kIHNlbGVjdCBpdCBhcyB0aGUgbmV3IG1vZGUKKwkJCSAqIHVubGVzcyB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGFuIDgwMi4xMQorCQkJICogaGVhZGVyIHdpdGggcmFkaW8gaW5mb3JtYXRpb24uCisJCQkgKi8KKwkJCWlmIChuZXdfZGx0ID09IC0xKQorCQkJCW5ld19kbHQgPSBiZGxwLT5iZmxfbGlzdFtpXTsKKwkJCWJyZWFrOworCisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfQUlST05FVF9IRUFERVI6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCQkJLyoKKwkJCSAqIDgwMi4xMSB3aXRoIHJhZGlvLCBidXQgbm90IHJhZGlvdGFwLgorCQkJICoKKwkJCSAqIE9mZmVyIHRoaXMsIGFuZCBzZWxlY3QgaXQgYXMgdGhlIG5ldyBtb2RlCisJCQkgKiB1bmxlc3Mgd2UndmUgYWxyZWFkeSBmb3VuZCB0aGUgcmFkaW90YXAgRExUXy4KKwkJCSAqLworCQkJaWYgKG5ld19kbHQgIT0gRExUX0lFRUU4MDJfMTFfUkFESU8pCisJCQkJbmV3X2RsdCA9IGJkbHAtPmJmbF9saXN0W2ldOworCQkJYnJlYWs7CisKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJCS8qCisJCQkgKiA4MDIuMTEgd2l0aCByYWRpb3RhcC4KKwkJCSAqCisJCQkgKiBPZmZlciB0aGlzLCBhbmQgc2VsZWN0IGl0IGFzIHRoZSBuZXcgbW9kZS4KKwkJCSAqLworCQkJbmV3X2RsdCA9IGJkbHAtPmJmbF9saXN0W2ldOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBOb3QgODAyLjExLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAobmV3X2RsdCk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChCSU9DR0RMVExJU1QpICYmIChkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChIQVZFX0JTRF9JRUVFODAyMTEpKSAqLworCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoQklPQ0dETFRMSVNUKQorLyoKKyAqIFJlbW92ZSBETFRfRU4xME1CIGZyb20gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGFzIHdlJ3JlIGluIG1vbml0b3IgbW9kZSwKKyAqIGFuZCBETFRfRU4xME1CIGlzbid0IHN1cHBvcnRlZCBpbiBtb25pdG9yIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkCityZW1vdmVfZW4ocGNhcF90ICpwKQoreworCWludCBpLCBqOworCisJLyoKKwkgKiBTY2FuIHRoZSBsaXN0IG9mIERMVF8gdmFsdWVzIGFuZCBkaXNjYXJkIERMVF9FTjEwTUIuCisJICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHAtPmRsdF9jb3VudDsgaSsrKSB7CisJCXN3aXRjaCAocC0+ZGx0X2xpc3RbaV0pIHsKKworCQljYXNlIERMVF9FTjEwTUI6CisJCQkvKgorCQkJICogRG9uJ3Qgb2ZmZXIgdGhpcyBvbmUuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogSnVzdCBjb3B5IHRoaXMgbW9kZSBvdmVyLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIENvcHkgdGhpcyBETFRfIHZhbHVlIHRvIGl0cyBuZXcgcG9zaXRpb24uCisJCSAqLworCQlwLT5kbHRfbGlzdFtqXSA9IHAtPmRsdF9saXN0W2ldOworCQlqKys7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIERMVF8gY291bnQgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGNvcGllZC4KKwkgKi8KKwlwLT5kbHRfY291bnQgPSBqOworfQorCisvKgorICogUmVtb3ZlIDgwMi4xMSBsaW5rLWxheWVyIHR5cGVzIGZyb20gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGFzCisgKiB3ZSdyZSBub3QgaW4gbW9uaXRvciBtb2RlLCBhbmQgdGhvc2UgRExUXyB2YWx1ZXMgd2lsbCBzd2l0Y2ggdXMKKyAqIHRvIG1vbml0b3IgbW9kZS4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92ZV84MDJfMTEocGNhcF90ICpwKQoreworCWludCBpLCBqOworCisJLyoKKwkgKiBTY2FuIHRoZSBsaXN0IG9mIERMVF8gdmFsdWVzIGFuZCBkaXNjYXJkIDgwMi4xMSB2YWx1ZXMuCisJICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHAtPmRsdF9jb3VudDsgaSsrKSB7CisJCXN3aXRjaCAocC0+ZGx0X2xpc3RbaV0pIHsKKworCQljYXNlIERMVF9JRUVFODAyXzExOgorCQljYXNlIERMVF9QUklTTV9IRUFERVI6CisJCWNhc2UgRExUX0FJUk9ORVRfSEVBREVSOgorCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgorCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKKwkJCS8qCisJCQkgKiA4MDIuMTEuICBEb24ndCBvZmZlciB0aGlzIG9uZS4KKwkJCSAqLworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBKdXN0IGNvcHkgdGhpcyBtb2RlIG92ZXIuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQ29weSB0aGlzIERMVF8gdmFsdWUgdG8gaXRzIG5ldyBwb3NpdGlvbi4KKwkJICovCisJCXAtPmRsdF9saXN0W2pdID0gcC0+ZGx0X2xpc3RbaV07CisJCWorKzsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgRExUXyBjb3VudCB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgY29waWVkLgorCSAqLworCXAtPmRsdF9jb3VudCA9IGo7Cit9CisjZW5kaWYgLyogZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoQklPQ0dETFRMSVNUKSAqLworCiBzdGF0aWMgaW50CiBwY2FwX3NldGZpbHRlcl9icGYocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQogewotCS8qCi0JICogSXQgbG9va3MgdGhhdCBCUEYgY29kZSBnZW5lcmF0ZWQgYnkgZ2VuX3Byb3RvY2hhaW4oKSBpcyBub3QKLQkgKiBjb21wYXRpYmxlIHdpdGggc29tZSBvZiBrZXJuZWwgQlBGIGNvZGUgKGZvciBleGFtcGxlIEJTRC9PUyAzLjEpLgotCSAqIFRha2UgYSBzYWZlciBzaWRlIGZvciBub3cuCi0JICovCi0JaWYgKG5vX29wdGltaXplKSB7Ci0JCS8qCi0JCSAqIFhYWCAtIHdoYXQgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZmlsdGVyIGluIHRoZSBrZXJuZWw/Ci0JCSAqLwotCQlpZiAoaW5zdGFsbF9icGZfcHJvZ3JhbShwLCBmcCkgPCAwKQotCQkJcmV0dXJuICgtMSk7Ci0JCXAtPm1kLnVzZV9icGYgPSAwOwkvKiBmaWx0ZXJpbmcgaW4gdXNlcmxhbmQgKi8KLQkJcmV0dXJuICgwKTsKLQl9CisJc3RydWN0IHBjYXBfYnBmICpwYiA9IHAtPnByaXY7CiAKIAkvKgogCSAqIEZyZWUgYW55IHVzZXItbW9kZSBmaWx0ZXIgd2UgbWlnaHQgaGFwcGVuIHRvIGhhdmUgaW5zdGFsbGVkLgpAQCAtMTA3OCwyMCArMjYxNiw1MSBAQAogCS8qCiAJICogVHJ5IHRvIGluc3RhbGwgdGhlIGtlcm5lbCBmaWx0ZXIuCiAJICovCi0JaWYgKGlvY3RsKHAtPmZkLCBCSU9DU0VURiwgKGNhZGRyX3QpZnApIDwgMCkgeworCWlmIChpb2N0bChwLT5mZCwgQklPQ1NFVEYsIChjYWRkcl90KWZwKSA9PSAwKSB7CisJCS8qCisJCSAqIEl0IHdvcmtlZC4KKwkJICovCisJCXBiLT5maWx0ZXJpbmdfaW5fa2VybmVsID0gMTsJLyogZmlsdGVyaW5nIGluIHRoZSBrZXJuZWwgKi8KKworCQkvKgorCQkgKiBEaXNjYXJkIGFueSBwcmV2aW91c2x5LXJlY2VpdmVkIHBhY2tldHMsIGFzIHRoZXkgbWlnaHQKKwkJICogaGF2ZSBwYXNzZWQgd2hhdGV2ZXIgZmlsdGVyIHdhcyBmb3JtZXJseSBpbiBlZmZlY3QsIGJ1dAorCQkgKiBtaWdodCBub3QgcGFzcyB0aGlzIGZpbHRlciAoQklPQ1NFVEYgZGlzY2FyZHMgcGFja2V0cworCQkgKiBidWZmZXJlZCBpbiB0aGUga2VybmVsLCBzbyB5b3UgY2FuIGxvc2UgcGFja2V0cyBpbiBhbnkKKwkJICogY2FzZSkuCisJCSAqLworCQlwLT5jYyA9IDA7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBXZSBmYWlsZWQuCisJICoKKwkgKiBJZiBpdCBmYWlsZWQgd2l0aCBFSU5WQUwsIHRoYXQncyBwcm9iYWJseSBiZWNhdXNlIHRoZSBwcm9ncmFtCisJICogaXMgaW52YWxpZCBvciB0b28gYmlnLiAgVmFsaWRhdGUgaXQgb3Vyc2VsdmVzOyBpZiB3ZSBsaWtlIGl0CisJICogKHdlIGN1cnJlbnRseSBhbGxvdyBiYWNrd2FyZCBicmFuY2hlcywgdG8gc3VwcG9ydCBwcm90b2NoYWluKSwKKwkgKiBydW4gaXQgaW4gdXNlcmxhbmQuICAoVGhlcmUncyBubyBub3Rpb24gb2YgInRvbyBiaWciIGZvcgorCSAqIHVzZXJsYW5kLikKKwkgKgorCSAqIE90aGVyd2lzZSwganVzdCBnaXZlIHVwLgorCSAqIFhYWCAtIGlmIHRoZSBjb3B5IG9mIHRoZSBwcm9ncmFtIGludG8gdGhlIGtlcm5lbCBmYWlsZWQsCisJICogd2Ugd2lsbCBnZXQgRUlOVkFMIHJhdGhlciB0aGFuLCBzYXksIEVGQVVMVCBvbiBhdCBsZWFzdAorCSAqIHNvbWUga2VybmVscy4KKwkgKi8KKwlpZiAoZXJybm8gIT0gRUlOVkFMKSB7CiAJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRGOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KLQlwLT5tZC51c2VfYnBmID0gMTsJLyogZmlsdGVyaW5nIGluIHRoZSBrZXJuZWwgKi8KIAogCS8qCi0JICogRGlzY2FyZCBhbnkgcHJldmlvdXNseS1yZWNlaXZlZCBwYWNrZXRzLCBhcyB0aGV5IG1pZ2h0IGhhdmUKLQkgKiBwYXNzZWQgd2hhdGV2ZXIgZmlsdGVyIHdhcyBmb3JtZXJseSBpbiBlZmZlY3QsIGJ1dCBtaWdodAotCSAqIG5vdCBwYXNzIHRoaXMgZmlsdGVyIChCSU9DU0VURiBkaXNjYXJkcyBwYWNrZXRzIGJ1ZmZlcmVkCi0JICogaW4gdGhlIGtlcm5lbCwgc28geW91IGNhbiBsb3NlIHBhY2tldHMgaW4gYW55IGNhc2UpLgorCSAqIGluc3RhbGxfYnBmX3Byb2dyYW0oKSB2YWxpZGF0ZXMgdGhlIHByb2dyYW0uCisJICoKKwkgKiBYWFggLSB3aGF0IGlmIHdlIGFscmVhZHkgaGF2ZSBhIGZpbHRlciBpbiB0aGUga2VybmVsPwogCSAqLwotCXAtPmNjID0gMDsKKwlpZiAoaW5zdGFsbF9icGZfcHJvZ3JhbShwLCBmcCkgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwlwYi0+ZmlsdGVyaW5nX2luX2tlcm5lbCA9IDA7CS8qIGZpbHRlcmluZyBpbiB1c2VybGFuZCAqLwogCXJldHVybiAoMCk7CiB9CiAKZGlmZiAtLWdpdCBhL3BjYXAtYnBmLmggYi9wY2FwLWJwZi5oCmluZGV4IDYyYzQ5M2IuLjdiN2U5MGEgMTAwNjQ0Ci0tLSBhL3BjYXAtYnBmLmgKKysrIGIvcGNhcC1icGYuaApAQCAtMzUsODAwICszNSwxMyBAQAogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCiAgKgotICogICAgICBAKCMpYnBmLmggICAgICAgNy4xIChCZXJrZWxleSkgNS83LzkxCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtYnBmLmgsdiAxLjUwIDIwMDctMDQtMDEgMjE6NDM6NTUgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtYnBmLmgsdiAxLjM0LjIuMjQgMjAwNy8wOS8xOSAwMjo1MjoxMiBndXkgRXhwICQgKExCTCkKKyAqIE5vdGUgdG8gT1MgdmVuZG9yczogZG8gTk9UIGdldCByaWQgb2YgdGhpcyBmaWxlISAgU29tZSBhcHBsaWNhdGlvbnMKKyAqIG1pZ2h0IGV4cGVjdCB0byBiZSBhYmxlIHRvIGluY2x1ZGUgPHBjYXAtYnBmLmg+LgogICovCi0KLS8qCi0gKiBUaGlzIGlzIGxpYnBjYXAncyBjdXQtZG93biB2ZXJzaW9uIG9mIGJwZi5oOyBpdCBpbmNsdWRlcyBvbmx5Ci0gKiB0aGUgc3R1ZmYgbmVlZGVkIGZvciB0aGUgY29kZSBnZW5lcmF0b3IgYW5kIHRoZSB1c2VybGFuZCBCUEYKLSAqIGludGVycHJldGVyLCBhbmQgdGhlIGxpYnBjYXAgQVBJcyBmb3Igc2V0dGluZyBmaWx0ZXJzLCBldGMuLgotICoKLSAqICJwY2FwLWJwZi5jIiB3aWxsIGluY2x1ZGUgdGhlIG5hdGl2ZSBPUyB2ZXJzaW9uLCBhcyBpdCBkZWFscyB3aXRoCi0gKiB0aGUgT1MncyBCUEYgaW1wbGVtZW50YXRpb24uCi0gKgotICogWFhYIC0gc2hvdWxkIHRoaXMgYWxsIGp1c3QgYmUgbW92ZWQgdG8gInBjYXAuaCI/Ci0gKi8KLQotI2lmbmRlZiBCUEZfTUFKT1JfVkVSU0lPTgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEJTRCBzdHlsZSByZWxlYXNlIGRhdGUgKi8KLSNkZWZpbmUgQlBGX1JFTEVBU0UgMTk5NjA2Ci0KLSNpZmRlZiBNU0RPUyAvKiBtdXN0IGJlIDMyLWJpdCAqLwotdHlwZWRlZiBsb25nICAgICAgICAgIGJwZl9pbnQzMjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBicGZfdV9pbnQzMjsKLSNlbHNlCi10eXBlZGVmCWludCBicGZfaW50MzI7Ci10eXBlZGVmCXVfaW50IGJwZl91X2ludDMyOwotI2VuZGlmCi0KLS8qCi0gKiBBbGlnbm1lbnQgbWFjcm9zLiAgQlBGX1dPUkRBTElHTiByb3VuZHMgdXAgdG8gdGhlIG5leHQgCi0gKiBldmVuIG11bHRpcGxlIG9mIEJQRl9BTElHTk1FTlQuIAotICovCi0jaWZuZGVmIF9fTmV0QlNEX18KLSNkZWZpbmUgQlBGX0FMSUdOTUVOVCBzaXplb2YoYnBmX2ludDMyKQotI2Vsc2UKLSNkZWZpbmUgQlBGX0FMSUdOTUVOVCBzaXplb2YobG9uZykKLSNlbmRpZgotI2RlZmluZSBCUEZfV09SREFMSUdOKHgpICgoKHgpKyhCUEZfQUxJR05NRU5ULTEpKSZ+KEJQRl9BTElHTk1FTlQtMSkpCi0KLSNkZWZpbmUgQlBGX01BWElOU05TIDUxMgotI2RlZmluZSBCUEZfTUFYQlVGU0laRSAweDgwMDAKLSNkZWZpbmUgQlBGX01JTkJVRlNJWkUgMzIKLQotLyoKLSAqIFN0cnVjdHVyZSBmb3IgInBjYXBfY29tcGlsZSgpIiwgInBjYXBfc2V0ZmlsdGVyKCkiLCBldGMuLgotICovCi1zdHJ1Y3QgYnBmX3Byb2dyYW0gewotCXVfaW50IGJmX2xlbjsKLQlzdHJ1Y3QgYnBmX2luc24gKmJmX2luc25zOwotfTsKLSAKLS8qCi0gKiBTdHJ1Y3QgcmV0dXJuIGJ5IEJJT0NWRVJTSU9OLiAgVGhpcyByZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiAKLSAqIHRoZSBmaWx0ZXIgbGFuZ3VhZ2UgZGVzY3JpYmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYmVsb3cuCi0gKiBicGYgdW5kZXJzdGFuZHMgYSBwcm9ncmFtIGlmZiBrZXJuZWxfbWFqb3IgPT0gZmlsdGVyX21ham9yICYmCi0gKiBrZXJuZWxfbWlub3IgPj0gZmlsdGVyX21pbm9yLCB0aGF0IGlzLCBpZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlCi0gKiBydW5uaW5nIGtlcm5lbCBoYXMgdGhlIHNhbWUgbWFqb3IgbnVtYmVyIGFuZCBhIG1pbm9yIG51bWJlciBlcXVhbAotICogZXF1YWwgdG8gb3IgbGVzcyB0aGFuIHRoZSBmaWx0ZXIgYmVpbmcgZG93bmxvYWRlZC4gIE90aGVyd2lzZSwgdGhlCi0gKiByZXN1bHRzIGFyZSB1bmRlZmluZWQsIG1lYW5pbmcgYW4gZXJyb3IgbWF5IGJlIHJldHVybmVkIG9yIHBhY2tldHMKLSAqIG1heSBiZSBhY2NlcHRlZCBoYXBoYXphcmRseS4KLSAqIEl0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNvdXJjZSBjb2RlIHZlcnNpb24uCi0gKi8KLXN0cnVjdCBicGZfdmVyc2lvbiB7Ci0JdV9zaG9ydCBidl9tYWpvcjsKLQl1X3Nob3J0IGJ2X21pbm9yOwotfTsKLS8qIEN1cnJlbnQgdmVyc2lvbiBudW1iZXIgb2YgZmlsdGVyIGFyY2hpdGVjdHVyZS4gKi8KLSNkZWZpbmUgQlBGX01BSk9SX1ZFUlNJT04gMQotI2RlZmluZSBCUEZfTUlOT1JfVkVSU0lPTiAxCi0KLS8qCi0gKiBEYXRhLWxpbmsgbGV2ZWwgdHlwZSBjb2Rlcy4KLSAqCi0gKiBEbyAqTk9UKiBhZGQgbmV3IHZhbHVlcyB0byB0aGlzIGxpc3Qgd2l0aG91dCBhc2tpbmcKLSAqICJ0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmciIGZvciBhIHZhbHVlLiAgT3RoZXJ3aXNlLCB5b3UgcnVuIHRoZQotICogcmlzayBvZiB1c2luZyBhIHZhbHVlIHRoYXQncyBhbHJlYWR5IGJlaW5nIHVzZWQgZm9yIHNvbWUgb3RoZXIgcHVycG9zZSwKLSAqIGFuZCBvZiBoYXZpbmcgdG9vbHMgdGhhdCByZWFkIGxpYnBjYXAtZm9ybWF0IGNhcHR1cmVzIG5vdCBiZWluZyBhYmxlCi0gKiB0byBoYW5kbGUgY2FwdHVyZXMgd2l0aCB5b3VyIG5ldyBETFRfIHZhbHVlLCB3aXRoIG5vIGhvcGUgdGhhdCB0aGV5Ci0gKiB3aWxsIGV2ZXIgYmUgY2hhbmdlZCB0byBkbyBzbyAoYXMgdGhhdCB3b3VsZCBkZXN0cm95IHRoZWlyIGFiaWxpdHkKLSAqIHRvIHJlYWQgY2FwdHVyZXMgdXNpbmcgdGhhdCB2YWx1ZSBmb3IgdGhhdCBvdGhlciBwdXJwb3NlKS4KLSAqLwotCi0vKgotICogVGhlc2UgYXJlIHRoZSB0eXBlcyB0aGF0IGFyZSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgdGhhdAotICogaGF2ZSBiZWVuIGRlZmluZWQgYnkgPG5ldC9icGYuaD4gZm9yIGFnZXMuCi0gKi8KLSNkZWZpbmUgRExUX05VTEwJMAkvKiBCU0QgbG9vcGJhY2sgZW5jYXBzdWxhdGlvbiAqLwotI2RlZmluZSBETFRfRU4xME1CCTEJLyogRXRoZXJuZXQgKDEwTWIpICovCi0jZGVmaW5lIERMVF9FTjNNQgkyCS8qIEV4cGVyaW1lbnRhbCBFdGhlcm5ldCAoM01iKSAqLwotI2RlZmluZSBETFRfQVgyNQkzCS8qIEFtYXRldXIgUmFkaW8gQVguMjUgKi8KLSNkZWZpbmUgRExUX1BST05FVAk0CS8qIFByb3Rlb24gUHJvTkVUIFRva2VuIFJpbmcgKi8KLSNkZWZpbmUgRExUX0NIQU9TCTUJLyogQ2hhb3MgKi8KLSNkZWZpbmUgRExUX0lFRUU4MDIJNgkvKiA4MDIuNSBUb2tlbiBSaW5nICovCi0jZGVmaW5lIERMVF9BUkNORVQJNwkvKiBBUkNORVQsIHdpdGggQlNELXN0eWxlIGhlYWRlciAqLwotI2RlZmluZSBETFRfU0xJUAk4CS8qIFNlcmlhbCBMaW5lIElQICovCi0jZGVmaW5lIERMVF9QUFAJCTkJLyogUG9pbnQtdG8tcG9pbnQgUHJvdG9jb2wgKi8KLSNkZWZpbmUgRExUX0ZEREkJMTAJLyogRkRESSAqLwotCi0vKgotICogVGhlc2UgYXJlIHR5cGVzIHRoYXQgYXJlIGRpZmZlcmVudCBvbiBzb21lIHBsYXRmb3JtcywgYW5kIHRoYXQKLSAqIGhhdmUgYmVlbiBkZWZpbmVkIGJ5IDxuZXQvYnBmLmg+IGZvciBhZ2VzLiAgV2UgdXNlICNpZmRlZnMgdG8KLSAqIGRldGVjdCB0aGUgQlNEcyB0aGF0IGRlZmluZSB0aGVtIGRpZmZlcmVudGx5IGZyb20gdGhlIHRyYWRpdGlvbmFsCi0gKiBsaWJwY2FwIDxuZXQvYnBmLmg+Ci0gKgotICogWFhYIC0gRExUX0FUTV9SRkMxNDgzIGlzIDEzIGluIEJTRC9PUywgYW5kIERMVF9SQVcgaXMgMTQgaW4gQlNEL09TLAotICogYnV0IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSByaWdodCAjZGVmaW5lIGlzIGZvciBCU0QvT1MuCi0gKi8KLSNkZWZpbmUgRExUX0FUTV9SRkMxNDgzCTExCS8qIExMQy1lbmNhcHN1bGF0ZWQgQVRNICovCi0KLSNpZmRlZiBfX09wZW5CU0RfXwotI2RlZmluZSBETFRfUkFXCQkxNAkvKiByYXcgSVAgKi8KLSNlbHNlCi0jZGVmaW5lIERMVF9SQVcJCTEyCS8qIHJhdyBJUCAqLwotI2VuZGlmCi0KLS8qCi0gKiBHaXZlbiB0aGF0IHRoZSBvbmx5IE9TIHRoYXQgY3VycmVudGx5IGdlbmVyYXRlcyBCU0QvT1MgU0xJUCBvciBQUFAKLSAqIGlzLCB3ZWxsLCBCU0QvT1MsIGFyZ3VhYmx5IGV2ZXJ5Ym9keSBzaG91bGQgaGF2ZSBjaG9zZW4gaXRzIHZhbHVlcwotICogZm9yIERMVF9TTElQX0JTRE9TIGFuZCBETFRfUFBQX0JTRE9TLCB3aGljaCBhcmUgMTUgYW5kIDE2LCBidXQgdGhleQotICogZGlkbid0LiAgU28gaXQgZ29lcy4KLSAqLwotI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSNpZm5kZWYgRExUX1NMSVBfQlNET1MKLSNkZWZpbmUgRExUX1NMSVBfQlNET1MJMTMJLyogQlNEL09TIFNlcmlhbCBMaW5lIElQICovCi0jZGVmaW5lIERMVF9QUFBfQlNET1MJMTQJLyogQlNEL09TIFBvaW50LXRvLXBvaW50IFByb3RvY29sICovCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIERMVF9TTElQX0JTRE9TCTE1CS8qIEJTRC9PUyBTZXJpYWwgTGluZSBJUCAqLwotI2RlZmluZSBETFRfUFBQX0JTRE9TCTE2CS8qIEJTRC9PUyBQb2ludC10by1wb2ludCBQcm90b2NvbCAqLwotI2VuZGlmCi0KLS8qCi0gKiAxNyBpcyB1c2VkIGZvciBETFRfT0xEX1BGTE9HIGluIE9wZW5CU0Q7Ci0gKiAgICAgT0JTT0xFVEU6IERMVF9QRkxPRyBpcyAxMTcgaW4gT3BlbkJTRCBub3cgYXMgd2VsbC4gU2VlIGJlbG93LgotICogMTggaXMgdXNlZCBmb3IgRExUX1BGU1lOQyBpbiBPcGVuQlNEOyBkb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIGVsc2UuCi0gKi8KLQotI2RlZmluZSBETFRfQVRNX0NMSVAJMTkJLyogTGludXggQ2xhc3NpY2FsLUlQIG92ZXIgQVRNICovCi0KLS8qCi0gKiBBcHBhcmVudGx5IFJlZGJhY2sgdXNlcyB0aGlzIGZvciBpdHMgU21hcnRFZGdlIDQwMC84MDAuICBJIGhvcGUKLSAqIG5vYm9keSBlbHNlIGRlY2lkZWQgdG8gdXNlIGl0LCB0b28uCi0gKi8KLSNkZWZpbmUgRExUX1JFREJBQ0tfU01BUlRFREdFCTMyCi0KLS8qCi0gKiBUaGVzZSB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgTmV0QlNEOyBvdGhlciBwbGF0Zm9ybXMgc2hvdWxkIHJlZnJhaW4gZnJvbQotICogdXNpbmcgdGhlbSBmb3Igb3RoZXIgcHVycG9zZXMsIHNvIHRoYXQgTmV0QlNEIHNhdmVmaWxlcyB3aXRoIGxpbmsKLSAqIHR5cGVzIG9mIDUwIG9yIDUxIGNhbiBiZSByZWFkIGFzIHRoaXMgdHlwZSBvbiBhbGwgcGxhdGZvcm1zLgotICovCi0jZGVmaW5lIERMVF9QUFBfU0VSSUFMCTUwCS8qIFBQUCBvdmVyIHNlcmlhbCB3aXRoIEhETEMgZW5jYXBzdWxhdGlvbiAqLwotI2RlZmluZSBETFRfUFBQX0VUSEVSCTUxCS8qIFBQUCBvdmVyIEV0aGVybmV0ICovCi0KLS8qCi0gKiBUaGUgQXhlbnQgUmFwdG9yIGZpcmV3YWxsIC0gbm93IHRoZSBTeW1hbnRlYyBFbnRlcnByaXNlIEZpcmV3YWxsIC0gdXNlcwotICogYSBsaW5rLWxheWVyIHR5cGUgb2YgOTkgZm9yIHRoZSB0Y3BkdW1wIGl0IHN1cHBsaWVzLiAgVGhlIGxpbmstbGF5ZXIKLSAqIGhlYWRlciBoYXMgNiBieXRlcyBvZiB1bmtub3duIGRhdGEsIHNvbWV0aGluZyB0aGF0IGFwcGVhcnMgdG8gYmUgYW4KLSAqIEV0aGVybmV0IHR5cGUsIGFuZCAzNiBieXRlcyB0aGF0IGFwcGVhciB0byBiZSAwIGluIGF0IGxlYXN0IG9uZSBjYXB0dXJlCi0gKiBJJ3ZlIHNlZW4uCi0gKi8KLSNkZWZpbmUgRExUX1NZTUFOVEVDX0ZJUkVXQUxMCTk5Ci0KLS8qCi0gKiBWYWx1ZXMgYmV0d2VlbiAxMDAgYW5kIDEwMyBhcmUgdXNlZCBpbiBjYXB0dXJlIGZpbGUgaGVhZGVycyBhcwotICogbGluay1sYXllciB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIERMVF8gdHlwZXMgdGhhdCBkaWZmZXIKLSAqIGJldHdlZW4gcGxhdGZvcm1zOyBkb24ndCB1c2UgdGhvc2UgdmFsdWVzIGZvciBuZXcgRExUXyBuZXcgdHlwZXMuCi0gKi8KLQotLyoKLSAqIFRoaXMgdmFsdWUgd2FzIGRlZmluZWQgYnkgbGlicGNhcCAwLjU7IHBsYXRmb3JtcyB0aGF0IGhhdmUgZGVmaW5lZAotICogaXQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBzaG91bGQgZGVmaW5lIGl0IGhlcmUgd2l0aCB0aGF0IHZhbHVlIC0KLSAqIGEgbGluayB0eXBlIG9mIDEwNCBpbiBhIHNhdmUgZmlsZSB3aWxsIGJlIG1hcHBlZCB0byBETFRfQ19IRExDLAotICogd2hhdGV2ZXIgdmFsdWUgdGhhdCBoYXBwZW5zIHRvIGJlLCBzbyBwcm9ncmFtcyB3aWxsIGNvcnJlY3RseQotICogaGFuZGxlIGZpbGVzIHdpdGggdGhhdCBsaW5rIHR5cGUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YKLSAqIERMVF9DX0hETEMuCi0gKgotICogVGhlIG5hbWUgRExUX0NfSERMQyB3YXMgdXNlZCBieSBCU0QvT1M7IHdlIHVzZSB0aGF0IG5hbWUgZm9yIHNvdXJjZQotICogY29tcGF0aWJpbGl0eSB3aXRoIHByb2dyYW1zIHdyaXR0ZW4gZm9yIEJTRC9PUy4KLSAqCi0gKiBsaWJwY2FwIDAuNSBkZWZpbmVkIGl0IGFzIERMVF9DSERMQzsgd2UgZGVmaW5lIERMVF9DSERMQyBhcyB3ZWxsLAotICogZm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggcHJvZ3JhbXMgd3JpdHRlbiBmb3IgbGlicGNhcCAwLjUuCi0gKi8KLSNkZWZpbmUgRExUX0NfSERMQwkxMDQJLyogQ2lzY28gSERMQyAqLwotI2RlZmluZSBETFRfQ0hETEMJRExUX0NfSERMQwotCi0jZGVmaW5lIERMVF9JRUVFODAyXzExCTEwNQkvKiBJRUVFIDgwMi4xMSB3aXJlbGVzcyAqLwotCi0vKgotICogMTA2IGlzIHJlc2VydmVkIGZvciBMaW51eCBDbGFzc2ljYWwgSVAgb3ZlciBBVE07IGl0J3MgbGlrZSBETFRfUkFXLAotICogZXhjZXB0IHdoZW4gaXQgaXNuJ3QuICAoSS5lLiwgc29tZXRpbWVzIGl0J3MganVzdCByYXcgSVAsIGFuZAotICogc29tZXRpbWVzIGl0IGlzbid0LikgIFdlIGN1cnJlbnRseSBoYW5kbGUgaXQgYXMgRExUX0xJTlVYX1NMTCwKLSAqIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgbGluay1sYXllciBoZWFkZXIuKQotICovCi0KLS8qCi0gKiBGcmFtZSBSZWxheTsgQlNEL09TIGhhcyBhIERMVF9GUiB3aXRoIGEgdmFsdWUgb2YgMTEsIGJ1dCB0aGF0IGNvbGxpZGVzCi0gKiB3aXRoIG90aGVyIHZhbHVlcy4KLSAqIERMVF9GUiBhbmQgRExUX0ZSRUxBWSBwYWNrZXRzIHN0YXJ0IHdpdGggdGhlIFEuOTIyIEZyYW1lIFJlbGF5IGhlYWRlcgotICogKERMQ0ksIGV0Yy4pLgotICovCi0jZGVmaW5lIERMVF9GUkVMQVkJMTA3Ci0KLS8qCi0gKiBPcGVuQlNEIERMVF9MT09QLCBmb3IgbG9vcGJhY2sgZGV2aWNlczsgaXQncyBsaWtlIERMVF9OVUxMLCBleGNlcHQKLSAqIHRoYXQgdGhlIEFGXyB0eXBlIGluIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKgotICogRExUX0xPT1AgaXMgMTIgaW4gT3BlbkJTRCwgYnV0IHRoYXQncyBETFRfUkFXIGluIG90aGVyIE9TZXMsIHNvCi0gKiB3ZSBkb24ndCB1c2UgMTIgZm9yIGl0IGluIE9TZXMgb3RoZXIgdGhhbiBPcGVuQlNELgotICovCi0jaWZkZWYgX19PcGVuQlNEX18KLSNkZWZpbmUgRExUX0xPT1AJMTIKLSNlbHNlCi0jZGVmaW5lIERMVF9MT09QCTEwOAotI2VuZGlmCi0KLS8qCi0gKiBFbmNhcHN1bGF0ZWQgcGFja2V0cyBmb3IgSVBzZWM7IERMVF9FTkMgaXMgMTMgaW4gT3BlbkJTRCwgYnV0IHRoYXQncwotICogRExUX1NMSVBfQlNET1MgaW4gTmV0QlNELCBzbyB3ZSBkb24ndCB1c2UgMTMgZm9yIGl0IGluIE9TZXMgb3RoZXIKLSAqIHRoYW4gT3BlbkJTRC4KLSAqLwotI2lmZGVmIF9fT3BlbkJTRF9fCi0jZGVmaW5lIERMVF9FTkMJCTEzCi0jZWxzZQotI2RlZmluZSBETFRfRU5DCQkxMDkKLSNlbmRpZgotCi0vKgotICogVmFsdWVzIGJldHdlZW4gMTEwIGFuZCAxMTIgYXJlIHJlc2VydmVkIGZvciB1c2UgaW4gY2FwdHVyZSBmaWxlIGhlYWRlcnMKLSAqIGFzIGxpbmstbGF5ZXIgdHlwZXMgY29ycmVzcG9uZGluZyB0byBETFRfIHR5cGVzIHRoYXQgbWlnaHQgZGlmZmVyCi0gKiBiZXR3ZWVuIHBsYXRmb3JtczsgZG9uJ3QgdXNlIHRob3NlIHZhbHVlcyBmb3IgbmV3IERMVF8gdHlwZXMKLSAqIG90aGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgRExUXyB0eXBlcy4KLSAqLwotCi0vKgotICogVGhpcyBpcyBmb3IgTGludXggY29va2VkIHNvY2tldHMuCi0gKi8KLSNkZWZpbmUgRExUX0xJTlVYX1NMTAkxMTMKLQotLyoKLSAqIEFwcGxlIExvY2FsVGFsayBoYXJkd2FyZS4KLSAqLwotI2RlZmluZSBETFRfTFRBTEsJMTE0Ci0KLS8qCi0gKiBBY29ybiBFY29uZXQuCi0gKi8KLSNkZWZpbmUgRExUX0VDT05FVAkxMTUKLQotLyoKLSAqIFJlc2VydmVkIGZvciB1c2Ugd2l0aCBPcGVuQlNEIGlwZmlsdGVyLgotICovCi0jZGVmaW5lIERMVF9JUEZJTFRFUgkxMTYKLQotLyoKLSAqIE9wZW5CU0QgRExUX1BGTE9HOyBETFRfUEZMT0cgaXMgMTcgaW4gT3BlbkJTRCwgYnV0IHRoYXQncyBETFRfTEFORTgwMjMKLSAqIGluIFN1U0UgNi4zLCBzbyB3ZSBjYW4ndCB1c2UgMTcgZm9yIGl0IGluIGNhcHR1cmUtZmlsZSBoZWFkZXJzLgotICoKLSAqIFhYWDogaXMgdGhlcmUgYSBjb25mbGljdCB3aXRoIERMVF9QRlNZTkMgMTggYXMgd2VsbD8KLSAqLwotI2lmZGVmIF9fT3BlbkJTRF9fCi0jZGVmaW5lIERMVF9PTERfUEZMT0cJMTcKLSNkZWZpbmUgRExUX1BGU1lOQwkxOAotI2VuZGlmCi0jZGVmaW5lIERMVF9QRkxPRwkxMTcKLQotLyoKLSAqIFJlZ2lzdGVyZWQgZm9yIENpc2NvLWludGVybmFsIHVzZS4KLSAqLwotI2RlZmluZSBETFRfQ0lTQ09fSU9TCTExOAotCi0vKgotICogRm9yIDgwMi4xMSBjYXJkcyB1c2luZyB0aGUgUHJpc20gSUkgY2hpcHMsIHdpdGggYSBsaW5rLWxheWVyCi0gKiBoZWFkZXIgaW5jbHVkaW5nIFByaXNtIG1vbml0b3IgbW9kZSBpbmZvcm1hdGlvbiBwbHVzIGFuIDgwMi4xMQotICogaGVhZGVyLgotICovCi0jZGVmaW5lIERMVF9QUklTTV9IRUFERVIJMTE5Ci0KLS8qCi0gKiBSZXNlcnZlZCBmb3IgQWlyb25ldCA4MDIuMTEgY2FyZHMsIHdpdGggYW4gQWlyb25ldCBsaW5rLWxheWVyIGhlYWRlcgotICogKHNlZSBEb3VnIEFtYnJpc2tvJ3MgRnJlZUJTRCBwYXRjaGVzKS4KLSAqLwotI2RlZmluZSBETFRfQUlST05FVF9IRUFERVIJMTIwCi0KLS8qCi0gKiBSZXNlcnZlZCBmb3IgU2llbWVucyBIaVBhdGggSERMQy4KLSAqLwotI2RlZmluZSBETFRfSEhETEMJCTEyMQotCi0vKgotICogVGhpcyBpcyBmb3IgUkZDIDI2MjUgSVAtb3Zlci1GaWJyZSBDaGFubmVsLgotICoKLSAqIFRoaXMgaXMgbm90IGZvciB1c2Ugd2l0aCByYXcgRmlicmUgQ2hhbm5lbCwgd2hlcmUgdGhlIGxpbmstbGF5ZXIKLSAqIGhlYWRlciBzdGFydHMgd2l0aCBhIEZpYnJlIENoYW5uZWwgZnJhbWUgaGVhZGVyOyBpdCdzIGZvciBJUC1vdmVyLUZDLAotICogd2hlcmUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHN0YXJ0cyB3aXRoIGFuIFJGQyAyNjI1IE5ldHdvcmtfSGVhZGVyCi0gKiBmaWVsZC4KLSAqLwotI2RlZmluZSBETFRfSVBfT1ZFUl9GQwkJMTIyCi0KLS8qCi0gKiBUaGlzIGlzIGZvciBGdWxsIEZyb250YWwgQVRNIG9uIFNvbGFyaXMgd2l0aCBTdW5BVE0sIHdpdGggYQotICogcHNldWRvLWhlYWRlciBmb2xsb3dlZCBieSBhbiBBQUxuIFBEVS4KLSAqCi0gKiBUaGVyZSBtYXkgYmUgb3RoZXIgZm9ybXMgb2YgRnVsbCBGcm9udGFsIEFUTSBvbiBvdGhlciBPU2VzLAotICogd2l0aCBkaWZmZXJlbnQgcHNldWRvLWhlYWRlcnMuCi0gKgotICogSWYgQVRNIHNvZnR3YXJlIHJldHVybnMgYSBwc2V1ZG8taGVhZGVyIHdpdGggVlBJL1ZDSSBpbmZvcm1hdGlvbgotICogKGFuZCwgaWRlYWxseSwgcGFja2V0IHR5cGUgaW5mb3JtYXRpb24sIGUuZy4gc2lnbmFsbGluZywgSUxNSSwKLSAqIExBTkUsIExMQy1tdWx0aXBsZXhlZCB0cmFmZmljLCBldGMuKSwgaXQgc2hvdWxkIG5vdCB1c2UKLSAqIERMVF9BVE1fUkZDMTQ4MywgYnV0IHNob3VsZCBnZXQgYSBuZXcgRExUXyB2YWx1ZSwgc28gdGNwZHVtcAotICogYW5kIHRoZSBsaWtlIGRvbid0IGhhdmUgdG8gaW5mZXIgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYQotICogcHNldWRvLWhlYWRlciBhbmQgdGhlIGZvcm0gb2YgdGhlIHBzZXVkby1oZWFkZXIuCi0gKi8KLSNkZWZpbmUgRExUX1NVTkFUTQkJMTIzCS8qIFNvbGFyaXMrU3VuQVRNICovCi0KLS8qIAotICogUmVzZXJ2ZWQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLZW50IERhaGxncmVuIDxrZW50QHByYWVzdW0uY29tPgotICogZm9yIHByaXZhdGUgdXNlLgotICovCi0jZGVmaW5lIERMVF9SSU8gICAgICAgICAgICAgICAgIDEyNCAgICAgLyogUmFwaWRJTyAqLwotI2RlZmluZSBETFRfUENJX0VYUCAgICAgICAgICAgICAxMjUgICAgIC8qIFBDSSBFeHByZXNzICovCi0jZGVmaW5lIERMVF9BVVJPUkEgICAgICAgICAgICAgIDEyNiAgICAgLyogWGlsaW54IEF1cm9yYSBsaW5rIGxheWVyICovCi0KLS8qCi0gKiBIZWFkZXIgZm9yIDgwMi4xMSBwbHVzIGEgbnVtYmVyIG9mIGJpdHMgb2YgbGluay1sYXllciBpbmZvcm1hdGlvbgotICogaW5jbHVkaW5nIHJhZGlvIGluZm9ybWF0aW9uLCB1c2VkIGJ5IHNvbWUgcmVjZW50IEJTRCBkcml2ZXJzIGFzCi0gKiB3ZWxsIGFzIHRoZSBtYWR3aWZpIEF0aGVyb3MgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotI2RlZmluZSBETFRfSUVFRTgwMl8xMV9SQURJTwkxMjcJLyogODAyLjExIHBsdXMgcmFkaW90YXAgcmFkaW8gaGVhZGVyICovCi0KLS8qCi0gKiBSZXNlcnZlZCBmb3IgdGhlIFRaU1AgZW5jYXBzdWxhdGlvbiwgYXMgcGVyIHJlcXVlc3QgZnJvbQotICogQ2hyaXMgV2F0ZXJzIDxjaHJpcy53YXRlcnNAbmV0d29ya2NoZW1pc3RyeS5jb20+Ci0gKiBUWlNQIGlzIGEgZ2VuZXJpYyBlbmNhcHN1bGF0aW9uIGZvciBhbnkgb3RoZXIgbGluayB0eXBlLAotICogd2hpY2ggaW5jbHVkZXMgYSBtZWFucyB0byBpbmNsdWRlIG1ldGEtaW5mb3JtYXRpb24KLSAqIHdpdGggdGhlIHBhY2tldCwgZS5nLiBzaWduYWwgc3RyZW5ndGggYW5kIGNoYW5uZWwKLSAqIGZvciA4MDIuMTEgcGFja2V0cy4KLSAqLwotI2RlZmluZSBETFRfVFpTUCAgICAgICAgICAgICAgICAxMjggICAgIC8qIFRhem1lbiBTbmlmZmVyIFByb3RvY29sICovCi0KLS8qCi0gKiBCU0QncyBBUkNORVQgaGVhZGVycyBoYXZlIHRoZSBzb3VyY2UgaG9zdCwgZGVzdGluYXRpb24gaG9zdCwKLSAqIGFuZCB0eXBlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldDsgdGhhdCdzIHdoYXQncyBoYW5kZWQKLSAqIHVwIHRvIHVzZXJsYW5kIHZpYSBCUEYuCi0gKgotICogTGludXgncyBBUkNORVQgaGVhZGVycywgaG93ZXZlciwgaGF2ZSBhIDItYnl0ZSBvZmZzZXQgZmllbGQKLSAqIGJldHdlZW4gdGhlIGhvc3QgSURzIGFuZCB0aGUgdHlwZTsgdGhhdCdzIHdoYXQncyBoYW5kZWQgdXAKLSAqIHRvIHVzZXJsYW5kIHZpYSBQRl9QQUNLRVQgc29ja2V0cy4KLSAqCi0gKiBXZSB0aGVyZWZvcmUgaGF2ZSB0byBoYXZlIHNlcGFyYXRlIERMVF8gdmFsdWVzIGZvciB0aGVtLgotICovCi0jZGVmaW5lIERMVF9BUkNORVRfTElOVVgJMTI5CS8qIEFSQ05FVCAqLwotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlcywgYXMgcGVyIHJlcXVlc3QgZnJvbQotICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKLSAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKLSAqIFFPUyBwcm9maWxlcywgZXRjLi4KLSAqLwotI2RlZmluZSBETFRfSlVOSVBFUl9NTFBQUCAgICAgICAxMzAKLSNkZWZpbmUgRExUX0pVTklQRVJfTUxGUiAgICAgICAgMTMxCi0jZGVmaW5lIERMVF9KVU5JUEVSX0VTICAgICAgICAgIDEzMgotI2RlZmluZSBETFRfSlVOSVBFUl9HR1NOICAgICAgICAxMzMKLSNkZWZpbmUgRExUX0pVTklQRVJfTUZSICAgICAgICAgMTM0Ci0jZGVmaW5lIERMVF9KVU5JUEVSX0FUTTIgICAgICAgIDEzNQotI2RlZmluZSBETFRfSlVOSVBFUl9TRVJWSUNFUyAgICAxMzYKLSNkZWZpbmUgRExUX0pVTklQRVJfQVRNMSAgICAgICAgMTM3Ci0KLS8qCi0gKiBBcHBsZSBJUC1vdmVyLUlFRUUgMTM5NCwgYXMgcGVyIGEgcmVxdWVzdCBmcm9tIERpZXRlciBTaWVnbXVuZAotICogPGRpZXRlckBhcHBsZS5jb20+LiAgVGhlIGhlYWRlciB0aGF0J3MgcHJlc2VudGVkIGlzIGFuIEV0aGVybmV0LWxpa2UKLSAqIGhlYWRlcjoKLSAqCi0gKgkjZGVmaW5lIEZJUkVXSVJFX0VVSTY0X0xFTgk4Ci0gKglzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyIHsKLSAqCQl1X2NoYXIgIGZpcmV3aXJlX2Rob3N0W0ZJUkVXSVJFX0VVSTY0X0xFTl07Ci0gKgkJdV9jaGFyICBmaXJld2lyZV9zaG9zdFtGSVJFV0lSRV9FVUk2NF9MRU5dOwotICoJCXVfc2hvcnQgZmlyZXdpcmVfdHlwZTsKLSAqCX07Ci0gKgotICogd2l0aCAiZmlyZXdpcmVfdHlwZSIgYmVpbmcgYW4gRXRoZXJuZXQgdHlwZSB2YWx1ZSwgcmF0aGVyIHRoYW4sCi0gKiBmb3IgZXhhbXBsZSwgcmF3IEdBU1AgZnJhbWVzIGJlaW5nIGhhbmRlZCB1cC4KLSAqLwotI2RlZmluZSBETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NAkxMzgKLQotLyoKLSAqIFZhcmlvdXMgU1M3IGVuY2Fwc3VsYXRpb25zLCBhcyBwZXIgYSByZXF1ZXN0IGZyb20gSmVmZiBNb3JyaXNzCi0gKiA8amVmZi5tb3JyaXNzW0FUXXVsdGljb20uY29tPiBhbmQgc3Vic2VxdWVudCBkaXNjdXNzaW9ucy4KLSAqLwotI2RlZmluZSBETFRfTVRQMl9XSVRIX1BIRFIJMTM5CS8qIHBzZXVkby1oZWFkZXIgd2l0aCB2YXJpb3VzIGluZm8sIGZvbGxvd2VkIGJ5IE1UUDIgKi8KLSNkZWZpbmUgRExUX01UUDIJCTE0MAkvKiBNVFAyLCB3aXRob3V0IHBzZXVkby1oZWFkZXIgKi8KLSNkZWZpbmUgRExUX01UUDMJCTE0MQkvKiBNVFAzLCB3aXRob3V0IHBzZXVkby1oZWFkZXIgb3IgTVRQMiAqLwotI2RlZmluZSBETFRfU0NDUAkJMTQyCS8qIFNDQ1AsIHdpdGhvdXQgcHNldWRvLWhlYWRlciBvciBNVFAyIG9yIE1UUDMgKi8KLQotLyoKLSAqIERPQ1NJUyBNQUMgZnJhbWVzLgotICovCi0jZGVmaW5lIERMVF9ET0NTSVMJCTE0MwotCi0vKgotICogTGludXgtSXJEQSBwYWNrZXRzLiBQcm90b2NvbCBkZWZpbmVkIGF0IGh0dHA6Ly93d3cuaXJkYS5vcmcuCi0gKiBUaG9zZSBwYWNrZXRzIGluY2x1ZGUgSXJMQVAgaGVhZGVycyBhbmQgYWJvdmUgKElyTE1QLi4uKSwgYnV0Ci0gKiBkb24ndCBpbmNsdWRlIFBoeSBmcmFtaW5nIChTT0YvRU9GL0NSQyAmIGJ5dGUgc3R1ZmZpbmcpLCBiZWNhdXNlIFBoeQotICogZnJhbWluZyBjYW4gYmUgaGFuZGxlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGRlcGVuZCBvbiB0aGUgYml0cmF0ZS4KLSAqIFRoaXMgaXMgZXhhY3RseSB0aGUgZm9ybWF0IHlvdSB3b3VsZCBnZXQgY2FwdHVyaW5nIG9uIGEgTGludXgtSXJEQQotICogaW50ZXJmYWNlIChpcmRhWCksIGJ1dCBub3Qgb24gYSByYXcgc2VyaWFsIHBvcnQuCi0gKiBOb3RlIHRoZSBjYXB0dXJlIGlzIGRvbmUgaW4gIkxpbnV4LWNvb2tlZCIgbW9kZSwgc28gZWFjaCBwYWNrZXQgaW5jbHVkZQotICogYSBmYWtlIHBhY2tldCBoZWFkZXIgKHN0cnVjdCBzbGxfaGVhZGVyKS4gVGhpcyBpcyBiZWNhdXNlIElyREEgcGFja2V0Ci0gKiBkZWNvZGluZyBpcyBkZXBlbmRhbnQgb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgcGFja2V0IChpbmNvbW1pbmcgb3IKLSAqIG91dGdvaW5nKS4KLSAqIFdoZW4vaWYgb3RoZXIgcGxhdGZvcm0gaW1wbGVtZW50IElyREEgY2FwdHVyZSwgd2UgbWF5IHJldmlzaXQgdGhlCi0gKiBpc3N1ZSBhbmQgZGVmaW5lIGEgcmVhbCBETFRfSVJEQS4uLgotICogSmVhbiBJSQotICovCi0jZGVmaW5lIERMVF9MSU5VWF9JUkRBCQkxNDQKLQotLyoKLSAqIFJlc2VydmVkIGZvciBJQk0gU1Agc3dpdGNoIGFuZCBJQk0gTmV4dCBGZWRlcmF0aW9uIHN3aXRjaC4KLSAqLwotI2RlZmluZSBETFRfSUJNX1NQCQkxNDUKLSNkZWZpbmUgRExUX0lCTV9TTgkJMTQ2Ci0KLS8qCi0gKiBSZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2UuICBJZiB5b3UgaGF2ZSBzb21lIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKLSAqIHRoYXQgeW91IHdhbnQgdG8gdXNlIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiwgd2l0aCB0aGUgY2FwdHVyZSBmaWxlcwotICogdXNpbmcgdGhhdCBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG5vdCBldmVyIGJlIHNlbnQgb3V0c2lkZSB5b3VyCi0gKiBvcmdhbml6YXRpb24sIHlvdSBjYW4gdXNlIHRoZXNlIHZhbHVlcy4KLSAqCi0gKiBObyBsaWJwY2FwIHJlbGVhc2Ugd2lsbCB1c2UgdGhlc2UgZm9yIGFueSBwdXJwb3NlLCBub3Igd2lsbCBhbnkKLSAqIHRjcGR1bXAgcmVsZWFzZSB1c2UgdGhlbSwgZWl0aGVyLgotICoKLSAqIERvICpOT1QqIHVzZSB0aGVzZSBpbiBjYXB0dXJlIGZpbGVzIHRoYXQgeW91IGV4cGVjdCBhbnlib2R5IG5vdCB1c2luZwotICogeW91ciBwcml2YXRlIHZlcnNpb25zIG9mIGNhcHR1cmUtZmlsZS1yZWFkaW5nIHRvb2xzIHRvIHJlYWQ7IGluCi0gKiBwYXJ0aWN1bGFyLCBkbyAqTk9UKiB1c2UgdGhlbSBpbiBwcm9kdWN0cywgb3RoZXJ3aXNlIHlvdSBtYXkgZmluZCB0aGF0Ci0gKiBwZW9wbGUgd29uJ3QgYmUgYWJsZSB0byB1c2UgdGNwZHVtcCwgb3Igc25vcnQsIG9yIEV0aGVyZWFsLCBvci4uLiB0bwotICogcmVhZCBjYXB0dXJlIGZpbGVzIGZyb20geW91ciBmaXJld2FsbC9pbnRydXNpb24gZGV0ZWN0aW9uL3RyYWZmaWMKLSAqIG1vbml0b3JpbmcvZXRjLiBhcHBsaWFuY2UsIG9yIHdoYXRldmVyIHByb2R1Y3QgdXNlcyB0aGF0IERMVF8gdmFsdWUsCi0gKiBhbmQgeW91IG1heSBhbHNvIGZpbmQgdGhhdCB0aGUgZGV2ZWxvcGVycyBvZiB0aG9zZSBhcHBsaWNhdGlvbnMgd2lsbAotICogbm90IGFjY2VwdCBwYXRjaGVzIHRvIGxldCB0aGVtIHJlYWQgdGhvc2UgZmlsZXMuCi0gKgotICogQWxzbywgZG8gbm90IHVzZSB0aGVtIGlmIHNvbWVib2R5IG1pZ2h0IHNlbmQgeW91IGEgY2FwdHVyZSB1c2luZyB0aGVtCi0gKiBmb3IgKnRoZWlyKiBwcml2YXRlIHR5cGUgYW5kIHRvb2xzIHVzaW5nIHRoZW0gZm9yICp5b3VyKiBwcml2YXRlIHR5cGUKLSAqIHdvdWxkIGhhdmUgdG8gcmVhZCB0aGVtLgotICoKLSAqIEluc3RlYWQsIGFzayAidGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnIiBmb3IgYSBuZXcgRExUXyB2YWx1ZSwKLSAqIGFzIHBlciB0aGUgY29tbWVudCBhYm92ZSwgYW5kIHVzZSB0aGUgdHlwZSB5b3UncmUgZ2l2ZW4uCi0gKi8KLSNkZWZpbmUgRExUX1VTRVIwCQkxNDcKLSNkZWZpbmUgRExUX1VTRVIxCQkxNDgKLSNkZWZpbmUgRExUX1VTRVIyCQkxNDkKLSNkZWZpbmUgRExUX1VTRVIzCQkxNTAKLSNkZWZpbmUgRExUX1VTRVI0CQkxNTEKLSNkZWZpbmUgRExUX1VTRVI1CQkxNTIKLSNkZWZpbmUgRExUX1VTRVI2CQkxNTMKLSNkZWZpbmUgRExUX1VTRVI3CQkxNTQKLSNkZWZpbmUgRExUX1VTRVI4CQkxNTUKLSNkZWZpbmUgRExUX1VTRVI5CQkxNTYKLSNkZWZpbmUgRExUX1VTRVIxMAkJMTU3Ci0jZGVmaW5lIERMVF9VU0VSMTEJCTE1OAotI2RlZmluZSBETFRfVVNFUjEyCQkxNTkKLSNkZWZpbmUgRExUX1VTRVIxMwkJMTYwCi0jZGVmaW5lIERMVF9VU0VSMTQJCTE2MQotI2RlZmluZSBETFRfVVNFUjE1CQkxNjIKLQotLyoKLSAqIEZvciBmdXR1cmUgdXNlIHdpdGggODAyLjExIGNhcHR1cmVzIC0gZGVmaW5lZCBieSBBYnNvbHV0ZVZhbHVlCi0gKiBTeXN0ZW1zIHRvIHN0b3JlIGEgbnVtYmVyIG9mIGJpdHMgb2YgbGluay1sYXllciBpbmZvcm1hdGlvbgotICogaW5jbHVkaW5nIHJhZGlvIGluZm9ybWF0aW9uOgotICoKLSAqCWh0dHA6Ly93d3cuc2hhZnRuZXQub3JnL35waXp6YS9zb2Z0d2FyZS9jYXB0dXJlZnJtLnR4dAotICoKLSAqIGJ1dCBpdCBtaWdodCBiZSB1c2VkIGJ5IHNvbWUgbm9uLUFWUyBkcml2ZXJzIG5vdyBvciBpbiB0aGUKLSAqIGZ1dHVyZS4KLSAqLwotI2RlZmluZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlMgMTYzCS8qIDgwMi4xMSBwbHVzIEFWUyByYWRpbyBoZWFkZXIgKi8KLQotLyoKLSAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQotICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKLSAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKLSAqIFFPUyBwcm9maWxlcywgZXRjLi4KLSAqLwotI2RlZmluZSBETFRfSlVOSVBFUl9NT05JVE9SICAgICAxNjQKLQotLyoKLSAqIFJlc2VydmVkIGZvciBCQUNuZXQgTVMvVFAuCi0gKi8KLSNkZWZpbmUgRExUX0JBQ05FVF9NU19UUAkxNjUKLQotLyoKLSAqIEFub3RoZXIgUFBQIHZhcmlhbnQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLYXJzdGVuIEtlaWwgPGtrZWlsQHN1c2UuZGU+LgotICoKLSAqIFRoaXMgaXMgdXNlZCBpbiBzb21lIE9TZXMgdG8gYWxsb3cgYSBrZXJuZWwgc29ja2V0IGZpbHRlciB0byBkaXN0aW5ndWlzaAotICogYmV0d2VlbiBpbmNvbWluZyBhbmQgb3V0Z29pbmcgcGFja2V0cywgb24gYSBzb2NrZXQgaW50ZW5kZWQgdG8KLSAqIHN1cHBseSBwcHBkIHdpdGggb3V0Z29pbmcgcGFja2V0cyBzbyBpdCBjYW4gZG8gZGlhbC1vbi1kZW1hbmQgYW5kCi0gKiBoYW5ndXAtb24tbGFjay1vZi1kZW1hbmQ7IGluY29taW5nIHBhY2tldHMgYXJlIGZpbHRlcmVkIG91dCBzbyB0aGV5Ci0gKiBkb24ndCBjYXVzZSBwcHBkIHRvIGhvbGQgdGhlIGNvbm5lY3Rpb24gdXAgKHlvdSBkb24ndCB3YW50IHJhbmRvbQotICogaW5wdXQgcGFja2V0cyBzdWNoIGFzIHBvcnQgc2NhbnMsIHBhY2tldHMgZnJvbSBvbGQgbG9zdCBjb25uZWN0aW9ucywKLSAqIGV0Yy4gdG8gZm9yY2UgdGhlIGNvbm5lY3Rpb24gdG8gc3RheSB1cCkuCi0gKgotICogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFBQUCBoZWFkZXIgKDB4ZmYwMykgaXMgbW9kaWZpZWQgdG8gYWNjb21vZGF0ZQotICogdGhlIGRpcmVjdGlvbiAtIDB4MDAgPSBJTiwgMHgwMSA9IE9VVC4KLSAqLwotI2RlZmluZSBETFRfUFBQX1BQUEQJCTE2NgotCi0vKgotICogTmFtZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2Ygc29tZSBQUFAKLSAqIHNvZnR3YXJlOyBuZXcgc29mdHdhcmUgc2hvdWxkIHVzZSBETFRfUFBQX1BQUEQuCi0gKi8KLSNkZWZpbmUgRExUX1BQUF9XSVRIX0RJUkVDVElPTglETFRfUFBQX1BQUEQKLSNkZWZpbmUgRExUX0xJTlVYX1BQUF9XSVRIRElSRUNUSU9OCURMVF9QUFBfUFBQRAotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfcyBhcmUgdXNlZAotICogZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcwotICogUU9TIHByb2ZpbGVzLCBjb29raWVzLCBldGMuLgotICovCi0jZGVmaW5lIERMVF9KVU5JUEVSX1BQUE9FICAgICAgIDE2NwotI2RlZmluZSBETFRfSlVOSVBFUl9QUFBPRV9BVE0gICAxNjgKLQotI2RlZmluZSBETFRfR1BSU19MTEMJCTE2OQkvKiBHUFJTIExMQyAqLwotI2RlZmluZSBETFRfR1BGX1QJCTE3MAkvKiBHUEYtVCAoSVRVLVQgRy43MDQxL1kuMTMwMykgKi8KLSNkZWZpbmUgRExUX0dQRl9GCQkxNzEJLyogR1BGLUYgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCi0KLS8qCi0gKiBSZXF1ZXN0ZWQgYnkgT29sYW4gWmltbWVyIDxvekBnY29tLmNvbT4gZm9yIHVzZSBpbiBHY29tJ3MgVDEvRTEgbGluZQotICogbW9uaXRvcmluZyBlcXVpcG1lbnQuCi0gKi8KLSNkZWZpbmUgRExUX0dDT01fVDFFMQkJMTcyCi0jZGVmaW5lIERMVF9HQ09NX1NFUklBTAkJMTczCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF8gaXMgdXNlZAotICogZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gdG8gUGh5c2ljYWwgSW50ZXJmYWNlIENhcmRzIChQSUMpCi0gKi8KLSNkZWZpbmUgRExUX0pVTklQRVJfUElDX1BFRVIgICAgMTc0Ci0KLS8qCi0gKiBMaW5rIHR5cGVzIHJlcXVlc3RlZCBieSBHcmVnb3IgTWFpZXIgPGdyZWdvckBlbmRhY2UuY29tPiBvZiBFbmRhY2UKLSAqIE1lYXN1cmVtZW50IFN5c3RlbXMuICBUaGV5IGFkZCBhbiBFUkYgaGVhZGVyIChzZWUKLSAqIGh0dHA6Ly93d3cuZW5kYWNlLmNvbS9zdXBwb3J0L0VuZGFjZVJlY29yZEZvcm1hdC5wZGYpIGluIGZyb250IG9mCi0gKiB0aGUgbGluay1sYXllciBoZWFkZXIuCi0gKi8KLSNkZWZpbmUgRExUX0VSRl9FVEgJCTE3NQkvKiBFdGhlcm5ldCAqLwotI2RlZmluZSBETFRfRVJGX1BPUwkJMTc2CS8qIFBhY2tldC1vdmVyLVNPTkVUICovCi0KLS8qCi0gKiBSZXF1ZXN0ZWQgYnkgRGFuaWVsZSBPcmxhbmRpIDxkYW5pZWxlQG9ybGFuZGkuY29tPiBmb3IgcmF3IExBUEQKLSAqIGZvciB2SVNETiAoaHR0cDovL3d3dy5vcmxhbmRpLmNvbS92aXNkbi8pLiAgSXRzIGxpbmstbGF5ZXIgaGVhZGVyCi0gKiBpbmNsdWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgTEFQRCBoZWFkZXIsIHNvIGl0J3MKLSAqIG5vdCBuZWNlc3NhcmlseSBhIGdlbmVyaWMgTEFQRCBoZWFkZXIuCi0gKi8KLSNkZWZpbmUgRExUX0xJTlVYX0xBUEQJCTE3NwotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCi0gKiBUaGUgRExUXyBhcmUgdXNlZCBmb3IgcHJlcGVuZGluZyBtZXRhLWluZm9ybWF0aW9uCi0gKiBsaWtlIGludGVyZmFjZSBpbmRleCwgaW50ZXJmYWNlIG5hbWUKLSAqIGJlZm9yZSBzdGFuZGFyZCBFdGhlcm5ldCwgUFBQLCBGcmVsYXkgJiBDLUhETEMgRnJhbWVzCi0gKi8KLSNkZWZpbmUgRExUX0pVTklQRVJfRVRIRVIgICAgICAgMTc4Ci0jZGVmaW5lIERMVF9KVU5JUEVSX1BQUCAgICAgICAgIDE3OQotI2RlZmluZSBETFRfSlVOSVBFUl9GUkVMQVkgICAgICAxODAKLSNkZWZpbmUgRExUX0pVTklQRVJfQ0hETEMgICAgICAgMTgxCi0KLS8qCi0gKiBNdWx0aSBMaW5rIEZyYW1lIFJlbGF5IChGUkYuMTYpCi0gKi8KLSNkZWZpbmUgRExUX01GUiAgICAgICAgICAgICAgICAgMTgyCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKLSAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gd2l0aCBhCi0gKiB2b2ljZSBBZGFwdGVyIENhcmQgKFBJQykKLSAqLwotI2RlZmluZSBETFRfSlVOSVBFUl9WUCAgICAgICAgICAxODMKLQotLyoKLSAqIEFyaW5jIDQyOSBmcmFtZXMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBFdmVyeSBmcmFtZSBjb250YWlucyBhIDMyYml0IEE0MjkgbGFiZWwuCi0gKiBNb3JlIGRvY3VtZW50YXRpb24gb24gQXJpbmMgNDI5IGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5jb25kb3JlbmcuY29tL3N1cHBvcnQvZG93bmxvYWRzL3R1dG9yaWFscy9BUklOQ1R1dG9yaWFsLnBkZgotICovCi0jZGVmaW5lIERMVF9BNDI5ICAgICAgICAgICAgICAgIDE4NAotCi0vKgotICogQXJpbmMgNjUzIEludGVycGFydGl0aW9uIENvbW11bmljYXRpb24gbWVzc2FnZXMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBQbGVhc2UgcmVmZXIgdG8gdGhlIEE2NTMtMSBzdGFuZGFyZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotI2RlZmluZSBETFRfQTY1M19JQ00gICAgICAgICAgICAxODUKLQotLyoKLSAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIFVTQiBzZXR1cCBoZWFkZXI7IHJlcXVlc3RlZCBieQotICogUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0Pi4KLSAqLwotI2RlZmluZSBETFRfVVNCCQkJMTg2Ci0KLS8qCi0gKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCk7IHJlcXVlc3RlZCBieQotICogUGFvbG8gQWJlbmkuCi0gKi8KLSNkZWZpbmUgRExUX0JMVUVUT09USF9IQ0lfSDQJMTg3Ci0KLS8qCi0gKiBJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXI7IHJlcXVlc3RlZCBieSBNYXJpYSBDcnV6Ci0gKiA8Y3J1el9wZXRhZ2F5QGJhaC5jb20+LgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE2X01BQ19DUFMJMTg4Ci0KLS8qCi0gKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBMaW51eCBVU0IgaGVhZGVyOyByZXF1ZXN0ZWQgYnkKLSAqIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uCi0gKi8KLSNkZWZpbmUgRExUX1VTQl9MSU5VWAkJMTg5Ci0KLS8qCi0gKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2LiAyLjBCIHBhY2tldHMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBVc2VkIHRvIGR1bXAgQ0FOIHBhY2tldHMgY29taW5nIGZyb20gYSBDQU4gVmVjdG9yIGJvYXJkLgotICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBDQU4gdjIuMEIgZnJhbWVzIGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5jYW4tY2lhLm9yZy9kb3dubG9hZHMvPzI2OQotICovCi0jZGVmaW5lIERMVF9DQU4yMEIgICAgICAgICAgICAgIDE5MAotCi0vKgotICogSUVFRSA4MDIuMTUuNCwgd2l0aCBhZGRyZXNzIGZpZWxkcyBwYWRkZWQsIGFzIGlzIGRvbmUgYnkgTGludXgKLSAqIGRyaXZlcnM7IHJlcXVlc3RlZCBieSBKdWVyZ2VuIFNjaGltbWVyLgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE1XzRfTElOVVgJMTkxCi0KLS8qCi0gKiBQZXIgUGFja2V0IEluZm9ybWF0aW9uIGVuY2Fwc3VsYXRlZCBwYWNrZXRzLgotICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgotICovCi0jZGVmaW5lIERMVF9QUEkJCQkxOTIKLQotLyoKLSAqIEhlYWRlciBmb3IgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciBwbHVzIGEgcmFkaW90YXAgcmFkaW8gaGVhZGVyOwotICogcmVxdWVzdGVkIGJ5IENoYXJsZXMgQ2xhbmN5LgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE2X01BQ19DUFNfUkFESU8JMTkzCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKLSAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gd2l0aCBhCi0gKiBpbnRlZ3JhdGVkIHNlcnZpY2UgbW9kdWxlIChJU00pLgotICovCi0jZGVmaW5lIERMVF9KVU5JUEVSX0lTTSAgICAgICAgIDE5NAotCi0vKgotICogSUVFRSA4MDIuMTUuNCwgZXhhY3RseSBhcyBpdCBhcHBlYXJzIGluIHRoZSBzcGVjIChubyBwYWRkaW5nLCBubwotICogbm90aGluZyk7IHJlcXVlc3RlZCBieSBNaWtrbyBTYWFybml2YWxhIDxtaWtrby5zYWFybml2YWxhQHNlbnNpbm9kZS5jb20+LgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE1XzQJMTk1Ci0KLS8qCi0gKiBWYXJpb3VzIGxpbmstbGF5ZXIgdHlwZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyLCBmb3IgU0lUQQotICogKGh0dHA6Ly93d3cuc2l0YS5hZXJvLyk7IHJlcXVlc3RlZCBieSBGdWxrbyBIZXcgKGZ1bGtvLmhld0BnbWFpbC5jb20pLgotICovCi0jZGVmaW5lIERMVF9TSVRBCQkxOTYKLQotLyoKLSAqIFZhcmlvdXMgbGluay1sYXllciB0eXBlcywgd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBFbmRhY2UgREFHIGNhcmRzOwotICogZW5jYXBzdWxhdGVzIEVuZGFjZSBFUkYgcmVjb3Jkcy4gIFJlcXVlc3RlZCBieSBTdGVwaGVuIERvbm5lbGx5Ci0gKiA8c3RlcGhlbkBlbmRhY2UuY29tPi4KLSAqLwotI2RlZmluZSBETFRfRVJGCQkJMTk3Ci0KLS8qCi0gKiBTcGVjaWFsIGhlYWRlciBwcmVwZW5kZWQgdG8gRXRoZXJuZXQgcGFja2V0cyB3aGVuIGNhcHR1cmluZyBmcm9tIGEKLSAqIHUxMCBOZXR3b3JrcyBib2FyZC4gIFJlcXVlc3RlZCBieSBQaGlsIE11bGhvbGxhbmQKLSAqIDxwaGlsQHUxMG5ldHdvcmtzLmNvbT4uCi0gKi8KLSNkZWZpbmUgRExUX1JBSUYxCQkxOTgKLQotLyoKLSAqIElQTUIgcGFja2V0IGZvciBJUE1JLCBiZWdpbm5pbmcgd2l0aCB0aGUgSTJDIHNsYXZlIGFkZHJlc3MsIGZvbGxvd2VkCi0gKiBieSB0aGUgbmV0Rm4gYW5kIExVTiwgZXRjLi4gIFJlcXVlc3RlZCBieSBDaGFudGh5IFRvZXVuZwotICogPGNoYW50aHkudG9ldW5nQGNhLmtvbnRyb24uY29tPi4KLSAqLwotI2RlZmluZSBETFRfSVBNQgkJMTk5Ci0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKLSAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGNhcHR1cmluZyBkYXRhIG9uIGEgc2VjdXJlIHR1bm5lbCBpbnRlcmZhY2UuCi0gKi8KLSNkZWZpbmUgRExUX0pVTklQRVJfU1QgICAgICAgICAgMjAwCi0KLS8qCi0gKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCksIHdpdGggcHNldWRvLWhlYWRlcgotICogdGhhdCBpbmNsdWRlcyBkaXJlY3Rpb24gaW5mb3JtYXRpb247IHJlcXVlc3RlZCBieSBQYW9sbyBBYmVuaS4KLSAqLwotI2RlZmluZSBETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFIJMjAxCi0KLQotLyoKLSAqIFRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MuCi0gKi8KLS8qIGluc3RydWN0aW9uIGNsYXNzZXMgKi8KLSNkZWZpbmUgQlBGX0NMQVNTKGNvZGUpICgoY29kZSkgJiAweDA3KQotI2RlZmluZQkJQlBGX0xECQkweDAwCi0jZGVmaW5lCQlCUEZfTERYCQkweDAxCi0jZGVmaW5lCQlCUEZfU1QJCTB4MDIKLSNkZWZpbmUJCUJQRl9TVFgJCTB4MDMKLSNkZWZpbmUJCUJQRl9BTFUJCTB4MDQKLSNkZWZpbmUJCUJQRl9KTVAJCTB4MDUKLSNkZWZpbmUJCUJQRl9SRVQJCTB4MDYKLSNkZWZpbmUJCUJQRl9NSVNDCTB4MDcKLQotLyogbGQvbGR4IGZpZWxkcyAqLwotI2RlZmluZSBCUEZfU0laRShjb2RlKQkoKGNvZGUpICYgMHgxOCkKLSNkZWZpbmUJCUJQRl9XCQkweDAwCi0jZGVmaW5lCQlCUEZfSAkJMHgwOAotI2RlZmluZQkJQlBGX0IJCTB4MTAKLSNkZWZpbmUgQlBGX01PREUoY29kZSkJKChjb2RlKSAmIDB4ZTApCi0jZGVmaW5lCQlCUEZfSU1NIAkweDAwCi0jZGVmaW5lCQlCUEZfQUJTCQkweDIwCi0jZGVmaW5lCQlCUEZfSU5ECQkweDQwCi0jZGVmaW5lCQlCUEZfTUVNCQkweDYwCi0jZGVmaW5lCQlCUEZfTEVOCQkweDgwCi0jZGVmaW5lCQlCUEZfTVNICQkweGEwCi0KLS8qIGFsdS9qbXAgZmllbGRzICovCi0jZGVmaW5lIEJQRl9PUChjb2RlKQkoKGNvZGUpICYgMHhmMCkKLSNkZWZpbmUJCUJQRl9BREQJCTB4MDAKLSNkZWZpbmUJCUJQRl9TVUIJCTB4MTAKLSNkZWZpbmUJCUJQRl9NVUwJCTB4MjAKLSNkZWZpbmUJCUJQRl9ESVYJCTB4MzAKLSNkZWZpbmUJCUJQRl9PUgkJMHg0MAotI2RlZmluZQkJQlBGX0FORAkJMHg1MAotI2RlZmluZQkJQlBGX0xTSAkJMHg2MAotI2RlZmluZQkJQlBGX1JTSAkJMHg3MAotI2RlZmluZQkJQlBGX05FRwkJMHg4MAotI2RlZmluZQkJQlBGX0pBCQkweDAwCi0jZGVmaW5lCQlCUEZfSkVRCQkweDEwCi0jZGVmaW5lCQlCUEZfSkdUCQkweDIwCi0jZGVmaW5lCQlCUEZfSkdFCQkweDMwCi0jZGVmaW5lCQlCUEZfSlNFVAkweDQwCi0jZGVmaW5lIEJQRl9TUkMoY29kZSkJKChjb2RlKSAmIDB4MDgpCi0jZGVmaW5lCQlCUEZfSwkJMHgwMAotI2RlZmluZQkJQlBGX1gJCTB4MDgKLQotLyogcmV0IC0gQlBGX0sgYW5kIEJQRl9YIGFsc28gYXBwbHkgKi8KLSNkZWZpbmUgQlBGX1JWQUwoY29kZSkJKChjb2RlKSAmIDB4MTgpCi0jZGVmaW5lCQlCUEZfQQkJMHgxMAotCi0vKiBtaXNjICovCi0jZGVmaW5lIEJQRl9NSVNDT1AoY29kZSkgKChjb2RlKSAmIDB4ZjgpCi0jZGVmaW5lCQlCUEZfVEFYCQkweDAwCi0jZGVmaW5lCQlCUEZfVFhBCQkweDgwCi0KLS8qCi0gKiBUaGUgaW5zdHJ1Y3Rpb24gZGF0YSBzdHJ1Y3R1cmUuCi0gKi8KLXN0cnVjdCBicGZfaW5zbiB7Ci0JdV9zaG9ydAljb2RlOwotCXVfY2hhciAJanQ7Ci0JdV9jaGFyIAlqZjsKLQlicGZfaW50MzIgazsKLX07Ci0KLS8qCi0gKiBNYWNyb3MgZm9yIGluc24gYXJyYXkgaW5pdGlhbGl6ZXJzLgotICovCi0jZGVmaW5lIEJQRl9TVE1UKGNvZGUsIGspIHsgKHVfc2hvcnQpKGNvZGUpLCAwLCAwLCBrIH0KLSNkZWZpbmUgQlBGX0pVTVAoY29kZSwgaywganQsIGpmKSB7ICh1X3Nob3J0KShjb2RlKSwganQsIGpmLCBrIH0KLQotI2lmIF9fU1REQ19fIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gaW50IGJwZl92YWxpZGF0ZShzdHJ1Y3QgYnBmX2luc24gKiwgaW50KTsKLWV4dGVybiB1X2ludCBicGZfZmlsdGVyKHN0cnVjdCBicGZfaW5zbiAqLCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKLSNlbHNlCi1leHRlcm4gaW50IGJwZl92YWxpZGF0ZSgpOwotZXh0ZXJuIHVfaW50IGJwZl9maWx0ZXIoKTsKLSNlbmRpZgotCi0vKgotICogTnVtYmVyIG9mIHNjcmF0Y2ggbWVtb3J5IHdvcmRzIChmb3IgQlBGX0xEfEJQRl9NRU0gYW5kIEJQRl9TVCkuCi0gKi8KLSNkZWZpbmUgQlBGX01FTVdPUkRTIDE2Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgorI2luY2x1ZGUgPHBjYXAvYnBmLmg+CmRpZmYgLS1naXQgYS9wY2FwLWJ0LWxpbnV4LmMgYi9wY2FwLWJ0LWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNWJjZgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtYnQtbGludXguYwpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBQYW9sbyBBYmVuaSAoSXRhbHkpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBCbHVldG9vdGggc25pZmZpbmcgQVBJIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBwbGF0Zm9ybQorICogQnkgUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0PgorICoKKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1idC1saW51eC5jLHYgMS4xNSAyMDA4LTA3LTAxIDA3OjA1OjU0IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKyAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAicGNhcC1idC1saW51eC5oIgorI2luY2x1ZGUgInBjYXAvYmx1ZXRvb3RoLmgiCisKKyNpZmRlZiBORUVEX1NUUkVSUk9SX0gKKyNpbmNsdWRlICJzdHJlcnJvci5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPGJsdWV0b290aC9oY2kuaD4KKworI2RlZmluZSBCVF9JRkFDRSAiYmx1ZXRvb3RoIgorI2RlZmluZSBCVF9DVFJMX1NJWkUgMTI4CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgYnRfYWN0aXZhdGUocGNhcF90ICopOworc3RhdGljIGludCBidF9yZWFkX2xpbnV4KHBjYXBfdCAqLCBpbnQgLCBwY2FwX2hhbmRsZXIgLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IGJ0X2luamVjdF9saW51eChwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIGludCBidF9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworc3RhdGljIGludCBidF9zdGF0c19saW51eChwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKKworLyoKKyAqIFByaXZhdGUgZGF0YSBmb3IgY2FwdHVyaW5nIG9uIExpbnV4IEJsdWV0b290aCBkZXZpY2VzLgorICovCitzdHJ1Y3QgcGNhcF9idCB7CisJaW50IGRldl9pZDsJCS8qIGRldmljZSBJRCBvZiBkZXZpY2Ugd2UncmUgYm91bmQgdG8gKi8KK307CisKK2ludCAKK2J0X2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJfc3RyKQoreworCXN0cnVjdCBoY2lfZGV2X2xpc3RfcmVxICpkZXZfbGlzdDsKKwlzdHJ1Y3QgaGNpX2Rldl9yZXEgKmRldl9yZXE7CisJaW50IGksIHNvY2s7CisJaW50IHJldCA9IDA7CisKKwlzb2NrICA9IHNvY2tldChBRl9CTFVFVE9PVEgsIFNPQ0tfUkFXLCBCVFBST1RPX0hDSSk7CisJaWYgKHNvY2sgPCAwKQorCXsKKwkJLyogaWYgYmx1ZXRvb3RoIGlzIG5vdCBzdXBwb3J0ZWQgdGhpcyB0aGlzIGlzIG5vdCBmYXRhbCovIAorCQlpZiAoZXJybm8gPT0gRUFGTk9TVVBQT1JUKQorCQkJcmV0dXJuIDA7CisJCXNucHJpbnRmKGVycl9zdHIsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3Qgb3BlbiByYXcgQmx1ZXRvb3RoIHNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2X2xpc3QgPSBtYWxsb2MoSENJX01BWF9ERVYgKiBzaXplb2YoKmRldl9yZXEpICsgc2l6ZW9mKCpkZXZfbGlzdCkpOworCWlmICghZGV2X2xpc3QpIAorCXsKKwkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGFsbG9jYXRlICV6dSBieXRlcyBmb3IgQmx1ZXRvb3RoIGRldmljZSBsaXN0IiwKKwkJCUhDSV9NQVhfREVWICogc2l6ZW9mKCpkZXZfcmVxKSArIHNpemVvZigqZGV2X2xpc3QpKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkZXZfbGlzdC0+ZGV2X251bSA9IEhDSV9NQVhfREVWOworCisJaWYgKGlvY3RsKHNvY2ssIEhDSUdFVERFVkxJU1QsICh2b2lkICopIGRldl9saXN0KSA8IDApIAorCXsKKwkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBnZXQgQmx1ZXRvb3RoIGRldmljZSBsaXN0IHZpYSBpb2N0bDogJXMiLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZnJlZTsKKwl9CisKKwlkZXZfcmVxID0gZGV2X2xpc3QtPmRldl9yZXE7CisJZm9yIChpID0gMDsgaSA8IGRldl9saXN0LT5kZXZfbnVtOyBpKyssIGRldl9yZXErKykgeworCQljaGFyIGRldl9uYW1lWzIwXSwgZGV2X2Rlc2NyWzMwXTsKKwkJCisJCXNucHJpbnRmKGRldl9uYW1lLCAyMCwgQlRfSUZBQ0UiJWQiLCBkZXZfcmVxLT5kZXZfaWQpOworCQlzbnByaW50ZihkZXZfZGVzY3IsIDMwLCAiQmx1ZXRvb3RoIGFkYXB0ZXIgbnVtYmVyICVkIiwgaSk7CisJCQkKKwkJaWYgKHBjYXBfYWRkX2lmKGFsbGRldnNwLCBkZXZfbmFtZSwgMCwgCisJCSAgICAgICBkZXZfZGVzY3IsIGVycl9zdHIpIDwgMCkKKwkJeworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCisJfQorCitmcmVlOgorCWZyZWUoZGV2X2xpc3QpOworCitkb25lOgorCWNsb3NlKHNvY2spOworCXJldHVybiByZXQ7Cit9CisKK3BjYXBfdCAqCitidF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqY3BlbmQ7CisJbG9uZyBkZXZudW07CisJcGNhcF90ICpwOworCisJLyogRG9lcyB0aGlzIGxvb2sgbGlrZSBhIEJsdWV0b290aCBkZXZpY2U/ICovCisJY3AgPSBzdHJyY2hyKGRldmljZSwgJy8nKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJY3AgPSBkZXZpY2U7CisJLyogRG9lcyBpdCBiZWdpbiB3aXRoIEJUX0lGQUNFPyAqLworCWlmIChzdHJuY21wKGNwLCBCVF9JRkFDRSwgc2l6ZW9mIEJUX0lGQUNFIC0gMSkgIT0gMCkgeworCQkvKiBOb3BlLCBkb2Vzbid0IGJlZ2luIHdpdGggQlRfSUZBQ0UgKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogWWVzIC0gaXMgQlRfSUZBQ0UgZm9sbG93ZWQgYnkgYSBudW1iZXI/ICovCisJY3AgKz0gc2l6ZW9mIEJUX0lGQUNFIC0gMTsKKwlkZXZudW0gPSBzdHJ0b2woY3AsICZjcGVuZCwgMTApOworCWlmIChjcGVuZCA9PSBjcCB8fCAqY3BlbmQgIT0gJ1wwJykgeworCQkvKiBOb3QgZm9sbG93ZWQgYnkgYSBudW1iZXIuICovCisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChkZXZudW0gPCAwKSB7CisJCS8qIEZvbGxvd2VkIGJ5IGEgbm9uLXZhbGlkIG51bWJlci4gKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPSywgaXQncyBwcm9iYWJseSBvdXJzLiAqLworCSppc19vdXJzID0gMTsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX2J0KSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gYnRfYWN0aXZhdGU7CisJcmV0dXJuIChwKTsKK30KKworc3RhdGljIGludAorYnRfYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpCit7CisJc3RydWN0IHBjYXBfYnQgKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJc3RydWN0IHNvY2thZGRyX2hjaSBhZGRyOworCWludCBvcHQ7CisJaW50CQlkZXZfaWQ7CisJc3RydWN0IGhjaV9maWx0ZXIJZmx0OworCWludCBlcnIgPSBQQ0FQX0VSUk9SOworCisJLyogZ2V0IGJ0IGludGVyZmFjZSBpZCAqLworCWlmIChzc2NhbmYoaGFuZGxlLT5vcHQuc291cmNlLCBCVF9JRkFDRSIlZCIsICZkZXZfaWQpICE9IDEpCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSJDYW4ndCBnZXQgQmx1ZXRvb3RoIGRldmljZSBpbmRleCBmcm9tICVzIiwgCisJCQkgaGFuZGxlLT5vcHQuc291cmNlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzb21lIGNvbXBvbmVudHMgb2YgdGhlIHBjYXAgc3RydWN0dXJlLiAqLworCWhhbmRsZS0+YnVmc2l6ZSA9IGhhbmRsZS0+c25hcHNob3QrQlRfQ1RSTF9TSVpFK3NpemVvZihwY2FwX2JsdWV0b290aF9oNF9oZWFkZXIpOworCWhhbmRsZS0+b2Zmc2V0ID0gQlRfQ1RSTF9TSVpFOworCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFI7CisKKwloYW5kbGUtPnJlYWRfb3AgPSBidF9yZWFkX2xpbnV4OworCWhhbmRsZS0+aW5qZWN0X29wID0gYnRfaW5qZWN0X2xpbnV4OworCWhhbmRsZS0+c2V0ZmlsdGVyX29wID0gaW5zdGFsbF9icGZfcHJvZ3JhbTsgLyogbm8ga2VybmVsIGZpbHRlcmluZyAqLworCWhhbmRsZS0+c2V0ZGlyZWN0aW9uX29wID0gYnRfc2V0ZGlyZWN0aW9uX2xpbnV4OworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsJLyogY2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisJaGFuZGxlLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfZmQ7CisJaGFuZGxlLT5zdGF0c19vcCA9IGJ0X3N0YXRzX2xpbnV4OworCWhhbmRsZXAtPmRldl9pZCA9IGRldl9pZDsKKwkKKwkvKiBDcmVhdGUgSENJIHNvY2tldCAqLworCWhhbmRsZS0+ZmQgPSBzb2NrZXQoQUZfQkxVRVRPT1RILCBTT0NLX1JBVywgQlRQUk9UT19IQ0kpOworCWlmIChoYW5kbGUtPmZkIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBjcmVhdGUgcmF3IHNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwloYW5kbGUtPmJ1ZmZlciA9IG1hbGxvYyhoYW5kbGUtPmJ1ZnNpemUpOworCWlmICghaGFuZGxlLT5idWZmZXIpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBkdW1wIGJ1ZmZlcjogJXMiLAorCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGNsb3NlX2ZhaWw7CisJfQorCisJb3B0ID0gMTsKKwlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfSENJLCBIQ0lfREFUQV9ESVIsICZvcHQsIHNpemVvZihvcHQpKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3QgZW5hYmxlIGRhdGEgZGlyZWN0aW9uIGluZm86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCW9wdCA9IDE7CisJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX0hDSSwgSENJX1RJTUVfU1RBTVAsICZvcHQsIHNpemVvZihvcHQpKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3QgZW5hYmxlIHRpbWUgc3RhbXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCS8qIFNldHVwIGZpbHRlciwgZG8gbm90IGNhbGwgaGNpIGZ1bmN0aW9uIHRvIGF2b2lkIGRlcGVuZGVuY2Ugb24gCisJICogZXh0ZXJuYWwgbGlicwkqLworCW1lbXNldCgmZmx0LCAwLCBzaXplb2YoZmx0KSk7CisJbWVtc2V0KCh2b2lkICopICZmbHQudHlwZV9tYXNrLCAweGZmLCBzaXplb2YoZmx0LnR5cGVfbWFzaykpOwkKKwltZW1zZXQoKHZvaWQgKikgJmZsdC5ldmVudF9tYXNrLCAweGZmLCBzaXplb2YoZmx0LmV2ZW50X21hc2spKTsKKwlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfSENJLCBIQ0lfRklMVEVSLCAmZmx0LCBzaXplb2YoZmx0KSkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IHNldCBmaWx0ZXI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCisJLyogQmluZCBzb2NrZXQgdG8gdGhlIEhDSSBkZXZpY2UgKi8KKwlhZGRyLmhjaV9mYW1pbHkgPSBBRl9CTFVFVE9PVEg7CisJYWRkci5oY2lfZGV2ID0gaGFuZGxlcC0+ZGV2X2lkOworI2lmZGVmIFNPQ0tBRERSX0hDSV9IQVNfSENJX0NIQU5ORUwKKwlhZGRyLmhjaV9jaGFubmVsID0gSENJX0NIQU5ORUxfUkFXOworI2VuZGlmCisJaWYgKGJpbmQoaGFuZGxlLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3QgYXR0YWNoIHRvIGRldmljZSAlZDogJXMiLCBoYW5kbGVwLT5kZXZfaWQsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGNsb3NlX2ZhaWw7CisJfQorCisJaWYgKGhhbmRsZS0+b3B0LnJmbW9uKSB7CisJCS8qCisJCSAqIE1vbml0b3IgbW9kZSBkb2Vzbid0IGFwcGx5IHRvIEJsdWV0b290aCBkZXZpY2VzLgorCQkgKi8KKwkJZXJyID0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCWdvdG8gY2xvc2VfZmFpbDsKKwl9CisKKwlpZiAoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUgIT0gMCkgeworCQkvKgorCQkgKiBTZXQgdGhlIHNvY2tldCBidWZmZXIgc2l6ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAorCQkgICAgJmhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplLAorCQkgICAgc2l6ZW9mKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplKSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gY2xvc2VfZmFpbDsKKwkJfQorCX0KKworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQ7CisJcmV0dXJuIDA7CisKK2Nsb3NlX2ZhaWw6CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorYnRfcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgaW92ZWMgIGl2OworCXNzaXplX3QgcmV0OworCXN0cnVjdCBwY2FwX3BrdGhkciBwa3RoOworCXBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlciogYnRoZHI7CisKKwlidGhkciA9IChwY2FwX2JsdWV0b290aF9oNF9oZWFkZXIqKSAmaGFuZGxlLT5idWZmZXJbaGFuZGxlLT5vZmZzZXRdOworCWl2Lmlvdl9iYXNlID0gJmhhbmRsZS0+YnVmZmVyW2hhbmRsZS0+b2Zmc2V0K3NpemVvZihwY2FwX2JsdWV0b290aF9oNF9oZWFkZXIpXTsKKwlpdi5pb3ZfbGVuICA9IGhhbmRsZS0+c25hcHNob3Q7CisJCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2cubXNnX2lvdiA9ICZpdjsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19jb250cm9sID0gaGFuZGxlLT5idWZmZXI7CisJbXNnLm1zZ19jb250cm9sbGVuID0gaGFuZGxlLT5vZmZzZXQ7CisKKwkvKiBpZ25vcmUgaW50ZXJydXB0IHN5c3RlbSBjYWxsIGVycm9yICovCisJZG8geworCQlyZXQgPSByZWN2bXNnKGhhbmRsZS0+ZmQsICZtc2csIDApOworCQlpZiAoaGFuZGxlLT5icmVha19sb29wKQorCQl7CisJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJcmV0dXJuIC0yOworCQl9CisJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCByZWNlaXZlIHBhY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGt0aC5jYXBsZW4gPSByZXQ7CisKKwkvKiBnZXQgZGlyZWN0aW9uIGFuZCB0aW1lc3RhbXAqLyAKKwljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKwlpbnQgaW49MDsKKwl3aGlsZSAoY21zZykgeworCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgeworCQkJY2FzZSBIQ0lfQ01TR19ESVI6CisJCQkJbWVtY3B5KCZpbiwgQ01TR19EQVRBKGNtc2cpLCBzaXplb2YgaW4pOworCQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIAljYXNlIEhDSV9DTVNHX1RTVEFNUDoKKyAgICAgICAgICAgICAgICAgICAgICAJCW1lbWNweSgmcGt0aC50cywgQ01TR19EQVRBKGNtc2cpLAorICAgICAgICAgICAgICAgICAgICAgIAkJICAgIHNpemVvZiBwa3RoLnRzKTsKKwkJCQlicmVhazsKKwkJfQorCQljbXNnID0gQ01TR19OWFRIRFIoJm1zZywgY21zZyk7CisJfQorCWlmICgoaW4gJiYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9PVVQpKSB8fCAKKwkJCQkoKCFpbikgJiYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9JTikpKQorCQlyZXR1cm4gMDsKKworCWJ0aGRyLT5kaXJlY3Rpb24gPSBodG9ubChpbiAhPSAwKTsKKwlwa3RoLmNhcGxlbis9c2l6ZW9mKHBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlcik7CisJcGt0aC5sZW4gPSBwa3RoLmNhcGxlbjsKKwlpZiAoaGFuZGxlLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMIHx8CisJICAgIGJwZl9maWx0ZXIoaGFuZGxlLT5mY29kZS5iZl9pbnNucywgJmhhbmRsZS0+YnVmZmVyW2hhbmRsZS0+b2Zmc2V0XSwKKwkgICAgICBwa3RoLmxlbiwgcGt0aC5jYXBsZW4pKSB7CisJCWNhbGxiYWNrKHVzZXIsICZwa3RoLCAmaGFuZGxlLT5idWZmZXJbaGFuZGxlLT5vZmZzZXRdKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwkvKiBkaWRuJ3QgcGFzcyBmaWx0ZXIgKi8KK30KKworc3RhdGljIGludAorYnRfaW5qZWN0X2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiaW5qZWN0IG5vdCBzdXBwb3J0ZWQgb24gIgorICAgIAkJImJsdWV0b290aCBkZXZpY2VzIik7CisJcmV0dXJuICgtMSk7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworc3RhdGljIGludCAKK2J0X3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKK3sKKwlzdHJ1Y3QgcGNhcF9idCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwlpbnQgcmV0OworCXN0cnVjdCBoY2lfZGV2X2luZm8gZGV2X2luZm87CisJc3RydWN0IGhjaV9kZXZfc3RhdHMgKiBzID0gJmRldl9pbmZvLnN0YXQ7CisJZGV2X2luZm8uZGV2X2lkID0gaGFuZGxlcC0+ZGV2X2lkOworCQorCS8qIGlnbm9yZSBlaW50ciAqLworCWRvIHsKKwkJcmV0ID0gaW9jdGwoaGFuZGxlLT5mZCwgSENJR0VUREVWSU5GTywgKHZvaWQgKikmZGV2X2luZm8pOworCX0gd2hpbGUgKChyZXQgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCSAgICAKKwlpZiAocmV0IDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBnZXQgc3RhdHMgdmlhIGlvY3RsOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCQkKKwl9CisKKwkvKiB3ZSByZWNlaXZlIGJvdGggcnggYW5kIHR4IGZyYW1lcywgc28gY29tdWxhdGUgYWxsIHN0YXRzICovCQorCXN0YXRzLT5wc19yZWN2ID0gcy0+ZXZ0X3J4ICsgcy0+YWNsX3J4ICsgcy0+c2NvX3J4ICsgcy0+Y21kX3R4ICsgCisJCXMtPmFjbF90eCArcy0+c2NvX3R4OworCXN0YXRzLT5wc19kcm9wID0gcy0+ZXJyX3J4ICsgcy0+ZXJyX3R4OworCXN0YXRzLT5wc19pZmRyb3AgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAorYnRfc2V0ZGlyZWN0aW9uX2xpbnV4KHBjYXBfdCAqcCwgcGNhcF9kaXJlY3Rpb25fdCBkKQoreworCXAtPmRpcmVjdGlvbiA9IGQ7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wY2FwLWJ0LWxpbnV4LmggYi9wY2FwLWJ0LWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlOGY0OAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtYnQtbGludXguaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhb2xvIEFiZW5pIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEJsdWV0b290aCBzbmlmZmluZyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IHBsYXRmb3JtCisgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWJ0LWxpbnV4LmgsdiAxLjUgMjAwOC0wNC0wNCAxOTozNzo0NSBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogUHJvdG90eXBlcyBmb3IgQmx1ZXRvb3RoLXJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KK2ludCBidF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyX3N0cik7CitwY2FwX3QgKmJ0X2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYsIGludCAqaXNfb3Vycyk7CmRpZmYgLS1naXQgYS9wY2FwLWNhbi1saW51eC5jIGIvcGNhcC1jYW4tbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZhNDFjCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1jYW4tbGludXguYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBTb2NrZXRDYW4gc25pZmZpbmcgQVBJIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBwbGF0Zm9ybQorICogQnkgRmVsaXggT2Jlbmh1YmVyIDxmZWxpeEBvYmVuaHViZXIuZGU+CisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAicGNhcC1jYW4tbGludXguaCIKKworI2lmZGVmIE5FRURfU1RSRVJST1JfSAorI2luY2x1ZGUgInN0cmVycm9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vcmF3Lmg+CisKKy8qIG5vdCB5ZXQgZGVmaW5lZCBhbnl3aGVyZSAqLworI2lmbmRlZiBQRl9DQU4KKyNkZWZpbmUgUEZfQ0FOIDI5CisjZW5kaWYKKyNpZm5kZWYgQUZfQ0FOCisjZGVmaW5lIEFGX0NBTiBQRl9DQU4KKyNlbmRpZgorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgaW50IGNhbl9hY3RpdmF0ZShwY2FwX3QgKik7CitzdGF0aWMgaW50IGNhbl9yZWFkX2xpbnV4KHBjYXBfdCAqLCBpbnQgLCBwY2FwX2hhbmRsZXIgLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IGNhbl9pbmplY3RfbGludXgocGNhcF90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgY2FuX3NldGZpbHRlcl9saW51eChwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOworc3RhdGljIGludCBjYW5fc2V0ZGlyZWN0aW9uX2xpbnV4KHBjYXBfdCAqLCBwY2FwX2RpcmVjdGlvbl90KTsKK3N0YXRpYyBpbnQgY2FuX3N0YXRzX2xpbnV4KHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOworCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gTGludXggQ0FOYnVzIGRldmljZXMuCisgKi8KK3N0cnVjdCBwY2FwX2NhbiB7CisJaW50IGlmaW5kZXg7CQkvKiBpbnRlcmZhY2UgaW5kZXggb2YgZGV2aWNlIHdlJ3JlIGJvdW5kIHRvICovCit9OworCitpbnQKK2Nhbl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKQoreworCS8qCisJICogVGhlcmUgYXJlIG5vIHBsYXRmb3JtLXNwZWNpZmljIGRldmljZXMgc2luY2UgZWFjaCBkZXZpY2UKKwkgKiBleGlzdHMgYXMgYSByZWd1bGFyIG5ldHdvcmsgaW50ZXJmYWNlLgorCSAqCisJICogWFhYIC0gdHJ1ZT8KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworcGNhcF90ICoKK2Nhbl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqY3BlbmQ7CisJbG9uZyBkZXZudW07CisJcGNhcF90KiBwOworCisJLyogRG9lcyB0aGlzIGxvb2sgbGlrZSBhIENBTmJ1cyBkZXZpY2U/ICovCisJY3AgPSBzdHJyY2hyKGRldmljZSwgJy8nKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJY3AgPSBkZXZpY2U7CisJLyogRG9lcyBpdCBiZWdpbiB3aXRoICJjYW4iIG9yICJ2Y2FuIj8gKi8KKwlpZiAoc3RybmNtcChjcCwgImNhbiIsIDMpID09IDApIHsKKwkJLyogQmVnaW5zIHdpdGggImNhbiIgKi8KKwkJY3AgKz0gMzsJLyogc2tpcCBwYXN0ICJjYW4iICovCisJfSBlbHNlIGlmIChzdHJuY21wKGNwLCAidmNhbiIsIDQpID09IDApIHsKKwkJLyogQmVnaW5zIHdpdGggInZjYW4iICovCisJCWNwICs9IDQ7CisJfSBlbHNlIHsKKwkJLyogTm9wZSwgZG9lc24ndCBiZWdpbiB3aXRoICJjYW4iIG9yICJ2Y2FuIiAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBZZXMgLSBpcyAiY2FuIiBvciAidmNhbiIgZm9sbG93ZWQgYnkgYSBudW1iZXIgZnJvbSAwPyAqLworCWRldm51bSA9IHN0cnRvbChjcCwgJmNwZW5kLCAxMCk7CisJaWYgKGNwZW5kID09IGNwIHx8ICpjcGVuZCAhPSAnXDAnKSB7CisJCS8qIE5vdCBmb2xsb3dlZCBieSBhIG51bWJlci4gKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGRldm51bSA8IDApIHsKKwkJLyogRm9sbG93ZWQgYnkgYSBub24tdmFsaWQgbnVtYmVyLiAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9LLCBpdCdzIHByb2JhYmx5IG91cnMuICovCisJKmlzX291cnMgPSAxOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfY2FuKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gY2FuX2FjdGl2YXRlOworCXJldHVybiAocCk7Cit9CisKKworc3RhdGljIGludAorY2FuX2FjdGl2YXRlKHBjYXBfdCogaGFuZGxlKQoreworCXN0cnVjdCBwY2FwX2NhbiAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwlzdHJ1Y3Qgc29ja2FkZHJfY2FuIGFkZHI7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSAyNDsKKwloYW5kbGUtPm9mZnNldCA9IDg7CisJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9DQU5fU09DS0VUQ0FOOworCWhhbmRsZS0+cmVhZF9vcCA9IGNhbl9yZWFkX2xpbnV4OworCWhhbmRsZS0+aW5qZWN0X29wID0gY2FuX2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGNhbl9zZXRmaWx0ZXJfbGludXg7CisJaGFuZGxlLT5zZXRkaXJlY3Rpb25fb3AgPSBjYW5fc2V0ZGlyZWN0aW9uX2xpbnV4OworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsKKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnN0YXRzX29wID0gY2FuX3N0YXRzX2xpbnV4OworCisJLyogQ3JlYXRlIHNvY2tldCAqLworCWhhbmRsZS0+ZmQgPSBzb2NrZXQoUEZfQ0FOLCBTT0NLX1JBVywgQ0FOX1JBVyk7CisJaWYgKGhhbmRsZS0+ZmQgPCAwKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBjcmVhdGUgcmF3IHNvY2tldCAlZDolcyIsCisJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJLyogZ2V0IGludGVyZmFjZSBpbmRleCAqLworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+b3B0LnNvdXJjZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR0lGSU5ERVgsICZpZnIpIDwgMCkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJVbmFibGUgdG8gZ2V0IGludGVyZmFjZSBpbmRleDogJXMiLAorCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWhhbmRsZXAtPmlmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisKKwkvKiBhbGxvY2F0ZSBidXR0ZXIgKi8KKwloYW5kbGUtPmJ1ZmZlciA9IG1hbGxvYyhoYW5kbGUtPmJ1ZnNpemUpOworCWlmICghaGFuZGxlLT5idWZmZXIpCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGFsbG9jYXRlIGR1bXAgYnVmZmVyOiAlcyIsCisJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihoYW5kbGUpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwkvKiBCaW5kIHRvIHRoZSBzb2NrZXQgKi8KKwlhZGRyLmNhbl9mYW1pbHkgPSBBRl9DQU47CisJYWRkci5jYW5faWZpbmRleCA9IGhhbmRsZXAtPmlmaW5kZXg7CisJaWYoIGJpbmQoIGhhbmRsZS0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikgKSA8IDAgICkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYXR0YWNoIHRvIGRldmljZSAlZCAlZDolcyIsCisJCQloYW5kbGVwLT5pZmluZGV4LCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCWlmIChoYW5kbGUtPm9wdC5yZm1vbikKKwl7CisJCS8qIE1vbml0b3IgbW9kZSBkb2Vzbid0IGFwcGx5IHRvIENBTiBkZXZpY2VzLiAqLworCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCX0KKworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQ7CisJcmV0dXJuIDA7CisKK30KKworCitzdGF0aWMgaW50CitjYW5fcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKKwlzdHJ1Y3QgaW92ZWMgaXY7CisJc3RydWN0IGNhbl9mcmFtZSogY2Y7CisKKwlpdi5pb3ZfYmFzZSA9ICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldF07CisJaXYuaW92X2xlbiA9IGhhbmRsZS0+c25hcHNob3Q7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tc2dfaW92ID0gJml2OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBoYW5kbGUtPmJ1ZmZlcjsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBoYW5kbGUtPm9mZnNldDsKKworCWRvCisJeworCQlwa3RoLmNhcGxlbiA9IHJlY3Ztc2coaGFuZGxlLT5mZCwgJm1zZywgMCk7CisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApCisJCXsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gLTI7CisJCX0KKwl9IHdoaWxlICgocGt0aC5jYXBsZW4gPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCisJaWYgKHBrdGguY2FwbGVuIDwgMCkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgcmVjZWl2ZSBwYWNrZXQgJWQ6JXMiLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhZGp1c3QgY2FwdHVyZSBsZW4gYWNjb3JkaW5nIHRvIGZyYW1lIGxlbiAqLworCWNmID0gKHN0cnVjdCBjYW5fZnJhbWUqKSZoYW5kbGUtPmJ1ZmZlcls4XTsKKwlwa3RoLmNhcGxlbiAtPSA4IC0gY2YtPmNhbl9kbGM7CisJcGt0aC5sZW4gPSBwa3RoLmNhcGxlbjsKKworCWNmLT5jYW5faWQgPSBodG9ubCggY2YtPmNhbl9pZCApOworCisJaWYoIC0xID09IGdldHRpbWVvZmRheSgmcGt0aC50cywgTlVMTCkgKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBnZXQgdGltZSBvZiBkYXkgJWQ6JXMiLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwljYWxsYmFjayh1c2VyLCAmcGt0aCwgJmhhbmRsZS0+YnVmZmVyWzhdKTsKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK2Nhbl9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiaW5qZWN0IG5vdCBzdXBwb3J0ZWQgb24gIgorCQkiY2FuIGRldmljZXMiKTsKKwlyZXR1cm4gKC0xKTsKK30KKworCitzdGF0aWMgaW50CitjYW5fc3RhdHNfbGludXgocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBwY2FwX3N0YXQgKnN0YXRzKQoreworCS8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwlzdGF0cy0+cHNfcmVjdiA9IDA7CQkJIC8qIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkICovCisJc3RhdHMtPnBzX2Ryb3AgPSAwOwkJCSAvKiBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkICovCisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CQkgLyogZHJvcHMgYnkgaW50ZXJmYWNlIC0tIG9ubHkgc3VwcG9ydGVkIG9uIHNvbWUgcGxhdGZvcm1zICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorY2FuX3NldGZpbHRlcl9saW51eChwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApCit7CisJLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2Nhbl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCit7CisJLyogbm8gc3VwcG9ydCBmb3IgUENBUF9EX09VVCAqLworCWlmIChkID09IFBDQVBfRF9PVVQpCisJeworCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkJIlNldHRpbmcgZGlyZWN0aW9uIHRvIFBDQVBfRF9PVVQgaXMgbm90IHN1cHBvcnRlZCBvbiBjYW4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXAtPmRpcmVjdGlvbiA9IGQ7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBlb2YgKi8KZGlmZiAtLWdpdCBhL3BjYXAtY2FuLWxpbnV4LmggYi9wY2FwLWNhbi1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODA2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLWNhbi1saW51eC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRmVsaXggT2Jlbmh1YmVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBTb2NrZXRDQU4gcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworcGNhcF90KiBjYW5fY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKTsKK2ludCBjYW5fZmluZGFsbGRldnMocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1Zik7CmRpZmYgLS1naXQgYS9wY2FwLWNhbnVzYi1saW51eC5jIGIvcGNhcC1jYW51c2ItbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJmNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1jYW51c2ItbGludXguYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBTb2NrZXR0cmFjZSBzbmlmZmluZyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IHBsYXRmb3JtCisgKiBCeSBGZWxpeCBPYmVuaHViZXIgPGZlbGl4QG9iZW5odWJlci5kZT4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGlidXNiLTEuMC9saWJ1c2IuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKyNpbmNsdWRlICJwY2FwLWNhbnVzYi1saW51eC5oIgorCisjZGVmaW5lIENBTlVTQl9JRkFDRSAiY2FudXNiIgorCisjZGVmaW5lIENBTlVTQl9WSUQgMHgwNDAzCisjZGVmaW5lIENBTlVTQl9QSUQgMHg4OTkwCisKKyNkZWZpbmUgVVNFX1RIUkVBRCAxCisKKyNpZiBVU0VfVEhSRUFEID09IDAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgY2FudXNiX2FjdGl2YXRlKHBjYXBfdCAqKTsKK3N0YXRpYyBpbnQgY2FudXNiX3JlYWRfbGludXgocGNhcF90ICosIGludCAsIHBjYXBfaGFuZGxlciAsIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgY2FudXNiX2luamVjdF9saW51eChwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIGludCBjYW51c2Jfc2V0ZmlsdGVyX2xpbnV4KHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CitzdGF0aWMgaW50IGNhbnVzYl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworc3RhdGljIGludCBjYW51c2Jfc3RhdHNfbGludXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CisKK3N0cnVjdCBDQU5fTXNnCit7CisgICAgdWludDMyX3QgdGltZXN0YW1wOworICAgIHVpbnQzMl90IGlkOworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICB1aW50OF90IGRhdGFbOF07Cit9OworCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gTGludXggQ0FOYnVzIFVTQiBkZXZpY2VzLgorICovCitzdHJ1Y3QgcGNhcF9jYW51c2IgeworICAgIGxpYnVzYl9jb250ZXh0ICpjdHg7CisgICAgbGlidXNiX2RldmljZV9oYW5kbGUgKmRldjsKKyAgICBwdGhyZWFkX3Qgd29ya2VyOworICAgIGludCByZHBpcGUsIHdycGlwZTsKKyAgICB2b2xhdGlsZSBpbnQgbG9vcDsKK307CisKK2ludCBjYW51c2JfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycl9zdHIpCit7CisgICAgbGlidXNiX2NvbnRleHQgKmZkY3R4OworICAgIGxpYnVzYl9kZXZpY2UqKiBkZXZzOworICAgIHVuc2lnbmVkIGNoYXIgc2VybnVtWzY1XTsKKyAgICBpbnQgY250LCBpOworICAgIAorICAgIGlmIChsaWJ1c2JfaW5pdCgmZmRjdHgpICE9IDApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogWFhYIC0gaWYgdGhpcyBkb2Vzbid0IGp1c3QgbWVhbiAibm8gVVNCIGZpbGUgc3lzdGVtIG1vdW50ZWQiLAorICAgICAgICAgKiBwZXJoYXBzIHdlIHNob3VsZCByZXBvcnQgYSByZWFsIGVycm9yIHJhdGhlciB0aGFuIGp1c3QKKyAgICAgICAgICogc2F5aW5nICJubyBDQU5VU0IgZGV2aWNlcyIuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9IAorCisgICAgY250ID0gbGlidXNiX2dldF9kZXZpY2VfbGlzdChmZGN0eCwmZGV2cyk7CisKKyAgICBmb3IoaT0wO2k8Y250O2krKykKKyAgICB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGV2aWNlIGlzIGludGVyZXN0aW5nLgorICAgICAgICBzdHJ1Y3QgbGlidXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2M7CisgICAgICAgIGxpYnVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IoZGV2c1tpXSwmZGVzYyk7CisKKyAgICAgICAgaWYgKChkZXNjLmlkVmVuZG9yICE9IENBTlVTQl9WSUQpIHx8IChkZXNjLmlkUHJvZHVjdCAhPSBDQU5VU0JfUElEKSkgCisgICAgICAgICAgICBjb250aW51ZTsgLy9JdCBpcyBub3QsIGNoZWNrIG5leHQgZGV2aWNlCisgICAgICAgICAgCisgICAgICAgIC8vSXQgaXMhCisgICAgICAgIGxpYnVzYl9kZXZpY2VfaGFuZGxlICpkaCA9IE5VTEw7CisKKyAgICAgICAgaWYgKChyZXQgPSBsaWJ1c2Jfb3BlbihkZXZzW2ldLCZkaCkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgZGV2X25hbWVbMzBdOworICAgICAgICAgICAgY2hhciBkZXZfZGVzY3JbNTBdOyAKKyAgICAgICAgICAgIGludCBuID0gbGlidXNiX2dldF9zdHJpbmdfZGVzY3JpcHRvcl9hc2NpaShkaCxkZXNjLmlTZXJpYWxOdW1iZXIsc2VybnVtLDY0KTsKKyAgICAgICAgICAgIHNlcm51bVtuXSA9IDA7CisKKyAgICAgICAgICAgIHNucHJpbnRmKGRldl9uYW1lLCAzMCwgQ0FOVVNCX0lGQUNFIiVzIiwgc2VybnVtKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGRldl9kZXNjciwgNTAsICJDYW5VU0IgWyVzXSIsIHNlcm51bSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxpYnVzYl9jbG9zZShkaCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgZGV2X25hbWUsIDAsIGRldl9kZXNjciwgZXJyX3N0cikgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpYnVzYl9mcmVlX2RldmljZV9saXN0KGRldnMsMSk7CisgICAgICAgICAgICAgICAgbGlidXNiX2V4aXQoZmRjdHgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGxpYnVzYl9mcmVlX2RldmljZV9saXN0KGRldnMsMSk7CisgICAgbGlidXNiX2V4aXQoZmRjdHgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbGlidXNiX2RldmljZV9oYW5kbGUqIGNhbnVzYl9vcGVuZGV2aWNlKHN0cnVjdCBsaWJ1c2JfY29udGV4dCAqY3R4LCBjaGFyKiBkZXZzZXJpYWwpCit7CisgICAgbGlidXNiX2RldmljZSoqIGRldnM7CisgICAgdW5zaWduZWQgY2hhciBzZXJpYWxbNjVdOworICAgIGludCBjbnQsaSxuOworICAgIAorICAgIGNudCA9IGxpYnVzYl9nZXRfZGV2aWNlX2xpc3QoY3R4LCZkZXZzKTsKKworICAgIGZvcihpPTA7aTxjbnQ7aSsrKQorICAgIHsgICAgCisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGV2aWNlIGlzIGludGVyZXN0aW5nLgorICAgICAgICBzdHJ1Y3QgbGlidXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2M7CisgICAgICAgIGxpYnVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IoZGV2c1tpXSwmZGVzYyk7CisKKyAgICAgICAgaWYgKChkZXNjLmlkVmVuZG9yICE9IENBTlVTQl9WSUQpIHx8IChkZXNjLmlkUHJvZHVjdCAhPSBDQU5VU0JfUElEKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAKKyAgICAgICAgLy9Gb3VuZCBvbmUhCisgICAgICAgIGxpYnVzYl9kZXZpY2VfaGFuZGxlICpkaCA9IE5VTEw7CisKKyAgICAgICAgaWYgKGxpYnVzYl9vcGVuKGRldnNbaV0sJmRoKSAhPSAwKSBjb250aW51ZTsKKworICAgICAgICBuID0gbGlidXNiX2dldF9zdHJpbmdfZGVzY3JpcHRvcl9hc2NpaShkaCxkZXNjLmlTZXJpYWxOdW1iZXIsc2VyaWFsLDY0KTsKKyAgICAgICAgc2VyaWFsW25dID0gMDsKKworICAgICAgICBpZiAoKGRldnNlcmlhbCkgJiYgKHN0cmNtcCgoY2hhciAqKXNlcmlhbCxkZXZzZXJpYWwpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGxpYnVzYl9rZXJuZWxfZHJpdmVyX2FjdGl2ZShkaCwwKSkgJiYgKGxpYnVzYl9kZXRhY2hfa2VybmVsX2RyaXZlcihkaCwwKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGlidXNiX2Nsb3NlKGRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpYnVzYl9zZXRfY29uZmlndXJhdGlvbihkaCwxKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlidXNiX2NsYWltX2ludGVyZmFjZShkaCwwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vRm91bnQgaXQhCisgICAgICAgIGxpYnVzYl9mcmVlX2RldmljZV9saXN0KGRldnMsMSk7ICAgICAgICAKKyAgICAgICAgcmV0dXJuIGRoOworICAgIH0KKworICAgIGxpYnVzYl9mcmVlX2RldmljZV9saXN0KGRldnMsMSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworcGNhcF90ICoKK2NhbnVzYl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpCit7IAorICAgIGNvbnN0IGNoYXIgKmNwOworICAgIGNoYXIgKmNwZW5kOworICAgIGxvbmcgZGV2bnVtOworICAgIHBjYXBfdCogcDsKKyAgICBzdHJ1Y3QgcGNhcF9jYW51c2IgKmNhbnVzYjsKKworICAgIC8qIERvZXMgdGhpcyBsb29rIGxpa2UgYSBEQUcgZGV2aWNlPyAqLworICAgIGNwID0gc3RycmNocihkZXZpY2UsICcvJyk7CisgICAgaWYgKGNwID09IE5VTEwpCisgICAgICAgIGNwID0gZGV2aWNlOworICAgIC8qIERvZXMgaXQgYmVnaW4gd2l0aCAiY2FudXNiIj8gKi8KKyAgICBpZiAoc3RybmNtcChjcCwgImNhbnVzYiIsIDYpICE9IDApIHsKKyAgICAgICAgLyogTm9wZSwgZG9lc24ndCBiZWdpbiB3aXRoICJjYW51c2IiICovCisgICAgICAgICppc19vdXJzID0gMDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFllcyAtIGlzICJjYW51c2IiIGZvbGxvd2VkIGJ5IGEgbnVtYmVyPyAqLworICAgIGNwICs9IDY7CisgICAgZGV2bnVtID0gc3RydG9sKGNwLCAmY3BlbmQsIDEwKTsKKyAgICBpZiAoY3BlbmQgPT0gY3AgfHwgKmNwZW5kICE9ICdcMCcpIHsKKyAgICAgICAgLyogTm90IGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiAqLworICAgICAgICAqaXNfb3VycyA9IDA7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZGV2bnVtIDwgMCkgeworICAgICAgICAvKiBGb2xsb3dlZCBieSBhIG5vbi12YWxpZCBudW1iZXIuICovCisgICAgICAgICppc19vdXJzID0gMDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogT0ssIGl0J3MgcHJvYmFibHkgb3Vycy4gKi8KKyAgICAqaXNfb3VycyA9IDE7CisKKyAgICBwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9jYW51c2IpKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKE5VTEwpOworCisgICAgY2FudXNiID0gcC0+cHJpdjsKKyAgICBjYW51c2ItPmN0eCA9IE5VTEw7CisgICAgY2FudXNiLT5kZXYgPSBOVUxMOworICAgIGNhbnVzYi0+cmRwaXBlID0gLTE7CisgICAgY2FudXNiLT53cnBpcGUgPSAtMTsKKworICAgIHAtPmFjdGl2YXRlX29wID0gY2FudXNiX2FjdGl2YXRlOworCisgICAgcmV0dXJuIChwKTsKK30KKworCitzdGF0aWMgdm9pZCogY2FudXNiX2NhcHR1cmVfdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICBzdHJ1Y3QgcGNhcF9jYW51c2IgKmNhbnVzYiA9IGFyZzsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgCisgICAgeworICAgICAgdWludDhfdCByeHN6LCB0eHN6OworICAgIH0gc3RhdHVzOworICAKKyAgICBmY250bChjYW51c2ItPndycGlwZSwgRl9TRVRGTCwgT19OT05CTE9DSyk7ICAKKworICAgIHdoaWxlKGNhbnVzYi0+bG9vcCkKKyAgICB7CisgICAgICAgIGludCBzejsKKyAgICAgICAgc3RydWN0IENBTl9Nc2cgbXNnOworICAgIAorICAgICAgICBsaWJ1c2JfaW50ZXJydXB0X3RyYW5zZmVyKGNhbnVzYi0+ZGV2LCAweDgxLCAodW5zaWduZWQgY2hhciopJnN0YXR1cywgc2l6ZW9mKHN0YXR1cyksICZzeiwgMTAwKTsKKyAgICAgICAgLy9IQUNLISEhISEgLT4gZHJvcCBidWZmZXJlZCBkYXRhLCByZWFkIG5ldyBvbmUgYnkgcmVhZGluZyB0d2ljZS4gICAgICAgIAorICAgICAgICBsaWJ1c2JfaW50ZXJydXB0X3RyYW5zZmVyKGNhbnVzYi0+ZGV2LCAweDgxLCAodW5zaWduZWQgY2hhciopJnN0YXR1cywgc2l6ZW9mKHN0YXR1cyksICZzeiwgMTAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgIGZvcihpID0gMDsgaTxzdGF0dXMucnhzejsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsaWJ1c2JfYnVsa190cmFuc2ZlcihjYW51c2ItPmRldiwgMHg4NSwgKHVuc2lnbmVkIGNoYXIqKSZtc2csIHNpemVvZihtc2cpLCAmc3osIDEwMCk7ICAgICAgCisgICAgICAgICAgICB3cml0ZShjYW51c2ItPndycGlwZSwgJm1zZywgc2l6ZW9mKG1zZykpOworICAgICAgICB9CisKKyAgICB9CisgIAorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGNhbnVzYl9zdGFydGNhcHR1cmUoc3RydWN0IHBjYXBfY2FudXNiKiB0aGlzKQoreworICAgIGludCBwaXBlZmRbMl07CisKKyAgICBpZiAocGlwZShwaXBlZmQpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB0aGlzLT5yZHBpcGUgPSBwaXBlZmRbMF07CisgICAgdGhpcy0+d3JwaXBlID0gcGlwZWZkWzFdOworCisgICAgdGhpcy0+bG9vcCA9IDE7ICAKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGhpcy0+d29ya2VyLCBOVUxMLCBjYW51c2JfY2FwdHVyZV90aHJlYWQsIHRoaXMpOworCisgICAgcmV0dXJuIHRoaXMtPnJkcGlwZTsKK30KKworc3RhdGljIHZvaWQgY2FudXNiX2NsZWFyYnVmcyhzdHJ1Y3QgcGNhcF9jYW51c2IqIHRoaXMpCit7CisgICAgdW5zaWduZWQgY2hhciBjbWRbMTZdOworICAgIGludCBhbDsKKworICAgIGNtZFswXSA9IDE7ICAvL0VtcHR5IGluY29taW5nIGJ1ZmZlcgorICAgIGNtZFsxXSA9IDE7ICAvL0VtcHR5IG91dGdvaW5nIGJ1ZmZlcgorICAgIGNtZFszXSA9IDA7ICAvL05vdCBhIHdyaXRlIHRvIHNlcmlhbCBudW1iZXIKKyAgICBtZW1zZXQoJmNtZFs0XSwwLDE2LTQpOworICAgICAgICAKKyAgICBsaWJ1c2JfaW50ZXJydXB0X3RyYW5zZmVyKHRoaXMtPmRldiwgMHgxLGNtZCwxNiwmYWwsMTAwKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW51c2JfY2xvc2UocGNhcF90KiBoYW5kbGUpCit7CisgICAgc3RydWN0IHBjYXBfY2FudXNiICpjYW51c2IgPSBoYW5kbGUtPnByaXY7CisKKyAgICBjYW51c2ItPmxvb3AgPSAwOworICAgIHB0aHJlYWRfam9pbihjYW51c2ItPndvcmtlciwgTlVMTCk7CisKKyAgICBpZiAoY2FudXNiLT5kZXYpCisgICAgeworICAgICAgICBsaWJ1c2JfY2xvc2UoY2FudXNiLT5kZXYpOworICAgICAgICBjYW51c2ItPmRldiA9IE5VTEw7CisgICAgfSAgICAKKyAgICBpZiAoY2FudXNiLT5jdHgpCisgICAgeworICAgICAgICBsaWJ1c2JfZXhpdChjYW51c2ItPmN0eCk7CisgICAgICAgIGNhbnVzYi0+Y3R4ID0gTlVMTDsKKyAgICB9Cit9CisKKworCitzdGF0aWMgaW50IGNhbnVzYl9hY3RpdmF0ZShwY2FwX3QqIGhhbmRsZSkKK3sKKyAgICBzdHJ1Y3QgcGNhcF9jYW51c2IgKmNhbnVzYiA9IGhhbmRsZS0+cHJpdjsKKyAgICBjaGFyICpzZXJpYWw7CisKKyAgICBpZiAobGlidXNiX2luaXQoJmNhbnVzYi0+Y3R4KSAhPSAwKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFhYWCAtIHdoYXQgY2F1c2VzIHRoaXMgdG8gZmFpbD8KKyAgICAgICAgICovCisgICAgICAgIHNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibGlidXNiX2luaXQoKSBmYWlsZWQiKTsgIAorICAgICAgICByZXR1cm4gUENBUF9FUlJPUjsKKyAgICB9IAorCisgICAgaGFuZGxlLT5yZWFkX29wID0gY2FudXNiX3JlYWRfbGludXg7CisKKyAgICBoYW5kbGUtPmluamVjdF9vcCA9IGNhbnVzYl9pbmplY3RfbGludXg7CisgICAgaGFuZGxlLT5zZXRmaWx0ZXJfb3AgPSBjYW51c2Jfc2V0ZmlsdGVyX2xpbnV4OworICAgIGhhbmRsZS0+c2V0ZGlyZWN0aW9uX29wID0gY2FudXNiX3NldGRpcmVjdGlvbl9saW51eDsKKyAgICBoYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKyAgICBoYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKyAgICBoYW5kbGUtPnN0YXRzX29wID0gY2FudXNiX3N0YXRzX2xpbnV4OworICAgIGhhbmRsZS0+Y2xlYW51cF9vcCA9IGNhbnVzYl9jbG9zZTsKKworICAgIC8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKyAgICBoYW5kbGUtPmJ1ZnNpemUgPSAzMjsKKyAgICBoYW5kbGUtPm9mZnNldCA9IDg7CisgICAgaGFuZGxlLT5saW5rdHlwZSA9IERMVF9DQU5fU09DS0VUQ0FOOworICAgIGhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsKKworICAgIHNlcmlhbCA9IGhhbmRsZS0+b3B0LnNvdXJjZSArIHN0cmxlbihDQU5VU0JfSUZBQ0UpOworCisgICAgY2FudXNiLT5kZXYgPSBjYW51c2Jfb3BlbmRldmljZShjYW51c2ItPmN0eCwgc2VyaWFsKTsKKyAgICBpZiAoIWNhbnVzYi0+ZGV2KQorICAgIHsKKyAgICAgICAgbGlidXNiX2V4aXQoY2FudXNiLT5jdHgpOworICAgICAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IG9wZW4gVVNCIERldmljZSIpOyAgCisgICAgICAgIHJldHVybiBQQ0FQX0VSUk9SOworICAgIH0KKworICAgIGNhbnVzYl9jbGVhcmJ1ZnMoY2FudXNiKTsKKworICAgIGhhbmRsZS0+ZmQgPSBjYW51c2Jfc3RhcnRjYXB0dXJlKGNhbnVzYik7CisgICAgaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKworICAgIHJldHVybiAwOworfQorCisKKworCitzdGF0aWMgaW50CitjYW51c2JfcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKyAgICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgZmlyc3RwYWNrZXQgPSB7IC0xLCAtMX07CisgICAgaW50IGkgPSAwOworICAgIHN0cnVjdCBDQU5fTXNnIG1zZzsKKyAgICBzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKKyAgCisgICAgd2hpbGUoaSA8IG1heF9wYWNrZXRzKQorICAgIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIHVzbGVlcCgxMCAqIDEwMDApOworICAgICAgICBuID0gcmVhZChoYW5kbGUtPmZkLCAmbXNnLCBzaXplb2YobXNnKSk7CisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcGt0aC5jYXBsZW4gPSBwa3RoLmxlbiA9IG47CisgICAgICAgIHBrdGguY2FwbGVuIC09IDQ7CisgICAgICAgIHBrdGguY2FwbGVuIC09IDggLSBtc2cubGVuZ3RoOworICAgIAorICAgICAgICBpZiAoKGZpcnN0cGFja2V0LnR2X3NlYyA9PSAtMSkgJiYgKGZpcnN0cGFja2V0LnR2X3VzZWMgPT0gLTEpKQorICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZmaXJzdHBhY2tldCwgTlVMTCk7CisgICAgICAKKyAgICAgICAgcGt0aC50cy50dl91c2VjID0gZmlyc3RwYWNrZXQudHZfdXNlYyArIChtc2cudGltZXN0YW1wICUgMTAwKSAqIDEwMDAwOworICAgICAgICBwa3RoLnRzLnR2X3NlYyA9IGZpcnN0cGFja2V0LnR2X3VzZWMgKyAobXNnLnRpbWVzdGFtcCAvIDEwMCk7CisgICAgICAgIGlmIChwa3RoLnRzLnR2X3VzZWMgPiAxMDAwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBwa3RoLnRzLnR2X3VzZWMgLT0gMTAwMDAwMDsKKyAgICAgICAgICAgIHBrdGgudHMudHZfc2VjKys7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayh1c2VyLCAmcGt0aCwgKHZvaWQqKSZtc2cuaWQpOworICAgICAgICBpKys7CisgICAgfQorICAKKyAgICByZXR1cm4gaTsKK30KKworCitzdGF0aWMgaW50CitjYW51c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworICAgIC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluamVjdCBub3Qgc3VwcG9ydGVkIG9uIGNhbnVzYiBkZXZpY2VzIik7CisgICAgcmV0dXJuICgtMSk7Cit9CisKKworc3RhdGljIGludAorY2FudXNiX3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKK3sKKyAgICAvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisgICAgc3RhdHMtPnBzX3JlY3YgPSAwOyAgICAgLyogbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgKi8KKyAgICBzdGF0cy0+cHNfZHJvcCA9IDA7ICAgICAvKiBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkICovCisgICAgc3RhdHMtPnBzX2lmZHJvcCA9IDA7ICAgLyogZHJvcHMgYnkgaW50ZXJmYWNlIC0tIG9ubHkgc3VwcG9ydGVkIG9uIHNvbWUgcGxhdGZvcm1zICovCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorY2FudXNiX3NldGZpbHRlcl9saW51eChwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApCit7CisgICAgLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2NhbnVzYl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCit7CisgICAgLyogbm8gc3VwcG9ydCBmb3IgUENBUF9EX09VVCAqLworICAgIGlmIChkID09IFBDQVBfRF9PVVQpCisgICAgeworICAgICAgICBzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorICAgICAgICAgICAgIlNldHRpbmcgZGlyZWN0aW9uIHRvIFBDQVBfRF9PVVQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGludGVyZmFjZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcC0+ZGlyZWN0aW9uID0gZDsKKworICAgIHJldHVybiAwOworfQorCisKKy8qIGVvZiAqLwpkaWZmIC0tZ2l0IGEvcGNhcC1jYW51c2ItbGludXguaCBiL3BjYXAtY2FudXNiLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmM2JlMQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtY2FudXNiLWxpbnV4LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIFNvY2tldENBTiByZWxhdGVkIGZ1bmN0aW9ucworICovCitwY2FwX3QqIGNhbnVzYl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpOworaW50IGNhbnVzYl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipwZGV2bGlzdCwgY2hhciogZXJyYnVmKTsKKwpkaWZmIC0tZ2l0IGEvcGNhcC1jb21tb24uYyBiL3BjYXAtY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmYzYzMQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtY29tbW9uLmMKQEAgLTAsMCArMSwxMjk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogcGNhcC1jb21tb24uYyAtIGNvbW1vbiBjb2RlIGZvciBwY2FwIGFuZCBwY2FwLW5nIGZpbGVzCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgInBjYXAvdXNiLmgiCisjaW5jbHVkZSAicGNhcC9uZmxvZy5oIgorCisjaW5jbHVkZSAicGNhcC1jb21tb24uaCIKKworLyoKKyAqIFdlIGRvbid0IHdyaXRlIERMVF8qIHZhbHVlcyB0byBjYXB0dXJlIGZpbGVzLCBiZWNhdXNlIHRoZXkncmUgbm90IHRoZQorICogc2FtZSBvbiBhbGwgcGxhdGZvcm1zLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIHRoZSB2YXJpb3VzIGZsYXZvcnMgb2YgQlNEIGhhdmUgbm90IGFsd2F5cyB1c2VkIHRoZSBzYW1lCisgKiBudW1lcmljYWwgdmFsdWVzIGZvciB0aGUgc2FtZSBkYXRhIHR5cGVzLCBhbmQgdmFyaW91cyBwYXRjaGVzIHRvCisgKiBsaWJwY2FwIGZvciBub24tQlNEIE9TZXMgaGF2ZSBhZGRlZCB0aGVpciBvd24gRExUXyogY29kZXMgZm9yIGxpbmsKKyAqIGxheWVyIGVuY2Fwc3VsYXRpb24gdHlwZXMgc2VlbiBvbiB0aG9zZSBPU2VzLCBhbmQgdGhvc2UgY29kZXMgaGF2ZSBoYWQsCisgKiBpbiBzb21lIGNhc2VzLCB2YWx1ZXMgdGhhdCB3ZXJlIGFsc28gdXNlZCwgb24gb3RoZXIgcGxhdGZvcm1zLCBmb3Igb3RoZXIKKyAqIGxpbmsgbGF5ZXIgZW5jYXBzdWxhdGlvbiB0eXBlcy4KKyAqCisgKiBUaGlzIG1lYW5zIHRoYXQgY2FwdHVyZSBmaWxlcyBvZiBhIHR5cGUgd2hvc2UgbnVtZXJpY2FsIERMVF8qIGNvZGUKKyAqIG1lYW5zIGRpZmZlcmVudCB0aGluZ3Mgb24gZGlmZmVyZW50IEJTRHMsIG9yIHdpdGggZGlmZmVyZW50IHZlcnNpb25zCisgKiBvZiBsaWJwY2FwLCBjYW4ndCBhbHdheXMgYmUgcmVhZCBvbiBzeXN0ZW1zIG90aGVyIHRoYW4gdGhvc2UgbGlrZQorICogdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBtYWNoaW5lIG9uIHdoaWNoIHRoZSBjYXB0dXJlIHdhcyBtYWRlLgorICoKKyAqIEluc3RlYWQsIHdlIGRlZmluZSBoZXJlIGEgc2V0IG9mIExJTktUWVBFXyogY29kZXMsIGFuZCBtYXAgRExUXyogY29kZXMKKyAqIHRvIExJTktUWVBFXyogY29kZXMgd2hlbiB3cml0aW5nIGEgc2F2ZWZpbGUgaGVhZGVyLCBhbmQgbWFwIExJTktUWVBFXyoKKyAqIGNvZGVzIHRvIERMVF8qIGNvZGVzIHdoZW4gcmVhZGluZyBhIHNhdmVmaWxlIGhlYWRlci4KKyAqCisgKiBGb3IgdGhvc2UgRExUXyogY29kZXMgdGhhdCBoYXZlLCBhcyBmYXIgYXMgd2Uga25vdywgdGhlIHNhbWUgdmFsdWVzIG9uCisgKiBhbGwgcGxhdGZvcm1zIChETFRfTlVMTCB0aHJvdWdoIERMVF9GRERJKSwgd2UgZGVmaW5lIExJTktUWVBFX3h4eCBhcworICogRExUX3h4eDsgdGhhdCB3YXksIGNhcHR1cmVzIG9mIHRob3NlIHR5cGVzIGNhbiBzdGlsbCBiZSByZWFkIGJ5CisgKiB2ZXJzaW9ucyBvZiBsaWJwY2FwIHRoYXQgbWFwIExJTktUWVBFXyogdmFsdWVzIHRvIERMVF8qIHZhbHVlcywgYW5kCisgKiBjYXB0dXJlcyBvZiB0aG9zZSB0eXBlcyB3cml0dGVuIGJ5IHZlcnNpb25zIG9mIGxpYnBjYXAgdGhhdCBtYXAgRExUXworICogdmFsdWVzIHRvIExJTktUWVBFXyB2YWx1ZXMgY2FuIHN0aWxsIGJlIHJlYWQgYnkgb2xkZXIgdmVyc2lvbnMKKyAqIG9mIGxpYnBjYXAuCisgKgorICogVGhlIG90aGVyIExJTktUWVBFXyogY29kZXMgYXJlIGdpdmVuIHZhbHVlcyBzdGFydGluZyBhdCAxMDAsIGluIHRoZQorICogaG9wZXMgdGhhdCBubyBETFRfKiBjb2RlIHdpbGwgYmUgZ2l2ZW4gb25lIG9mIHRob3NlIHZhbHVlcy4KKyAqCisgKiBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhIGdpdmVuIExJTktUWVBFXyogY29kZSdzIHZhbHVlIHdpbGwgcmVmZXIgdG8KKyAqIHRoZSBzYW1lIGVuY2Fwc3VsYXRpb24gdHlwZSBvbiBhbGwgcGxhdGZvcm1zLCB5b3Ugc2hvdWxkIG5vdCBhbGxvY2F0ZQorICogYSBuZXcgTElOS1RZUEVfKiB2YWx1ZSB3aXRob3V0IGNvbnN1bHRpbmcKKyAqICJ0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmciLiAgVGhlIHRjcGR1bXAgZGV2ZWxvcGVycyB3aWxsCisgKiBhbGxvY2F0ZSBhIHZhbHVlIGZvciB5b3UsIGFuZCB3aWxsIG5vdCBzdWJzZXF1ZW50bHkgYWxsb2NhdGUgaXQgdG8KKyAqIGFueWJvZHkgZWxzZTsgdGhhdCB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSAicGNhcC5oIiBpbiB0aGUKKyAqIHRjcGR1bXAub3JnIEdpdCByZXBvc2l0b3J5LCBzbyB0aGF0IGEgZnV0dXJlIGxpYnBjYXAgcmVsZWFzZSB3aWxsCisgKiBpbmNsdWRlIGl0LgorICoKKyAqIFlvdSBzaG91bGQsIGlmIHBvc3NpYmxlLCBhbHNvIGNvbnRyaWJ1dGUgcGF0Y2hlcyB0byBsaWJwY2FwIGFuZCB0Y3BkdW1wCisgKiB0byBoYW5kbGUgdGhlIG5ldyBlbmNhcHN1bGF0aW9uIHR5cGUsIHNvIHRoYXQgdGhleSBjYW4gYWxzbyBiZSBjaGVja2VkCisgKiBpbnRvIHRoZSB0Y3BkdW1wLm9yZyBHaXQgcmVwb3NpdG9yeSBhbmQgc28gdGhhdCB0aGV5IHdpbGwgYXBwZWFyIGluCisgKiBmdXR1cmUgbGlicGNhcCBhbmQgdGNwZHVtcCByZWxlYXNlcy4KKyAqCisgKiBEbyAqTk9UKiBhc3N1bWUgdGhhdCBhbnkgdmFsdWVzIGFmdGVyIHRoZSBsYXJnZXN0IHZhbHVlIGluIHRoaXMgZmlsZQorICogYXJlIGF2YWlsYWJsZTsgeW91IG1pZ2h0IG5vdCBoYXZlIHRoZSBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlLCBhbmQgbmV3IHZhbHVlcyBhZnRlciB0aGF0IG9uZSBtaWdodCBoYXZlIGJlZW4gYXNzaWduZWQuICBBbHNvLAorICogZG8gKk5PVCogdXNlIGFueSB2YWx1ZXMgYmVsb3cgMTAwIC0gdGhvc2UgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4KKyAqIHRha2VuIGJ5IG9uZSAob3IgbW9yZSEpIG9yZ2FuaXphdGlvbnMuCisgKgorICogQW55IHBsYXRmb3JtIHRoYXQgZGVmaW5lcyBhZGRpdGlvbmFsIERMVF8qIGNvZGVzIHNob3VsZDoKKyAqCisgKglyZXF1ZXN0IGEgTElOS1RZUEVfKiBjb2RlIGFuZCB2YWx1ZSBmcm9tIHRjcGR1bXAub3JnLAorICoJYXMgcGVyIHRoZSBhYm92ZTsKKyAqCisgKglhZGQsIGluIHRoZWlyIHZlcnNpb24gb2YgbGlicGNhcCwgYW4gZW50cnkgdG8gbWFwCisgKgl0aG9zZSBETFRfKiBjb2RlcyB0byB0aGUgY29ycmVzcG9uZGluZyBMSU5LVFlQRV8qCisgKgljb2RlOworICoKKyAqCXJlZGVmaW5lLCBpbiB0aGVpciAibmV0L2JwZi5oIiwgYW55IERMVF8qIHZhbHVlcworICoJdGhhdCBjb2xsaWRlIHdpdGggdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZWlyIGFkZGl0aW9uYWwKKyAqCURMVF8qIGNvZGVzLCB0byByZW1vdmUgdGhvc2UgY29sbGlzaW9ucyAoYnV0IHdpdGhvdXQKKyAqCW1ha2luZyB0aGVtIGNvbGxpZGUgd2l0aCBhbnkgb2YgdGhlIExJTktUWVBFXyoKKyAqCXZhbHVlcyBlcXVhbCB0byA1MCBvciBhYm92ZTsgdGhleSBzaG91bGQgYWxzbyBhdm9pZAorICoJZGVmaW5pbmcgRExUXyogdmFsdWVzIHRoYXQgY29sbGlkZSB3aXRoIHRob3NlCisgKglMSU5LVFlQRV8qIHZhbHVlcywgZWl0aGVyKS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9OVUxMCQlETFRfTlVMTAorI2RlZmluZSBMSU5LVFlQRV9FVEhFUk5FVAlETFRfRU4xME1CCS8qIGFsc28gZm9yIDEwME1iIGFuZCB1cCAqLworI2RlZmluZSBMSU5LVFlQRV9FWFBfRVRIRVJORVQJRExUX0VOM01CCS8qIDNNYiBleHBlcmltZW50YWwgRXRoZXJuZXQgKi8KKyNkZWZpbmUgTElOS1RZUEVfQVgyNQkJRExUX0FYMjUKKyNkZWZpbmUgTElOS1RZUEVfUFJPTkVUCQlETFRfUFJPTkVUCisjZGVmaW5lIExJTktUWVBFX0NIQU9TCQlETFRfQ0hBT1MKKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl81CURMVF9JRUVFODAyCS8qIERMVF9JRUVFODAyIGlzIHVzZWQgZm9yIDgwMi41IFRva2VuIFJpbmcgKi8KKyNkZWZpbmUgTElOS1RZUEVfQVJDTkVUX0JTRAlETFRfQVJDTkVUCS8qIEJTRC1zdHlsZSBoZWFkZXJzICovCisjZGVmaW5lIExJTktUWVBFX1NMSVAJCURMVF9TTElQCisjZGVmaW5lIExJTktUWVBFX1BQUAkJRExUX1BQUAorI2RlZmluZSBMSU5LVFlQRV9GRERJCQlETFRfRkRESQorCisvKgorICogTElOS1RZUEVfUFBQIGlzIGZvciB1c2Ugd2hlbiB0aGVyZSBtaWdodCwgb3IgbWlnaHQgbm90LCBiZSBhbiBSRkMgMTY2MgorICogUFBQIGluIEhETEMtbGlrZSBmcmFtaW5nIGhlYWRlciAod2l0aCAweGZmIDB4MDMgYmVmb3JlIHRoZSBQUFAgcHJvdG9jb2wKKyAqIGZpZWxkKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQuCisgKgorICogVGhpcyBpcyBmb3IgdXNlIHdoZW4gdGhlcmUgaXMgYWx3YXlzIHN1Y2ggYSBoZWFkZXI7IHRoZSBhZGRyZXNzIGZpZWxkCisgKiBtaWdodCBiZSAweGZmLCBmb3IgcmVndWxhciBQUFAsIG9yIGl0IG1pZ2h0IGJlIGFuIGFkZHJlc3MgZmllbGQgZm9yIENpc2NvCisgKiBwb2ludC10by1wb2ludCB3aXRoIEhETEMgZnJhbWluZyBhcyBwZXIgc2VjdGlvbiA0LjMuMSBvZiBSRkMgMTU0NyAoIkNpc2NvCisgKiBIRExDIikuICBUaGlzIGlzLCBmb3IgZXhhbXBsZSwgd2hhdCB5b3UgZ2V0IHdpdGggTmV0QlNEJ3MgRExUX1BQUF9TRVJJQUwuCisgKgorICogV2UgZ2l2ZSBpdCB0aGUgc2FtZSB2YWx1ZSBhcyBOZXRCU0QncyBETFRfUFBQX1NFUklBTCwgaW4gdGhlIGhvcGVzIHRoYXQKKyAqIG5vYm9keSBlbHNlIHdpbGwgY2hvb3NlIGEgRExUXyB2YWx1ZSBvZiA1MCwgYW5kIHNvIHRoYXQgRExUX1BQUF9TRVJJQUwKKyAqIGNhcHR1cmVzIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2l0aCBhIGxpbmsgdHlwZSB0aGF0IE5ldEJTRCdzIHRjcGR1bXAKKyAqIGNhbiByZWFkLgorICovCisjZGVmaW5lIExJTktUWVBFX1BQUF9IRExDCTUwCQkvKiBQUFAgaW4gSERMQy1saWtlIGZyYW1pbmcgKi8KKworI2RlZmluZSBMSU5LVFlQRV9QUFBfRVRIRVIJNTEJCS8qIE5ldEJTRCBQUFAtb3Zlci1FdGhlcm5ldCAqLworCisjZGVmaW5lIExJTktUWVBFX1NZTUFOVEVDX0ZJUkVXQUxMIDk5CQkvKiBTeW1hbnRlYyBFbnRlcnByaXNlIEZpcmV3YWxsICovCisKKy8qCisgKiBUaGVzZSBjb3JyZXNwb25kIHRvIERMVF9zIHRoYXQgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzIG9uIGRpZmZlcmVudAorICogcGxhdGZvcm1zOyB3ZSBtYXAgYmV0d2VlbiB0aGVzZSB2YWx1ZXMgaW4gY2FwdHVyZSBmaWxlcyBhbmQKKyAqIHRoZSBETFRfIHZhbHVlcyBhcyByZXR1cm5lZCBieSBwY2FwX2RhdGFsaW5rKCkgYW5kIHBhc3NlZCB0bworICogcGNhcF9vcGVuX2RlYWQoKS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9BVE1fUkZDMTQ4MwkxMDAJCS8qIExMQy9TTkFQLWVuY2Fwc3VsYXRlZCBBVE0gKi8KKyNkZWZpbmUgTElOS1RZUEVfUkFXCQkxMDEJCS8qIHJhdyBJUCAqLworI2RlZmluZSBMSU5LVFlQRV9TTElQX0JTRE9TCTEwMgkJLyogQlNEL09TIFNMSVAgQlBGIGhlYWRlciAqLworI2RlZmluZSBMSU5LVFlQRV9QUFBfQlNET1MJMTAzCQkvKiBCU0QvT1MgUFBQIEJQRiBoZWFkZXIgKi8KKworLyoKKyAqIFZhbHVlcyBzdGFydGluZyB3aXRoIDEwNCBhcmUgdXNlZCBmb3IgbmV3bHktYXNzaWduZWQgbGluay1sYXllcgorICogaGVhZGVyIHR5cGUgdmFsdWVzOyBmb3IgdGhvc2UgbGluay1sYXllciBoZWFkZXIgdHlwZXMsIHRoZSBETFRfCisgKiB2YWx1ZSByZXR1cm5lZCBieSBwY2FwX2RhdGFsaW5rKCkgYW5kIHBhc3NlZCB0byBwY2FwX29wZW5fZGVhZCgpLAorICogYW5kIHRoZSBMSU5LVFlQRV8gdmFsdWUgdGhhdCBhcHBlYXJzIGluIGNhcHR1cmUgZmlsZXMsIGFyZSB0aGUKKyAqIHNhbWUuCisgKgorICogTElOS1RZUEVfTUFUQ0hJTkdfTUlOIGlzIHRoZSBsb3dlc3Qgc3VjaCB2YWx1ZTsgTElOS1RZUEVfTUFUQ0hJTkdfTUFYCisgKiBpcyB0aGUgaGlnaGVzdCBzdWNoIHZhbHVlLgorICovCisjZGVmaW5lIExJTktUWVBFX01BVENISU5HX01JTgkxMDQJCS8qIGxvd2VzdCB2YWx1ZSBpbiB0aGUgIm1hdGNoaW5nIiByYW5nZSAqLworCisjZGVmaW5lIExJTktUWVBFX0NfSERMQwkJMTA0CQkvKiBDaXNjbyBIRExDICovCisjZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTEJMTA1CQkvKiBJRUVFIDgwMi4xMSAod2lyZWxlc3MpICovCisjZGVmaW5lIExJTktUWVBFX0FUTV9DTElQCTEwNgkJLyogTGludXggQ2xhc3NpY2FsIElQIG92ZXIgQVRNICovCisjZGVmaW5lIExJTktUWVBFX0ZSRUxBWQkJMTA3CQkvKiBGcmFtZSBSZWxheSAqLworI2RlZmluZSBMSU5LVFlQRV9MT09QCQkxMDgJCS8qIE9wZW5CU0QgbG9vcGJhY2sgKi8KKyNkZWZpbmUgTElOS1RZUEVfRU5DCQkxMDkJCS8qIE9wZW5CU0QgSVBTRUMgZW5jICovCisKKy8qCisgKiBUaGVzZSB0aHJlZSB0eXBlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTEFORTgwMjMJMTEwCQkvKiBBVE0gTEFORSArIDgwMi4zICovCisjZGVmaW5lIExJTktUWVBFX0hJUFBJCQkxMTEJCS8qIE5ldEJTRCBISVBQSSAqLworI2RlZmluZSBMSU5LVFlQRV9IRExDCQkxMTIJCS8qIE5ldEJTRCBIRExDIGZyYW1pbmcgKi8KKworI2RlZmluZSBMSU5LVFlQRV9MSU5VWF9TTEwJMTEzCQkvKiBMaW51eCBjb29rZWQgc29ja2V0IGNhcHR1cmUgKi8KKyNkZWZpbmUgTElOS1RZUEVfTFRBTEsJCTExNAkJLyogQXBwbGUgTG9jYWxUYWxrIGhhcmR3YXJlICovCisjZGVmaW5lIExJTktUWVBFX0VDT05FVAkJMTE1CQkvKiBBY29ybiBFY29uZXQgKi8KKworLyoKKyAqIFJlc2VydmVkIGZvciB1c2Ugd2l0aCBPcGVuQlNEIGlwZmlsdGVyLgorICovCisjZGVmaW5lIExJTktUWVBFX0lQRklMVEVSCTExNgorCisjZGVmaW5lIExJTktUWVBFX1BGTE9HCQkxMTcJCS8qIE9wZW5CU0QgRExUX1BGTE9HICovCisjZGVmaW5lIExJTktUWVBFX0NJU0NPX0lPUwkxMTgJCS8qIEZvciBDaXNjby1pbnRlcm5hbCB1c2UgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xMV9QUklTTSAxMTkJCS8qIDgwMi4xMSBwbHVzIFByaXNtIElJIG1vbml0b3IgbW9kZSByYWRpbyBtZXRhZGF0YSBoZWFkZXIgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xMV9BSVJPTkVUIDEyMAkJLyogODAyLjExIHBsdXMgRnJlZUJTRCBBaXJvbmV0IGRyaXZlciByYWRpbyBtZXRhZGF0YSBoZWFkZXIgKi8KKworLyoKKyAqIFJlc2VydmVkIGZvciBTaWVtZW5zIEhpUGF0aCBIRExDLgorICovCisjZGVmaW5lIExJTktUWVBFX0hIRExDCQkxMjEKKworI2RlZmluZSBMSU5LVFlQRV9JUF9PVkVSX0ZDCTEyMgkJLyogUkZDIDI2MjUgSVAtb3Zlci1GaWJyZSBDaGFubmVsICovCisjZGVmaW5lIExJTktUWVBFX1NVTkFUTQkJMTIzCQkvKiBTb2xhcmlzK1N1bkFUTSAqLworCisvKgorICogUmVzZXJ2ZWQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLZW50IERhaGxncmVuIDxrZW50QHByYWVzdW0uY29tPgorICogZm9yIHByaXZhdGUgdXNlLgorICovCisjZGVmaW5lIExJTktUWVBFX1JJTwkJMTI0CQkvKiBSYXBpZElPICovCisjZGVmaW5lIExJTktUWVBFX1BDSV9FWFAJMTI1CQkvKiBQQ0kgRXhwcmVzcyAqLworI2RlZmluZSBMSU5LVFlQRV9BVVJPUkEJCTEyNgkJLyogWGlsaW54IEF1cm9yYSBsaW5rIGxheWVyICovCisKKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xMV9SQURJT1RBUCAxMjcJLyogODAyLjExIHBsdXMgcmFkaW90YXAgcmFkaW8gbWV0YWRhdGEgaGVhZGVyICovCisKKy8qCisgKiBSZXNlcnZlZCBmb3IgdGhlIFRaU1AgZW5jYXBzdWxhdGlvbiwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogQ2hyaXMgV2F0ZXJzIDxjaHJpcy53YXRlcnNAbmV0d29ya2NoZW1pc3RyeS5jb20+CisgKiBUWlNQIGlzIGEgZ2VuZXJpYyBlbmNhcHN1bGF0aW9uIGZvciBhbnkgb3RoZXIgbGluayB0eXBlLAorICogd2hpY2ggaW5jbHVkZXMgYSBtZWFucyB0byBpbmNsdWRlIG1ldGEtaW5mb3JtYXRpb24KKyAqIHdpdGggdGhlIHBhY2tldCwgZS5nLiBzaWduYWwgc3RyZW5ndGggYW5kIGNoYW5uZWwKKyAqIGZvciA4MDIuMTEgcGFja2V0cy4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9UWlNQCQkxMjgJCS8qIFRhem1lbiBTbmlmZmVyIFByb3RvY29sICovCisKKyNkZWZpbmUgTElOS1RZUEVfQVJDTkVUX0xJTlVYCTEyOQkJLyogTGludXgtc3R5bGUgaGVhZGVycyAqLworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlcywgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgY29ycmVzcG9uZGluZworICogRExUX3MgYXJlIHVzZWQgZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbAorICogbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMgUU9TIHByb2ZpbGVzLCBldGMuLgorICovCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfTUxQUFAgIDEzMAorI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX01MRlIgICAxMzEKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9FUyAgICAgMTMyCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfR0dTTiAgIDEzMworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX01GUiAgICAxMzQKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9BVE0yICAgMTM1CisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfU0VSVklDRVMgMTM2CisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfQVRNMSAgIDEzNworCisjZGVmaW5lIExJTktUWVBFX0FQUExFX0lQX09WRVJfSUVFRTEzOTQgMTM4CS8qIEFwcGxlIElQLW92ZXItSUVFRSAxMzk0IGNvb2tlZCBoZWFkZXIgKi8KKworI2RlZmluZSBMSU5LVFlQRV9NVFAyX1dJVEhfUEhEUgkxMzkKKyNkZWZpbmUgTElOS1RZUEVfTVRQMgkJMTQwCisjZGVmaW5lIExJTktUWVBFX01UUDMJCTE0MQorI2RlZmluZSBMSU5LVFlQRV9TQ0NQCQkxNDIKKworI2RlZmluZSBMSU5LVFlQRV9ET0NTSVMJCTE0MwkJLyogRE9DU0lTIE1BQyBmcmFtZXMgKi8KKworI2RlZmluZSBMSU5LVFlQRV9MSU5VWF9JUkRBCTE0NAkJLyogTGludXgtSXJEQSAqLworCisvKgorICogUmVzZXJ2ZWQgZm9yIElCTSBTUCBzd2l0Y2ggYW5kIElCTSBOZXh0IEZlZGVyYXRpb24gc3dpdGNoLgorICovCisjZGVmaW5lIExJTktUWVBFX0lCTV9TUAkJMTQ1CisjZGVmaW5lIExJTktUWVBFX0lCTV9TTgkJMTQ2CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2UuICBJZiB5b3UgaGF2ZSBzb21lIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKyAqIHRoYXQgeW91IHdhbnQgdG8gdXNlIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiwgd2l0aCB0aGUgY2FwdHVyZSBmaWxlcworICogdXNpbmcgdGhhdCBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG5vdCBldmVyIGJlIHNlbnQgb3V0c2lkZSB5b3VyCisgKiBvcmdhbml6YXRpb24sIHlvdSBjYW4gdXNlIHRoZXNlIHZhbHVlcy4KKyAqCisgKiBObyBsaWJwY2FwIHJlbGVhc2Ugd2lsbCB1c2UgdGhlc2UgZm9yIGFueSBwdXJwb3NlLCBub3Igd2lsbCBhbnkKKyAqIHRjcGR1bXAgcmVsZWFzZSB1c2UgdGhlbSwgZWl0aGVyLgorICoKKyAqIERvICpOT1QqIHVzZSB0aGVzZSBpbiBjYXB0dXJlIGZpbGVzIHRoYXQgeW91IGV4cGVjdCBhbnlib2R5IG5vdCB1c2luZworICogeW91ciBwcml2YXRlIHZlcnNpb25zIG9mIGNhcHR1cmUtZmlsZS1yZWFkaW5nIHRvb2xzIHRvIHJlYWQ7IGluCisgKiBwYXJ0aWN1bGFyLCBkbyAqTk9UKiB1c2UgdGhlbSBpbiBwcm9kdWN0cywgb3RoZXJ3aXNlIHlvdSBtYXkgZmluZCB0aGF0CisgKiBwZW9wbGUgd29uJ3QgYmUgYWJsZSB0byB1c2UgdGNwZHVtcCwgb3Igc25vcnQsIG9yIEV0aGVyZWFsLCBvci4uLiB0bworICogcmVhZCBjYXB0dXJlIGZpbGVzIGZyb20geW91ciBmaXJld2FsbC9pbnRydXNpb24gZGV0ZWN0aW9uL3RyYWZmaWMKKyAqIG1vbml0b3JpbmcvZXRjLiBhcHBsaWFuY2UsIG9yIHdoYXRldmVyIHByb2R1Y3QgdXNlcyB0aGF0IExJTktUWVBFXyB2YWx1ZSwKKyAqIGFuZCB5b3UgbWF5IGFsc28gZmluZCB0aGF0IHRoZSBkZXZlbG9wZXJzIG9mIHRob3NlIGFwcGxpY2F0aW9ucyB3aWxsCisgKiBub3QgYWNjZXB0IHBhdGNoZXMgdG8gbGV0IHRoZW0gcmVhZCB0aG9zZSBmaWxlcy4KKyAqCisgKiBBbHNvLCBkbyBub3QgdXNlIHRoZW0gaWYgc29tZWJvZHkgbWlnaHQgc2VuZCB5b3UgYSBjYXB0dXJlIHVzaW5nIHRoZW0KKyAqIGZvciAqdGhlaXIqIHByaXZhdGUgdHlwZSBhbmQgdG9vbHMgdXNpbmcgdGhlbSBmb3IgKnlvdXIqIHByaXZhdGUgdHlwZQorICogd291bGQgaGF2ZSB0byByZWFkIHRoZW0uCisgKgorICogSW5zdGVhZCwgaW4gdGhvc2UgY2FzZXMsIGFzayAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiBmb3IgYQorICogbmV3IERMVF8gYW5kIExJTktUWVBFXyB2YWx1ZSwgYXMgcGVyIHRoZSBjb21tZW50IGluIHBjYXAvYnBmLmgsIGFuZCB1c2UKKyAqIHRoZSB0eXBlIHlvdSdyZSBnaXZlbi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9VU0VSMAkJMTQ3CisjZGVmaW5lIExJTktUWVBFX1VTRVIxCQkxNDgKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjIJCTE0OQorI2RlZmluZSBMSU5LVFlQRV9VU0VSMwkJMTUwCisjZGVmaW5lIExJTktUWVBFX1VTRVI0CQkxNTEKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjUJCTE1MgorI2RlZmluZSBMSU5LVFlQRV9VU0VSNgkJMTUzCisjZGVmaW5lIExJTktUWVBFX1VTRVI3CQkxNTQKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjgJCTE1NQorI2RlZmluZSBMSU5LVFlQRV9VU0VSOQkJMTU2CisjZGVmaW5lIExJTktUWVBFX1VTRVIxMAkJMTU3CisjZGVmaW5lIExJTktUWVBFX1VTRVIxMQkJMTU4CisjZGVmaW5lIExJTktUWVBFX1VTRVIxMgkJMTU5CisjZGVmaW5lIExJTktUWVBFX1VTRVIxMwkJMTYwCisjZGVmaW5lIExJTktUWVBFX1VTRVIxNAkJMTYxCisjZGVmaW5lIExJTktUWVBFX1VTRVIxNQkJMTYyCisKKy8qCisgKiBGb3IgZnV0dXJlIHVzZSB3aXRoIDgwMi4xMSBjYXB0dXJlcyAtIGRlZmluZWQgYnkgQWJzb2x1dGVWYWx1ZQorICogU3lzdGVtcyB0byBzdG9yZSBhIG51bWJlciBvZiBiaXRzIG9mIGxpbmstbGF5ZXIgaW5mb3JtYXRpb24KKyAqIGluY2x1ZGluZyByYWRpbyBpbmZvcm1hdGlvbjoKKyAqCisgKglodHRwOi8vd3d3LnNoYWZ0bmV0Lm9yZy9+cGl6emEvc29mdHdhcmUvY2FwdHVyZWZybS50eHQKKyAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzExX0FWUwkxNjMJLyogODAyLjExIHBsdXMgQVZTIHJhZGlvIG1ldGFkYXRhIGhlYWRlciAqLworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBjb3JyZXNwb25kaW5nCisgKiBETFRfcyBhcmUgdXNlZCBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsCisgKiBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcyBRT1MgcHJvZmlsZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9NT05JVE9SIDE2NAorCisvKgorICogQkFDbmV0IE1TL1RQIGZyYW1lcy4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9CQUNORVRfTVNfVFAJMTY1CisKKy8qCisgKiBBbm90aGVyIFBQUCB2YXJpYW50IGFzIHBlciByZXF1ZXN0IGZyb20gS2Fyc3RlbiBLZWlsIDxra2VpbEBzdXNlLmRlPi4KKyAqCisgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBPU2VzIHRvIGFsbG93IGEga2VybmVsIHNvY2tldCBmaWx0ZXIgdG8gZGlzdGluZ3Vpc2gKKyAqIGJldHdlZW4gaW5jb21pbmcgYW5kIG91dGdvaW5nIHBhY2tldHMsIG9uIGEgc29ja2V0IGludGVuZGVkIHRvCisgKiBzdXBwbHkgcHBwZCB3aXRoIG91dGdvaW5nIHBhY2tldHMgc28gaXQgY2FuIGRvIGRpYWwtb24tZGVtYW5kIGFuZAorICogaGFuZ3VwLW9uLWxhY2stb2YtZGVtYW5kOyBpbmNvbWluZyBwYWNrZXRzIGFyZSBmaWx0ZXJlZCBvdXQgc28gdGhleQorICogZG9uJ3QgY2F1c2UgcHBwZCB0byBob2xkIHRoZSBjb25uZWN0aW9uIHVwICh5b3UgZG9uJ3Qgd2FudCByYW5kb20KKyAqIGlucHV0IHBhY2tldHMgc3VjaCBhcyBwb3J0IHNjYW5zLCBwYWNrZXRzIGZyb20gb2xkIGxvc3QgY29ubmVjdGlvbnMsCisgKiBldGMuIHRvIGZvcmNlIHRoZSBjb25uZWN0aW9uIHRvIHN0YXkgdXApLgorICoKKyAqIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBQUFAgaGVhZGVyICgweGZmMDMpIGlzIG1vZGlmaWVkIHRvIGFjY29tb2RhdGUKKyAqIHRoZSBkaXJlY3Rpb24gLSAweDAwID0gSU4sIDB4MDEgPSBPVVQuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfUFBQX1BQUEQJMTY2CisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF9zIGFyZSB1c2VkCisgKiBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzCisgKiBRT1MgcHJvZmlsZXMsIGNvb2tpZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9QUFBPRSAgICAgMTY3CisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfUFBQT0VfQVRNIDE2OAorCisjZGVmaW5lIExJTktUWVBFX0dQUlNfTExDCTE2OQkJLyogR1BSUyBMTEMgKi8KKyNkZWZpbmUgTElOS1RZUEVfR1BGX1QJCTE3MAkJLyogR1BGLVQgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCisjZGVmaW5lIExJTktUWVBFX0dQRl9GCQkxNzEJCS8qIEdQRi1UIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLworCisvKgorICogUmVxdWVzdGVkIGJ5IE9vbGFuIFppbW1lciA8b3pAZ2NvbS5jb20+IGZvciB1c2UgaW4gR2NvbSdzIFQxL0UxIGxpbmUKKyAqIG1vbml0b3JpbmcgZXF1aXBtZW50LgorICovCisjZGVmaW5lIExJTktUWVBFX0dDT01fVDFFMQkxNzIKKyNkZWZpbmUgTElOS1RZUEVfR0NPTV9TRVJJQUwJMTczCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF8gaXMgdXNlZAorICogZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gdG8gUGh5c2ljYWwgSW50ZXJmYWNlIENhcmRzIChQSUMpCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9QSUNfUEVFUiAgICAxNzQKKworLyoKKyAqIExpbmsgdHlwZXMgcmVxdWVzdGVkIGJ5IEdyZWdvciBNYWllciA8Z3JlZ29yQGVuZGFjZS5jb20+IG9mIEVuZGFjZQorICogTWVhc3VyZW1lbnQgU3lzdGVtcy4gIFRoZXkgYWRkIGFuIEVSRiBoZWFkZXIgKHNlZQorICogaHR0cDovL3d3dy5lbmRhY2UuY29tL3N1cHBvcnQvRW5kYWNlUmVjb3JkRm9ybWF0LnBkZikgaW4gZnJvbnQgb2YKKyAqIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9FUkZfRVRICTE3NQkvKiBFdGhlcm5ldCAqLworI2RlZmluZSBMSU5LVFlQRV9FUkZfUE9TCTE3NgkvKiBQYWNrZXQtb3Zlci1TT05FVCAqLworCisvKgorICogUmVxdWVzdGVkIGJ5IERhbmllbGUgT3JsYW5kaSA8ZGFuaWVsZUBvcmxhbmRpLmNvbT4gZm9yIHJhdyBMQVBECisgKiBmb3IgdklTRE4gKGh0dHA6Ly93d3cub3JsYW5kaS5jb20vdmlzZG4vKS4gIEl0cyBsaW5rLWxheWVyIGhlYWRlcgorICogaW5jbHVkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIExBUEQgaGVhZGVyLCBzbyBpdCdzCisgKiBub3QgbmVjZXNzYXJpbHkgYSBnZW5lcmljIExBUEQgaGVhZGVyLgorICovCisjZGVmaW5lIExJTktUWVBFX0xJTlVYX0xBUEQJMTc3CisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKKyAqIFRoZSBMaW5rIFR5cGVzIGFyZSB1c2VkIGZvciBwcmVwZW5kaW5nIG1ldGEtaW5mb3JtYXRpb24KKyAqIGxpa2UgaW50ZXJmYWNlIGluZGV4LCBpbnRlcmZhY2UgbmFtZQorICogYmVmb3JlIHN0YW5kYXJkIEV0aGVybmV0LCBQUFAsIEZyZWxheSAmIEMtSERMQyBGcmFtZXMKKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0VUSEVSICAxNzgKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9QUFAgICAgMTc5CisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfRlJFTEFZIDE4MAorI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0NIRExDICAxODEKKworLyoKKyAqIE11bHRpIExpbmsgRnJhbWUgUmVsYXkgKEZSRi4xNikKKyAqLworI2RlZmluZSBMSU5LVFlQRV9NRlIgICAgICAgICAgICAxODIKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICogVGhlIERMVF8gaXMgdXNlZCBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiB3aXRoIGEKKyAqIHZvaWNlIEFkYXB0ZXIgQ2FyZCAoUElDKQorICovCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfVlAgICAgIDE4MworCisvKgorICogQXJpbmMgNDI5IGZyYW1lcy4KKyAqIERMVF8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqIEV2ZXJ5IGZyYW1lIGNvbnRhaW5zIGEgMzJiaXQgQTQyOSBsYWJlbC4KKyAqIE1vcmUgZG9jdW1lbnRhdGlvbiBvbiBBcmluYyA0MjkgY2FuIGJlIGZvdW5kIGF0CisgKiBodHRwOi8vd3d3LmNvbmRvcmVuZy5jb20vc3VwcG9ydC9kb3dubG9hZHMvdHV0b3JpYWxzL0FSSU5DVHV0b3JpYWwucGRmCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfQTQyOSAgICAgICAgICAgMTg0CisKKy8qCisgKiBBcmluYyA2NTMgSW50ZXJwYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiBtZXNzYWdlcy4KKyAqIERMVF8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqIFBsZWFzZSByZWZlciB0byB0aGUgQTY1My0xIHN0YW5kYXJkIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisjZGVmaW5lIExJTktUWVBFX0E2NTNfSUNNICAgICAgIDE4NQorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgVVNCIHNldHVwIGhlYWRlcjsgcmVxdWVzdGVkIGJ5CisgKiBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+LgorICovCisjZGVmaW5lIExJTktUWVBFX1VTQgkJMTg2CisKKy8qCisgKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCk7IHJlcXVlc3RlZCBieQorICogUGFvbG8gQWJlbmkuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfQkxVRVRPT1RIX0hDSV9INAkxODcKKworLyoKKyAqIElFRUUgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllcjsgcmVxdWVzdGVkIGJ5IE1hcmlhIENydXoKKyAqIDxjcnV6X3BldGFnYXlAYmFoLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xNl9NQUNfQ1BTCTE4OAorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgTGludXggVVNCIGhlYWRlcjsgcmVxdWVzdGVkIGJ5CisgKiBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+LgorICovCisjZGVmaW5lIExJTktUWVBFX1VTQl9MSU5VWAkJMTg5CisKKy8qCisgKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2LiAyLjBCIHBhY2tldHMuCisgKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCisgKiBVc2VkIHRvIGR1bXAgQ0FOIHBhY2tldHMgY29taW5nIGZyb20gYSBDQU4gVmVjdG9yIGJvYXJkLgorICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBDQU4gdjIuMEIgZnJhbWVzIGNhbiBiZSBmb3VuZCBhdAorICogaHR0cDovL3d3dy5jYW4tY2lhLm9yZy9kb3dubG9hZHMvPzI2OQorICovCisjZGVmaW5lIExJTktUWVBFX0NBTjIwQiAgICAgICAgIDE5MAorCisvKgorICogSUVFRSA4MDIuMTUuNCwgd2l0aCBhZGRyZXNzIGZpZWxkcyBwYWRkZWQsIGFzIGlzIGRvbmUgYnkgTGludXgKKyAqIGRyaXZlcnM7IHJlcXVlc3RlZCBieSBKdWVyZ2VuIFNjaGltbWVyLgorICovCisjZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTVfNF9MSU5VWAkxOTEKKworLyoKKyAqIFBlciBQYWNrZXQgSW5mb3JtYXRpb24gZW5jYXBzdWxhdGVkIHBhY2tldHMuCisgKiBMSU5LVFlQRV8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9QUEkJCQkxOTIKKworLyoKKyAqIEhlYWRlciBmb3IgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciBwbHVzIGEgcmFkaW90YXAgcmFkaW8gaGVhZGVyOworICogcmVxdWVzdGVkIGJ5IENoYXJsZXMgQ2xhbmN5LgorICovCisjZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTZfTUFDX0NQU19SQURJTwkxOTMKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICogVGhlIERMVF8gaXMgdXNlZCBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiB3aXRoIGEKKyAqIGludGVncmF0ZWQgc2VydmljZSBtb2R1bGUgKElTTSkuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9JU00gICAgMTk0CisKKy8qCisgKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCisgKiBub3RoaW5nKTsgcmVxdWVzdGVkIGJ5IE1pa2tvIFNhYXJuaXZhbGEgPG1pa2tvLnNhYXJuaXZhbGFAc2Vuc2lub2RlLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xNV80CTE5NQorCisvKgorICogVmFyaW91cyBsaW5rLWxheWVyIHR5cGVzLCB3aXRoIGEgcHNldWRvLWhlYWRlciwgZm9yIFNJVEEKKyAqIChodHRwOi8vd3d3LnNpdGEuYWVyby8pOyByZXF1ZXN0ZWQgYnkgRnVsa28gSGV3IChmdWxrby5oZXdAZ21haWwuY29tKS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9TSVRBCQkxOTYKKworLyoKKyAqIFZhcmlvdXMgbGluay1sYXllciB0eXBlcywgd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBFbmRhY2UgREFHIGNhcmRzOworICogZW5jYXBzdWxhdGVzIEVuZGFjZSBFUkYgcmVjb3Jkcy4gIFJlcXVlc3RlZCBieSBTdGVwaGVuIERvbm5lbGx5CisgKiA8c3RlcGhlbkBlbmRhY2UuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9FUkYJCTE5NworCisvKgorICogU3BlY2lhbCBoZWFkZXIgcHJlcGVuZGVkIHRvIEV0aGVybmV0IHBhY2tldHMgd2hlbiBjYXB0dXJpbmcgZnJvbSBhCisgKiB1MTAgTmV0d29ya3MgYm9hcmQuICBSZXF1ZXN0ZWQgYnkgUGhpbCBNdWxob2xsYW5kCisgKiA8cGhpbEB1MTBuZXR3b3Jrcy5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX1JBSUYxCQkxOTgKKworLyoKKyAqIElQTUIgcGFja2V0IGZvciBJUE1JLCBiZWdpbm5pbmcgd2l0aCB0aGUgSTJDIHNsYXZlIGFkZHJlc3MsIGZvbGxvd2VkCisgKiBieSB0aGUgbmV0Rm4gYW5kIExVTiwgZXRjLi4gIFJlcXVlc3RlZCBieSBDaGFudGh5IFRvZXVuZworICogPGNoYW50aHkudG9ldW5nQGNhLmtvbnRyb24uY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JUE1CCQkxOTkKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICogVGhlIERMVF8gaXMgdXNlZCBmb3IgY2FwdHVyaW5nIGRhdGEgb24gYSBzZWN1cmUgdHVubmVsIGludGVyZmFjZS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1NUICAgICAyMDAKKworLyoKKyAqIEJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIgKHBhcnQgSDo0KSwgd2l0aCBwc2V1ZG8taGVhZGVyCisgKiB0aGF0IGluY2x1ZGVzIGRpcmVjdGlvbiBpbmZvcm1hdGlvbjsgcmVxdWVzdGVkIGJ5IFBhb2xvIEFiZW5pLgorICovCisjZGVmaW5lIExJTktUWVBFX0JMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSCTIwMQorCisvKgorICogQVguMjUgcGFja2V0IHdpdGggYSAxLWJ5dGUgS0lTUyBoZWFkZXI7IHNlZQorICoKKyAqCWh0dHA6Ly93d3cuYXgyNS5uZXQva2lzcy5odG0KKyAqCisgKiBhcyBwZXIgUmljaGFyZCBTdGVhcm4gPHJpY2hhcmRAcm5zLXN0ZWFybi5kZW1vbi5jby51az4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfQVgyNV9LSVNTCTIwMgorCisvKgorICogTEFQRCBwYWNrZXRzIGZyb20gYW4gSVNETiBjaGFubmVsLCBzdGFydGluZyB3aXRoIHRoZSBhZGRyZXNzIGZpZWxkLAorICogd2l0aCBubyBwc2V1ZG8taGVhZGVyLgorICogUmVxdWVzdGVkIGJ5IFZhcnVuYSBEZSBTaWx2YSA8dmFydW5heEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0xBUEQJCTIwMworCisvKgorICogVmFyaWFudHMgb2YgdmFyaW91cyBsaW5rLWxheWVyIGhlYWRlcnMsIHdpdGggYSBvbmUtYnl0ZSBkaXJlY3Rpb24KKyAqIHBzZXVkby1oZWFkZXIgcHJlcGVuZGVkIC0gemVybyBtZWFucyAicmVjZWl2ZWQgYnkgdGhpcyBob3N0IiwKKyAqIG5vbi16ZXJvIChhbnkgbm9uLXplcm8gdmFsdWUpIG1lYW5zICJzZW50IGJ5IHRoaXMgaG9zdCIgLSBhcyBwZXIKKyAqIFdpbGwgQmFya2VyIDx3LmJhcmtlckB6ZW4uY28udWs+LgorICovCisjZGVmaW5lIExJTktUWVBFX1BQUF9XSVRIX0RJUgkyMDQJLyogUFBQICovCisjZGVmaW5lIExJTktUWVBFX0NfSERMQ19XSVRIX0RJUiAyMDUJLyogQ2lzY28gSERMQyAqLworI2RlZmluZSBMSU5LVFlQRV9GUkVMQVlfV0lUSF9ESVIgMjA2CS8qIEZyYW1lIFJlbGF5ICovCisjZGVmaW5lIExJTktUWVBFX0xBUEJfV0lUSF9ESVIJMjA3CS8qIExBUEIgKi8KKworLyoKKyAqIDIwOCBpcyByZXNlcnZlZCBmb3IgYW4gYXMteWV0LXVuc3BlY2lmaWVkIHByb3ByaWV0YXJ5IGxpbmstbGF5ZXIKKyAqIHR5cGUsIGFzIHJlcXVlc3RlZCBieSBXaWxsIEJhcmtlci4KKyAqLworCisvKgorICogSVBNQiB3aXRoIGEgTGludXgtc3BlY2lmaWMgcHNldWRvLWhlYWRlcjsgYXMgcmVxdWVzdGVkIGJ5IEFsZXhleSBOZXltYW4KKyAqIDxhdm5AcGlnZW9ucG9pbnQuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JUE1CX0xJTlVYCTIwOQorCisvKgorICogRmxleFJheSBhdXRvbW90aXZlIGJ1cyAtIGh0dHA6Ly93d3cuZmxleHJheS5jb20vIC0gYXMgcmVxdWVzdGVkCisgKiBieSBIYW5uZXMgS2FlbGJlciA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9GTEVYUkFZCTIxMAorCisvKgorICogTWVkaWEgT3JpZW50ZWQgU3lzdGVtcyBUcmFuc3BvcnQgKE1PU1QpIGJ1cyBmb3IgbXVsdGltZWRpYQorICogdHJhbnNwb3J0IC0gaHR0cDovL3d3dy5tb3N0Y29vcGVyYXRpb24uY29tLyAtIGFzIHJlcXVlc3RlZAorICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTU9TVAkJMjExCisKKy8qCisgKiBMb2NhbCBJbnRlcmNvbm5lY3QgTmV0d29yayAoTElOKSBidXMgZm9yIHZlaGljbGUgbmV0d29ya3MgLQorICogaHR0cDovL3d3dy5saW4tc3ViYnVzLm9yZy8gLSBhcyByZXF1ZXN0ZWQgYnkgSGFubmVzIEthZWxiZXIKKyAqIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX0xJTgkJMjEyCisKKy8qCisgKiBYMkUtcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSB1c2VkIGZvciBzZXJpYWwgbGluZSBjYXB0dXJlLAorICogYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX1gyRV9TRVJJQUwJMjEzCisKKy8qCisgKiBYMkUtcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSB1c2VkIGZvciB0aGUgWG9yYXlhIGRhdGEgbG9nZ2VyCisgKiBmYW1pbHksIGFzIHJlcXVlc3RlZCBieSBIYW5uZXMgS2FlbGJlciA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9YMkVfWE9SQVlBCTIxNAorCisvKgorICogSUVFRSA4MDIuMTUuNCwgZXhhY3RseSBhcyBpdCBhcHBlYXJzIGluIHRoZSBzcGVjIChubyBwYWRkaW5nLCBubworICogbm90aGluZyksIGJ1dCB3aXRoIHRoZSBQSFktbGV2ZWwgZGF0YSBmb3Igbm9uLUFTSyBQSFlzICg0IG9jdGV0cworICogb2YgMCBhcyBwcmVhbWJsZSwgb25lIG9jdGV0IG9mIFNGRCwgb25lIG9jdGV0IG9mIGZyYW1lIGxlbmd0aCsKKyAqIHJlc2VydmVkIGJpdCwgYW5kIHRoZW4gdGhlIE1BQy1sYXllciBkYXRhLCBzdGFydGluZyB3aXRoIHRoZQorICogZnJhbWUgY29udHJvbCBmaWVsZCkuCisgKgorICogUmVxdWVzdGVkIGJ5IE1heCBGaWxpcHBvdiA8amNtdmJrYmNAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzE1XzRfTk9OQVNLX1BIWQkyMTUKKworLyogCisgKiBEYXZpZCBHaWJzb24gPGRhdmlkQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4gcmVxdWVzdGVkIHRoaXMgZm9yCisgKiBjYXB0dXJlcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwgL2Rldi9pbnB1dC9ldmVudE4gZGV2aWNlcy4gVGhpcworICogaXMgdXNlZCB0byBjb21tdW5pY2F0ZSBrZXlzdHJva2VzIGFuZCBtb3VzZSBtb3ZlbWVudHMgZnJvbSB0aGUKKyAqIExpbnV4IGtlcm5lbCB0byBkaXNwbGF5IHN5c3RlbXMsIHN1Y2ggYXMgWG9yZy4gCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTElOVVhfRVZERVYJMjE2CisKKy8qCisgKiBHU00gVW0gYW5kIEFiaXMgaW50ZXJmYWNlcywgcHJlY2VkZWQgYnkgYSAiZ3NtdGFwIiBoZWFkZXIuCisgKgorICogUmVxdWVzdGVkIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+LgorICovCisjZGVmaW5lIExJTktUWVBFX0dTTVRBUF9VTQkyMTcKKyNkZWZpbmUgTElOS1RZUEVfR1NNVEFQX0FCSVMJMjE4CisKKy8qCisgKiBNUExTLCB3aXRoIGFuIE1QTFMgbGFiZWwgYXMgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgorICogUmVxdWVzdGVkIGJ5IE1pY2hlbGUgTWFyY2hldHRvIDxtaWNoZWxlQG9wZW5ic2Qub3JnPiBvbiBiZWhhbGYKKyAqIG9mIE9wZW5CU0QuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTVBMUwkJMjE5CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBMaW51eCBVU0IgaGVhZGVyLCB3aXRoIHRoZSBVU0IgaGVhZGVyCisgKiBwYWRkZWQgdG8gNjQgYnl0ZXM7IHJlcXVpcmVkIGZvciBtZW1vcnktbWFwcGVkIGFjY2Vzcy4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9VU0JfTElOVVhfTU1BUFBFRAkJMjIwCisKKy8qCisgKiBERUNUIHBhY2tldHMsIHdpdGggYSBwc2V1ZG8taGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIE1hdHRoaWFzIFdlbnplbCA8dGNwZHVtcEBtYXp6b28uZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX0RFQ1QJCTIyMQorCisvKgorICogRnJvbTogIkxpZHdhLCBFcmljIChHU0ZDLTU4Mi4wKVtTR1QgSU5DXSIgPGVyaWMubGlkd2EtMUBuYXNhLmdvdj4KKyAqIERhdGU6IE1vbiwgMTEgTWF5IDIwMDkgMTE6MTg6MzAgLTA1MDAKKyAqCisgKiBETFRfQU9TLiBXZSBuZWVkIGl0IGZvciBBT1MgU3BhY2UgRGF0YSBMaW5rIFByb3RvY29sLgorICogICBJIGhhdmUgYWxyZWFkeSB3cml0dGVuIGRpc3NlY3RvcnMgZm9yIGJ1dCBuZWVkIGFuIE9LIGZyb20KKyAqICAgbGVnYWwgYmVmb3JlIEkgY2FuIHN1Ym1pdCBhIHBhdGNoLgorICoKKyAqLworI2RlZmluZSBMSU5LVFlQRV9BT1MJCTIyMgorCisvKgorICogV2lyZWxlc3MgSEFSVCAoSGlnaHdheSBBZGRyZXNzYWJsZSBSZW1vdGUgVHJhbnNkdWNlcikKKyAqIEZyb20gdGhlIEhBUlQgQ29tbXVuaWNhdGlvbiBGb3VuZGF0aW9uCisgKiBJRVMvUEFTIDYyNTkxCisgKgorICogUmVxdWVzdGVkIGJ5IFNhbSBSb2JlcnRzIDx2aWV1eHRlY2hAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9XSUhBUlQJCTIyMworCisvKgorICogRmlicmUgQ2hhbm5lbCBGQy0yIGZyYW1lcywgYmVnaW5uaW5nIHdpdGggYSBGcmFtZV9IZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgS2Fob3UgTGVpIDxrYWhvdTgyQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfRkNfMgkJMjI0CisKKy8qCisgKiBGaWJyZSBDaGFubmVsIEZDLTIgZnJhbWVzLCBiZWdpbm5pbmcgd2l0aCBhbiBlbmNvZGluZyBvZiB0aGUKKyAqIFNPRiwgYW5kIGVuZGluZyB3aXRoIGFuIGVuY29kaW5nIG9mIHRoZSBFT0YuCisgKgorICogVGhlIGVuY29kaW5ncyByZXByZXNlbnQgdGhlIGZyYW1lIGRlbGltaXRlcnMgYXMgNC1ieXRlIHNlcXVlbmNlcworICogcmVwcmVzZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyZWQgc2V0cywgd2l0aCBLMjguNQorICogcmVwcmVzZW50ZWQgYXMgMHhCQywgYW5kIHRoZSBEIHN5bWJvbHMgYXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGJ5dGUgdmFsdWVzOyBmb3IgZXhhbXBsZSwgU09GaTIsIHdoaWNoIGlzIEsyOC41IC0gRDIxLjUgLSBEMS4yIC0gRDIxLjIsCisgKiBpcyByZXByZXNlbnRlZCBhcyAweEJDIDB4QjUgMHg1NSAweDU1LgorICoKKyAqIFJlcXVlc3RlZCBieSBLYWhvdSBMZWkgPGthaG91ODJAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9GQ18yX1dJVEhfRlJBTUVfREVMSU1TCQkyMjUKKworLyoKKyAqIFNvbGFyaXMgaXBuZXQgcHNldWRvLWhlYWRlcjsgcmVxdWVzdGVkIGJ5IERhcnJlbiBSZWVkIDxEYXJyZW4uUmVlZEBTdW4uQ09NPi4KKyAqCisgKiBUaGUgcHNldWRvLWhlYWRlciBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHZlcnNpb24gbnVtYmVyOyBmb3IgdmVyc2lvbiAyLAorICogdGhlIHBzZXVkby1oZWFkZXIgaXM6CisgKgorICogc3RydWN0IGRsX2lwbmV0aW5mbyB7CisgKiAgICAgdV9pbnQ4X3QgICBkbGlfdmVyc2lvbjsKKyAqICAgICB1X2ludDhfdCAgIGRsaV9mYW1pbHk7CisgKiAgICAgdV9pbnQxNl90ICBkbGlfaHR5cGU7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfcGt0bGVuOworICogICAgIHVfaW50MzJfdCAgZGxpX2lmaW5kZXg7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfZ3JpZmluZGV4OworICogICAgIHVfaW50MzJfdCAgZGxpX3pzcmM7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfemRzdDsKKyAqIH07CisgKgorICogZGxpX3ZlcnNpb24gaXMgMiBmb3IgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcHNldWRvLWhlYWRlci4KKyAqCisgKiBkbGlfZmFtaWx5IGlzIGEgU29sYXJpcyBhZGRyZXNzIGZhbWlseSB2YWx1ZSwgc28gaXQncyAyIGZvciBJUHY0CisgKiBhbmQgMjYgZm9yIElQdjYuCisgKgorICogZGxpX2h0eXBlIGlzIGEgImhvb2sgdHlwZSIgLSAwIGZvciBpbmNvbWluZyBwYWNrZXRzLCAxIGZvciBvdXRnb2luZworICogcGFja2V0cywgYW5kIDIgZm9yIHBhY2tldHMgYXJyaXZpbmcgZnJvbSBhbm90aGVyIHpvbmUgb24gdGhlIHNhbWUKKyAqIG1hY2hpbmUuCisgKgorICogZGxpX3BrdGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgZGF0YSBmb2xsb3dpbmcgdGhlIHBzZXVkby1oZWFkZXIKKyAqIChzbyB0aGUgY2FwdHVyZWQgbGVuZ3RoIG1pbnVzIGRsaV9wa3RsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHBzZXVkby1oZWFkZXIsIGFzc3VtaW5nIHRoZSBlbnRpcmUgcHNldWRvLWhlYWRlciB3YXMgY2FwdHVyZWQpLgorICoKKyAqIGRsaV9pZmluZGV4IGlzIHRoZSBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGludGVyZmFjZSBvbiB3aGljaCB0aGUKKyAqIHBhY2tldCBhcnJpdmVkLgorICoKKyAqIGRsaV9ncmlmaW5kZXggaXMgdGhlIGdyb3VwIGludGVyZmFjZSBpbmRleCBudW1iZXIgKGZvciBJUE1QIGludGVyZmFjZXMpLgorICoKKyAqIGRsaV96c3JjIGlzIHRoZSB6b25lIGlkZW50aWZpZXIgZm9yIHRoZSBzb3VyY2Ugb2YgdGhlIHBhY2tldC4KKyAqCisgKiBkbGlfemRzdCBpcyB0aGUgem9uZSBpZGVudGlmaWVyIGZvciB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHBhY2tldC4KKyAqCisgKiBBIHpvbmUgbnVtYmVyIG9mIDAgaXMgdGhlIGdsb2JhbCB6b25lOyBhIHpvbmUgbnVtYmVyIG9mIDB4ZmZmZmZmZmYKKyAqIG1lYW5zIHRoYXQgdGhlIHBhY2tldCBhcnJpdmVkIGZyb20gYW5vdGhlciBob3N0IG9uIHRoZSBuZXR3b3JrLCBub3QKKyAqIGZyb20gYW5vdGhlciB6b25lIG9uIHRoZSBzYW1lIG1hY2hpbmUuCisgKgorICogQW4gSVB2NCBvciBJUHY2IGRhdGFncmFtIGZvbGxvd3MgdGhlIHBzZXVkby1oZWFkZXI7IGRsaV9mYW1pbHkgaW5kaWNhdGVzCisgKiB3aGljaCBvZiB0aG9zZSBpdCBpcy4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JUE5FVAkJMjI2CisKKy8qCisgKiBDQU4gKENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrKSBmcmFtZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyIGFzIHN1cHBsaWVkCisgKiBieSBMaW51eCBTb2NrZXRDQU4uICBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2Nhbi50eHQgaW4gdGhlIExpbnV4CisgKiBzb3VyY2UuCisgKgorICogUmVxdWVzdGVkIGJ5IEZlbGl4IE9iZW5odWJlciA8ZmVsaXhAb2Jlbmh1YmVyLmRlPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9DQU5fU09DS0VUQ0FOCTIyNworCisvKgorICogUmF3IElQdjQvSVB2NjsgZGlmZmVyZW50IGZyb20gRExUX1JBVyBpbiB0aGF0IHRoZSBETFRfIHZhbHVlIHNwZWNpZmllcworICogd2hldGhlciBpdCdzIHY0IG9yIHY2LiAgUmVxdWVzdGVkIGJ5IERhcnJlbiBSZWVkIDxEYXJyZW4uUmVlZEBTdW4uQ09NPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JUFY0CQkyMjgKKyNkZWZpbmUgTElOS1RZUEVfSVBWNgkJMjI5CisKKy8qCisgKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCisgKiBub3RoaW5nKSwgYW5kIHdpdGggbm8gRkNTIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lOyByZXF1ZXN0ZWQgYnkKKyAqIEpvbiBTbWlybCA8am9uc21pcmxAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzE1XzRfTk9GQ1MJCTIzMAorCisvKgorICogUmF3IEQtQnVzOgorICoKKyAqCWh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvU29mdHdhcmUvZGJ1cworICoKKyAqIG1lc3NhZ2VzOgorICoKKyAqCWh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjbWVzc2FnZS1wcm90b2NvbC1tZXNzYWdlcworICoKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGVuZGlhbm5lc3MgZmxhZywgZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UgdHlwZSwgZXRjLiwKKyAqIGJ1dCB3aXRob3V0IHRoZSBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UgYmVmb3JlIHRoZSBtZXNzYWdlIHNlcXVlbmNlOgorICoKKyAqCWh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjYXV0aC1wcm90b2NvbAorICoKKyAqIFJlcXVlc3RlZCBieSBNYXJ0aW4gVmlkbmVyIDxtYXJ0aW5AdmlkbmVyLm5ldD4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfREJVUwkJMjMxCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1ZTCQkJMjMyCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfU1JYX0UyRQkJMjMzCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfRklCUkVDSEFOTkVMCQkyMzQKKworLyoKKyAqIERWQi1DSSAoRFZCIENvbW1vbiBJbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBhIFBDIENhcmQKKyAqIG1vZHVsZSBhbmQgYSBEVkIgcmVjZWl2ZXIpLiAgU2VlCisgKgorICoJaHR0cDovL3d3dy5rYWlzZXIuY3gvcGNhcC1kdmJjaS5odG1sCisgKgorICogZm9yIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIFJlcXVlc3RlZCBieSBNYXJ0aW4gS2Fpc2VyIDxtYXJ0aW5Aa2Fpc2VyLmN4Pi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9EVkJfQ0kJCTIzNQorCisvKgorICogVmFyaWFudCBvZiAzR1BQIFRTIDI3LjAxMCBtdWx0aXBsZXhpbmcgcHJvdG9jb2wuICBSZXF1ZXN0ZWQKKyAqIGJ5IEhhbnMtQ2hyaXN0b3BoIFNjaGVtbWVsIDxoYW5zLWNocmlzdG9waC5zY2hlbW1lbEBjaW50ZXJpb24uY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9NVVgyNzAxMAkyMzYKKworLyoKKyAqIFNUQU5BRyA1MDY2IERfUERVcy4gIFJlcXVlc3RlZCBieSBNLiBCYXJpcyBEZW1pcmF5CisgKiA8YmFyaXNkZW1pcmF5QGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfU1RBTkFHXzUwNjZfRF9QRFUJCTIzNworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9BVE1fQ0VNSUMJCTIzOAorCisvKgorICogTmV0RmlsdGVyIExPRyBtZXNzYWdlcyAKKyAqIChwYXlsb2FkIG9mIG5ldGxpbmsgTkZOTF9TVUJTWVNfVUxPRy9ORlVMTkxfTVNHX1BBQ0tFVCBwYWNrZXRzKQorICoKKyAqIFJlcXVlc3RlZCBieSBKYWt1YiBaYXdhZHpraSA8ZGFya2phbWVzLXdzQGRhcmtqYW1lcy5wbD4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9ORkxPRwkJMjM5CisKKy8qCisgKiBIaWxzY2hlciBHZXNlbGxzY2hhZnQgZnVlciBTeXN0ZW1hdXRvbWF0aW9uIG1iSCBsaW5rLWxheWVyIHR5cGUKKyAqIGZvciBFdGhlcm5ldCBwYWNrZXRzIHdpdGggYSA0LWJ5dGUgcHNldWRvLWhlYWRlciBhbmQgYWx3YXlzCisgKiB3aXRoIHRoZSBwYXlsb2FkIGluY2x1ZGluZyB0aGUgRkNTLCBhcyBzdXBwbGllZCBieSB0aGVpcgorICogbmV0QU5BTFlaRVIgaGFyZHdhcmUgYW5kIHNvZnR3YXJlLgorICoKKyAqIFJlcXVlc3RlZCBieSBIb2xnZXIgUC4gRnJvbW1lciA8SFBmcm9tbWVyQGhpbHNjaGVyLmNvbT4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9ORVRBTkFMWVpFUgkyNDAKKworLyoKKyAqIEhpbHNjaGVyIEdlc2VsbHNjaGFmdCBmdWVyIFN5c3RlbWF1dG9tYXRpb24gbWJIIGxpbmstbGF5ZXIgdHlwZQorICogZm9yIEV0aGVybmV0IHBhY2tldHMgd2l0aCBhIDQtYnl0ZSBwc2V1ZG8taGVhZGVyIGFuZCBGQ1MgYW5kCisgKiAxIGJ5dGUgb2YgU0ZELCBhcyBzdXBwbGllZCBieSB0aGVpciBuZXRBTkFMWVpFUiBoYXJkd2FyZSBhbmQKKyAqIHNvZnR3YXJlLgorICoKKyAqIFJlcXVlc3RlZCBieSBIb2xnZXIgUC4gRnJvbW1lciA8SFBmcm9tbWVyQGhpbHNjaGVyLmNvbT4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVAkyNDEKKworLyoKKyAqIElQLW92ZXItSW5maW5pQmFuZCwgYXMgc3BlY2lmaWVkIGJ5IFJGQyA0MzkxLgorICoKKyAqIFJlcXVlc3RlZCBieSBQZXRyIFN1bWJlcmEgPHBldHIuc3VtYmVyYUBvcmFjbGUuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JUE9JQgkJMjQyCisKKy8qCisgKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAoSVNPIDEzODE4LTEvSVRVLVQgSC4yMjIuMCkuCisgKgorICogUmVxdWVzdGVkIGJ5IEd1eSBNYXJ0aW4gPGdtc29mdEB0dXhpY29tYW4uYmU+LgorICovCisjZGVmaW5lIExJTktUWVBFX01QRUdfMl9UUwkyNDMKKworLyoKKyAqIG5nNFQgR21iSCdzIFVNVFMgSXViL0l1ci1vdmVyLUFUTSBhbmQgSXViL0l1ci1vdmVyLUlQIGZvcm1hdCBhcworICogdXNlZCBieSB0aGVpciBuZzQwIHByb3RvY29sIHRlc3Rlci4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSmVucyBHcmltbWVyIDxqZW5zLmdyaW1tZXJAbmc0dC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX05HNDAJCTI0NAorCisvKgorICogUHNldWRvLWhlYWRlciBnaXZpbmcgYWRhcHRlciBudW1iZXIgYW5kIGZsYWdzLCBmb2xsb3dlZCBieSBhbiBORkMKKyAqIChOZWFyLUZpZWxkIENvbW11bmljYXRpb25zKSBMb2dpY2FsIExpbmsgQ29udHJvbCBQcm90b2NvbCAoTExDUCkgUERVLAorICogYXMgc3BlY2lmaWVkIGJ5IE5GQyBGb3J1bSBMb2dpY2FsIExpbmsgQ29udHJvbCBQcm90b2NvbCBUZWNobmljYWwKKyAqIFNwZWNpZmljYXRpb24gTExDUCAxLjEuCisgKgorICogUmVxdWVzdGVkIGJ5IE1pa2UgV2FrZXJseSA8bWlrZXlAZ29vZ2xlLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTkZDX0xMQ1AJMjQ1CisKKy8qCisgKiBwZnN5bmMgb3V0cHV0OyBETFRfUEZTWU5DIGlzIDE4LCB3aGljaCBjb2xsaWRlcyB3aXRoIERMVF9DSVAgaW4KKyAqIFN1U0UgNi4zLCBvbiBPcGVuQlNELCBOZXRCU0QsIERyYWdvbkZseSBCU0QsIGFuZCBNYWMgT1MgWCwgYW5kCisgKiBpcyAxMjEsIHdoaWNoIGNvbGxpZGVzIHdpdGggRExUX0hIRExDLCBpbiBGcmVlQlNELiAgV2UgcGljayBhCisgKiBzaGlueSBuZXcgbGluay1sYXllciBoZWFkZXIgdHlwZSB2YWx1ZSB0aGF0IGRvZXNuJ3QgY29sbGlkZSB3aXRoCisgKiBhbnl0aGluZywgaW4gdGhlIGhvcGVzIHRoYXQgZnV0dXJlIHBmc3luYyBzYXZlZmlsZXMsIGlmIGFueSwKKyAqIHdvbid0IHJlcXVpcmUgc3BlY2lhbCBoYWNrcyB0byBkaXN0aW5ndWlzaCBmcm9tIG90aGVyIHNhdmVmaWxlcy4KKyAqCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfUEZTWU5DCQkyNDYKKworLyoKKyAqIFJhdyBJbmZpbmlCYW5kIHBhY2tldHMsIHN0YXJ0aW5nIHdpdGggdGhlIExvY2FsIFJvdXRpbmcgSGVhZGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBPcmVuIEtsYWRuaXRza3kgPG9yZW5rQG1lbGxhbm94LmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSU5GSU5JQkFORAkyNDcKKworLyoKKyAqIFNDVFAsIHdpdGggbm8gbG93ZXItbGV2ZWwgcHJvdG9jb2xzIChpLmUuLCBubyBJUHY0IG9yIElQdjYpLgorICoKKyAqIFJlcXVlc3RlZCBieSBNaWNoYWVsIFR1ZXhlbiA8TWljaGFlbC5UdWV4ZW5AbHVyY2hpLmZyYW5rZW4uZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX1NDVFAJCTI0OAorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgVVNCUGNhcCBoZWFkZXIuCisgKgorICogUmVxdWVzdGVkIGJ5IFRvbWFzeiBNb24gPGRlc293aW5AZ21haWwuY29tPgorICovCisjZGVmaW5lIExJTktUWVBFX1VTQlBDQVAJMjQ5CisKKy8qCisgKiBTY2h3ZWl0emVyIEVuZ2luZWVyaW5nIExhYm9yYXRvcmllcyAiUlRBQyIgcHJvZHVjdCBzZXJpYWwtbGluZQorICogcGFja2V0cy4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgQ2hyaXMgQm9udGplIDxjaHJpc19ib250amVAc2VsaW5jLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX1JUQUNfU0VSSUFMCQkyNTAKKworLyoKKyAqIEJsdWV0b290aCBMb3cgRW5lcmd5IGFpciBpbnRlcmZhY2UgbGluay1sYXllciBwYWNrZXRzLgorICoKKyAqIFJlcXVlc3RlZCBieSBNaWtlIEtlcnNoYXcgPGRyYWdvcm5Aa2lzbWV0d2lyZWxlc3MubmV0Pi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9CTFVFVE9PVEhfTEVfTEwJMjUxCisKKy8qCisgKiBMaW5rLWxheWVyIGhlYWRlciB0eXBlIGZvciB1cHBlci1wcm90b2NvbCBsYXllciBQRFUgc2F2ZXMgZnJvbSB3aXJlc2hhcmsuCisgKiAKKyAqIHRoZSBhY3R1YWwgY29udGVudHMgYXJlIGRldGVybWluZWQgYnkgdHdvIFRBR3Mgc3RvcmVkIHdpdGggZWFjaAorICogcGFja2V0OgorICogICBFWFBfUERVX1RBR19MSU5LVFlQRSAgICAgICAgICB0aGUgbGluayB0eXBlIChMSU5LVFlQRV8gdmFsdWUpIG9mIHRoZQorICoJCQkJICAgb3JpZ2luYWwgcGFja2V0LgorICoKKyAqICAgRVhQX1BEVV9UQUdfUFJPVE9fTkFNRSAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdpcmVzaGFyayBkaXNzZWN0b3IKKyAqIAkJCQkgICB0aGF0IGNhbiBtYWtlIHNlbnNlIG9mIHRoZSBkYXRhIHN0b3JlZC4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9XSVJFU0hBUktfVVBQRVJfUERVCTI1MgorCisjZGVmaW5lIExJTktUWVBFX01BVENISU5HX01BWAkyNTIJCS8qIGhpZ2hlc3QgdmFsdWUgaW4gdGhlICJtYXRjaGluZyIgcmFuZ2UgKi8KKworc3RhdGljIHN0cnVjdCBsaW5rdHlwZV9tYXAgeworCWludAlkbHQ7CisJaW50CWxpbmt0eXBlOworfSBtYXBbXSA9IHsKKwkvKgorCSAqIFRoZXNlIERMVF8qIGNvZGVzIGhhdmUgTElOS1RZUEVfKiBjb2RlcyB3aXRoIHZhbHVlcyBpZGVudGljYWwKKwkgKiB0byB0aGUgdmFsdWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIERMVF8qIGNvZGUuCisJICovCisJeyBETFRfTlVMTCwJCUxJTktUWVBFX05VTEwgfSwKKwl7IERMVF9FTjEwTUIsCQlMSU5LVFlQRV9FVEhFUk5FVCB9LAorCXsgRExUX0VOM01CLAkJTElOS1RZUEVfRVhQX0VUSEVSTkVUIH0sCisJeyBETFRfQVgyNSwJCUxJTktUWVBFX0FYMjUgfSwKKwl7IERMVF9QUk9ORVQsCQlMSU5LVFlQRV9QUk9ORVQgfSwKKwl7IERMVF9DSEFPUywJCUxJTktUWVBFX0NIQU9TIH0sCisJeyBETFRfSUVFRTgwMiwJCUxJTktUWVBFX0lFRUU4MDJfNSB9LAorCXsgRExUX0FSQ05FVCwJCUxJTktUWVBFX0FSQ05FVF9CU0QgfSwKKwl7IERMVF9TTElQLAkJTElOS1RZUEVfU0xJUCB9LAorCXsgRExUX1BQUCwJCUxJTktUWVBFX1BQUCB9LAorCXsgRExUX0ZEREksCSAJTElOS1RZUEVfRkRESSB9LAorCXsgRExUX1NZTUFOVEVDX0ZJUkVXQUxMLCBMSU5LVFlQRV9TWU1BTlRFQ19GSVJFV0FMTCB9LAorCisJLyoKKwkgKiBUaGVzZSBETFRfKiBjb2RlcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMgb24gZGlmZmVyZW50CisJICogcGxhdGZvcm1zOyB3ZSBtYXAgdGhlbSB0byBMSU5LVFlQRV8qIGNvZGVzIHRoYXQKKwkgKiBoYXZlIHZhbHVlcyB0aGF0IHNob3VsZCBuZXZlciBiZSBlcXVhbCB0byBhbnkgRExUXyoKKwkgKiBjb2RlLgorCSAqLworI2lmZGVmIERMVF9GUgorCS8qIEJTRC9PUyBGcmFtZSBSZWxheSAqLworCXsgRExUX0ZSLAkJTElOS1RZUEVfRlJFTEFZIH0sCisjZW5kaWYKKworCXsgRExUX0FUTV9SRkMxNDgzLCAJTElOS1RZUEVfQVRNX1JGQzE0ODMgfSwKKwl7IERMVF9SQVcsCQlMSU5LVFlQRV9SQVcgfSwKKwl7IERMVF9TTElQX0JTRE9TLAlMSU5LVFlQRV9TTElQX0JTRE9TIH0sCisJeyBETFRfUFBQX0JTRE9TLAlMSU5LVFlQRV9QUFBfQlNET1MgfSwKKworCS8qIEJTRC9PUyBDaXNjbyBIRExDICovCisJeyBETFRfQ19IRExDLAkJTElOS1RZUEVfQ19IRExDIH0sCisKKwkvKgorCSAqIFRoZXNlIERMVF8qIGNvZGVzIGFyZSBub3Qgb24gYWxsIHBsYXRmb3JtcywgYnV0LCBzbyBmYXIsCisJICogdGhlcmUgZG9uJ3QgYXBwZWFyIHRvIGJlIGFueSBwbGF0Zm9ybXMgdGhhdCBkZWZpbmUKKwkgKiBvdGhlciBjb2RlcyB3aXRoIHRob3NlIHZhbHVlczsgd2UgbWFwIHRoZW0gdG8KKwkgKiBkaWZmZXJlbnQgTElOS1RZUEVfKiB2YWx1ZXMgYW55d2F5LCBqdXN0IGluIGNhc2UuCisJICovCisKKwkvKiBMaW51eCBBVE0gQ2xhc3NpY2FsIElQICovCisJeyBETFRfQVRNX0NMSVAsCQlMSU5LVFlQRV9BVE1fQ0xJUCB9LAorCisJLyogTmV0QlNEIHN5bmMvYXN5bmMgc2VyaWFsIFBQUCAob3IgQ2lzY28gSERMQykgKi8KKwl7IERMVF9QUFBfU0VSSUFMLAlMSU5LVFlQRV9QUFBfSERMQyB9LAorCisJLyogTmV0QlNEIFBQUCBvdmVyIEV0aGVybmV0ICovCisJeyBETFRfUFBQX0VUSEVSLAlMSU5LVFlQRV9QUFBfRVRIRVIgfSwKKworCS8qCisJICogQWxsIExJTktUWVBFXyB2YWx1ZXMgYmV0d2VlbiBMSU5LVFlQRV9NQVRDSElOR19NSU4KKwkgKiBhbmQgTElOS1RZUEVfTUFUQ0hJTkdfTUFYIGFyZSBtYXBwZWQgdG8gaWRlbnRpY2FsCisJICogRExUXyB2YWx1ZXMuCisJICovCisKKwl7IC0xLAkJCS0xIH0KK307CisKK2ludAorZGx0X3RvX2xpbmt0eXBlKGludCBkbHQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIE1hcCBETFRfUEZTWU5DLCB3aGF0ZXZlciBpdCBtaWdodCBiZSwgdG8gTElOS1RZUEVfUEZTWU5DLgorCSAqLworCWlmIChkbHQgPT0gRExUX1BGU1lOQykKKwkJcmV0dXJuIChMSU5LVFlQRV9QRlNZTkMpOworCisJLyoKKwkgKiBNYXAgdGhlIHZhbHVlcyBpbiB0aGUgbWF0Y2hpbmcgcmFuZ2UuCisJICovCisJaWYgKGRsdCA+PSBETFRfTUFUQ0hJTkdfTUlOICYmIGRsdCA8PSBETFRfTUFUQ0hJTkdfTUFYKQorCQlyZXR1cm4gKGRsdCk7CisKKwkvKgorCSAqIE1hcCB0aGUgdmFsdWVzIG91dHNpZGUgdGhhdCByYW5nZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBtYXBbaV0uZGx0ICE9IC0xOyBpKyspIHsKKwkJaWYgKG1hcFtpXS5kbHQgPT0gZGx0KQorCQkJcmV0dXJuIChtYXBbaV0ubGlua3R5cGUpOworCX0KKworCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hcHBpbmcgZm9yIHRoaXMgRExUXyBjb2RlLCByZXR1cm4gYW4KKwkgKiBlcnJvcjsgdGhhdCBtZWFucyB0aGF0IHRoaXMgaXMgYSB2YWx1ZSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcKKwkgKiBMSU5LVFlQRV8gY29kZSwgYW5kIHdlIG5lZWQgdG8gYXNzaWduIG9uZS4KKwkgKi8KKwlyZXR1cm4gKC0xKTsKK30KKworaW50CitsaW5rdHlwZV90b19kbHQoaW50IGxpbmt0eXBlKQoreworCWludCBpOworCisJLyoKKwkgKiBNYXAgTElOS1RZUEVfUEZTWU5DIHRvIERMVF9QRlNZTkMsIHdoYXRldmVyIGl0IG1pZ2h0IGJlLgorCSAqIExJTktUWVBFX1BGU1lOQyBpcyBpbiB0aGUgbWF0Y2hpbmcgcmFuZ2UsIHRvIG1ha2Ugc3VyZQorCSAqIGl0J3MgYXMgc2FmZSBmcm9tIHJldXNlIGFzIHdlIGNhbiBhcnJhbmdlLCBzbyB3ZSBkbworCSAqIHRoaXMgdGVzdCBmaXJzdC4KKwkgKi8KKwlpZiAobGlua3R5cGUgPT0gTElOS1RZUEVfUEZTWU5DKQorCQlyZXR1cm4gKERMVF9QRlNZTkMpOworCisJLyoKKwkgKiBNYXAgdGhlIHZhbHVlcyBpbiB0aGUgbWF0Y2hpbmcgcmFuZ2UuCisJICovCisJaWYgKGxpbmt0eXBlID49IExJTktUWVBFX01BVENISU5HX01JTiAmJgorCSAgICBsaW5rdHlwZSA8PSBMSU5LVFlQRV9NQVRDSElOR19NQVgpCisJCXJldHVybiAobGlua3R5cGUpOworCisJLyoKKwkgKiBNYXAgdGhlIHZhbHVlcyBvdXRzaWRlIHRoYXQgcmFuZ2UuCisJICovCisJZm9yIChpID0gMDsgbWFwW2ldLmxpbmt0eXBlICE9IC0xOyBpKyspIHsKKwkJaWYgKG1hcFtpXS5saW5rdHlwZSA9PSBsaW5rdHlwZSkKKwkJCXJldHVybiAobWFwW2ldLmRsdCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGFuIGVudHJ5IGZvciB0aGlzIGxpbmsgdHlwZSwgcmV0dXJuCisJICogdGhlIGxpbmsgdHlwZSB2YWx1ZTsgaXQgbWF5IGJlIGEgRExUXyB2YWx1ZSBmcm9tIGFuCisJICogb2xkZXIgdmVyc2lvbiBvZiBsaWJwY2FwLgorCSAqLworCXJldHVybiBsaW5rdHlwZTsKK30KKworLyoKKyAqIFRoZSBETFRfVVNCX0xJTlVYIGFuZCBETFRfVVNCX0xJTlVYX01NQVBQRUQgaGVhZGVycyBhcmUgaW4gaG9zdAorICogYnl0ZSBvcmRlciB3aGVuIGNhcHR1cmluZyAoaXQncyBzdXBwbGllZCBkaXJlY3RseSBmcm9tIGEKKyAqIG1lbW9yeS1tYXBwZWQgYnVmZmVyIHNoYXJlZCBieSB0aGUga2VybmVsKS4KKyAqCisgKiBXaGVuIHJlYWRpbmcgYSBETFRfVVNCX0xJTlVYIG9yIERMVF9VU0JfTElOVVhfTU1BUFBFRCBjYXB0dXJlIGZpbGUsCisgKiB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgZnJvbSB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdCB0aGF0IHdyb3RlCisgKiB0aGUgZmlsZSB0byB0aGlzIGhvc3QncyBieXRlIG9yZGVyLgorICovCitzdGF0aWMgdm9pZAorc3dhcF9saW51eF91c2JfaGVhZGVyKGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaGRyLCB1X2NoYXIgKmJ1ZiwKKyAgICBpbnQgaGVhZGVyX2xlbl82NF9ieXRlcykKK3sKKwlwY2FwX3VzYl9oZWFkZXJfbW1hcHBlZCAqdWhkciA9IChwY2FwX3VzYl9oZWFkZXJfbW1hcHBlZCAqKWJ1ZjsKKwlicGZfdV9pbnQzMiBvZmZzZXQgPSAwOworCXVzYl9pc29kZXNjICpwaXNvZGVzYzsKKwlpbnQzMl90IG51bWRlc2MsIGk7CisKKwkvKgorCSAqICJvZmZzZXQiIGlzIHRoZSBvZmZzZXQgKnBhc3QqIHRoZSBmaWVsZCB3ZSdyZSBzd2FwcGluZzsKKwkgKiB3ZSBza2lwIHRoZSBmaWVsZCAqYmVmb3JlKiBjaGVja2luZyB0byBtYWtlIHN1cmUKKwkgKiB0aGUgY2FwdHVyZWQgZGF0YSBsZW5ndGggaW5jbHVkZXMgdGhlIGVudGlyZSBmaWVsZC4KKwkgKi8KKworCS8qCisJICogVGhlIFVSQiBpZCBpcyBhIHRvdGFsbHkgb3BhcXVlIHZhbHVlOyBkbyB3ZSByZWFsbHkgbmVlZCB0byAKKwkgKiBjb252ZXJ0IGl0IHRvIHRoZSByZWFkaW5nIGhvc3QncyBieXRlIG9yZGVyPz8/CisJICovCisJb2Zmc2V0ICs9IDg7CQkJLyogc2tpcCBwYXN0IGlkICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+aWQgPSBTV0FQTEwodWhkci0+aWQpOworCisJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHZhcmlvdXMgMS1ieXRlIGZpZWxkcyAqLworCisJb2Zmc2V0ICs9IDI7CQkJLyogc2tpcCBwYXN0IGJ1c19pZCAqLworCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJcmV0dXJuOworCXVoZHItPmJ1c19pZCA9IFNXQVBTSE9SVCh1aGRyLT5idXNfaWQpOworCisJb2Zmc2V0ICs9IDI7CQkJLyogc2tpcCBwYXN0IHZhcmlvdXMgMS1ieXRlIGZpZWxkcyAqLworCisJb2Zmc2V0ICs9IDg7CQkJLyogc2tpcCBwYXN0IHRzX3NlYyAqLworCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJcmV0dXJuOworCXVoZHItPnRzX3NlYyA9IFNXQVBMTCh1aGRyLT50c19zZWMpOworCisJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHRzX3VzZWMgKi8KKwlpZiAoaGRyLT5jYXBsZW4gPCBvZmZzZXQpCisJCXJldHVybjsKKwl1aGRyLT50c191c2VjID0gU1dBUExPTkcodWhkci0+dHNfdXNlYyk7CisKKwlvZmZzZXQgKz0gNDsJCQkvKiBza2lwIHBhc3Qgc3RhdHVzICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+c3RhdHVzID0gU1dBUExPTkcodWhkci0+c3RhdHVzKTsKKworCW9mZnNldCArPSA0OwkJCS8qIHNraXAgcGFzdCB1cmJfbGVuICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+dXJiX2xlbiA9IFNXQVBMT05HKHVoZHItPnVyYl9sZW4pOworCisJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IGRhdGFfbGVuICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+ZGF0YV9sZW4gPSBTV0FQTE9ORyh1aGRyLT5kYXRhX2xlbik7CisKKwlpZiAodWhkci0+dHJhbnNmZXJfdHlwZSA9PSBVUkJfSVNPQ0hST05PVVMpIHsKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHMuaXNvLmVycm9yX2NvdW50ICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+cy5pc28uZXJyb3JfY291bnQgPSBTV0FQTE9ORyh1aGRyLT5zLmlzby5lcnJvcl9jb3VudCk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHMuaXNvLm51bWRlc2MgKi8KKwkJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQkJcmV0dXJuOworCQl1aGRyLT5zLmlzby5udW1kZXNjID0gU1dBUExPTkcodWhkci0+cy5pc28ubnVtZGVzYyk7CisJfSBlbHNlCisJCW9mZnNldCArPSA4OwkJCS8qIHNraXAgVVNCIHNldHVwIGhlYWRlciAqLworCisJaWYgKGhlYWRlcl9sZW5fNjRfYnl0ZXMpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBlaXRoZXIgdGhlICJ2ZXJzaW9uIDEiIGhlYWRlciwgd2l0aAorCQkgKiAxNiBieXRlcyBvZiBhZGRpdGlvbmFsIGZpZWxkcyBhdCB0aGUgZW5kLCBvcgorCQkgKiBhICJ2ZXJzaW9uIDAiIGhlYWRlciBmcm9tIGEgbWVtb3J5LW1hcHBlZAorCQkgKiBjYXB0dXJlLCB3aXRoIDE2IGJ5dGVzIG9mIHplcm9lZC1vdXQgcGFkZGluZworCQkgKiBhdCB0aGUgZW5kLiAgQnl0ZSBzd2FwIHRoZW0gYXMgaWYgdGhpcyB3ZXJlCisJCSAqIGEgInZlcnNpb24gMSIgaGVhZGVyLgorCQkgKi8KKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IGludGVydmFsICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+aW50ZXJ2YWwgPSBTV0FQTE9ORyh1aGRyLT5pbnRlcnZhbCk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHN0YXJ0X2ZyYW1lICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+c3RhcnRfZnJhbWUgPSBTV0FQTE9ORyh1aGRyLT5zdGFydF9mcmFtZSk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHhmZXJfZmxhZ3MgKi8KKwkJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQkJcmV0dXJuOworCQl1aGRyLT54ZmVyX2ZsYWdzID0gU1dBUExPTkcodWhkci0+eGZlcl9mbGFncyk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IG5kZXNjICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+bmRlc2MgPSBTV0FQTE9ORyh1aGRyLT5uZGVzYyk7CisJfQkKKworCWlmICh1aGRyLT50cmFuc2Zlcl90eXBlID09IFVSQl9JU09DSFJPTk9VUykgeworCQkvKiBzd2FwIHRoZSB2YWx1ZXMgaW4gc3RydWN0IGxpbnV4X3VzYl9pc29kZXNjICovCisJCXBpc29kZXNjID0gKHVzYl9pc29kZXNjICopKHZvaWQgKikoYnVmK29mZnNldCk7CisJCW51bWRlc2MgPSB1aGRyLT5zLmlzby5udW1kZXNjOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtZGVzYzsgaSsrKSB7CisJCQlvZmZzZXQgKz0gNDsJCS8qIHNraXAgcGFzdCBzdGF0dXMgKi8KKwkJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCQlyZXR1cm47CisJCQlwaXNvZGVzYy0+c3RhdHVzID0gU1dBUExPTkcocGlzb2Rlc2MtPnN0YXR1cyk7CisKKwkJCW9mZnNldCArPSA0OwkJLyogc2tpcCBwYXN0IG9mZnNldCAqLworCQkJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQkJCXJldHVybjsKKwkJCXBpc29kZXNjLT5vZmZzZXQgPSBTV0FQTE9ORyhwaXNvZGVzYy0+b2Zmc2V0KTsKKworCQkJb2Zmc2V0ICs9IDQ7CQkvKiBza2lwIHBhc3QgbGVuICovCisJCQlpZiAoaGRyLT5jYXBsZW4gPCBvZmZzZXQpCisJCQkJcmV0dXJuOworCQkJcGlzb2Rlc2MtPmxlbiA9IFNXQVBMT05HKHBpc29kZXNjLT5sZW4pOworCisJCQlvZmZzZXQgKz0gNDsJCS8qIHNraXAgcGFzdCBwYWRkaW5nICovCisKKwkJCXBpc29kZXNjKys7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgRExUX05GTE9HICJwYWNrZXRzIiBoYXZlIGEgbWl4dHVyZSBvZiBiaWctZW5kaWFuIGFuZCBob3N0LWJ5dGUtb3JkZXIKKyAqIGRhdGEuICBUaGV5IGJlZ2luIHdpdGggYSBmaXhlZC1sZW5ndGggaGVhZGVyIHdpdGggYmlnLWVuZGlhbiBmaWVsZHMsCisgKiBmb2xsb3dlZCBieSBhIHNldCBvZiBUTFZzLCB3aGVyZSB0aGUgdHlwZSBhbmQgbGVuZ3RoIGFyZSBpbiBob3N0CisgKiBieXRlIG9yZGVyIGJ1dCB0aGUgdmFsdWVzIGFyZSBlaXRoZXIgYmlnLWVuZGlhbiBvciBhcmUgYSByYXcgYnl0ZQorICogc2VxdWVuY2UgdGhhdCdzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgdGhlIGhvc3QncyBieXRlIG9yZGVyLgorICoKKyAqIFdoZW4gcmVhZGluZyBhIERMVF9ORkxPRyBjYXB0dXJlIGZpbGUsIHdlIG5lZWQgdG8gY29udmVydCB0aGUgdHlwZQorICogYW5kIGxlbmd0aCB2YWx1ZXMgZnJvbSB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdCB0aGF0IHdyb3RlIHRoZQorICogZmlsZSB0byB0aGUgYnl0ZSBvcmRlciBvZiB0aGlzIGhvc3QuCisgKi8KK3N0YXRpYyB2b2lkCitzd2FwX25mbG9nX2hlYWRlcihjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICpidWYpCit7CisJdV9jaGFyICpwID0gYnVmOworCW5mbG9nX2hkcl90ICpuZmhkciA9IChuZmxvZ19oZHJfdCAqKWJ1ZjsKKwluZmxvZ190bHZfdCAqdGx2OworCXVfaW50IGNhcGxlbiA9IGhkci0+Y2FwbGVuOworCXVfaW50IGxlbmd0aCA9IGhkci0+bGVuOworCXVfaW50MTZfdCBzaXplOworCisJaWYgKGNhcGxlbiA8IChpbnQpIHNpemVvZihuZmxvZ19oZHJfdCkgfHwgbGVuZ3RoIDwgKGludCkgc2l6ZW9mKG5mbG9nX2hkcl90KSkgeworCQkvKiBOb3QgZW5vdWdoIGRhdGEgdG8gaGF2ZSBhbnkgVExWcy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICghKG5maGRyLT5uZmxvZ192ZXJzaW9uKSA9PSAwKSB7CisJCS8qIFVua25vd24gTkZMT0cgdmVyc2lvbiAqLworCQlyZXR1cm47CisJfQorCisJbGVuZ3RoIC09IHNpemVvZihuZmxvZ19oZHJfdCk7CisJY2FwbGVuIC09IHNpemVvZihuZmxvZ19oZHJfdCk7CisJcCArPSBzaXplb2YobmZsb2dfaGRyX3QpOworCisJd2hpbGUgKGNhcGxlbiA+PSBzaXplb2YobmZsb2dfdGx2X3QpKSB7CisJCXRsdiA9IChuZmxvZ190bHZfdCAqKSBwOworCisJCS8qIFN3YXAgdGhlIHR5cGUgYW5kIGxlbmd0aC4gKi8KKwkJdGx2LT50bHZfdHlwZSA9IFNXQVBTSE9SVCh0bHYtPnRsdl90eXBlKTsKKwkJdGx2LT50bHZfbGVuZ3RoID0gU1dBUFNIT1JUKHRsdi0+dGx2X2xlbmd0aCk7CisKKwkJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIFRMVi4gKi8KKwkJc2l6ZSA9IHRsdi0+dGx2X2xlbmd0aDsKKwkJaWYgKHNpemUgJSA0ICE9IDApCisJCQlzaXplICs9IDQgLSBzaXplICUgNDsKKworCQkvKiBJcyB0aGUgVExWJ3MgbGVuZ3RoIGxlc3MgdGhhbiB0aGUgbWluaW11bT8gKi8KKwkJaWYgKHNpemUgPCBzaXplb2YobmZsb2dfdGx2X3QpKSB7CisJCQkvKiBZZXMuIEdpdmUgdXAgbm93LiAqLworCQkJcmV0dXJuOworCQl9CisKKwkJLyogRG8gd2UgaGF2ZSBlbm91Z2ggZGF0YSBmb3IgdGhlIGZ1bGwgVExWPyAqLworCQlpZiAoY2FwbGVuIDwgc2l6ZSB8fCBsZW5ndGggPCBzaXplKSB7CisJCQkvKiBOby4gKi8KKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFNraXAgb3ZlciB0aGUgVExWLiAqLworCQlsZW5ndGggLT0gc2l6ZTsKKwkJY2FwbGVuIC09IHNpemU7CisJCXAgKz0gc2l6ZTsKKwl9Cit9CisKK3ZvaWQKK3N3YXBfcHNldWRvX2hlYWRlcnMoaW50IGxpbmt0eXBlLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICpkYXRhKQoreworCS8qCisJICogQ29udmVydCBwc2V1ZG8taGVhZGVycyBmcm9tIHRoZSBieXRlIG9yZGVyIG9mCisJICogdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGZpbGUgd2FzIHNhdmVkIHRvIG91cgorCSAqIGJ5dGUgb3JkZXIsIGFzIG5lY2Vzc2FyeS4KKwkgKi8KKwlzd2l0Y2ggKGxpbmt0eXBlKSB7CisKKwljYXNlIERMVF9VU0JfTElOVVg6CisJCXN3YXBfbGludXhfdXNiX2hlYWRlcihoZHIsIGRhdGEsIDApOworCQlicmVhazsKKworCWNhc2UgRExUX1VTQl9MSU5VWF9NTUFQUEVEOgorCQlzd2FwX2xpbnV4X3VzYl9oZWFkZXIoaGRyLCBkYXRhLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIERMVF9ORkxPRzoKKwkJc3dhcF9uZmxvZ19oZWFkZXIoaGRyLCBkYXRhKTsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGNhcC1jb21tb24uaCBiL3BjYXAtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjNWJjZAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtY29tbW9uLmgKQEAgLTAsMCArMSwyNSBAQAorCisvKgorICogV2UgdXNlIHRoZSAicmVjZWl2ZXItbWFrZXMtcmlnaHQiIGFwcHJvYWNoIHRvIGJ5dGUgb3JkZXIsCisgKiBiZWNhdXNlIHRpbWUgaXMgYXQgYSBwcmVtaXVtIHdoZW4gd2UgYXJlIHdyaXRpbmcgdGhlIGZpbGUuCisgKiBJbiBvdGhlciB3b3JkcywgdGhlIHBjYXBfZmlsZV9oZWFkZXIgYW5kIHBjYXBfcGt0aGRyLAorICogcmVjb3JkcyBhcmUgd3JpdHRlbiBpbiBob3N0IGJ5dGUgb3JkZXIuCisgKiBOb3RlIHRoYXQgdGhlIGJ5dGVzIG9mIHBhY2tldCBkYXRhIGFyZSB3cml0dGVuIG91dCBpbiB0aGUgb3JkZXIgaW4KKyAqIHdoaWNoIHRoZXkgd2VyZSByZWNlaXZlZCwgc28gbXVsdGktYnl0ZSBmaWVsZHMgaW4gcGFja2V0cyBhcmUgbm90CisgKiB3cml0dGVuIGluIGhvc3QgYnl0ZSBvcmRlciwgdGhleSdyZSB3cml0dGVuIGluIHdoYXRldmVyIG9yZGVyIHRoZQorICogc2VuZGluZyBtYWNoaW5lIHB1dCB0aGVtIGluLgorICoKKyAqIG50b2hbbHNdIGFyZW4ndCBzdWZmaWNpZW50IGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCB0byBzd2FwIG9uIGEgYmlnLWVuZGlhbgorICogbWFjaGluZSAoaWYgdGhlIGZpbGUgd2FzIHdyaXR0ZW4gaW4gbGl0dGxlLWVuZCBvcmRlcikuCisgKi8KKyNkZWZpbmUJU1dBUExPTkcoeSkgXAorKCgoKHkpJjB4ZmYpPDwyNCkgfCAoKCh5KSYweGZmMDApPDw4KSB8ICgoKHkpJjB4ZmYwMDAwKT4+OCkgfCAoKCh5KT4+MjQpJjB4ZmYpKQorI2RlZmluZQlTV0FQU0hPUlQoeSkgXAorCSggKCgoeSkmMHhmZik8PDgpIHwgKCh1X3Nob3J0KSgoeSkmMHhmZjAwKT4+OCkgKQorCitleHRlcm4gaW50IGRsdF90b19saW5rdHlwZShpbnQgZGx0KTsKKworZXh0ZXJuIGludCBsaW5rdHlwZV90b19kbHQoaW50IGxpbmt0eXBlKTsKKworZXh0ZXJuIHZvaWQgc3dhcF9wc2V1ZG9faGVhZGVycyhpbnQgbGlua3R5cGUsIHN0cnVjdCBwY2FwX3BrdGhkciAqaGRyLAorICAgIHVfY2hhciAqZGF0YSk7CmRpZmYgLS1naXQgYS9wY2FwLWNvbmZpZy4xIGIvcGNhcC1jb25maWcuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFmNDUwCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1jb25maWcuMQpAQCAtMCwwICsxLDc0IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWNvbmZpZy4xLHYgMS4xIDIwMDgtMDktMjMgMTg6MDQ6MDEgZ3V5IEV4cCAkIChMQkwpCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQLUNPTkZJRyAxICIyNiBNYXJjaCAyMDA5IgorLlNIIE5BTUUKK3BjYXAtY29uZmlnIFwtIHdyaXRlIGxpYnBjYXAgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyB0byBzdGFuZGFyZCBvdXRwdXQKKy5TSCBTWU5PUFNJUworLm5hCisuQiBwY2FwLWNvbmZpZworWworLkIgXC1cLXN0YXRpYworXQorWworLkIgXC1cLWNmbGFncyB8IFwtXC1saWJzIHwgXC1cLWFkZGl0aW9uYWwtbGlicworXQorLmFkCisuU0ggREVTQ1JJUFRJT04KKy5MUAorV2hlbiBydW4gd2l0aCB0aGUKKy5CIFwtXC1jZmxhZ3MKK29wdGlvbiwKKy5JIHBjYXAtY29uZmlnCit3cml0ZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCB0aGUKKy5CIFwtSQorY29tcGlsZXIgZmxhZ3MgcmVxdWlyZWQgdG8gaW5jbHVkZSBsaWJwY2FwJ3MgaGVhZGVyIGZpbGVzLgorV2hlbiBydW4gd2l0aCB0aGUKKy5CIFwtXC1saWJzCitvcHRpb24sCisuSSBwY2FwLWNvbmZpZword3JpdGVzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgdGhlCisuQiBcLUwKK2FuZAorLkIgXC1sCitsaW5rZXIgZmxhZ3MgcmVxdWlyZWQgdG8gbGluayB3aXRoIGxpYnBjYXAsIGluY2x1ZGluZworLkIgXC1sCitmbGFncyBmb3IgbGlicmFyaWVzIHJlcXVpcmVkIGJ5IGxpYnBjYXAuCitXaGVuIHJ1biB3aXRoIHRoZQorLkIgXC1cLWFkZGl0aW9uYWwtbGlicworb3B0aW9uLAorLkkgcGNhcC1jb25maWcKK3dyaXRlcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHRoZQorLkIgXC1MCithbmQKKy5CIFwtbAorZmxhZ3MgZm9yIGxpYnJhcmllcyByZXF1aXJlZCBieSBsaWJwY2FwLCBidXQgbm90IHRoZQorLkIgXC1scGNhcAorZmxhZyB0byBsaW5rIHdpdGggbGlicGNhcCBpdHNlbGYuCisuTFAKK0J5IGRlZmF1bHQsIGl0IHdyaXRlcyBmbGFncyBhcHByb3ByaWF0ZSBmb3IgY29tcGlsaW5nIHdpdGggYQorZHluYW1pY2FsbHktbGlua2VkIHZlcnNpb24gb2YgbGlicGNhcDsgdGhlCisuQiBcLVwtc3RhdGljCitmbGFnIGNhdXNlcyBpdCB0byB3cml0ZSBmbGFncyBhcHByb3ByaWF0ZSBmb3IgY29tcGlsaW5nIHdpdGggYQorc3RhdGljYWxseS1saW5rZWQgdmVyc2lvbiBvZiBsaWJwY2FwLgorLlNIICJTRUUgQUxTTyIKK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwLWNvbmZpZy5pbiBiL3BjYXAtY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmJlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLWNvbmZpZy5pbgpAQCAtMCwwICsxLDg5IEBACisjISAvYmluL3NoCisKKyMKKyMgU2NyaXB0IHRvIGdpdmUgdGhlIGFwcHJvcHJpYXRlIGNvbXBpbGVyIGZsYWdzIGFuZCBsaW5rZXIgZmxhZ3MKKyMgdG8gdXNlIHdoZW4gYnVpbGRpbmcgY29kZSB0aGF0IHVzZXMgbGlicGNhcC4KKyMKK3ByZWZpeD0iQHByZWZpeEAiCitleGVjX3ByZWZpeD0iQGV4ZWNfcHJlZml4QCIKK2luY2x1ZGVkaXI9IkBpbmNsdWRlZGlyQCIKK2xpYmRpcj0iQGxpYmRpckAiCitWX1JQQVRIX09QVD0iQFZfUlBBVEhfT1BUQCIKK0xJQlM9IkBMSUJTQCIKKworc3RhdGljPTAKK3Nob3dfY2ZsYWdzPTAKK3Nob3dfbGlicz0wCit3aGlsZSBbICIkIyIgIT0gMCBdCitkbworCWNhc2UgIiQxIiBpbgorCisJLS1zdGF0aWMpCisJCXN0YXRpYz0xCisJCTs7CisKKwktLWNmbGFncykKKwkJc2hvd19jZmxhZ3M9MQorCQk7OworCisJLS1saWJzKQorCQlzaG93X2xpYnM9MQorCQk7OworCisJLS1hZGRpdGlvbmFsLWxpYnMpCisJCXNob3dfYWRkaXRpb25hbF9saWJzPTEKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKK2lmIFsgIiRWX1JQQVRIX09QVCIgIT0gIiIgXQordGhlbgorCSMKKwkjIElmIGxpYmRpciBpc24ndCAvdXNyL2xpYiwgYWRkIGl0IHRvIHRoZSBydW4tdGltZSBsaW5rZXIgcGF0aC4KKwkjCisJaWYgWyAiJGxpYmRpciIgIT0gIi91c3IvbGliIiBdCisJdGhlbgorCQlSUEFUSD0kVl9SUEFUSF9PUFQkbGliZGlyCisJZmkKK2ZpCitpZiBbICIkc3RhdGljIiA9IDEgXQordGhlbgorCSMKKwkjIEluY2x1ZGUgTElCUyBzbyB0aGF0IHRoZSBmbGFncyBpbmNsdWRlIGxpYnJhcmllcyBjb250YWluaW5nCisJIyByb3V0aW5lcyB0aGF0IGxpYnBjYXAgdXNlcy4KKwkjCisJaWYgWyAiJHNob3dfY2ZsYWdzIiA9IDEgLWEgIiRzaG93X2xpYnMiID0gMSBdCisJdGhlbgorCQllY2hvICItSSRpbmNsdWRlZGlyIC1MJGxpYmRpciAtbHBjYXAgJExJQlMiCisJZWxpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfYWRkaXRpb25hbF9saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUkkaW5jbHVkZWRpciAtTCRsaWJkaXIgJExJQlMiCisJZWxpZiBbICIkc2hvd19jZmxhZ3MiID0gMSBdCisJdGhlbgorCQllY2hvICItSSRpbmNsdWRlZGlyIgorCWVsaWYgWyAiJHNob3dfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1MJGxpYmRpciAtbHBjYXAgJExJQlMiCisJZWxpZiBbICIkc2hvd19hZGRpdGlvbmFsX2xpYnMiID0gMSBdCisJdGhlbgorCQllY2hvICIkTElCUyIKKwlmaQorZWxzZQorCSMKKwkjIE9taXQgTElCUyAtIGxpYnBjYXAgaXMgYXNzdW1lZCB0byBiZSBsaW5rZWQgd2l0aCB0aG9zZQorCSMgbGlicmFyaWVzLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZG8gc28gZXhwbGljaXRseS4KKwkjCisJaWYgWyAiJHNob3dfY2ZsYWdzIiA9IDEgLWEgIiRzaG93X2xpYnMiID0gMSBdCisJdGhlbgorCQllY2hvICItSSRpbmNsdWRlZGlyIC1MJGxpYmRpciAkUlBBVEggLWxwY2FwIgorCWVsaWYgWyAiJHNob3dfY2ZsYWdzIiA9IDEgLWEgIiRzaG93X2FkZGl0aW9uYWxfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIiCisJZWxpZiBbICIkc2hvd19jZmxhZ3MiID0gMSBdCisJdGhlbgorCQllY2hvICItSSRpbmNsdWRlZGlyIgorCWVsaWYgWyAiJHNob3dfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1MJGxpYmRpciAkUlBBVEggLWxwY2FwIgorCWZpCitmaQpkaWZmIC0tZ2l0IGEvcGNhcC1kYWcuYyBiL3BjYXAtZGFnLmMKaW5kZXggM2VmMjUwOC4uNzBhNmQ2YyAxMDA2NDQKLS0tIGEvcGNhcC1kYWcuYworKysgYi9wY2FwLWRhZy5jCkBAIC0xNyw3ICsxNyw3IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotCSJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZGFnLmMsdiAxLjIxLjIuNyAyMDA3LzA2LzIyIDA2OjQzOjU4IGd1eSBFeHAgJCAoTEJMKSI7CisJIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1kYWcuYyx2IDEuMzkgMjAwOC0wNC0xNCAyMDo0MDo1OCBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC00Niw2ICs0NiwxNyBAQAogI2luY2x1ZGUgImRhZ25ldy5oIgogI2luY2x1ZGUgImRhZ2FwaS5oIgogCisjaW5jbHVkZSAicGNhcC1kYWcuaCIKKworLyoKKyAqIERBRyBkZXZpY2VzIGhhdmUgbmFtZXMgYmVnaW5uaW5nIHdpdGggImRhZyIsIGZvbGxvd2VkIGJ5IGEgbnVtYmVyCisgKiBmcm9tIDAgdG8gREFHX01BWF9CT0FSRFMsIHRoZW4gb3B0aW9uYWxseSBhIGNvbG9uIGFuZCBhIHN0cmVhbSBudW1iZXIKKyAqIGZyb20gMCB0byBEQUdfU1RSRUFNX01BWC4KKyAqLworI2lmbmRlZiBEQUdfTUFYX0JPQVJEUworI2RlZmluZSBEQUdfTUFYX0JPQVJEUyAzMgorI2VuZGlmCisKICNkZWZpbmUgQVRNX0NFTExfU0laRQkJNTIKICNkZWZpbmUgQVRNX0hEUl9TSVpFCQk0CiAKQEAgLTY4LDYgKzc5LDI3IEBACiAJdW5zaWduZWQgc2hvcnQJdmNpOwkJLyogVkNJICovCiB9OwogCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gREFHIGRldmljZXMuCisgKi8KK3N0cnVjdCBwY2FwX2RhZyB7CisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OworI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCisJdV9jaGFyCSpkYWdfbWVtX2JvdHRvbTsJLyogREFHIGNhcmQgY3VycmVudCBtZW1vcnkgYm90dG9tIHBvaW50ZXIgKi8KKwl1X2NoYXIJKmRhZ19tZW1fdG9wOwkvKiBEQUcgY2FyZCBjdXJyZW50IG1lbW9yeSB0b3AgcG9pbnRlciAqLworI2Vsc2UgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KKwl2b2lkCSpkYWdfbWVtX2Jhc2U7CS8qIERBRyBjYXJkIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKwl1X2ludAlkYWdfbWVtX2JvdHRvbTsJLyogREFHIGNhcmQgY3VycmVudCBtZW1vcnkgYm90dG9tIG9mZnNldCAqLworCXVfaW50CWRhZ19tZW1fdG9wOwkvKiBEQUcgY2FyZCBjdXJyZW50IG1lbW9yeSB0b3Agb2Zmc2V0ICovCisjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KKwlpbnQJZGFnX2Zjc19iaXRzOwkvKiBOdW1iZXIgb2YgY2hlY2tzdW0gYml0cyBmcm9tIGxpbmsgbGF5ZXIgKi8KKwlpbnQJZGFnX29mZnNldF9mbGFnczsgLyogRmxhZ3MgdG8gcGFzcyB0byBkYWdfb2Zmc2V0KCkuICovCisJaW50CWRhZ19zdHJlYW07CS8qIERBRyBzdHJlYW0gbnVtYmVyICovCisJaW50CWRhZ190aW1lb3V0OwkvKiB0aW1lb3V0IHNwZWNpZmllZCB0byBwY2FwX29wZW5fbGl2ZS4KKwkJCQkgKiBTYW1lIGFzIGluIGxpbnV4IGFib3ZlLCBpbnRyb2R1Y2UKKwkJCQkgKiBnZW5lcmFsbHk/ICovCit9OworCiB0eXBlZGVmIHN0cnVjdCBwY2FwX2RhZ19ub2RlIHsKIAlzdHJ1Y3QgcGNhcF9kYWdfbm9kZSAqbmV4dDsKIAlwY2FwX3QgKnA7CkBAIC04MCwxNiArMTEyLDYgQEAKIAogI2RlZmluZSBJU19CSUdFTkRJQU4oKSAoKigodW5zaWduZWQgY2hhciAqKSZlbmRpYW5fdGVzdF93b3JkKSkKIAotCi0jaWZkZWYgREFHX09OTFkKLS8qIFRoaXMgY29kZSBpcyByZXF1aXJlZCB3aGVuIGNvbXBpbGluZyBmb3IgYSBEQUcgZGV2aWNlIG9ubHkuICovCi0jaW5jbHVkZSAicGNhcC1kYWcuaCIKLQotLyogUmVwbGFjZSBkYWcgZnVuY3Rpb24gbmFtZXMgd2l0aCBwY2FwIGVxdWl2YWxlbnQuICovCi0jZGVmaW5lIGRhZ19vcGVuX2xpdmUgcGNhcF9vcGVuX2xpdmUKLSNkZWZpbmUgZGFnX3BsYXRmb3JtX2ZpbmRkZXZzIHBjYXBfcGxhdGZvcm1fZmluZGRldnMKLSNlbmRpZiAvKiBEQUdfT05MWSAqLwotCiAjZGVmaW5lIE1BWF9EQUdfUEFDS0VUIDY1NTM2CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFRlbXBQa3RbTUFYX0RBR19QQUNLRVRdOwpAQCAtMTI0LDI0ICsxNDYsMzAgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotZGFnX3BsYXRmb3JtX2Nsb3NlKHBjYXBfdCAqcCkKK2RhZ19wbGF0Zm9ybV9jbGVhbnVwKHBjYXBfdCAqcCkKIHsKLQkKKwlzdHJ1Y3QgcGNhcF9kYWcgKnBkOworCiAJaWYgKHAgIT0gTlVMTCkgeworCQlwZCA9IHAtPnByaXY7CiAjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKLQkJaWYoZGFnX3N0b3Bfc3RyZWFtKHAtPmZkLCBwLT5tZC5kYWdfc3RyZWFtKSA8IDApCisJCWlmKGRhZ19zdG9wX3N0cmVhbShwLT5mZCwgcGQtPmRhZ19zdHJlYW0pIDwgMCkKIAkJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcF9zdHJlYW06ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogCQkKLQkJaWYoZGFnX2RldGFjaF9zdHJlYW0ocC0+ZmQsIHAtPm1kLmRhZ19zdHJlYW0pIDwgMCkKKwkJaWYoZGFnX2RldGFjaF9zdHJlYW0ocC0+ZmQsIHBkLT5kYWdfc3RyZWFtKSA8IDApCiAJCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2RldGFjaF9zdHJlYW06ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogI2Vsc2UKIAkJaWYoZGFnX3N0b3AocC0+ZmQpIDwgMCkKIAkJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KLQkJaWYoZGFnX2Nsb3NlKHAtPmZkKSA8IDApCi0JCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2Nsb3NlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYocC0+ZmQgIT0gLTEpIHsKKwkJCWlmKGRhZ19jbG9zZShwLT5mZCkgPCAwKQorCQkJCWZwcmludGYoc3RkZXJyLCJkYWdfY2xvc2U6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJcC0+ZmQgPSAtMTsKKwkJfQorCQlkZWxldGVfcGNhcF9kYWcocCk7CisJCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKIAl9Ci0JZGVsZXRlX3BjYXBfZGFnKHApOwogCS8qIE5vdGU6IGRvbid0IG5lZWQgdG8gY2FsbCBjbG9zZShwLT5mZCkgaGVyZSBhcyBkYWdfY2xvc2UocC0+ZmQpIGRvZXMgdGhpcy4gKi8KIH0KIApAQCAtMTUwLDcgKzE3OCw3IEBACiB7CiAJd2hpbGUgKHBjYXBfZGFncyAhPSBOVUxMKSB7CiAJCWlmIChwY2FwX2RhZ3MtPnBpZCA9PSBnZXRwaWQoKSkgewotCQkJZGFnX3BsYXRmb3JtX2Nsb3NlKHBjYXBfZGFncy0+cCk7CisJCQlkYWdfcGxhdGZvcm1fY2xlYW51cChwY2FwX2RhZ3MtPnApOwogCQl9IGVsc2UgewogCQkJZGVsZXRlX3BjYXBfZGFnKHBjYXBfZGFncy0+cCk7CiAJCX0KQEAgLTE4MCw2ICsyMDgsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludAorZGFnX2VyZl9leHRfaGVhZGVyX2NvdW50KHVpbnQ4X3QgKiBlcmYsIHNpemVfdCBsZW4pCit7CisJdWludDMyX3QgaGRyX251bSA9IDA7CisJdWludDhfdCAgaGRyX3R5cGU7CisKKwkvKiBiYXNpYyBzYW5pdHkgY2hlY2tzICovCisJaWYgKCBlcmYgPT0gTlVMTCApCisJCXJldHVybiAwOworCWlmICggbGVuIDwgMTYgKQorCQlyZXR1cm4gMDsKKworCS8qIGNoZWNrIGlmIHdlIGhhdmUgYW55IGV4dGVuc2lvbiBoZWFkZXJzICovCisJaWYgKCAoZXJmWzhdICYgMHg4MCkgPT0gMHgwMCApCisJCXJldHVybiAwOworCisJLyogbG9vcCBvdmVyIHRoZSBleHRlbnNpb24gaGVhZGVycyAqLworCWRvIHsKKwkKKwkJLyogc2FuaXR5IGNoZWNrIHdlIGhhdmUgZW5vdWdoIGJ5dGVzICovCisJCWlmICggbGVuIDwgKDI0ICsgKGhkcl9udW0gKiA4KSkgKQorCQkJcmV0dXJuIGhkcl9udW07CisKKwkJLyogZ2V0IHRoZSBoZWFkZXIgdHlwZSAqLworCQloZHJfdHlwZSA9IGVyZlsoMTYgKyAoaGRyX251bSAqIDgpKV07CisJCWhkcl9udW0rKzsKKworCX0gd2hpbGUgKCBoZHJfdHlwZSAmIDB4ODAgKTsKKworCXJldHVybiBoZHJfbnVtOworfQorCiAvKgogICogIFJlYWQgYXQgbW9zdCBtYXhfcGFja2V0cyBmcm9tIHRoZSBjYXB0dXJlIHN0cmVhbSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sKICAqICBmb3IgZWFjaCBvZiB0aGVtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBoYW5kbGVkLCAtMSBpZiBhbgpAQCAtMTg4LDEyICsyNDgsMTQgQEAKIHN0YXRpYyBpbnQKIGRhZ19yZWFkKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCiB7CisJc3RydWN0IHBjYXBfZGFnICpwZCA9IHAtPnByaXY7CiAJdW5zaWduZWQgaW50IHByb2Nlc3NlZCA9IDA7Ci0JaW50IGZsYWdzID0gcC0+bWQuZGFnX29mZnNldF9mbGFnczsKKwlpbnQgZmxhZ3MgPSBwZC0+ZGFnX29mZnNldF9mbGFnczsKIAl1bnNpZ25lZCBpbnQgbm9uYmxvY2tpbmcgPSBmbGFncyAmIERBR0ZfTk9OQkxPQ0s7CisJdW5zaWduZWQgaW50IG51bV9leHRfaGRyID0gMDsKIAogCS8qIEdldCB0aGUgbmV4dCBidWZmZXJmdWwgb2YgcGFja2V0cyAoaWYgbmVjZXNzYXJ5KS4gKi8KLQl3aGlsZSAocC0+bWQuZGFnX21lbV90b3AgLSBwLT5tZC5kYWdfbWVtX2JvdHRvbSA8IGRhZ19yZWNvcmRfc2l6ZSkgeworCXdoaWxlIChwZC0+ZGFnX21lbV90b3AgLSBwZC0+ZGFnX21lbV9ib3R0b20gPCBkYWdfcmVjb3JkX3NpemUpIHsKICAKIAkJLyoKIAkJICogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8KQEAgLTIyMCwyMSArMjgyLDIzIEBACiAJCSAqIElmIG5vbi1ibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuIFRoZSB1c2VyCiAJCSAqIGlzIHRoZW4gcmVzcG9uc2libGUgZm9yIGVmZmljaWVuY3kuCiAJCSAqLwotCQlwLT5tZC5kYWdfbWVtX3RvcCA9IGRhZ19hZHZhbmNlX3N0cmVhbShwLT5mZCwgcC0+bWQuZGFnX3N0cmVhbSwgJihwLT5tZC5kYWdfbWVtX2JvdHRvbSkpOworCQlpZiAoIE5VTEwgPT0gKHBkLT5kYWdfbWVtX3RvcCA9IGRhZ19hZHZhbmNlX3N0cmVhbShwLT5mZCwgcGQtPmRhZ19zdHJlYW0sICYocGQtPmRhZ19tZW1fYm90dG9tKSkpICkgeworCQkgICAgIHJldHVybiAtMTsKKwkJfQogI2Vsc2UKIAkJLyogZGFnX29mZnNldCBkb2VzIG5vdCBzdXBwb3J0IHRpbWVvdXRzICovCi0JCXAtPm1kLmRhZ19tZW1fdG9wID0gZGFnX29mZnNldChwLT5mZCwgJihwLT5tZC5kYWdfbWVtX2JvdHRvbSksIGZsYWdzKTsKKwkJcGQtPmRhZ19tZW1fdG9wID0gZGFnX29mZnNldChwLT5mZCwgJihwZC0+ZGFnX21lbV9ib3R0b20pLCBmbGFncyk7CiAjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KIAotCQlpZiAobm9uYmxvY2tpbmcgJiYgKHAtPm1kLmRhZ19tZW1fdG9wIC0gcC0+bWQuZGFnX21lbV9ib3R0b20gPCBkYWdfcmVjb3JkX3NpemUpKQorCQlpZiAobm9uYmxvY2tpbmcgJiYgKHBkLT5kYWdfbWVtX3RvcCAtIHBkLT5kYWdfbWVtX2JvdHRvbSA8IGRhZ19yZWNvcmRfc2l6ZSkpCiAJCXsKIAkJCS8qIFBjYXAgaXMgY29uZmlndXJlZCB0byBwcm9jZXNzIG9ubHkgYXZhaWxhYmxlIHBhY2tldHMsIGFuZCB0aGVyZSBhcmVuJ3QgYW55LCByZXR1cm4gaW1tZWRpYXRlbHkuICovCiAJCQlyZXR1cm4gMDsKIAkJfQogCQkKIAkJaWYoIW5vbmJsb2NraW5nICYmCi0JCSAgIHAtPm1kLmRhZ190aW1lb3V0ICYmCi0JCSAgIChwLT5tZC5kYWdfbWVtX3RvcCAtIHAtPm1kLmRhZ19tZW1fYm90dG9tIDwgZGFnX3JlY29yZF9zaXplKSkKKwkJICAgcGQtPmRhZ190aW1lb3V0ICYmCisJCSAgIChwZC0+ZGFnX21lbV90b3AgLSBwZC0+ZGFnX21lbV9ib3R0b20gPCBkYWdfcmVjb3JkX3NpemUpKQogCQl7CiAJCQkvKiBCbG9ja2luZyBtb2RlLCBidXQgdGltZW91dCBzZXQgYW5kIG5vIGRhdGEgaGFzIGFycml2ZWQsIHJldHVybiBhbnl3YXkuKi8KIAkJCXJldHVybiAwOwpAQCAtMjQzLDE5ICszMDcsMTkgQEAKIAl9CiAJCiAJLyogUHJvY2VzcyB0aGUgcGFja2V0cy4gKi8KLQl3aGlsZSAocC0+bWQuZGFnX21lbV90b3AgLSBwLT5tZC5kYWdfbWVtX2JvdHRvbSA+PSBkYWdfcmVjb3JkX3NpemUpIHsKLQorCXdoaWxlIChwZC0+ZGFnX21lbV90b3AgLSBwZC0+ZGFnX21lbV9ib3R0b20gPj0gZGFnX3JlY29yZF9zaXplKSB7CisJCQogCQl1bnNpZ25lZCBzaG9ydCBwYWNrZXRfbGVuID0gMDsKIAkJaW50IGNhcGxlbiA9IDA7CiAJCXN0cnVjdCBwY2FwX3BrdGhkcglwY2FwX2hlYWRlcjsKLQorCQkKICNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQotCQlkYWdfcmVjb3JkX3QgKmhlYWRlciA9IChkYWdfcmVjb3JkX3QgKikocC0+bWQuZGFnX21lbV9ib3R0b20pOworCQlkYWdfcmVjb3JkX3QgKmhlYWRlciA9IChkYWdfcmVjb3JkX3QgKikocGQtPmRhZ19tZW1fYm90dG9tKTsKICNlbHNlCi0JCWRhZ19yZWNvcmRfdCAqaGVhZGVyID0gKGRhZ19yZWNvcmRfdCAqKShwLT5tZC5kYWdfbWVtX2Jhc2UgKyBwLT5tZC5kYWdfbWVtX2JvdHRvbSk7CisJCWRhZ19yZWNvcmRfdCAqaGVhZGVyID0gKGRhZ19yZWNvcmRfdCAqKShwZC0+ZGFnX21lbV9iYXNlICsgcGQtPmRhZ19tZW1fYm90dG9tKTsKICNlbmRpZiAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLwogCi0JCXVfY2hhciAqZHAgPSAoKHVfY2hhciAqKWhlYWRlcikgKyBkYWdfcmVjb3JkX3NpemU7CisJCXVfY2hhciAqZHAgPSAoKHVfY2hhciAqKWhlYWRlcik7IC8qICsgZGFnX3JlY29yZF9zaXplOyAqLwogCQl1bnNpZ25lZCBzaG9ydCBybGVuOwogIAogCQkvKgpAQCAtMjc3LDE2MiArMzQxLDIxNCBAQAogCQkJc3RybmNweShwLT5lcnJidWYsICJkYWdfcmVhZDogcmVjb3JkIHRvbyBzbWFsbCIsIFBDQVBfRVJSQlVGX1NJWkUpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCXAtPm1kLmRhZ19tZW1fYm90dG9tICs9IHJsZW47Ci0KLQkJc3dpdGNoKGhlYWRlci0+dHlwZSkgewotCQljYXNlIFRZUEVfQVRNOgotI2lmZGVmIFRZUEVfQUFMNQotCQljYXNlIFRZUEVfQUFMNToKLQkJCWlmIChoZWFkZXItPnR5cGUgPT0gVFlQRV9BQUw1KSB7Ci0JCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7Ci0JCQkJY2FwbGVuID0gcmxlbiAtIGRhZ19yZWNvcmRfc2l6ZTsKLQkJCX0KLSNlbmRpZgotI2lmZGVmIFRZUEVfTUNfQVRNCi0JCWNhc2UgVFlQRV9NQ19BVE06Ci0JCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfTUNfQVRNKSB7Ci0JCQkJY2FwbGVuID0gcGFja2V0X2xlbiA9IEFUTV9DRUxMX1NJWkU7Ci0JCQkJZHArPTQ7Ci0JCQl9Ci0jZW5kaWYKLSNpZmRlZiBUWVBFX01DX0FBTDUKLQkJY2FzZSBUWVBFX01DX0FBTDU6Ci0JCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfTUNfQUFMNSkgewotCQkJCXBhY2tldF9sZW4gPSBudG9ocyhoZWFkZXItPndsZW4pOwotCQkJCWNhcGxlbiA9IHJsZW4gLSBkYWdfcmVjb3JkX3NpemUgLSA0OwotCQkJCWRwKz00OwotCQkJfQotI2VuZGlmCi0JCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfQVRNKSB7Ci0JCQkJY2FwbGVuID0gcGFja2V0X2xlbiA9IEFUTV9DRUxMX1NJWkU7Ci0JCQl9Ci0JCQlpZiAocC0+bGlua3R5cGUgPT0gRExUX1NVTkFUTSkgewotCQkJCXN0cnVjdCBzdW5hdG1faGRyICpzdW5hdG0gPSAoc3RydWN0IHN1bmF0bV9oZHIgKilkcDsKLQkJCQl1bnNpZ25lZCBsb25nIHJhd2F0bTsKLQkJCQkJCi0JCQkJcmF3YXRtID0gbnRvaGwoKigodW5zaWduZWQgbG9uZyAqKWRwKSk7Ci0JCQkJc3VuYXRtLT52Y2kgPSBodG9ucygocmF3YXRtID4+ICA0KSAmIDB4ZmZmZik7Ci0JCQkJc3VuYXRtLT52cGkgPSAocmF3YXRtID4+IDIwKSAmIDB4MDBmZjsKLQkJCQlzdW5hdG0tPmZsYWdzID0gKChoZWFkZXItPmZsYWdzLmlmYWNlICYgMSkgPyAweDgwIDogMHgwMCkgfCAKLQkJCQkJKChzdW5hdG0tPnZwaSA9PSAwICYmIHN1bmF0bS0+dmNpID09IGh0b25zKDUpKSA/IDYgOgotCQkJCQkgKChzdW5hdG0tPnZwaSA9PSAwICYmIHN1bmF0bS0+dmNpID09IGh0b25zKDE2KSkgPyA1IDogCi0JCQkJCSAgKChkcFtBVE1fSERSX1NJWkVdID09IDB4YWEgJiYKLQkJCQkJICAgIGRwW0FUTV9IRFJfU0laRSsxXSA9PSAweGFhICYmCi0JCQkJCSAgICBkcFtBVE1fSERSX1NJWkUrMl0gPT0gMHgwMykgPyAyIDogMSkpKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlwYWNrZXRfbGVuIC09IEFUTV9IRFJfU0laRTsKLQkJCQljYXBsZW4gLT0gQVRNX0hEUl9TSVpFOwotCQkJCWRwICs9IEFUTV9IRFJfU0laRTsKLQkJCX0KLQkJCWJyZWFrOwotCi0jaWZkZWYgVFlQRV9EU01fQ09MT1JfRVRICi0JCWNhc2UgVFlQRV9EU01fQ09MT1JfRVRIOgotI2VuZGlmCi0jaWZkZWYgVFlQRV9DT0xPUl9FVEgKLQkJY2FzZSBUWVBFX0NPTE9SX0VUSDoKLSNlbmRpZgotCQljYXNlIFRZUEVfRVRIOgotCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7Ci0JCQlwYWNrZXRfbGVuIC09IChwLT5tZC5kYWdfZmNzX2JpdHMgPj4gMyk7Ci0JCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplIC0gMjsKLQkJCWlmIChjYXBsZW4gPiBwYWNrZXRfbGVuKSB7Ci0JCQkJY2FwbGVuID0gcGFja2V0X2xlbjsKLQkJCX0KLQkJCWRwICs9IDI7Ci0JCQlicmVhazsKLSNpZmRlZiBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUwotCQljYXNlIFRZUEVfRFNNX0NPTE9SX0hETENfUE9TOgotI2VuZGlmCi0jaWZkZWYgVFlQRV9DT0xPUl9IRExDX1BPUwotCQljYXNlIFRZUEVfQ09MT1JfSERMQ19QT1M6Ci0jZW5kaWYKLQkJY2FzZSBUWVBFX0hETENfUE9TOgotCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7Ci0JCQlwYWNrZXRfbGVuIC09IChwLT5tZC5kYWdfZmNzX2JpdHMgPj4gMyk7Ci0JCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplOwotCQkJaWYgKGNhcGxlbiA+IHBhY2tldF9sZW4pIHsKLQkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgVFlQRV9DT0xPUl9NQ19IRExDX1BPUwotCQljYXNlIFRZUEVfQ09MT1JfTUNfSERMQ19QT1M6Ci0jZW5kaWYKLSNpZmRlZiBUWVBFX01DX0hETEMKLQkJY2FzZSBUWVBFX01DX0hETEM6Ci0JCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKTsKLQkJCXBhY2tldF9sZW4gLT0gKHAtPm1kLmRhZ19mY3NfYml0cyA+PiAzKTsKLQkJCWNhcGxlbiA9IHJsZW4gLSBkYWdfcmVjb3JkX3NpemUgLSA0OwotCQkJaWYgKGNhcGxlbiA+IHBhY2tldF9sZW4pIHsKLQkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOwotCQkJfQotCQkJLyoganVtcCB0aGUgTUNfSERMQ19IRUFERVIgKi8KLQkJCWRwICs9IDQ7Ci0JCQlpZiAocC0+bGlua3R5cGUgPT0gRExUX01UUDJfV0lUSF9QSERSKSB7Ci0JCQkJLyogQWRkIHRoZSBNVFAyIFBzZXVkbyBIZWFkZXIgKi8KLQkJCQljYXBsZW4gKz0gTVRQMl9IRFJfTEVOOwotCQkJCXBhY2tldF9sZW4gKz0gTVRQMl9IRFJfTEVOOwotCi0JCQkJVGVtcFBrdFtNVFAyX1NFTlRfT0ZGU0VUXSA9IDA7Ci0JCQkJVGVtcFBrdFtNVFAyX0FOTkVYX0FfVVNFRF9PRkZTRVRdID0gTVRQMl9BTk5FWF9BX1VTRURfVU5LTk9XTjsKLQkJCQkqKFRlbXBQa3QrTVRQMl9MSU5LX05VTUJFUl9PRkZTRVQpID0gKChoZWFkZXItPnJlYy5tY19oZGxjLm1jX2hlYWRlcj4+MTYpJjB4MDEpOwotCQkJCSooVGVtcFBrdCtNVFAyX0xJTktfTlVNQkVSX09GRlNFVCsxKSA9ICgoaGVhZGVyLT5yZWMubWNfaGRsYy5tY19oZWFkZXI+PjI0KSYweGZmKTsKLQkJCQltZW1jcHkoVGVtcFBrdCtNVFAyX0hEUl9MRU4sIGRwLCBjYXBsZW4pOwotCQkJCWRwID0gVGVtcFBrdDsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQkvKiBVbmhhbmRsZWQgRVJGIHR5cGUuCi0JCQkgKiBJZ25vcmUgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBlcnJvcgotCQkJICovCi0JCQljb250aW51ZTsKLQkJfQotIAotCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCi0JCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKKwkJcGQtPmRhZ19tZW1fYm90dG9tICs9IHJsZW47CiAKIAkJLyogQ291bnQgbG9zdCBwYWNrZXRzLiAqLwotCQlzd2l0Y2goaGVhZGVyLT50eXBlKSB7Ci0jaWZkZWYgVFlQRV9DT0xPUl9IRExDX1BPUwotCQkJLyogaW4gdGhpcyB0eXBlIHRoZSBjb2xvciB2YWx1ZSBvdmVyd3JpdGVzIHRoZSBsY3RyICovCisJCXN3aXRjaCgoaGVhZGVyLT50eXBlICYgMHg3ZikpIHsKKwkJCS8qIGluIHRoZXNlIHR5cGVzIHRoZSBjb2xvciB2YWx1ZSBvdmVyd3JpdGVzIHRoZSBsY3RyICovCiAJCWNhc2UgVFlQRV9DT0xPUl9IRExDX1BPUzoKLQkJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgVFlQRV9DT0xPUl9FVEgKLQkJCS8qIGluIHRoaXMgdHlwZSB0aGUgY29sb3IgdmFsdWUgb3ZlcndyaXRlcyB0aGUgbGN0ciAqLwogCQljYXNlIFRZUEVfQ09MT1JfRVRIOgotCQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUwotCQkJLyogaW4gdGhpcyB0eXBlIHRoZSBjb2xvciB2YWx1ZSBvdmVyd3JpdGVzIHRoZSBsY3RyICovCiAJCWNhc2UgVFlQRV9EU01fQ09MT1JfSERMQ19QT1M6Ci0JCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIFRZUEVfRFNNX0NPTE9SX0VUSAotCQkJLyogaW4gdGhpcyB0eXBlIHRoZSBjb2xvciB2YWx1ZSBvdmVyd3JpdGVzIHRoZSBsY3RyICovCiAJCWNhc2UgVFlQRV9EU01fQ09MT1JfRVRIOgotCQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUWVBFX0NPTE9SX01DX0hETENfUE9TCiAJCWNhc2UgVFlQRV9DT0xPUl9NQ19IRExDX1BPUzoKKwkJY2FzZSBUWVBFX0NPTE9SX0hBU0hfRVRIOgorCQljYXNlIFRZUEVfQ09MT1JfSEFTSF9QT1M6CiAJCQlicmVhazsKLSNlbmRpZgogCiAJCWRlZmF1bHQ6CiAJCQlpZiAoaGVhZGVyLT5sY3RyKSB7Ci0JCQkJaWYgKHAtPm1kLnN0YXQucHNfZHJvcCA+IChVSU5UX01BWCAtIG50b2hzKGhlYWRlci0+bGN0cikpKSB7Ci0JCQkJCXAtPm1kLnN0YXQucHNfZHJvcCA9IFVJTlRfTUFYOworCQkJCWlmIChwZC0+c3RhdC5wc19kcm9wID4gKFVJTlRfTUFYIC0gbnRvaHMoaGVhZGVyLT5sY3RyKSkpIHsKKwkJCQkJcGQtPnN0YXQucHNfZHJvcCA9IFVJTlRfTUFYOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXAtPm1kLnN0YXQucHNfZHJvcCArPSBudG9ocyhoZWFkZXItPmxjdHIpOworCQkJCQlwZC0+c3RhdC5wc19kcm9wICs9IG50b2hzKGhlYWRlci0+bGN0cik7CiAJCQkJfQogCQkJfQogCQl9CisJCQorCQlpZiAoKGhlYWRlci0+dHlwZSAmIDB4N2YpID09IFRZUEVfUEFEKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCW51bV9leHRfaGRyID0gZGFnX2VyZl9leHRfaGVhZGVyX2NvdW50KGRwLCBybGVuKTsKKworCQkvKiBFUkYgZW5jYXBzdWxhdGlvbiAqLworCQkvKiBUaGUgRXh0ZW5zaWJsZSBSZWNvcmQgRm9ybWF0IGlzIG5vdCBkcm9wcGVkIGZvciB0aGlzIGtpbmQgb2YgZW5jYXBzdWxhdGlvbiwgCisJCSAqIGFuZCB3aWxsIGJlIGhhbmRsZWQgYXMgYSBwc2V1ZG8gaGVhZGVyIGJ5IHRoZSBkZWNvZGluZyBhcHBsaWNhdGlvbi4KKwkJICogVGhlIGluZm9ybWF0aW9uIGNhcnJpZWQgaW4gdGhlIEVSRiBoZWFkZXIgYW5kIGluIHRoZSBvcHRpb25hbCBzdWJoZWFkZXIgKGlmIHByZXNlbnQpCisJCSAqIGNvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBsaWJwY2FwIGluZm9ybWF0aW9uLCB0byBvZmZlciBhIGJldHRlciBkZWNvZGluZy4KKwkJICogVGhlIHBhY2tldCBsZW5ndGggaXMKKwkJICogbyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb24gdGhlIGxpbmsgKGhlYWRlci0+d2xlbiksCisJCSAqIG8gcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBFUkYgaGVhZGVyIChkYWdfcmVjb3JkX3NpemUpLCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSAKKwkJICogICBwc2V1ZG8gaGVhZGVyIHdpbGwgYmUgYWRqdXN0ZWQgZHVyaW5nIHRoZSBkZWNvZGluZywKKwkJICogbyBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsIHN1YmhlYWRlciAoaWYgcHJlc2VudCkuCisJCSAqCisJCSAqIFRoZSBjYXB0dXJlIGxlbmd0aCBpcyBoZWFkZXIucmxlbiBhbmQgdGhlIGJ5dGUgc3R1ZmZpbmcgZm9yIGFsaWdubWVudCB3aWxsIGJlIGRyb3BwZWQKKwkJICogaWYgdGhlIGNhcHR1cmUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGFja2V0IGxlbmd0aC4KKwkJICovCisJCWlmIChwLT5saW5rdHlwZSA9PSBETFRfRVJGKSB7CisJCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKSArIGRhZ19yZWNvcmRfc2l6ZTsKKwkJCWNhcGxlbiA9IHJsZW47CisJCQlzd2l0Y2ggKChoZWFkZXItPnR5cGUgJiAweDdmKSkgeworCQkJY2FzZSBUWVBFX01DX0FBTDU6CisJCQljYXNlIFRZUEVfTUNfQVRNOgorCQkJY2FzZSBUWVBFX01DX0hETEM6CisJCQljYXNlIFRZUEVfTUNfUkFXX0NIQU5ORUw6CisJCQljYXNlIFRZUEVfTUNfUkFXOgorCQkJY2FzZSBUWVBFX01DX0FBTDI6CisJCQljYXNlIFRZUEVfQ09MT1JfTUNfSERMQ19QT1M6CisJCQkJcGFja2V0X2xlbiArPSA0OyAvKiBNQyBoZWFkZXIgKi8KKwkJCQlicmVhazsKKworCQkJY2FzZSBUWVBFX0NPTE9SX0hBU0hfRVRIOgorCQkJY2FzZSBUWVBFX0RTTV9DT0xPUl9FVEg6CisJCQljYXNlIFRZUEVfQ09MT1JfRVRIOgorCQkJY2FzZSBUWVBFX0VUSDoKKwkJCQlwYWNrZXRfbGVuICs9IDI7IC8qIEVUSCBoZWFkZXIgKi8KKwkJCQlicmVhazsKKwkJCX0gLyogc3dpdGNoIHR5cGUgKi8KKworCQkJLyogSW5jbHVkZSBFUkYgZXh0ZW5zaW9uIGhlYWRlcnMgKi8KKwkJCXBhY2tldF9sZW4gKz0gKDggKiBudW1fZXh0X2hkcik7CisKKwkJCWlmIChjYXBsZW4gPiBwYWNrZXRfbGVuKSB7CisJCQkJY2FwbGVuID0gcGFja2V0X2xlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE90aGVyIGtpbmQgb2YgZW5jYXBzdWxhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGhlYWRlciBUeXBlICovCisKKwkJCS8qIFNraXAgb3ZlciBnZW5lcmljIEVSRiBoZWFkZXIgKi8KKwkJCWRwICs9IGRhZ19yZWNvcmRfc2l6ZTsKKwkJCS8qIFNraXAgb3ZlciBleHRlbnNpb24gaGVhZGVycyAqLworCQkJZHAgKz0gOCAqIG51bV9leHRfaGRyOworCQkJCisJCQlzd2l0Y2goKGhlYWRlci0+dHlwZSAmIDB4N2YpKSB7CisJCQljYXNlIFRZUEVfQVRNOgorCQkJY2FzZSBUWVBFX0FBTDU6CisJCQkJaWYgKGhlYWRlci0+dHlwZSA9PSBUWVBFX0FBTDUpIHsKKwkJCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7CisJCQkJCWNhcGxlbiA9IHJsZW4gLSBkYWdfcmVjb3JkX3NpemU7CisJCQkJfQorCQkJY2FzZSBUWVBFX01DX0FUTToKKwkJCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfTUNfQVRNKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW4gPSBBVE1fQ0VMTF9TSVpFOworCQkJCQlkcCs9NDsKKwkJCQl9CisJCQljYXNlIFRZUEVfTUNfQUFMNToKKwkJCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfTUNfQUFMNSkgeworCQkJCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKTsKKwkJCQkJY2FwbGVuID0gcmxlbiAtIGRhZ19yZWNvcmRfc2l6ZSAtIDQ7CisJCQkJCWRwKz00OworCQkJCX0KKwkJCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfQVRNKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW4gPSBBVE1fQ0VMTF9TSVpFOworCQkJCX0KKwkJCQlpZiAocC0+bGlua3R5cGUgPT0gRExUX1NVTkFUTSkgeworCQkJCQlzdHJ1Y3Qgc3VuYXRtX2hkciAqc3VuYXRtID0gKHN0cnVjdCBzdW5hdG1faGRyICopZHA7CisJCQkJCXVuc2lnbmVkIGxvbmcgcmF3YXRtOworCQkJCQkKKwkJCQkJcmF3YXRtID0gbnRvaGwoKigodW5zaWduZWQgbG9uZyAqKWRwKSk7CisJCQkJCXN1bmF0bS0+dmNpID0gaHRvbnMoKHJhd2F0bSA+PiAgNCkgJiAweGZmZmYpOworCQkJCQlzdW5hdG0tPnZwaSA9IChyYXdhdG0gPj4gMjApICYgMHgwMGZmOworCQkJCQlzdW5hdG0tPmZsYWdzID0gKChoZWFkZXItPmZsYWdzLmlmYWNlICYgMSkgPyAweDgwIDogMHgwMCkgfCAKKwkJCQkJCSgoc3VuYXRtLT52cGkgPT0gMCAmJiBzdW5hdG0tPnZjaSA9PSBodG9ucyg1KSkgPyA2IDoKKwkJCQkJCSAoKHN1bmF0bS0+dnBpID09IDAgJiYgc3VuYXRtLT52Y2kgPT0gaHRvbnMoMTYpKSA/IDUgOiAKKwkJCQkJCSAgKChkcFtBVE1fSERSX1NJWkVdID09IDB4YWEgJiYKKwkJCQkJCSAgICBkcFtBVE1fSERSX1NJWkUrMV0gPT0gMHhhYSAmJgorCQkJCQkJICAgIGRwW0FUTV9IRFJfU0laRSsyXSA9PSAweDAzKSA/IDIgOiAxKSkpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJcGFja2V0X2xlbiAtPSBBVE1fSERSX1NJWkU7CisJCQkJCWNhcGxlbiAtPSBBVE1fSERSX1NJWkU7CisJCQkJCWRwICs9IEFUTV9IRFJfU0laRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVFlQRV9DT0xPUl9IQVNIX0VUSDoKKwkJCWNhc2UgVFlQRV9EU01fQ09MT1JfRVRIOgorCQkJY2FzZSBUWVBFX0NPTE9SX0VUSDoKKwkJCWNhc2UgVFlQRV9FVEg6CisJCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7CisJCQkJcGFja2V0X2xlbiAtPSAocGQtPmRhZ19mY3NfYml0cyA+PiAzKTsKKwkJCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplIC0gMjsKKwkJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikgeworCQkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOworCQkJCX0KKwkJCQlkcCArPSAyOworCQkJCWJyZWFrOworCisJCQljYXNlIFRZUEVfQ09MT1JfSEFTSF9QT1M6CisJCQljYXNlIFRZUEVfRFNNX0NPTE9SX0hETENfUE9TOgorCQkJY2FzZSBUWVBFX0NPTE9SX0hETENfUE9TOgorCQkJY2FzZSBUWVBFX0hETENfUE9TOgorCQkJCXBhY2tldF9sZW4gPSBudG9ocyhoZWFkZXItPndsZW4pOworCQkJCXBhY2tldF9sZW4gLT0gKHBkLT5kYWdfZmNzX2JpdHMgPj4gMyk7CisJCQkJY2FwbGVuID0gcmxlbiAtIGRhZ19yZWNvcmRfc2l6ZTsKKwkJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikgeworCQkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBUWVBFX0NPTE9SX01DX0hETENfUE9TOgorCQkJY2FzZSBUWVBFX01DX0hETEM6CisJCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7CisJCQkJcGFja2V0X2xlbiAtPSAocGQtPmRhZ19mY3NfYml0cyA+PiAzKTsKKwkJCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplIC0gNDsKKwkJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikgeworCQkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOworCQkJCX0KKwkJCQkvKiBqdW1wIHRoZSBNQ19IRExDX0hFQURFUiAqLworCQkJCWRwICs9IDQ7CisjaWZkZWYgRExUX01UUDJfV0lUSF9QSERSCisJCQkJaWYgKHAtPmxpbmt0eXBlID09IERMVF9NVFAyX1dJVEhfUEhEUikgeworCQkJCQkvKiBBZGQgdGhlIE1UUDIgUHNldWRvIEhlYWRlciAqLworCQkJCQljYXBsZW4gKz0gTVRQMl9IRFJfTEVOOworCQkJCQlwYWNrZXRfbGVuICs9IE1UUDJfSERSX0xFTjsKKwkJCQkJCisJCQkJCVRlbXBQa3RbTVRQMl9TRU5UX09GRlNFVF0gPSAwOworCQkJCQlUZW1wUGt0W01UUDJfQU5ORVhfQV9VU0VEX09GRlNFVF0gPSBNVFAyX0FOTkVYX0FfVVNFRF9VTktOT1dOOworCQkJCQkqKFRlbXBQa3QrTVRQMl9MSU5LX05VTUJFUl9PRkZTRVQpID0gKChoZWFkZXItPnJlYy5tY19oZGxjLm1jX2hlYWRlcj4+MTYpJjB4MDEpOworCQkJCQkqKFRlbXBQa3QrTVRQMl9MSU5LX05VTUJFUl9PRkZTRVQrMSkgPSAoKGhlYWRlci0+cmVjLm1jX2hkbGMubWNfaGVhZGVyPj4yNCkmMHhmZik7CisJCQkJCW1lbWNweShUZW1wUGt0K01UUDJfSERSX0xFTiwgZHAsIGNhcGxlbik7CisJCQkJCWRwID0gVGVtcFBrdDsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKworCQkJY2FzZSBUWVBFX0lQVjQ6CisJCQljYXNlIFRZUEVfSVBWNjoKKwkJCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKTsKKwkJCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplOworCQkJCWlmIChjYXBsZW4gPiBwYWNrZXRfbGVuKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW47CisJCQkJfQorCQkJCWJyZWFrOworCisJCQkvKiBUaGVzZSB0eXBlcyBoYXZlIG5vIG1hdGNoaW5nICduYXRpdmUnIERMVCwgYnV0IGNhbiBiZSB1c2VkIHdpdGggRExUX0VSRiBhYm92ZSAqLworCQkJY2FzZSBUWVBFX01DX1JBVzoKKwkJCWNhc2UgVFlQRV9NQ19SQVdfQ0hBTk5FTDoKKwkJCWNhc2UgVFlQRV9JUF9DT1VOVEVSOgorCQkJY2FzZSBUWVBFX1RDUF9GTE9XX0NPVU5URVI6CisJCQljYXNlIFRZUEVfSU5GSU5JQkFORDoKKwkJCWNhc2UgVFlQRV9SQVdfTElOSzoKKwkJCWNhc2UgVFlQRV9JTkZJTklCQU5EX0xJTks6CisJCQlkZWZhdWx0OgorCQkJCS8qIFVuaGFuZGxlZCBFUkYgdHlwZS4KKwkJCQkgKiBJZ25vcmUgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBlcnJvcgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfSAvKiBzd2l0Y2ggdHlwZSAqLworCisJCQkvKiBTa2lwIG92ZXIgZXh0ZW5zaW9uIGhlYWRlcnMgKi8KKwkJCWNhcGxlbiAtPSAoOCAqIG51bV9leHRfaGRyKTsKKworCQl9IC8qIEVSRiBlbmNhcHN1bGF0aW9uICovCisJCQorCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCisJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKIAogCQkvKiBSdW4gdGhlIHBhY2tldCBmaWx0ZXIgaWYgdGhlcmUgaXMgb25lLiAqLwogCQlpZiAoKHAtPmZjb2RlLmJmX2luc25zID09IE5VTEwpIHx8IGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIGRwLCBwYWNrZXRfbGVuLCBjYXBsZW4pKSB7Ci0KKwkJCQogCQkJLyogY29udmVydCBiZXR3ZWVuIHRpbWVzdGFtcCBmb3JtYXRzICovCiAJCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGxvbmcgdHM7CiAJCQkJCkBAIC00NTYsMTQgKzU3MiwxNCBAQAogCQkJcGNhcF9oZWFkZXIubGVuID0gcGFja2V0X2xlbjsKIAkKIAkJCS8qIENvdW50IHRoZSBwYWNrZXQuICovCi0JCQlwLT5tZC5zdGF0LnBzX3JlY3YrKzsKKwkJCXBkLT5zdGF0LnBzX3JlY3YrKzsKIAkKIAkJCS8qIENhbGwgdGhlIHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIAkJCWNhbGxiYWNrKHVzZXIsICZwY2FwX2hlYWRlciwgZHApOwogCQogCQkJLyogT25seSBjb3VudCBwYWNrZXRzIHRoYXQgcGFzcyB0aGUgZmlsdGVyLCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzdGFuZGFyZCBMaW51eCBiZWhhdmlvdXIuICovCiAJCQlwcm9jZXNzZWQrKzsKLQkJCWlmIChwcm9jZXNzZWQgPT0gY250KQorCQkJaWYgKHByb2Nlc3NlZCA9PSBjbnQgJiYgIVBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQoY250KSkKIAkJCXsKIAkJCQkvKiBSZWFjaGVkIHRoZSB1c2VyLXNwZWNpZmllZCBsaW1pdC4gKi8KIAkJCQlyZXR1cm4gY250OwpAQCAtNDg1LDIzICs2MDEsMjUgQEAKIC8qCiAgKiAgR2V0IGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSBmcm9tIHRoZSBnaXZlbiBEQUcgZGV2aWNlLiAgUGFzc2luZyBhIE5VTEwKICAqICBkZXZpY2Ugd2lsbCByZXN1bHQgaW4gYSBmYWlsdXJlLiAgVGhlIHByb21pc2MgZmxhZyBpcyBpZ25vcmVkIGJlY2F1c2UgREFHCi0gKiAgY2FyZHMgYXJlIGFsd2F5cyBwcm9taXNjdW91cy4gIFRoZSB0b19tcyBwYXJhbWV0ZXIgaXMgYWxzbyBpZ25vcmVkIGFzIGl0IGlzCi0gKiAgbm90IHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4KKyAqICBjYXJkcyBhcmUgYWx3YXlzIHByb21pc2N1b3VzLiAgVGhlIHRvX21zIHBhcmFtZXRlciBpcyB1c2VkIGluIHNldHRpbmcgdGhlCisgKiAgQVBJIHBvbGxpbmcgcGFyYW1ldGVycy4KICAqICAKICAqICBzbmFwbGVuIGlzIG5vdyBhbHNvIGlnbm9yZWQsIHVudGlsIHdlIGdldCBwZXItc3RyZWFtIHNsZW4gc3VwcG9ydC4gU2V0Ci0gKiAgc2xlbiB3aXRoIGFwcHJvcHJpdGUgREFHIHRvb2wgQkVGT1JFIHBjYXBfb3Blbl9saXZlKCkuCisgKiAgc2xlbiB3aXRoIGFwcHJvcHJpdGUgREFHIHRvb2wgQkVGT1JFIHBjYXBfYWN0aXZhdGUoKS4KICAqCiAgKiAgU2VlIGFsc28gcGNhcCgzKS4KICAqLwotcGNhcF90ICoKLWRhZ19vcGVuX2xpdmUoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZWJ1ZikKK3N0YXRpYyBpbnQgZGFnX2FjdGl2YXRlKHBjYXBfdCogaGFuZGxlKQogeworCXN0cnVjdCBwY2FwX2RhZyAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKyNpZiAwCiAJY2hhciBjb25mWzMwXTsgLyogZGFnIGNvbmZpZ3VyZSBzdHJpbmcgKi8KLQlwY2FwX3QgKmhhbmRsZTsKKyNlbmRpZgogCWNoYXIgKnM7CiAJaW50IG47CiAJZGFnaW5mX3QqIGRhZ2luZjsKIAljaGFyICogbmV3RGV2ID0gTlVMTDsKKwljaGFyICogZGV2aWNlID0gaGFuZGxlLT5vcHQuc291cmNlOwogI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCiAJdWludDMyX3QgbWluZGF0YTsKIAlzdHJ1Y3QgdGltZXZhbCBtYXh3YWl0OwpAQCAtNTA5LDQ0ICs2MjcsMzUgQEAKICNlbmRpZgogCiAJaWYgKGRldmljZSA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkZXZpY2UgaXMgTlVMTDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBOVUxMOworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRldmljZSBpcyBOVUxMOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOwogCX0KLQkvKiBBbGxvY2F0ZSBhIGhhbmRsZSBmb3IgdGhpcyBzZXNzaW9uLiAqLwogCi0JaGFuZGxlID0gbWFsbG9jKHNpemVvZigqaGFuZGxlKSk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2MgJXM6ICVzIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKIAkvKiBJbml0aWFsaXplIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgcGNhcCBzdHJ1Y3R1cmUuICovCi0JCi0JbWVtc2V0KGhhbmRsZSwgMCwgc2l6ZW9mKCpoYW5kbGUpKTsKIAogI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCiAJbmV3RGV2ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGRldmljZSkgKyAxNik7CiAJaWYgKG5ld0RldiA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBzdHJpbmcgZm9yIGRldmljZSBuYW1lOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGFsbG9jYXRlIHN0cmluZyBmb3IgZGV2aWNlIG5hbWU6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJCiAJLyogUGFyc2UgaW5wdXQgbmFtZSB0byBnZXQgZGFnIGRldmljZSBhbmQgc3RyZWFtIG51bWJlciBpZiBwcm92aWRlZCAqLwotCWlmIChkYWdfcGFyc2VfbmFtZShkZXZpY2UsIG5ld0Rldiwgc3RybGVuKGRldmljZSkgKyAxNiwgJmhhbmRsZS0+bWQuZGFnX3N0cmVhbSkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfcGFyc2VfbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZGFnX3BhcnNlX25hbWUoZGV2aWNlLCBuZXdEZXYsIHN0cmxlbihkZXZpY2UpICsgMTYsICZoYW5kbGVwLT5kYWdfc3RyZWFtKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfcGFyc2VfbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsOwogCX0KIAlkZXZpY2UgPSBuZXdEZXY7CiAKLQlpZiAoaGFuZGxlLT5tZC5kYWdfc3RyZWFtJTIpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19wYXJzZV9uYW1lOiB0eCAoZXZlbiBudW1iZXJlZCkgc3RyZWFtcyBub3Qgc3VwcG9ydGVkIGZvciBjYXB0dXJlXG4iKTsKKwlpZiAoaGFuZGxlcC0+ZGFnX3N0cmVhbSUyKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3BhcnNlX25hbWU6IHR4IChldmVuIG51bWJlcmVkKSBzdHJlYW1zIG5vdCBzdXBwb3J0ZWQgZm9yIGNhcHR1cmVcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogI2Vsc2UKIAlpZiAoc3RybmNtcChkZXZpY2UsICIvZGV2LyIsIDUpICE9IDApIHsKIAkJbmV3RGV2ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGRldmljZSkgKyA1KTsKIAkJaWYgKG5ld0RldiA9PSBOVUxMKSB7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgc3RyaW5nIGZvciBkZXZpY2UgbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgc3RyaW5nIGZvciBkZXZpY2UgbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQlzdHJjcHkobmV3RGV2LCAiL2Rldi8iKTsKQEAgLTU1Nyw0NyArNjY2LDU0IEBACiAKIAkvKiBzZXR1cCBkZXZpY2UgcGFyYW1ldGVycyAqLwogCWlmKChoYW5kbGUtPmZkID0gZGFnX29wZW4oKGNoYXIgKilkZXZpY2UpKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19vcGVuICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19vcGVuICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGZhaWw7CiAJfQogCiAjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKIAkvKiBPcGVuIHJlcXVlc3RlZCBzdHJlYW0uIENhbiBmYWlsIGlmIGFscmVhZHkgbG9ja2VkIG9yIG9uIGVycm9yICovCi0JaWYgKGRhZ19hdHRhY2hfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSwgMCwgMCkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfYXR0YWNoX3N0cmVhbTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZGFnX2F0dGFjaF9zdHJlYW0oaGFuZGxlLT5mZCwgaGFuZGxlcC0+ZGFnX3N0cmVhbSwgMCwgMCkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX2F0dGFjaF9zdHJlYW06ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbGNsb3NlOwogCX0KIAogCS8qIFNldCB1cCBkZWZhdWx0IHBvbGwgcGFyYW1ldGVycyBmb3Igc3RyZWFtCiAJICogQ2FuIGJlIG92ZXJyaWRkZW4gYnkgcGNhcF9zZXRfbm9uYmxvY2soKQogCSAqLwotCWlmIChkYWdfZ2V0X3N0cmVhbV9wb2xsKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSwKKwlpZiAoZGFnX2dldF9zdHJlYW1fcG9sbChoYW5kbGUtPmZkLCBoYW5kbGVwLT5kYWdfc3RyZWFtLAogCQkJCSZtaW5kYXRhLCAmbWF4d2FpdCwgJnBvbGwpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX2dldF9zdHJlYW1fcG9sbDogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfZ2V0X3N0cmVhbV9wb2xsOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGZhaWxkZXRhY2g7CiAJfQogCQotCS8qIEFtb3VudCBvZiBkYXRhIHRvIGNvbGxlY3QgaW4gQnl0ZXMgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzLgotCSAqIEltcG9ydGFudCBmb3IgZWZmaWNpZW5jeSwgYnV0IGNhbiBpbnRyb2R1Y2UgbGF0ZW5jeQotCSAqIGF0IGxvdyBwYWNrZXQgcmF0ZXMgaWYgdG9fbXMgbm90IHNldCEKLQkgKi8KLQltaW5kYXRhID0gNjU1MzY7CisJaWYgKGhhbmRsZS0+b3B0LmltbWVkaWF0ZSkgeworCQkvKiBDYWxsIGNhbGxiYWNrIGltbWVkaWF0ZWx5LgorCQkgKiBYWFggLSBpcyB0aGlzIHRoZSByaWdodCB3YXkgdG8gaGFuZGxlIHRoaXM/CisJCSAqLworCQltaW5kYXRhID0gMDsKKwl9IGVsc2UgeworCQkvKiBBbW91bnQgb2YgZGF0YSB0byBjb2xsZWN0IGluIEJ5dGVzIGJlZm9yZSBjYWxsaW5nIGNhbGxiYWNrcy4KKwkJICogSW1wb3J0YW50IGZvciBlZmZpY2llbmN5LCBidXQgY2FuIGludHJvZHVjZSBsYXRlbmN5CisJCSAqIGF0IGxvdyBwYWNrZXQgcmF0ZXMgaWYgdG9fbXMgbm90IHNldCEKKwkJICovCisJCW1pbmRhdGEgPSA2NTUzNjsKKwl9CiAKLQkvKiBPYmV5IHRvX21zIGlmIHN1cHBsaWVkLiBUaGlzIGlzIGEgZ29vZCBpZGVhIQorCS8qIE9iZXkgb3B0LnRpbWVvdXQgKHdhcyB0b19tcykgaWYgc3VwcGxpZWQuIFRoaXMgaXMgYSBnb29kIGlkZWEhCiAJICogUmVjb21tZW5kIDEwLTEwMG1zLiBDYWxscyB3aWxsIHRpbWUgb3V0IGV2ZW4gaWYgbm8gZGF0YSBhcnJpdmVkLgogCSAqLwotCW1heHdhaXQudHZfc2VjID0gdG9fbXMvMTAwMDsKLQltYXh3YWl0LnR2X3VzZWMgPSAodG9fbXMlMTAwMCkgKiAxMDAwOworCW1heHdhaXQudHZfc2VjID0gaGFuZGxlLT5vcHQudGltZW91dC8xMDAwOworCW1heHdhaXQudHZfdXNlYyA9IChoYW5kbGUtPm9wdC50aW1lb3V0JTEwMDApICogMTAwMDsKIAotCWlmIChkYWdfc2V0X3N0cmVhbV9wb2xsKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSwKKwlpZiAoZGFnX3NldF9zdHJlYW1fcG9sbChoYW5kbGUtPmZkLCBoYW5kbGVwLT5kYWdfc3RyZWFtLAogCQkJCW1pbmRhdGEsICZtYXh3YWl0LCAmcG9sbCkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfc2V0X3N0cmVhbV9wb2xsOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zZXRfc3RyZWFtX3BvbGw6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbGRldGFjaDsKIAl9CiAJCQogI2Vsc2UKLQlpZigoaGFuZGxlLT5tZC5kYWdfbWVtX2Jhc2UgPSBkYWdfbW1hcChoYW5kbGUtPmZkKSkgPT0gTUFQX0ZBSUxFRCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCJkYWdfbW1hcCAlczogJXNcbiIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCWlmKChoYW5kbGVwLT5kYWdfbWVtX2Jhc2UgPSBkYWdfbW1hcChoYW5kbGUtPmZkKSkgPT0gTUFQX0ZBSUxFRCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiZGFnX21tYXAgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsY2xvc2U7CiAJfQogCkBAIC02MTEsMjggKzcyNywyOCBAQAogCS8qIHNldCB0aGUgY2FyZCBzbmFwIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIHNuYXBsZW4gcGFyYW1ldGVyICovCiAJLyogVGhpcyBpcyBhIHJlYWxseSBiYWQgaWRlYSwgYXMgZGlmZmVyZW50IGNhcmRzIGhhdmUgZGlmZmVyZW50CiAJICogdmFsaWQgc2xlbiByYW5nZXMuIFNob3VsZCBmaXggaW4gQ29uZmlnIEFQSS4gKi8KLQlpZiAoc25hcGxlbiA9PSAwIHx8IHNuYXBsZW4gPiBNQVhfREFHX1NOQVBMRU4pIHsKLQkJc25hcGxlbiA9IE1BWF9EQUdfU05BUExFTjsKKwlpZiAoaGFuZGxlLT5zbmFwc2hvdCA9PSAwIHx8IGhhbmRsZS0+c25hcHNob3QgPiBNQVhfREFHX1NOQVBMRU4pIHsKKwkJaGFuZGxlLT5zbmFwc2hvdCA9IE1BWF9EQUdfU05BUExFTjsKIAl9IGVsc2UgaWYgKHNuYXBsZW4gPCBNSU5fREFHX1NOQVBMRU4pIHsKLQkJc25hcGxlbiA9IE1JTl9EQUdfU05BUExFTjsKKwkJaGFuZGxlLT5zbmFwc2hvdCA9IE1JTl9EQUdfU05BUExFTjsKIAl9CiAJLyogc25hcCBsZW4gaGFzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNCAqLwogCXNucHJpbnRmKGNvbmYsIDMwLCAidmFybGVuIHNsZW49JWQiLCAoc25hcGxlbiArIDMpICYgfjMpOyAKIAogCWlmKGRhZ19jb25maWd1cmUoaGFuZGxlLT5mZCwgY29uZikgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsImRhZ19jb25maWd1cmUgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsImRhZ19jb25maWd1cmUgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsZGV0YWNoOwogCX0KICNlbmRpZgkKIAkKICNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQotCWlmKGRhZ19zdGFydF9zdHJlYW0oaGFuZGxlLT5mZCwgaGFuZGxlLT5tZC5kYWdfc3RyZWFtKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zdGFydF9zdHJlYW0gJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpZihkYWdfc3RhcnRfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZXAtPmRhZ19zdHJlYW0pIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zdGFydF9zdHJlYW0gJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsZGV0YWNoOwogCX0KICNlbHNlCiAJaWYoZGFnX3N0YXJ0KGhhbmRsZS0+ZmQpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3N0YXJ0ICVzOiAlc1xuIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3N0YXJ0ICVzOiAlc1xuIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbGNsb3NlOwogCX0KICNlbmRpZiAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLwpAQCAtNjQyLDQyICs3NTgsNjAgQEAKIAkgKiBpbml0aWFsaXplZCB0byB6ZXJvIG9uIHN0YXJ0dXAsIGl0IHdvbid0IGdpdmUgeW91CiAJICogYSBjb21waWxlciB3YXJuaW5nIGlmIHlvdSBtYWtlIHRoaXMgbWlzdGFrZSEKIAkgKi8KLQloYW5kbGUtPm1kLmRhZ19tZW1fYm90dG9tID0gMDsKLQloYW5kbGUtPm1kLmRhZ19tZW1fdG9wID0gMDsKLQloYW5kbGUtPm1kLmRhZ19mY3NfYml0cyA9IDMyOworCWhhbmRsZXAtPmRhZ19tZW1fYm90dG9tID0gMDsKKwloYW5kbGVwLT5kYWdfbWVtX3RvcCA9IDA7CiAKLQkvKiBRdWVyeSB0aGUgY2FyZCBmaXJzdCBmb3Igc3BlY2lhbCBjYXNlcy4gKi8KKwkvKgorCSAqIEZpbmQgb3V0IGhvdyBtYW55IEZDUyBiaXRzIHdlIHNob3VsZCBzdHJpcC4KKwkgKiBGaXJzdCwgcXVlcnkgdGhlIGNhcmQgdG8gc2VlIGlmIGl0IHN0cmlwcyB0aGUgRkNTLgorCSAqLwogCWRhZ2luZiA9IGRhZ19pbmZvKGhhbmRsZS0+ZmQpOwotCWlmICgoMHg0MjAwID09IGRhZ2luZi0+ZGV2aWNlX2NvZGUpIHx8ICgweDQyMzAgPT0gZGFnaW5mLT5kZXZpY2VfY29kZSkpCi0JeworCWlmICgoMHg0MjAwID09IGRhZ2luZi0+ZGV2aWNlX2NvZGUpIHx8ICgweDQyMzAgPT0gZGFnaW5mLT5kZXZpY2VfY29kZSkpCXsKIAkJLyogREFHIDQuMlMgYW5kIDQuMjNTIGFscmVhZHkgc3RyaXAgdGhlIEZDUy4gIFN0cmlwcGluZyB0aGUgZmluYWwgd29yZCBhZ2FpbiB0cnVuY2F0ZXMgdGhlIHBhY2tldC4gKi8KLQkJaGFuZGxlLT5tZC5kYWdfZmNzX2JpdHMgPSAwOwotCX0KKwkJaGFuZGxlcC0+ZGFnX2Zjc19iaXRzID0gMDsKIAotCS8qIFRoZW4gYWxsb3cgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJpZGUuICovCi0JaWYgKChzID0gZ2V0ZW52KCJFUkZfRkNTX0JJVFMiKSkgIT0gTlVMTCkgewotCQlpZiAoKG4gPSBhdG9pKHMpKSA9PSAwIHx8IG4gPT0gMTZ8fCBuID09IDMyKSB7Ci0JCQloYW5kbGUtPm1kLmRhZ19mY3NfYml0cyA9IG47Ci0JCX0gZWxzZSB7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSJwY2FwX29wZW5fbGl2ZSAlczogYmFkIEVSRl9GQ1NfQklUUyB2YWx1ZSAoJWQpIGluIGVudmlyb25tZW50XG4iLCBkZXZpY2UsIG4pOwotCQkJZ290byBmYWlsc3RvcDsKKwkJLyogTm90ZSB0aGF0IG5vIEZDUyB3aWxsIGJlIHN1cHBsaWVkLiAqLworCQloYW5kbGUtPmxpbmt0eXBlX2V4dCA9IExUX0ZDU19EQVRBTElOS19FWFQoMCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3RhcnQgb3V0IGFzc3VtaW5nIGl0J3MgMzIgYml0cy4KKwkJICovCisJCWhhbmRsZXAtPmRhZ19mY3NfYml0cyA9IDMyOworCisJCS8qIEFsbG93IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJyaWRlLiAqLworCQlpZiAoKHMgPSBnZXRlbnYoIkVSRl9GQ1NfQklUUyIpKSAhPSBOVUxMKSB7CisJCQlpZiAoKG4gPSBhdG9pKHMpKSA9PSAwIHx8IG4gPT0gMTYgfHwgbiA9PSAzMikgeworCQkJCWhhbmRsZXAtPmRhZ19mY3NfYml0cyA9IG47CisJCQl9IGVsc2UgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkicGNhcF9hY3RpdmF0ZSAlczogYmFkIEVSRl9GQ1NfQklUUyB2YWx1ZSAoJWQpIGluIGVudmlyb25tZW50XG4iLCBkZXZpY2UsIG4pOworCQkJCWdvdG8gZmFpbHN0b3A7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBEaWQgdGhlIHVzZXIgcmVxdWVzdCB0aGF0IHRoZXkgbm90IGJlIHN0cmlwcGVkPworCQkgKi8KKwkJaWYgKChzID0gZ2V0ZW52KCJFUkZfRE9OVF9TVFJJUF9GQ1MiKSkgIT0gTlVMTCkgeworCQkJLyogWWVzLiAgTm90ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZQorCQkJICAgc3VwcGxpZWQuICovCisJCQloYW5kbGUtPmxpbmt0eXBlX2V4dCA9IExUX0ZDU19EQVRBTElOS19FWFQoaGFuZGxlcC0+ZGFnX2Zjc19iaXRzLzE2KTsKKworCQkJLyogQW5kIGRvbid0IHN0cmlwIHRoZW0uICovCisJCQloYW5kbGVwLT5kYWdfZmNzX2JpdHMgPSAwOwogCQl9CiAJfQogCi0JaGFuZGxlLT5zbmFwc2hvdAk9IHNuYXBsZW47Ci0JaGFuZGxlLT5tZC5kYWdfdGltZW91dAk9IHRvX21zOworCWhhbmRsZXAtPmRhZ190aW1lb3V0CT0gaGFuZGxlLT5vcHQudGltZW91dDsKIAogCWhhbmRsZS0+bGlua3R5cGUgPSAtMTsKLQlpZiAoZGFnX2dldF9kYXRhbGluayhoYW5kbGUpIDwgMCkgewotCQlzdHJjcHkoZWJ1ZiwgaGFuZGxlLT5lcnJidWYpOworCWlmIChkYWdfZ2V0X2RhdGFsaW5rKGhhbmRsZSkgPCAwKQogCQlnb3RvIGZhaWxzdG9wOwotCX0KIAkKIAloYW5kbGUtPmJ1ZnNpemUgPSAwOwogCiAJaWYgKG5ld19wY2FwX2RhZyhoYW5kbGUpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibmV3X3BjYXBfZGFnICVzOiAlc1xuIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibmV3X3BjYXBfZGFnICVzOiAlc1xuIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbHN0b3A7CiAJfQogCkBAIC02OTgsMTA1ICs4MzIsMTc0IEBACiAJaGFuZGxlLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CiAJaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IGRhZ19zZXRub25ibG9jazsKIAloYW5kbGUtPnN0YXRzX29wID0gZGFnX3N0YXRzOwotCWhhbmRsZS0+Y2xvc2Vfb3AgPSBkYWdfcGxhdGZvcm1fY2xvc2U7Ci0JaGFuZGxlLT5tZC5zdGF0LnBzX2Ryb3AgPSAwOwotCWhhbmRsZS0+bWQuc3RhdC5wc19yZWN2ID0gMDsKLQlyZXR1cm4gaGFuZGxlOworCWhhbmRsZS0+Y2xlYW51cF9vcCA9IGRhZ19wbGF0Zm9ybV9jbGVhbnVwOworCWhhbmRsZXAtPnN0YXQucHNfZHJvcCA9IDA7CisJaGFuZGxlcC0+c3RhdC5wc19yZWN2ID0gMDsKKwloYW5kbGVwLT5zdGF0LnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7CiAKICNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSSAKIGZhaWxzdG9wOgotCWlmIChoYW5kbGUgIT0gTlVMTCkgewotCQlpZiAoZGFnX3N0b3Bfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSkgPCAwKQotCQkJZnByaW50ZihzdGRlcnIsImRhZ19zdG9wX3N0cmVhbTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGRhZ19zdG9wX3N0cmVhbShoYW5kbGUtPmZkLCBoYW5kbGVwLT5kYWdfc3RyZWFtKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImRhZ19zdG9wX3N0cmVhbTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAJfQogCQogZmFpbGRldGFjaDoKLQlpZiAoaGFuZGxlICE9IE5VTEwpIHsKLQkJaWYgKGRhZ19kZXRhY2hfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSkgPCAwKQotCQkJZnByaW50ZihzdGRlcnIsImRhZ19kZXRhY2hfc3RyZWFtOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0jZWxzZQkKKwlpZiAoZGFnX2RldGFjaF9zdHJlYW0oaGFuZGxlLT5mZCwgaGFuZGxlcC0+ZGFnX3N0cmVhbSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2RldGFjaF9zdHJlYW06ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworI2Vsc2UKIGZhaWxzdG9wOgotCWlmIChoYW5kbGUgIT0gTlVMTCkgewotCQlpZiAoZGFnX3N0b3AocC0+ZmQpIDwgMCkKLQkJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0JfQorCWlmIChkYWdfc3RvcChoYW5kbGUtPmZkKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KIAkKIGZhaWxjbG9zZToKLQlpZiAoaGFuZGxlICE9IE5VTEwpIHsKLQkJaWYgKGRhZ19jbG9zZShoYW5kbGUtPmZkKSA8IDApCi0JCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2Nsb3NlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JaWYgKGhhbmRsZSAhPSBOVUxMKQotCQlkZWxldGVfcGNhcF9kYWcoaGFuZGxlKTsKLQkKKwlpZiAoZGFnX2Nsb3NlKGhhbmRsZS0+ZmQpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsImRhZ19jbG9zZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJZGVsZXRlX3BjYXBfZGFnKGhhbmRsZSk7CisKIGZhaWw6CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CiAJaWYgKG5ld0RldiAhPSBOVUxMKSB7CiAJCWZyZWUoKGNoYXIgKiluZXdEZXYpOwogCX0KLQlpZiAoaGFuZGxlICE9IE5VTEwpIHsKLQkJLyoKLQkJICogR2V0IHJpZCBvZiBhbnkgbGluay1sYXllciB0eXBlIGxpc3Qgd2UgYWxsb2NhdGVkLgotCQkgKi8KLQkJaWYgKGhhbmRsZS0+ZGx0X2xpc3QgIT0gTlVMTCkgewotCQkJZnJlZShoYW5kbGUtPmRsdF9saXN0KTsKLQkJfQotCQlmcmVlKGhhbmRsZSk7Ci0JfQogCi0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIFBDQVBfRVJST1I7Cit9CisKK3BjYXBfdCAqZGFnX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYsIGludCAqaXNfb3VycykKK3sKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICpjcGVuZDsKKwlsb25nIGRldm51bTsKKwlwY2FwX3QgKnA7CisjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKKwlsb25nIHN0cmVhbSA9IDA7CisjZW5kaWYKKworCS8qIERvZXMgdGhpcyBsb29rIGxpa2UgYSBEQUcgZGV2aWNlPyAqLworCWNwID0gc3RycmNocihkZXZpY2UsICcvJyk7CisJaWYgKGNwID09IE5VTEwpCisJCWNwID0gZGV2aWNlOworCS8qIERvZXMgaXQgYmVnaW4gd2l0aCAiZGFnIj8gKi8KKwlpZiAoc3RybmNtcChjcCwgImRhZyIsIDMpICE9IDApIHsKKwkJLyogTm9wZSwgZG9lc24ndCBiZWdpbiB3aXRoICJkYWciICovCisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIFllcyAtIGlzICJkYWciIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIGZyb20gMCB0byBEQUdfTUFYX0JPQVJEUy0xICovCisJY3AgKz0gMzsKKwlkZXZudW0gPSBzdHJ0b2woY3AsICZjcGVuZCwgMTApOworI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCisJaWYgKCpjcGVuZCA9PSAnOicpIHsKKwkJLyogRm9sbG93ZWQgYnkgYSBzdHJlYW0gbnVtYmVyLiAqLworCQlzdHJlYW0gPSBzdHJ0b2woKytjcGVuZCwgJmNwZW5kLCAxMCk7CisJfQorI2VuZGlmCisJaWYgKGNwZW5kID09IGNwIHx8ICpjcGVuZCAhPSAnXDAnKSB7CisJCS8qIE5vdCBmb2xsb3dlZCBieSBhIG51bWJlci4gKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGRldm51bSA8IDAgfHwgZGV2bnVtID49IERBR19NQVhfQk9BUkRTKSB7CisJCS8qIEZvbGxvd2VkIGJ5IGEgbm9uLXZhbGlkIG51bWJlci4gKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKKwlpZiAoc3RyZWFtIDwwIHx8IHN0cmVhbSA+PSBEQUdfU1RSRUFNX01BWCkgeworCQkvKiBGb2xsb3dlZCBieSBhIG5vbi12YWxpZCBzdHJlYW0gbnVtYmVyLiAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgorCisJLyogT0ssIGl0J3MgcHJvYmFibHkgb3Vycy4gKi8KKwkqaXNfb3VycyA9IDE7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kYWcpKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXAtPmFjdGl2YXRlX29wID0gZGFnX2FjdGl2YXRlOworCXJldHVybiBwOwogfQogCiBzdGF0aWMgaW50CiBkYWdfc3RhdHMocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykgeworCXN0cnVjdCBwY2FwX2RhZyAqcGQgPSBwLT5wcml2OworCiAJLyogVGhpcyBuZWVkcyB0byBiZSBmaWxsZWQgb3V0IGNvcnJlY3RseS4gIEhvcGVmdWxseSBhIGRhZ2FwaSBjYWxsIHdpbGwKIAkJIHByb3ZpZGUgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4KIAkqLwotCS8qcC0+bWQuc3RhdC5wc19yZWN2ID0gMDsqLwotCS8qcC0+bWQuc3RhdC5wc19kcm9wID0gMDsqLworCS8qcGQtPnN0YXQucHNfcmVjdiA9IDA7Ki8KKwkvKnBkLT5zdGF0LnBzX2Ryb3AgPSAwOyovCiAJCi0JKnBzID0gcC0+bWQuc3RhdDsKKwkqcHMgPSBwZC0+c3RhdDsKICAKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIFNpbXBseSBzdWJtaXQgYWxsIHBvc3NpYmxlIGRhZyBuYW1lcyBhcyBjYW5kaWRhdGVzLgotICogcGNhcF9hZGRfaWYoKSBpbnRlcm5hbGx5IHRlc3RzIGVhY2ggY2FuZGlkYXRlIHdpdGggcGNhcF9vcGVuX2xpdmUoKSwKLSAqIHNvIGFueSBub24tZXhpc3RlbnQgZGV2aWNlcyBhcmUgZHJvcHBlZC4KLSAqIEZvciAyLjUgdHJ5IGFsbCByeCBzdHJlYW0gbmFtZXMgYXMgd2VsbC4KKyAqIFByZXZpb3VzbHkgd2UganVzdCBnZW5lcmF0ZWQgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBuYW1lcyBhbmQgbGV0CisgKiBwY2FwX2FkZF9pZigpIGF0dGVtcHQgdG8gb3BlbiBlYWNoIG9uZSwgYnV0IHdpdGggc3RyZWFtcyB0aGlzIGFkZHMgdXAKKyAqIHRvIDgxIHBvc3NpYmlsaXRpZXMgd2hpY2ggaXMgaW5lZmZpY2llbnQuCisgKgorICogU2luY2Ugd2Uga25vdyBtb3JlIGFib3V0IHRoZSBkZXZpY2VzIHdlIGNhbiBwcnVuZSB0aGUgdHJlZSBoZXJlLgorICogcGNhcF9hZGRfaWYoKSB3aWxsIHN0aWxsIHJldGVzdCBlYWNoIGRldmljZSBidXQgdGhlIHRvdGFsIG51bWJlciBvZgorICogb3BlbiBhdHRlbXB0cyB3aWxsIHN0aWxsIGJlIG11Y2ggbGVzcyB0aGFuIHRoZSBuYWl2ZSBhcHByb2FjaC4KICAqLwogaW50Ci1kYWdfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1ZikKK2RhZ19maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKQogewogCWNoYXIgbmFtZVsxMl07CS8qIFhYWCAtIHBpY2sgYSBzaXplICovCiAJaW50IHJldCA9IDA7CiAJaW50IGM7CisJY2hhciBkYWduYW1lW0RBR05BTUVfQlVGU0laRV07CisJaW50IGRhZ3N0cmVhbTsKKwlpbnQgZGFnZmQ7CiAKLQkvKiBUcnkgYWxsIHRoZSBEQUdzIDAtOSAqLwotCWZvciAoYyA9IDA7IGMgPCA5OyBjKyspIHsKKwkvKiBUcnkgYWxsIHRoZSBEQUdzIDAtREFHX01BWF9CT0FSRFMgKi8KKwlmb3IgKGMgPSAwOyBjIDwgREFHX01BWF9CT0FSRFM7IGMrKykgewogCQlzbnByaW50ZihuYW1lLCAxMiwgImRhZyVkIiwgYyk7Ci0JCWlmIChwY2FwX2FkZF9pZihkZXZsaXN0cCwgbmFtZSwgMCwgTlVMTCwgZXJyYnVmKSA9PSAtMSkgewotCQkJLyoKLQkJCSAqIEZhaWx1cmUuCi0JCQkgKi8KLQkJCXJldCA9IC0xOwotCQl9Ci0jaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKKwkJaWYgKC0xID09IGRhZ19wYXJzZV9uYW1lKG5hbWUsIGRhZ25hbWUsIERBR05BTUVfQlVGU0laRSwgJmRhZ3N0cmVhbSkpCiAJCXsKLQkJCWludCBzdHJlYW07Ci0JCQlmb3Ioc3RyZWFtPTA7c3RyZWFtPDE2O3N0cmVhbSs9MikgewotCQkJCXNucHJpbnRmKG5hbWUsICAxMCwgImRhZyVkOiVkIiwgYywgc3RyZWFtKTsKLQkJCQlpZiAocGNhcF9hZGRfaWYoZGV2bGlzdHAsIG5hbWUsIDAsIE5VTEwsIGVycmJ1ZikgPT0gLTEpIHsKLQkJCQkJLyoKLQkJCQkJICogRmFpbHVyZS4KLQkJCQkJICovCi0JCQkJCXJldCA9IC0xOwotCQkJCX0KLQkJCX0JCQkJCisJCQlyZXR1cm4gLTE7CiAJCX0KKwkJaWYgKCAoZGFnZmQgPSBkYWdfb3BlbihkYWduYW1lKSkgPj0gMCApIHsKKwkJCWlmIChwY2FwX2FkZF9pZihkZXZsaXN0cCwgbmFtZSwgMCwgTlVMTCwgZXJyYnVmKSA9PSAtMSkgeworCQkJCS8qCisJCQkJICogRmFpbHVyZS4KKwkJCQkgKi8KKwkJCQlyZXQgPSAtMTsKKwkJCX0KKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCQkJeworCQkJCWludCBzdHJlYW0sIHJ4c3RyZWFtczsKKwkJCQlyeHN0cmVhbXMgPSBkYWdfcnhfZ2V0X3N0cmVhbV9jb3VudChkYWdmZCk7CisJCQkJZm9yKHN0cmVhbT0wO3N0cmVhbTxEQUdfU1RSRUFNX01BWDtzdHJlYW0rPTIpIHsKKwkJCQkJaWYgKDAgPT0gZGFnX2F0dGFjaF9zdHJlYW0oZGFnZmQsIHN0cmVhbSwgMCwgMCkpIHsKKwkJCQkJCWRhZ19kZXRhY2hfc3RyZWFtKGRhZ2ZkLCBzdHJlYW0pOworCisJCQkJCQlzbnByaW50ZihuYW1lLCAgMTAsICJkYWclZDolZCIsIGMsIHN0cmVhbSk7CisJCQkJCQlpZiAocGNhcF9hZGRfaWYoZGV2bGlzdHAsIG5hbWUsIDAsIE5VTEwsIGVycmJ1ZikgPT0gLTEpIHsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIEZhaWx1cmUuCisJCQkJCQkJICovCisJCQkJCQkJcmV0ID0gLTE7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCXJ4c3RyZWFtcy0tOworCQkJCQkJaWYocnhzdHJlYW1zIDw9IDApIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0JCQkJCisJCQl9CiAjZW5kaWYgIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCisJCQlkYWdfY2xvc2UoZGFnZmQpOworCQl9CisKIAl9CiAJcmV0dXJuIChyZXQpOwogfQpAQCAtODIyLDggKzEwMjUsNiBAQAogCWlmIChpbnN0YWxsX2JwZl9wcm9ncmFtKHAsIGZwKSA8IDApCiAJCXJldHVybiAtMTsKIAotCXAtPm1kLnVzZV9icGYgPSAwOwotCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtODM4LDExICsxMDM5LDEzIEBACiBzdGF0aWMgaW50CiBkYWdfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKIHsKKwlzdHJ1Y3QgcGNhcF9kYWcgKnBkID0gcC0+cHJpdjsKKwogCS8qCiAJICogU2V0IG5vbi1ibG9ja2luZyBtb2RlIG9uIHRoZSBGRC4KIAkgKiBYWFggLSBpcyB0aGF0IG5lY2Vzc2FyeT8gIElmIG5vdCwgZG9uJ3QgYm90aGVyIGNhbGxpbmcgaXQsCiAJICogYW5kIGhhdmUgYSAiZGFnX2dldG5vbmJsb2NrKCkiIGZ1bmN0aW9uIHRoYXQgbG9va3MgYXQKLQkgKiAicC0+bWQuZGFnX29mZnNldF9mbGFncyIuCisJICogInBkLT5kYWdfb2Zmc2V0X2ZsYWdzIi4KIAkgKi8KIAlpZiAocGNhcF9zZXRub25ibG9ja19mZChwLCBub25ibG9jaywgZXJyYnVmKSA8IDApCiAJCXJldHVybiAoLTEpOwpAQCAtODUyLDcgKzEwNTUsNyBAQAogCQlzdHJ1Y3QgdGltZXZhbCBtYXh3YWl0OwogCQlzdHJ1Y3QgdGltZXZhbCBwb2xsOwogCQkKLQkJaWYgKGRhZ19nZXRfc3RyZWFtX3BvbGwocC0+ZmQsIHAtPm1kLmRhZ19zdHJlYW0sCisJCWlmIChkYWdfZ2V0X3N0cmVhbV9wb2xsKHAtPmZkLCBwZC0+ZGFnX3N0cmVhbSwKIAkJCQkJJm1pbmRhdGEsICZtYXh3YWl0LCAmcG9sbCkgPCAwKSB7CiAJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfZ2V0X3N0cmVhbV9wb2xsOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIC0xOwpAQCAtODY3LDcgKzEwNzAsNyBAQAogCQllbHNlCiAJCQltaW5kYXRhID0gNjU1MzY7CiAJCQotCQlpZiAoZGFnX3NldF9zdHJlYW1fcG9sbChwLT5mZCwgcC0+bWQuZGFnX3N0cmVhbSwKKwkJaWYgKGRhZ19zZXRfc3RyZWFtX3BvbGwocC0+ZmQsIHBkLT5kYWdfc3RyZWFtLAogCQkJCQltaW5kYXRhLCAmbWF4d2FpdCwgJnBvbGwpIDwgMCkgewogCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3NldF9zdHJlYW1fcG9sbDogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAtMTsKQEAgLTg3NSw5ICsxMDc4LDkgQEAKIAl9CiAjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KIAlpZiAobm9uYmxvY2spIHsKLQkJcC0+bWQuZGFnX29mZnNldF9mbGFncyB8PSBEQUdGX05PTkJMT0NLOworCQlwZC0+ZGFnX29mZnNldF9mbGFncyB8PSBEQUdGX05PTkJMT0NLOwogCX0gZWxzZSB7Ci0JCXAtPm1kLmRhZ19vZmZzZXRfZmxhZ3MgJj0gfkRBR0ZfTk9OQkxPQ0s7CisJCXBkLT5kYWdfb2Zmc2V0X2ZsYWdzICY9IH5EQUdGX05PTkJMT0NLOwogCX0KIAlyZXR1cm4gKDApOwogfQpAQCAtODg1LDcgKzEwODgsOCBAQAogc3RhdGljIGludAogZGFnX2dldF9kYXRhbGluayhwY2FwX3QgKnApCiB7Ci0JaW50IGluZGV4PTA7CisJc3RydWN0IHBjYXBfZGFnICpwZCA9IHAtPnByaXY7CisJaW50IGluZGV4PTAsIGRsdF9pbmRleD0wOwogCXVpbnQ4X3QgdHlwZXNbMjU1XTsKIAogCW1lbXNldCh0eXBlcywgMCwgMjU1KTsKQEAgLTg5Nyw3ICsxMTAxLDE2IEBACiAKIAlwLT5saW5rdHlwZSA9IDA7CiAKLSNpZmRlZiBIQVZFX0RBR19HRVRfRVJGX1RZUEVTCisjaWZkZWYgSEFWRV9EQUdfR0VUX1NUUkVBTV9FUkZfVFlQRVMKKwkvKiBHZXQgbGlzdCBvZiBwb3NzaWJsZSBFUkYgdHlwZXMgZm9yIHRoaXMgY2FyZCAqLworCWlmIChkYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMocC0+ZmQsIHBkLT5kYWdfc3RyZWFtLCB0eXBlcywgMjU1KSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwgImRhZ19nZXRfc3RyZWFtX2VyZl90eXBlczogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOwkJCisJfQorCQorCXdoaWxlICh0eXBlc1tpbmRleF0pIHsKKworI2VsaWYgZGVmaW5lZCBIQVZFX0RBR19HRVRfRVJGX1RZUEVTCiAJLyogR2V0IGxpc3Qgb2YgcG9zc2libGUgRVJGIHR5cGVzIGZvciB0aGlzIGNhcmQgKi8KIAlpZiAoZGFnX2dldF9lcmZfdHlwZXMocC0+ZmQsIHR5cGVzLCAyNTUpIDwgMCkgewogCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAiZGFnX2dldF9lcmZfdHlwZXM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwpAQCAtOTExLDMxICsxMTI0LDI2IEBACiAKIAl7CiAjZW5kaWYKLQkJc3dpdGNoKHR5cGVzW2luZGV4XSkgeworCQlzd2l0Y2goKHR5cGVzW2luZGV4XSAmIDB4N2YpKSB7CiAKIAkJY2FzZSBUWVBFX0hETENfUE9TOgotI2lmZGVmIFRZUEVfQ09MT1JfSERMQ19QT1MKIAkJY2FzZSBUWVBFX0NPTE9SX0hETENfUE9TOgotI2VuZGlmCi0jaWZkZWYgVFlQRV9EU01fQ09MT1JfSERMQ19QT1MKIAkJY2FzZSBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUzoKLSNlbmRpZgorCQljYXNlIFRZUEVfQ09MT1JfSEFTSF9QT1M6CisKIAkJCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7Ci0JCQkJcC0+ZGx0X2xpc3RbaW5kZXgrK10gPSBETFRfQ0hETEM7Ci0JCQkJcC0+ZGx0X2xpc3RbaW5kZXgrK10gPSBETFRfUFBQX1NFUklBTDsKLQkJCQlwLT5kbHRfbGlzdFtpbmRleCsrXSA9IERMVF9GUkVMQVk7CisJCQkJcC0+ZGx0X2xpc3RbZGx0X2luZGV4KytdID0gRExUX0NIRExDOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9QUFBfU0VSSUFMOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9GUkVMQVk7CiAJCQl9CiAJCQlpZighcC0+bGlua3R5cGUpCiAJCQkJcC0+bGlua3R5cGUgPSBETFRfQ0hETEM7CiAJCQlicmVhazsKIAogCQljYXNlIFRZUEVfRVRIOgotI2lmZGVmIFRZUEVfQ09MT1JfRVRICiAJCWNhc2UgVFlQRV9DT0xPUl9FVEg6Ci0jZW5kaWYKLSNpZmRlZiBUWVBFX0RTTV9DT0xPUl9FVEgKIAkJY2FzZSBUWVBFX0RTTV9DT0xPUl9FVEg6Ci0jZW5kaWYKKwkJY2FzZSBUWVBFX0NPTE9SX0hBU0hfRVRIOgogCQkJLyoKIAkJCSAqIFRoaXMgaXMgKHByZXN1bWFibHkpIGEgcmVhbCBFdGhlcm5ldCBjYXB0dXJlOyBnaXZlIGl0IGEKIAkJCSAqIGxpbmstbGF5ZXItdHlwZSBsaXN0IHdpdGggRExUX0VOMTBNQiBhbmQgRExUX0RPQ1NJUywgc28KQEAgLTk0Nyw2MSArMTE1NSw2OCBAQAogCQkJICogRXRoZXJuZXQgZnJhbWluZykuCiAJCQkgKi8KIAkJCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7Ci0JCQkJcC0+ZGx0X2xpc3RbaW5kZXgrK10gPSBETFRfRU4xME1COwotCQkJCXAtPmRsdF9saXN0W2luZGV4KytdID0gRExUX0RPQ1NJUzsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfRU4xME1COworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9ET0NTSVM7CiAJCQl9CiAJCQlpZighcC0+bGlua3R5cGUpCiAJCQkJcC0+bGlua3R5cGUgPSBETFRfRU4xME1COwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUWVBFX0FUTTogCi0jaWZkZWYgVFlQRV9BQUw1CiAJCWNhc2UgVFlQRV9BQUw1OgotI2VuZGlmCi0jaWZkZWYgVFlQRV9NQ19BVE0KIAkJY2FzZSBUWVBFX01DX0FUTToKLSNlbmRpZgotI2lmZGVmIFRZUEVfTUNfQUFMNQogCQljYXNlIFRZUEVfTUNfQUFMNToKLSNlbmRpZgogCQkJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKLQkJCQlwLT5kbHRfbGlzdFtpbmRleCsrXSA9IERMVF9BVE1fUkZDMTQ4MzsKLQkJCQlwLT5kbHRfbGlzdFtpbmRleCsrXSA9IERMVF9TVU5BVE07CisJCQkJcC0+ZGx0X2xpc3RbZGx0X2luZGV4KytdID0gRExUX0FUTV9SRkMxNDgzOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9TVU5BVE07CiAJCQl9CiAJCQlpZighcC0+bGlua3R5cGUpCiAJCQkJcC0+bGlua3R5cGUgPSBETFRfQVRNX1JGQzE0ODM7CiAJCQlicmVhazsKIAotI2lmZGVmIFRZUEVfQ09MT1JfTUNfSERMQ19QT1MKIAkJY2FzZSBUWVBFX0NPTE9SX01DX0hETENfUE9TOgotI2VuZGlmCi0jaWZkZWYgVFlQRV9NQ19IRExDCiAJCWNhc2UgVFlQRV9NQ19IRExDOgogCQkJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKLQkJCQlwLT5kbHRfbGlzdFtpbmRleCsrXSA9IERMVF9DSERMQzsKLQkJCQlwLT5kbHRfbGlzdFtpbmRleCsrXSA9IERMVF9QUFBfU0VSSUFMOwotCQkJCXAtPmRsdF9saXN0W2luZGV4KytdID0gRExUX0ZSRUxBWTsKLQkJCQlwLT5kbHRfbGlzdFtpbmRleCsrXSA9IERMVF9NVFAyOwotCQkJCXAtPmRsdF9saXN0W2luZGV4KytdID0gRExUX01UUDJfV0lUSF9QSERSOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9DSERMQzsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfUFBQX1NFUklBTDsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfRlJFTEFZOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9NVFAyOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9NVFAyX1dJVEhfUEhEUjsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfTEFQRDsKIAkJCX0KIAkJCWlmKCFwLT5saW5rdHlwZSkKIAkJCQlwLT5saW5rdHlwZSA9IERMVF9DSERMQzsKIAkJCWJyZWFrOwotI2VuZGlmCiAKLQkJY2FzZSBUWVBFX0xFR0FDWToKKwkJY2FzZSBUWVBFX0lQVjQ6CisJCWNhc2UgVFlQRV9JUFY2OgogCQkJaWYoIXAtPmxpbmt0eXBlKQotCQkJCXAtPmxpbmt0eXBlID0gRExUX05VTEw7CisJCQkJcC0+bGlua3R5cGUgPSBETFRfUkFXOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBUWVBFX0xFR0FDWToKKwkJY2FzZSBUWVBFX01DX1JBVzoKKwkJY2FzZSBUWVBFX01DX1JBV19DSEFOTkVMOgorCQljYXNlIFRZUEVfSVBfQ09VTlRFUjoKKwkJY2FzZSBUWVBFX1RDUF9GTE9XX0NPVU5URVI6CisJCWNhc2UgVFlQRV9JTkZJTklCQU5EOgorCQljYXNlIFRZUEVfUkFXX0xJTks6CisJCWNhc2UgVFlQRV9JTkZJTklCQU5EX0xJTks6CiAJCWRlZmF1bHQ6Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAidW5rbm93biBEQUcgbGlua3R5cGUgJWQiLCB0eXBlc1tpbmRleF0pOwotCQkJcmV0dXJuICgtMSk7CisJCQkvKiBMaWJwY2FwIGNhbm5vdCBkZWFsIHdpdGggdGhlc2UgdHlwZXMgeWV0ICovCisJCQkvKiBBZGQgbm8gJ25hdGl2ZScgRExUcywgYnV0IHN0aWxsIGNvdmVyZWQgYnkgRExUX0VSRiAqLworCQkJYnJlYWs7CiAKIAkJfSAvKiBzd2l0Y2ggKi8KKwkJaW5kZXgrKzsKIAl9CiAKLQlwLT5kbHRfY291bnQgPSBpbmRleDsKKwlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfRVJGOworCisJcC0+ZGx0X2NvdW50ID0gZGx0X2luZGV4OworCisJaWYoIXAtPmxpbmt0eXBlKQorCQlwLT5saW5rdHlwZSA9IERMVF9FUkY7CiAKIAlyZXR1cm4gcC0+bGlua3R5cGU7CiB9CmRpZmYgLS1naXQgYS9wY2FwLWRhZy5oIGIvcGNhcC1kYWcuaAppbmRleCBlZmYwMWQ2Li40NzUxMTg2IDEwMDY0NAotLS0gYS9wY2FwLWRhZy5oCisrKyBiL3BjYXAtZGFnLmgKQEAgLTcsOCArNywxMDIgQEAKICAqCiAgKiBBdXRob3I6IFJpY2hhcmQgTGl0dGluLCBTZWFuIElydmluZSAoe3JpY2hhcmQsc2Vhbn1AcmVlbHR3by5jb20pCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRhZy5oLHYgMS4zLjQuMSAyMDA1LzA3LzA3IDA2OjU2OjA0IGd1eSBFeHAgJCAoTEJMKQorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRhZy5oLHYgMS43IDIwMDgtMDQtMDQgMTk6Mzc6NDUgZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAotcGNhcF90ICpkYWdfb3Blbl9saXZlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHNuYXBsZW4sIGludCBwcm9taXNjLCBpbnQgdG9fbXMsIGNoYXIgKmVidWYpOwotaW50IGRhZ19wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKK3BjYXBfdCAqZGFnX2NyZWF0ZShjb25zdCBjaGFyICosIGNoYXIgKiwgaW50ICopOworaW50IGRhZ19maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKKworI2lmbmRlZiBUWVBFX0FBTDUKKyNkZWZpbmUgVFlQRV9BQUw1ICAgICAgICAgICAgICAgNAorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9NQ19IRExDCisjZGVmaW5lIFRZUEVfTUNfSERMQyAgICAgICAgICAgIDUKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfUkFXCisjZGVmaW5lIFRZUEVfTUNfUkFXICAgICAgICAgICAgIDYKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfQVRNCisjZGVmaW5lIFRZUEVfTUNfQVRNICAgICAgICAgICAgIDcKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfUkFXX0NIQU5ORUwKKyNkZWZpbmUgVFlQRV9NQ19SQVdfQ0hBTk5FTCAgICAgOAorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9NQ19BQUw1CisjZGVmaW5lIFRZUEVfTUNfQUFMNSAgICAgICAgICAgIDkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSERMQ19QT1MKKyNkZWZpbmUgVFlQRV9DT0xPUl9IRExDX1BPUyAgICAgMTAKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfRVRICisjZGVmaW5lIFRZUEVfQ09MT1JfRVRIICAgICAgICAgIDExCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX01DX0FBTDIKKyNkZWZpbmUgVFlQRV9NQ19BQUwyICAgICAgICAgICAgMTIKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSVBfQ09VTlRFUgorI2RlZmluZSBUWVBFX0lQX0NPVU5URVIgICAgICAgICAxMworI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9UQ1BfRkxPV19DT1VOVEVSCisjZGVmaW5lIFRZUEVfVENQX0ZMT1dfQ09VTlRFUiAgIDE0CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUworI2RlZmluZSBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUyAxNQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9EU01fQ09MT1JfRVRICisjZGVmaW5lIFRZUEVfRFNNX0NPTE9SX0VUSCAgICAgIDE2CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0NPTE9SX01DX0hETENfUE9TCisjZGVmaW5lIFRZUEVfQ09MT1JfTUNfSERMQ19QT1MgIDE3CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0FBTDIKKyNkZWZpbmUgVFlQRV9BQUwyICAgICAgICAgICAgICAgMTgKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9QT1MKKyNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX1BPUyAgICAgMTkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9FVEgKKyNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX0VUSCAgICAgMjAKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSU5GSU5JQkFORAorI2RlZmluZSBUWVBFX0lORklOSUJBTkQgICAgICAgICAyMQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9JUFY0CisjZGVmaW5lIFRZUEVfSVBWNCAgICAgICAgICAgICAgIDIyCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0lQVjYKKyNkZWZpbmUgVFlQRV9JUFY2ICAgICAgICAgICAgICAgMjMKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfUkFXX0xJTksKKyNkZWZpbmUgVFlQRV9SQVdfTElOSyAgICAgICAgICAgMjQKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSU5GSU5JQkFORF9MSU5LCisjZGVmaW5lIFRZUEVfSU5GSU5JQkFORF9MSU5LICAgIDI1CisjZW5kaWYKKworCisKKyNpZm5kZWYgVFlQRV9QQUQKKyNkZWZpbmUgVFlQRV9QQUQgICAgICAgICAgICAgICAgNDgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC1kYnVzLmMgYi9wY2FwLWRidXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc4MzUzCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1kYnVzLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgSmFrdWIgWmF3YWR6a2kKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAicGNhcC1kYnVzLmgiCisKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBELUJ1cy4KKyAqLworc3RydWN0IHBjYXBfZGJ1cyB7CisJREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisJdV9pbnQJcGFja2V0c19yZWFkOwkvKiBjb3VudCBvZiBwYWNrZXRzIHJlYWQgKi8KK307CisKK3N0YXRpYyBpbnQKK2RidXNfcmVhZChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlzdHJ1Y3QgcGNhcF9kYnVzICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisJREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKwljaGFyICpyYXdfbXNnOworCWludCByYXdfbXNnX2xlbjsKKworCWludCBjb3VudCA9IDA7CisKKwltZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKGhhbmRsZXAtPmNvbm4pOworCisJd2hpbGUgKCFtZXNzYWdlKSB7CisJCS8vIFhYWCBoYW5kbGUtPm9wdC50aW1lb3V0ID0gdGltZW91dF9tczsKKwkJaWYgKCFkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZShoYW5kbGVwLT5jb25uLCAxMDApKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNvbm5lY3Rpb24gY2xvc2VkIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoaGFuZGxlLT5icmVha19sb29wKSB7CisJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJcmV0dXJuIC0yOworCQl9CisKKwkJbWVzc2FnZSA9IGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZShoYW5kbGVwLT5jb25uKTsKKwl9CisKKwlpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9MT0NBTCwgIkRpc2Nvbm5lY3RlZCIpKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRGlzY29ubmVjdGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZGJ1c19tZXNzYWdlX21hcnNoYWwobWVzc2FnZSwgJnJhd19tc2csICZyYXdfbXNnX2xlbikpIHsKKwkJcGt0aC5jYXBsZW4gPSBwa3RoLmxlbiA9IHJhd19tc2dfbGVuOworCQkvKiBwa3RoLmNhcGxlbiA9IG1pbiAocGF5bG9hZF9sZW4sIGhhbmRsZS0+c25hcHNob3QpOyAqLworCisJCWdldHRpbWVvZmRheSgmcGt0aC50cywgTlVMTCk7CisJCWlmIChoYW5kbGUtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKKwkJICAgIGJwZl9maWx0ZXIoaGFuZGxlLT5mY29kZS5iZl9pbnNucywgKHVfY2hhciAqKXJhd19tc2csIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIHsKKwkJCWhhbmRsZXAtPnBhY2tldHNfcmVhZCsrOworCQkJY2FsbGJhY2sodXNlciwgJnBrdGgsICh1X2NoYXIgKilyYXdfbXNnKTsKKwkJCWNvdW50Kys7CisJCX0KKworCQlkYnVzX2ZyZWUocmF3X21zZyk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorZGJ1c193cml0ZShwY2FwX3QgKmhhbmRsZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwkvKiBYWFgsIG5vdCB0ZXN0ZWQgKi8KKwlzdHJ1Y3QgcGNhcF9kYnVzICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCisJREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCURCdXNNZXNzYWdlICptc2c7CisKKwlpZiAoIShtc2cgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsKGJ1Ziwgc2l6ZSwgJmVycm9yKSkpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYnVzX21lc3NhZ2VfZGVtYXJzaGFsKCkgZmFpbGVkOiAlcyIsIGVycm9yLm1lc3NhZ2UpOworCQlkYnVzX2Vycm9yX2ZyZWUoJmVycm9yKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRidXNfY29ubmVjdGlvbl9zZW5kKGhhbmRsZXAtPmNvbm4sIG1zZywgTlVMTCk7CisJZGJ1c19jb25uZWN0aW9uX2ZsdXNoKGhhbmRsZXAtPmNvbm4pOworCisJZGJ1c19tZXNzYWdlX3VucmVmKG1zZyk7CisJcmV0dXJuIDA7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK3N0YXRpYyBpbnQKK2RidXNfc3RhdHMocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBwY2FwX3N0YXQgKnN0YXRzKQoreworCXN0cnVjdCBwY2FwX2RidXMgKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisKKwlzdGF0cy0+cHNfcmVjdiA9IGhhbmRsZXAtPnBhY2tldHNfcmVhZDsKKwlzdGF0cy0+cHNfZHJvcCA9IDA7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkYnVzX2NsZWFudXAocGNhcF90ICpoYW5kbGUpCit7CisJc3RydWN0IHBjYXBfZGJ1cyAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKworCWRidXNfY29ubmVjdGlvbl91bnJlZihoYW5kbGVwLT5jb25uKTsKKworCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihoYW5kbGUpOworfQorCitzdGF0aWMgaW50CitkYnVzX2FjdGl2YXRlKHBjYXBfdCAqaGFuZGxlKQoreworI2RlZmluZSBFQVZFU0RST1BQSU5HX1JVTEUgImVhdmVzZHJvcD10cnVlLCIKKworCXN0YXRpYyBjb25zdCBjaGFyICpydWxlc1tdID0geworCQlFQVZFU0RST1BQSU5HX1JVTEUgInR5cGU9J3NpZ25hbCciLAorCQlFQVZFU0RST1BQSU5HX1JVTEUgInR5cGU9J21ldGhvZF9jYWxsJyIsCisJCUVBVkVTRFJPUFBJTkdfUlVMRSAidHlwZT0nbWV0aG9kX3JldHVybiciLAorCQlFQVZFU0RST1BQSU5HX1JVTEUgInR5cGU9J2Vycm9yJyIsCisJfTsKKworCSNkZWZpbmUgTl9SVUxFUyBzaXplb2YocnVsZXMpL3NpemVvZihydWxlc1swXSkKKworCXN0cnVjdCBwY2FwX2RidXMgKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJY29uc3QgY2hhciAqZGV2ID0gaGFuZGxlLT5vcHQuc291cmNlOworCisJREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCWludCBpOworCisJaWYgKHN0cmNtcChkZXYsICJkYnVzLXN5c3RlbSIpID09IDApIHsKKwkJaWYgKCEoaGFuZGxlcC0+Y29ubiA9IGRidXNfYnVzX2dldChEQlVTX0JVU19TWVNURU0sICZlcnJvcikpKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZhaWxlZCB0byBnZXQgc3lzdGVtIGJ1czogJXMiLCBlcnJvci5tZXNzYWdlKTsKKwkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKworCX0gZWxzZSBpZiAoc3RyY21wKGRldiwgImRidXMtc2Vzc2lvbiIpID09IDApIHsKKwkJaWYgKCEoaGFuZGxlcC0+Y29ubiA9IGRidXNfYnVzX2dldChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpKSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gZ2V0IHNlc3Npb24gYnVzOiAlcyIsIGVycm9yLm1lc3NhZ2UpOworCQkJZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCisJfSBlbHNlIGlmIChzdHJuY21wKGRldiwgImRidXM6Ly8iLCA3KSA9PSAwKSB7CisJCWNvbnN0IGNoYXIgKmFkZHIgPSBkZXYgKyA3OworCisJCWlmICghKGhhbmRsZXAtPmNvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbihhZGRyLCAmZXJyb3IpKSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvOiAlczogJXMiLCBhZGRyLCBlcnJvci5tZXNzYWdlKTsKKwkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKworCQlpZiAoIWRidXNfYnVzX3JlZ2lzdGVyKGhhbmRsZXAtPmNvbm4sICZlcnJvcikpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGJ1cyAlczogJXNcbiIsIGFkZHIsIGVycm9yLm1lc3NhZ2UpOworCQkJZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCisJfSBlbHNlIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBnZXQgYnVzIGFkZHJlc3MgZnJvbSAlcyIsIGhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSAwOworCWhhbmRsZS0+b2Zmc2V0ID0gMDsKKwloYW5kbGUtPmxpbmt0eXBlID0gRExUX0RCVVM7CisJaGFuZGxlLT5yZWFkX29wID0gZGJ1c19yZWFkOworCWhhbmRsZS0+aW5qZWN0X29wID0gZGJ1c193cml0ZTsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07IC8qIFhYWCwgbGF0ZXIgYWRkIHN1cHBvcnQgZm9yIGRidXNfYnVzX2FkZF9tYXRjaCgpICovCisJaGFuZGxlLT5zZXRkaXJlY3Rpb25fb3AgPSBOVUxMOworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsgICAgICAvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnN0YXRzX29wID0gZGJ1c19zdGF0czsKKworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQgPSAtMTsKKworCWlmIChoYW5kbGUtPm9wdC5yZm1vbikgeworCQkvKgorCQkgKiBNb25pdG9yIG1vZGUgZG9lc24ndCBhcHBseSB0byBkYnVzIGNvbm5lY3Rpb25zLgorCQkgKi8KKwkJZGJ1c19jbGVhbnVwKGhhbmRsZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwl9CisKKwkvKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUoaGFuZGxlcC0+Y29ubiwgaGFuZGxlLT5zbmFwc2hvdCk7ICovCisJaWYgKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplICE9IDApCisJCWRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoaGFuZGxlcC0+Y29ubiwgaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUpOworCisJZm9yIChpID0gMDsgaSA8IE5fUlVMRVM7IGkrKykgeworCQlkYnVzX2J1c19hZGRfbWF0Y2goaGFuZGxlcC0+Y29ubiwgcnVsZXNbaV0sICZlcnJvcik7CisJCWlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyb3IpKSB7CisJCQlkYnVzX2Vycm9yX2ZyZWUoJmVycm9yKTsKKworCQkJLyogdHJ5IHdpdGhvdXQgZWF2ZXNkcm9wICovCisJCQlkYnVzX2J1c19hZGRfbWF0Y2goaGFuZGxlcC0+Y29ubiwgcnVsZXNbaV0gKyBzdHJsZW4oRUFWRVNEUk9QUElOR19SVUxFKSwgJmVycm9yKTsKKwkJCWlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyb3IpKSB7CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gYWRkIGJ1cyBtYXRjaDogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworCQkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOworCQkJCWRidXNfY2xlYW51cChoYW5kbGUpOworCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3BjYXBfdCAqCitkYnVzX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYsIGludCAqaXNfb3VycykKK3sKKwlwY2FwX3QgKnA7CisKKwlpZiAoc3RyY21wKGRldmljZSwgImRidXMtc3lzdGVtIikgJiYgCisJCXN0cmNtcChkZXZpY2UsICJkYnVzLXNlc3Npb24iKSAmJiAKKwkJc3RybmNtcChkZXZpY2UsICJkYnVzOi8vIiwgNykpCisJeworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCSppc19vdXJzID0gMTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kYnVzKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gZGJ1c19hY3RpdmF0ZTsKKwlyZXR1cm4gKHApOworfQorCitpbnQgCitkYnVzX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJfc3RyKQoreworCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgImRidXMtc3lzdGVtIiwgMCwgIkQtQnVzIHN5c3RlbSBidXMiLCBlcnJfc3RyKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAocGNhcF9hZGRfaWYoYWxsZGV2c3AsICJkYnVzLXNlc3Npb24iLCAwLCAiRC1CdXMgc2Vzc2lvbiBidXMiLCBlcnJfc3RyKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcGNhcC1kYnVzLmggYi9wY2FwLWRidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ5M2NjCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1kYnVzLmgKQEAgLTAsMCArMSwyIEBACitwY2FwX3QgKmRidXNfY3JlYXRlKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQgKik7CitpbnQgZGJ1c19maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKZGlmZiAtLWdpdCBhL3BjYXAtZGxwaS5jIGIvcGNhcC1kbHBpLmMKaW5kZXggOGVhNzg1MC4uODk5MzEzNCAxMDA2NDQKLS0tIGEvcGNhcC1kbHBpLmMKKysrIGIvcGNhcC1kbHBpLmMKQEAgLTIyLDcgKzIyLDcgQEAKICAqIFVuaXZlcnNpdHkgQ29sbGVnZSBMb25kb24sIGFuZCBzdWJzZXF1ZW50bHkgbW9kaWZpZWQgYnkKICAqIEd1eSBIYXJyaXMgKGd1eUBhbHVtLm1pdC5lZHUpLCBNYXJrIFBpenpvbGF0bwogICogPExpc3QtdGNwZHVtcC13b3JrZXJzQHN1YnNjcmlwdGlvbnMucGl6em9sYXRvLm5ldD4sCi0gKiBhbmQgTWFyayBDLiBCcm93biAobWJyb3duQGhwLmNvbSkuCisgKiBNYXJrIEMuIEJyb3duIChtYnJvd25AaHAuY29tKSwgYW5kIFNhZ3VuIFNoYWt5YSA8U2FndW4uU2hha3lhQFN1bi5DT00+LgogICovCiAKIC8qCkBAIC03MCw3ICs3MCw3IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZGxwaS5jLHYgMS4xMDguMi43IDIwMDYvMDQvMDQgMDU6MzM6MDIgZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRscGkuYyx2IDEuMTI4IDIwMDgtMTItMDIgMTY6MjA6MjMgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtMTIxLDYgKzEyMSw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAiZGxwaXN1YnMuaCIKIAogI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAogI2luY2x1ZGUgIm9zLXByb3RvLmgiCkBAIC0xMzYsNDYgKzEzNywyMyBAQAogCiAjZGVmaW5lCU1BWERMQlVGCTgxOTIKIAotI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICi0KLS8qCi0gKiBTaXplIG9mIGEgYnVmbW9kIGNodW5rIHRvIHBhc3MgdXBzdHJlYW07IHRoYXQgYXBwZWFycyB0byBiZSB0aGUgYmlnZ2VzdAotICogdmFsdWUgdG8gd2hpY2ggeW91IGNhbiBzZXQgaXQsIGFuZCBzZXR0aW5nIGl0IHRvIHRoYXQgdmFsdWUgKHdoaWNoCi0gKiBpcyBiaWdnZXIgdGhhbiB3aGF0IGFwcGVhcnMgdG8gYmUgdGhlIFNvbGFyaXMgZGVmYXVsdCBvZiA4MTkyKQotICogcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHBhY2tldCBkcm9wcy4KLSAqLwotI2RlZmluZSBDSFVOS1NJWkUJNjU1MzYKLQotLyoKLSAqIFNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZSBmb3IgcGFja2V0IGRhdGEgd2UgcmVhZDsgaXQgbXVzdCBiZQotICogbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBjaHVuay4KLSAqLwotI2RlZmluZSBQS1RCVUZTSVpFCUNIVU5LU0laRQotCi0jZWxzZSAvKiBIQVZFX1NZU19CVUZNT0RfSCAqLwotCi0vKgotICogU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIGZvciBwYWNrZXQgZGF0YSB3ZSByZWFkOyB0aGlzIGlzCi0gKiB3aGF0IHRoZSB2YWx1ZSB1c2VkIHRvIGJlIC0gdGhlcmUncyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgaXQKLSAqIHNob3VsZCBiZSB0aWVkIHRvIE1BWERMQlVGLCBidXQgd2UnbGwgbGVhdmUgaXQgYXMgdGhpcyBmb3Igbm93LgotICovCi0jZGVmaW5lIFBLVEJVRlNJWkUJKE1BWERMQlVGICogc2l6ZW9mKGJwZl91X2ludDMyKSkKLQotI2VuZGlmCi0KIC8qIEZvcndhcmRzICovCiBzdGF0aWMgY2hhciAqc3BsaXRfZG5hbWUoY2hhciAqLCBpbnQgKiwgY2hhciAqKTsKIHN0YXRpYyBpbnQgZGxfZG9hdHRhY2goaW50LCBpbnQsIGNoYXIgKik7CiAjaWZkZWYgRExfSFBfUkFXRExTCiBzdGF0aWMgaW50IGRsX2RvaHB1eGJpbmQoaW50LCBjaGFyICopOwogI2VuZGlmCi1zdGF0aWMgaW50IGRsYXR0YWNocmVxKGludCwgYnBmX3VfaW50MzIsIGNoYXIgKik7CitzdGF0aWMgaW50IGRscHJvbWlzY29uKHBjYXBfdCAqLCBicGZfdV9pbnQzMik7CiBzdGF0aWMgaW50IGRsYmluZHJlcShpbnQsIGJwZl91X2ludDMyLCBjaGFyICopOwogc3RhdGljIGludCBkbGJpbmRhY2soaW50LCBjaGFyICosIGNoYXIgKiwgaW50ICopOwotc3RhdGljIGludCBkbHByb21pc2NvbnJlcShpbnQsIGJwZl91X2ludDMyLCBjaGFyICopOwogc3RhdGljIGludCBkbG9rYWNrKGludCwgY29uc3QgY2hhciAqLCBjaGFyICosIGNoYXIgKik7CiBzdGF0aWMgaW50IGRsaW5mb3JlcShpbnQsIGNoYXIgKik7CiBzdGF0aWMgaW50IGRsaW5mb2FjayhpbnQsIGNoYXIgKiwgY2hhciAqKTsKKworI2lmZGVmIEhBVkVfRExQSV9QQVNTSVZFCitzdGF0aWMgdm9pZCBkbHBhc3NpdmUoaW50LCBjaGFyICopOworI2VuZGlmCisKICNpZmRlZiBETF9IUF9SQVdETFMKIHN0YXRpYyBpbnQgZGxyYXdkYXRhcmVxKGludCwgY29uc3QgdV9jaGFyICosIGludCk7CiAjZW5kaWYKQEAgLTE4Niw5ICsxNjQsNiBAQAogc3RhdGljIGNoYXIgKmdldF9yZWxlYXNlKGJwZl91X2ludDMyICosIGJwZl91X2ludDMyICosIGJwZl91X2ludDMyICopOwogI2VuZGlmCiBzdGF0aWMgaW50IHNlbmRfcmVxdWVzdChpbnQsIGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKik7Ci0jaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKLXN0YXRpYyBpbnQgc3RyaW9jdGwoaW50LCBpbnQsIGludCwgY2hhciAqKTsKLSNlbmRpZgogI2lmZGVmIEhBVkVfSFBVWDkKIHN0YXRpYyBpbnQgZGxwaV9rcmVhZChpbnQsIG9mZl90LCB2b2lkICosIHVfaW50LCBjaGFyICopOwogI2VuZGlmCkBAIC0xOTYsNDIgKzE3MSw2IEBACiBzdGF0aWMgaW50IGdldF9kbHBpX3BwYShpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICopOwogI2VuZGlmCiAKLXN0YXRpYyBpbnQKLXBjYXBfc3RhdHNfZGxwaShwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQotewotCi0JLyoKLQkgKiAicHNfcmVjdiIgY291bnRzIHBhY2tldHMgaGFuZGVkIHRvIHRoZSBmaWx0ZXIsIG5vdCBwYWNrZXRzCi0JICogdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4gIEFzIGZpbHRlcmluZyBpcyBkb25lIGluIHVzZXJsYW5kLAotCSAqIHRoaXMgd291bGQgbm90IGluY2x1ZGUgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2Ugd2UgcmFuIG91dAotCSAqIG9mIGJ1ZmZlciBzcGFjZTsgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIG1vcmUgbGlrZSBvdGhlcgotCSAqIHBsYXRmb3JtcyAoTGludXggMi40IGFuZCBsYXRlciwgQlNEcyB3aXRoIEJQRiksIHdoZXJlIHRoZQotCSAqICJwYWNrZXRzIHJlY2VpdmVkIiBjb3VudCBpbmNsdWRlcyBwYWNrZXRzIHJlY2VpdmVkIGJ1dCBkcm9wcGVkCi0JICogZHVlIHRvIHJ1bm5pbmcgb3V0IG9mIGJ1ZmZlciBzcGFjZSwgYW5kIHRvIGtlZXAgZnJvbSBjb25mdXNpbmcKLQkgKiBhcHBsaWNhdGlvbnMgdGhhdCwgZm9yIGV4YW1wbGUsIGNvbXB1dGUgcGFja2V0IGRyb3AgcGVyY2VudGFnZXMsCi0JICogd2UgYWxzbyBtYWtlIGl0IGNvdW50IHBhY2tldHMgZHJvcHBlZCBieSAiYnVmbW9kIiAob3RoZXJ3aXNlIHdlCi0JICogbWlnaHQgcnVuIHRoZSByaXNrIG9mIHRoZSBwYWNrZXQgZHJvcCBjb3VudCBiZWluZyBiaWdnZXIgdGhhbgotCSAqIHRoZSByZWNlaXZlZC1wYWNrZXQgY291bnQpLgotCSAqCi0JICogInBzX2Ryb3AiIGNvdW50cyBwYWNrZXRzIGRyb3BwZWQgYnkgImJ1Zm1vZCIgYmVjYXVzZSBvZgotCSAqIGZsb3cgY29udHJvbCByZXF1aXJlbWVudHMgb3IgcmVzb3VyY2UgZXhoYXVzdGlvbjsgaXQgZG9lc24ndAotCSAqIGNvdW50IHBhY2tldHMgZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlIGRyaXZlciwgb3IgcGFja2V0cwotCSAqIGRyb3BwZWQgdXBzdHJlYW0uICBBcyBmaWx0ZXJpbmcgaXMgZG9uZSBpbiB1c2VybGFuZCwgaXQgY291bnRzCi0JICogcGFja2V0cyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3b3VsZCd2ZSBwYXNzZWQgdGhlIGZpbHRlci4KLQkgKgotCSAqIFRoZXNlIHN0YXRpc3RpY3MgZG9uJ3QgaW5jbHVkZSBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tCi0JICogdGhlIGtlcm5lbCBieSBsaWJwY2FwLCBidXQgdGhleSBtYXkgaW5jbHVkZSBwYWNrZXRzIG5vdAotCSAqIHlldCByZWFkIGZyb20gbGlicGNhcCBieSB0aGUgYXBwbGljYXRpb24uCi0JICovCi0JKnBzID0gcC0+bWQuc3RhdDsKLQotCS8qCi0JICogQWRkIGluIHRoZSBkcm9wIGNvdW50LCBhcyBwZXIgdGhlIGFib3ZlIGNvbW1lbnQuCi0JICovCi0JcHMtPnBzX3JlY3YgKz0gcHMtPnBzX2Ryb3A7Ci0JcmV0dXJuICgwKTsKLX0KLQogLyogWFhYIE5lZWRlZCBieSBIUC1VWCAoYXQgbGVhc3QpICovCiBzdGF0aWMgYnBmX3VfaW50MzIgY3RsYnVmW01BWERMQlVGXTsKIHN0YXRpYyBzdHJ1Y3Qgc3RyYnVmIGN0bCA9IHsKQEAgLTI0MCwyMSArMTc5LDE5IEBACiAJKGNoYXIgKiljdGxidWYKIH07CiAKKy8qCisgKiBDYXN0IGEgYnVmZmVyIHRvICJ1bmlvbiBETF9wcmltaXRpdmVzIiB3aXRob3V0IHByb3Zva2luZyB3YXJuaW5ncworICogZnJvbSB0aGUgY29tcGlsZXIuCisgKi8KKyNkZWZpbmUgTUFLRV9ETF9QUklNSVRJVkVTKHB0cikJKCh1bmlvbiBETF9wcmltaXRpdmVzICopKHZvaWQgKikocHRyKSkKKwogc3RhdGljIGludAogcGNhcF9yZWFkX2RscGkocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKIHsKLQlyZWdpc3RlciBpbnQgY2MsIG4sIGNhcGxlbiwgb3JpZ2xlbjsKLQlyZWdpc3RlciB1X2NoYXIgKmJwLCAqZXAsICpwazsKLQlyZWdpc3RlciBzdHJ1Y3QgYnBmX2luc24gKmZjb2RlOwotI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICi0JcmVnaXN0ZXIgc3RydWN0IHNiX2hkciAqc2JwOwotI2lmZGVmIExCTF9BTElHTgotCXN0cnVjdCBzYl9oZHIgc2JoZHI7Ci0jZW5kaWYKLSNlbmRpZgorCWludCBjYzsKKwl1X2NoYXIgKmJwOwogCWludCBmbGFnczsKIAlzdHJ1Y3Qgc3RyYnVmIGRhdGE7Ci0Jc3RydWN0IHBjYXBfcGt0aGRyIHBrdGhkcjsKIAogCWZsYWdzID0gMDsKIAljYyA9IHAtPmNjOwpAQCAtMzAyLDc5ICsyMzksMTUgQEAKIAl9IGVsc2UKIAkJYnAgPSBwLT5icDsKIAotCS8qIExvb3AgdGhyb3VnaCBwYWNrZXRzICovCi0JZmNvZGUgPSBwLT5mY29kZS5iZl9pbnNuczsKLQllcCA9IGJwICsgY2M7Ci0JbiA9IDA7Ci0jaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKLQl3aGlsZSAoYnAgPCBlcCkgewotCQkvKgotCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPwotCQkgKiBJZiBzbywgcmV0dXJuIGltbWVkaWF0ZWx5IC0gaWYgd2UgaGF2ZW4ndCByZWFkIGFueQotCQkgKiBwYWNrZXRzLCBjbGVhciB0aGUgZmxhZyBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlCi0JCSAqIHRoYXQgd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3RoZXJ3aXNlCi0JCSAqIGxlYXZlIHRoZSBmbGFnIHNldCwgc28gdGhhdCB0aGUgKm5leHQqIGNhbGwgd2lsbCBicmVhawotCQkgKiBvdXQgb2YgdGhlIGxvb3Agd2l0aG91dCBoYXZpbmcgcmVhZCBhbnkgcGFja2V0cywgYW5kCi0JCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UndmUgcHJvY2Vzc2VkIHNvIGZhci4KLQkJICovCi0JCWlmIChwLT5icmVha19sb29wKSB7Ci0JCQlpZiAobiA9PSAwKSB7Ci0JCQkJcC0+YnJlYWtfbG9vcCA9IDA7Ci0JCQkJcmV0dXJuICgtMik7Ci0JCQl9IGVsc2UgewotCQkJCXAtPmJwID0gYnA7Ci0JCQkJcC0+Y2MgPSBlcCAtIGJwOwotCQkJCXJldHVybiAobik7Ci0JCQl9Ci0JCX0KLSNpZmRlZiBMQkxfQUxJR04KLQkJaWYgKChsb25nKWJwICYgMykgewotCQkJc2JwID0gJnNiaGRyOwotCQkJbWVtY3B5KHNicCwgYnAsIHNpemVvZigqc2JwKSk7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCQlzYnAgPSAoc3RydWN0IHNiX2hkciAqKWJwOwotCQlwLT5tZC5zdGF0LnBzX2Ryb3AgPSBzYnAtPnNiaF9kcm9wczsKLQkJcGsgPSBicCArIHNpemVvZigqc2JwKTsKLQkJYnAgKz0gc2JwLT5zYmhfdG90bGVuOwotCQlvcmlnbGVuID0gc2JwLT5zYmhfb3JpZ2xlbjsKLQkJY2FwbGVuID0gc2JwLT5zYmhfbXNnbGVuOwotI2Vsc2UKLQkJb3JpZ2xlbiA9IGNjOwotCQljYXBsZW4gPSBtaW4ocC0+c25hcHNob3QsIGNjKTsKLQkJcGsgPSBicDsKLQkJYnAgKz0gY2FwbGVuOwotI2VuZGlmCi0JCSsrcC0+bWQuc3RhdC5wc19yZWN2OwotCQlpZiAoYnBmX2ZpbHRlcihmY29kZSwgcGssIG9yaWdsZW4sIGNhcGxlbikpIHsKLSNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAotCQkJcGt0aGRyLnRzLnR2X3NlYyA9IHNicC0+c2JoX3RpbWVzdGFtcC50dl9zZWM7Ci0JCQlwa3RoZHIudHMudHZfdXNlYyA9IHNicC0+c2JoX3RpbWVzdGFtcC50dl91c2VjOwotI2Vsc2UKLQkJCSh2b2lkKWdldHRpbWVvZmRheSgmcGt0aGRyLnRzLCBOVUxMKTsKLSNlbmRpZgotCQkJcGt0aGRyLmxlbiA9IG9yaWdsZW47Ci0JCQlwa3RoZHIuY2FwbGVuID0gY2FwbGVuOwotCQkJLyogSW5zdXJlIGNhcGxlbiBkb2VzIG5vdCBleGNlZWQgc25hcHNob3QgKi8KLQkJCWlmIChwa3RoZHIuY2FwbGVuID4gcC0+c25hcHNob3QpCi0JCQkJcGt0aGRyLmNhcGxlbiA9IHAtPnNuYXBzaG90OwotCQkJKCpjYWxsYmFjaykodXNlciwgJnBrdGhkciwgcGspOwotCQkJaWYgKCsrbiA+PSBjbnQgJiYgY250ID49IDApIHsKLQkJCQlwLT5jYyA9IGVwIC0gYnA7Ci0JCQkJcC0+YnAgPSBicDsKLQkJCQlyZXR1cm4gKG4pOwotCQkJfQotCQl9Ci0jaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKLQl9Ci0jZW5kaWYKLQlwLT5jYyA9IDA7Ci0JcmV0dXJuIChuKTsKKwlyZXR1cm4gKHBjYXBfcHJvY2Vzc19wa3RzKHAsIGNhbGxiYWNrLCB1c2VyLCBjbnQsIGJwLCBjYykpOwogfQogCiBzdGF0aWMgaW50CiBwY2FwX2luamVjdF9kbHBpKHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKKyNpZmRlZiBETF9IUF9SQVdETFMKKwlzdHJ1Y3QgcGNhcF9kbHBpICpwZCA9IHAtPnByaXY7CisjZW5kaWYKIAlpbnQgcmV0OwogCiAjaWYgZGVmaW5lZChETElPQ1JBVykKQEAgLTM4NSwxMiArMjU4LDEyIEBACiAJCXJldHVybiAoLTEpOwogCX0KICNlbGlmIGRlZmluZWQoRExfSFBfUkFXRExTKQotCWlmIChwLT5zZW5kX2ZkIDwgMCkgeworCWlmIChwZC0+c2VuZF9mZCA8IDApIHsKIAkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInNlbmQ6IE91dHB1dCBGRCBjb3VsZG4ndCBiZSBvcGVuZWQiKTsKIAkJcmV0dXJuICgtMSk7CiAJfQotCXJldCA9IGRscmF3ZGF0YXJlcShwLT5zZW5kX2ZkLCBidWYsIHNpemUpOworCXJldCA9IGRscmF3ZGF0YXJlcShwZC0+c2VuZF9mZCwgYnVmLCBzaXplKTsKIAlpZiAocmV0ID09IC0xKSB7CiAJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKQEAgLTQ0OSwyNiArMzIyLDMzIEBACiAjZW5kaWYgLyogSEFWRV9TT0xBUklTICovCiAKIHN0YXRpYyB2b2lkCi1wY2FwX2Nsb3NlX2RscGkocGNhcF90ICpwKQorcGNhcF9jbGVhbnVwX2RscGkocGNhcF90ICpwKQogewotCXBjYXBfY2xvc2VfY29tbW9uKHApOwotCWlmIChwLT5zZW5kX2ZkID49IDApCi0JCWNsb3NlKHAtPnNlbmRfZmQpOworI2lmZGVmIERMX0hQX1JBV0RMUworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKworCWlmIChwZC0+c2VuZF9mZCA+PSAwKSB7CisJCWNsb3NlKHBkLT5zZW5kX2ZkKTsKKwkJcGQtPnNlbmRfZmQgPSAtMTsKKwl9CisjZW5kaWYKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7CiB9CiAKLXBjYXBfdCAqCi1wY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICpkZXZpY2UsIGludCBzbmFwbGVuLCBpbnQgcHJvbWlzYywgaW50IHRvX21zLAotICAgIGNoYXIgKmVidWYpCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX2RscGkocGNhcF90ICpwKQogeworI2lmZGVmIERMX0hQX1JBV0RMUworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKyNlbmRpZgogCXJlZ2lzdGVyIGNoYXIgKmNwOwotCXJlZ2lzdGVyIHBjYXBfdCAqcDsKIAlpbnQgcHBhOwogI2lmZGVmIEhBVkVfU09MQVJJUwogCWludCBpc2F0bSA9IDA7CiAjZW5kaWYKIAlyZWdpc3RlciBkbF9pbmZvX2Fja190ICppbmZvcDsKICNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAotCWJwZl91X2ludDMyIHNzLCBjaHVua3NpemU7CisJYnBmX3VfaW50MzIgc3M7CiAjaWZkZWYgSEFWRV9TT0xBUklTCiAJcmVnaXN0ZXIgY2hhciAqcmVsZWFzZTsKIAlicGZfdV9pbnQzMiBvc21ham9yLCBvc21pbm9yLCBvc21pY3JvOwpAQCAtNDc5LDIzICszNTksMTUgQEAKICNpZm5kZWYgSEFWRV9ERVZfRExQSQogCWNoYXIgZG5hbWUyWzEwMF07CiAjZW5kaWYKLQotCXAgPSAocGNhcF90ICopbWFsbG9jKHNpemVvZigqcCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJc3RybGNweShlYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKLQlwLT5mZCA9IC0xOwkvKiBpbmRpY2F0ZSB0aGF0IGl0IGhhc24ndCBiZWVuIG9wZW5lZCB5ZXQgKi8KLQlwLT5zZW5kX2ZkID0gLTE7CisJaW50IHN0YXR1cyA9IFBDQVBfRVJST1I7CiAKICNpZmRlZiBIQVZFX0RFVl9ETFBJCiAJLyoKIAkqKiBSZW1vdmUgYW55ICIvZGV2LyIgb24gdGhlIGZyb250IG9mIHRoZSBkZXZpY2UuCiAJKi8KLQljcCA9IHN0cnJjaHIoZGV2aWNlLCAnLycpOworCWNwID0gc3RycmNocihwLT5vcHQuc291cmNlLCAnLycpOwogCWlmIChjcCA9PSBOVUxMKQotCQlzdHJsY3B5KGRuYW1lLCBkZXZpY2UsIHNpemVvZihkbmFtZSkpOworCQlzdHJsY3B5KGRuYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2YoZG5hbWUpKTsKIAllbHNlCiAJCXN0cmxjcHkoZG5hbWUsIGNwICsgMSwgc2l6ZW9mKGRuYW1lKSk7CiAKQEAgLTUwMyw5ICszNzUsMTEgQEAKIAkgKiBTcGxpdCB0aGUgZGV2aWNlIG5hbWUgaW50byBhIGRldmljZSB0eXBlIG5hbWUgYW5kIGEgdW5pdCBudW1iZXI7CiAJICogY2hvcCBvZmYgdGhlIHVuaXQgbnVtYmVyLCBzbyAiZG5hbWUiIGlzIGp1c3QgYSBkZXZpY2UgdHlwZSBuYW1lLgogCSAqLwotCWNwID0gc3BsaXRfZG5hbWUoZG5hbWUsICZwcGEsIGVidWYpOwotCWlmIChjcCA9PSBOVUxMKQorCWNwID0gc3BsaXRfZG5hbWUoZG5hbWUsICZwcGEsIHAtPmVycmJ1Zik7CisJaWYgKGNwID09IE5VTEwpIHsKKwkJc3RhdHVzID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKIAkJZ290byBiYWQ7CisJfQogCSpjcCA9ICdcMCc7CiAKIAkvKgpAQCAtNTIxLDcgKzM5NSw5IEBACiAJICovCiAJY3AgPSAiL2Rldi9kbHBpIjsKIAlpZiAoKHAtPmZkID0gb3BlbihjcCwgT19SRFdSKSkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpCisJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXM6ICVzIiwgY3AsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtNTMyLDIyICs0MDgsMjQgQEAKIAkgKiByZWNlaXZpbmcgcGFja2V0cyBvbiB0aGUgc2FtZSBkZXNjcmlwdG9yIC0geW91IG5lZWQgc2VwYXJhdGUKIAkgKiBkZXNjcmlwdG9ycyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nLCBib3VuZCB0byBkaWZmZXJlbnQgU0FQcy4KIAkgKgotCSAqIElmIHRoZSBvcGVuIGZhaWxzLCB3ZSBqdXN0IGxlYXZlIC0xIGluICJwLT5zZW5kX2ZkIiBhbmQgcmVqZWN0CisJICogSWYgdGhlIG9wZW4gZmFpbHMsIHdlIGp1c3QgbGVhdmUgLTEgaW4gInBkLT5zZW5kX2ZkIiBhbmQgcmVqZWN0CiAJICogYXR0ZW1wdHMgdG8gc2VuZCBwYWNrZXRzLCBqdXN0IGFzIGlmLCBpbiBwY2FwLWJwZi5jLCB3ZSBmYWlsCiAJICogdG8gb3BlbiB0aGUgQlBGIGRldmljZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZywgd2UganVzdCB0cnkKIAkgKiB0byBvcGVuIGl0IGZvciByZWFkaW5nIG9ubHkgYW5kLCBpZiB0aGF0IHN1Y2NlZWRzLCBqdXN0IGxldAogCSAqIHRoZSBzZW5kIGF0dGVtcHRzIGZhaWwuCiAJICovCi0JcC0+c2VuZF9mZCA9IG9wZW4oY3AsIE9fUkRXUik7CisJcGQtPnNlbmRfZmQgPSBvcGVuKGNwLCBPX1JEV1IpOwogI2VuZGlmCiAKIAkvKgogCSAqIEdldCBhIHRhYmxlIG9mIGFsbCBQUEFzIGZvciB0aGF0IGRldmljZSwgYW5kIHNlYXJjaCB0aGF0CiAJICogdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlIHR5cGUgbmFtZSBhbmQgdW5pdCBudW1iZXIuCiAJICovCi0JcHBhID0gZ2V0X2RscGlfcHBhKHAtPmZkLCBkbmFtZSwgcHBhLCBlYnVmKTsKLQlpZiAocHBhIDwgMCkKKwlwcGEgPSBnZXRfZGxwaV9wcGEocC0+ZmQsIGRuYW1lLCBwcGEsIHAtPmVycmJ1Zik7CisJaWYgKHBwYSA8IDApIHsKKwkJc3RhdHVzID0gcHBhOwogCQlnb3RvIGJhZDsKKwl9CiAjZWxzZQogCS8qCiAJICogSWYgdGhlIGRldmljZSBuYW1lIGJlZ2lucyB3aXRoICIvIiwgYXNzdW1lIGl0IGJlZ2lucyB3aXRoCkBAIC01NTUsMTkgKzQzMywyMSBAQAogCSAqIG90aGVyd2lzZSwgY29uY2F0ZW5hdGUgdGhlIGRldmljZSBkaXJlY3RvcnkgbmFtZSBhbmQgdGhlCiAJICogZGV2aWNlIG5hbWUuCiAJICovCi0JaWYgKCpkZXZpY2UgPT0gJy8nKQotCQlzdHJsY3B5KGRuYW1lLCBkZXZpY2UsIHNpemVvZihkbmFtZSkpOworCWlmICgqcC0+b3B0LnNvdXJjZSA9PSAnLycpCisJCXN0cmxjcHkoZG5hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihkbmFtZSkpOwogCWVsc2UKIAkJc25wcmludGYoZG5hbWUsIHNpemVvZihkbmFtZSksICIlcy8lcyIsIFBDQVBfREVWX1BSRUZJWCwKLQkJICAgIGRldmljZSk7CisJCSAgICBwLT5vcHQuc291cmNlKTsKIAogCS8qCiAJICogR2V0IHRoZSB1bml0IG51bWJlciwgYW5kIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBkZXZpY2UKIAkgKiB0eXBlIG5hbWUuCiAJICovCi0JY3AgPSBzcGxpdF9kbmFtZShkbmFtZSwgJnBwYSwgZWJ1Zik7Ci0JaWYgKGNwID09IE5VTEwpCisJY3AgPSBzcGxpdF9kbmFtZShkbmFtZSwgJnBwYSwgcC0+ZXJyYnVmKTsKKwlpZiAoY3AgPT0gTlVMTCkgeworCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOwogCQlnb3RvIGJhZDsKKwl9CiAKIAkvKgogCSAqIE1ha2UgYSBjb3B5IG9mIHRoZSBkZXZpY2UgcGF0aG5hbWUsIGFuZCB0aGVuIHJlbW92ZSB0aGUgdW5pdApAQCAtNTc5LDcgKzQ1OSw5IEBACiAJLyogVHJ5IGRldmljZSB3aXRob3V0IHVuaXQgbnVtYmVyICovCiAJaWYgKChwLT5mZCA9IG9wZW4oZG5hbWUsIE9fUkRXUikpIDwgMCkgewogCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZG5hbWUsCisJCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKQorCQkJCXN0YXR1cyA9IFBDQVBfRVJST1JfUEVSTV9ERU5JRUQ7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBkbmFtZSwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlnb3RvIGJhZDsKIAkJfQpAQCAtNTg3LDEwICs0NjksMTggQEAKIAkJLyogVHJ5IGFnYWluIHdpdGggdW5pdCBudW1iZXIgKi8KIAkJaWYgKChwLT5mZCA9IG9wZW4oZG5hbWUyLCBPX1JEV1IpKSA8IDApIHsKIAkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCiAJCQkJLyoKLQkJCQkgKiBXZSBqdXN0IHJlcG9ydCAiTm8gRExQSSBkZXZpY2UgZm91bmQiCi0JCQkJICogd2l0aCB0aGUgZGV2aWNlIG5hbWUsIHNvIHBlb3BsZSBkb24ndAotCQkJCSAqIGdldCBjb25mdXNlZCBhbmQgdGhpbmssIGZvciBleGFtcGxlLAorCQkJCSAqIFdlIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZSBldmVuCisJCQkJICogZm9yIHRoaXMgZXJyb3IsIGZvciBkaWFnbm9zdGljCisJCQkJICogcHVycG9zZXMgKHNvIHRoYXQsIGZvciBleGFtcGxlLAorCQkJCSAqIHRoZSBhcHAgY2FuIHNob3cgdGhlIG1lc3NhZ2UgaWYgdGhlCisJCQkJICogdXNlciByZXF1ZXN0cyBpdCkuCisJCQkJICoKKwkJCQkgKiBJbiBpdCwgd2UganVzdCByZXBvcnQgIk5vIERMUEkgZGV2aWNlCisJCQkJICogZm91bmQiIHdpdGggdGhlIGRldmljZSBuYW1lLCBzbyBwZW9wbGUKKwkJCQkgKiBkb24ndCBnZXQgY29uZnVzZWQgYW5kIHRoaW5rLCBmb3IgZXhhbXBsZSwKIAkJCQkgKiB0aGF0IGlmIHRoZXkgY2FuJ3QgY2FwdHVyZSBvbiAibG8wIgogCQkJCSAqIG9uIFNvbGFyaXMgdGhlIGZpeCBpcyB0byBjaGFuZ2UgbGlicGNhcAogCQkJCSAqIChvciB0aGUgYXBwbGljYXRpb24gdGhhdCB1c2VzIGl0KSB0bwpAQCAtNjAyLDEwICs0OTIsMTIgQEAKIAkJCQkgKiBmb3IgdGhlIGxvb3BiYWNrIGludGVyZmFjZSBpcyBqdXN0IGEKIAkJCQkgKiBzeW1wdG9tIG9mIHRoYXQgaW5hYmlsaXR5LgogCQkJCSAqLwotCQkJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJICAgICIlczogTm8gRExQSSBkZXZpY2UgZm91bmQiLCBkZXZpY2UpOworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIiVzOiBObyBETFBJIGRldmljZSBmb3VuZCIsIHAtPm9wdC5zb3VyY2UpOwogCQkJfSBlbHNlIHsKLQkJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwKKwkJCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKQorCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsCiAJCQkJICAgIGRuYW1lMiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJfQogCQkJZ290byBiYWQ7CkBAIC02MTUsMzAgKzUwNyw0NSBAQAogCX0KICNlbmRpZgogCi0JcC0+c25hcHNob3QgPSBzbmFwbGVuOwotCiAJLyoKIAkqKiBBdHRhY2ggaWYgInN0eWxlIDIiIHByb3ZpZGVyCiAJKi8KLQlpZiAoZGxpbmZvcmVxKHAtPmZkLCBlYnVmKSA8IDAgfHwKLQkgICAgZGxpbmZvYWNrKHAtPmZkLCAoY2hhciAqKWJ1ZiwgZWJ1ZikgPCAwKQorCWlmIChkbGluZm9yZXEocC0+ZmQsIHAtPmVycmJ1ZikgPCAwIHx8CisJICAgIGRsaW5mb2FjayhwLT5mZCwgKGNoYXIgKilidWYsIHAtPmVycmJ1ZikgPCAwKQogCQlnb3RvIGJhZDsKLQlpbmZvcCA9ICYoKHVuaW9uIERMX3ByaW1pdGl2ZXMgKilidWYpLT5pbmZvX2FjazsKKwlpbmZvcCA9ICYoTUFLRV9ETF9QUklNSVRJVkVTKGJ1ZikpLT5pbmZvX2FjazsKICNpZmRlZiBIQVZFX1NPTEFSSVMKIAlpZiAoaW5mb3AtPmRsX21hY190eXBlID09IERMX0lQQVRNKQogCQlpc2F0bSA9IDE7CiAjZW5kaWYKIAlpZiAoaW5mb3AtPmRsX3Byb3ZpZGVyX3N0eWxlID09IERMX1NUWUxFMikgewotCQlpZiAoZGxfZG9hdHRhY2gocC0+ZmQsIHBwYSwgZWJ1ZikgPCAwKQorCQlzdGF0dXMgPSBkbF9kb2F0dGFjaChwLT5mZCwgcHBhLCBwLT5lcnJidWYpOworCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWdvdG8gYmFkOwogI2lmZGVmIERMX0hQX1JBV0RMUwotCQlpZiAocC0+c2VuZF9mZCA+PSAwKSB7Ci0JCQlpZiAoZGxfZG9hdHRhY2gocC0+c2VuZF9mZCwgcHBhLCBlYnVmKSA8IDApCisJCWlmIChwZC0+c2VuZF9mZCA+PSAwKSB7CisJCQlpZiAoZGxfZG9hdHRhY2gocGQtPnNlbmRfZmQsIHBwYSwgcC0+ZXJyYnVmKSA8IDApCiAJCQkJZ290byBiYWQ7CiAJCX0KICNlbmRpZgogCX0KIAorCWlmIChwLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogVGhpcyBkZXZpY2UgZXhpc3RzLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCBtb25pdG9yIG1vZGUKKwkJICogYW55IHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgRExQSS4KKwkJICovCisJCXN0YXR1cyA9IFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCQlnb3RvIGJhZDsKKwl9CisKKyNpZmRlZiBIQVZFX0RMUElfUEFTU0lWRQorCS8qCisJICogRW5hYmxlIFBhc3NpdmUgbW9kZSB0byBiZSBhYmxlIHRvIGNhcHR1cmUgb24gYWdncmVnYXRlZCBsaW5rLgorCSAqIE5vdCBzdXBwb3J0ZWQgaW4gYWxsIFNvbGFyaXMgdmVyc2lvbnMuCisJICovCisJZGxwYXNzaXZlKHAtPmZkLCBwLT5lcnJidWYpOworI2VuZGlmCiAJLyoKIAkqKiBCaW5kIChkZWZlciBpZiB1c2luZyBIUC1VWCA5IG9yIEhQLVVYIDEwLjIwIG9yIGxhdGVyLCB0b3RhbGx5CiAJKiogc2tpcCBpZiB1c2luZyBTSU5JWCkKQEAgLTY2MywyMyArNTcwLDIzIEBACiAJKiogYXNzdW1lIHRoZSBTQVAgdmFsdWUgaW4gYSBETFBJIGJpbmQgaXMgYW4gTExDIFNBUCBmb3IgbmV0d29yawogCSoqIHR5cGVzIHRoYXQgdXNlIDgwMi4yIExMQykuCiAJKi8KLQlpZiAoKGRsYmluZHJlcShwLT5mZCwgMTUzNywgZWJ1ZikgPCAwICYmCi0JICAgICBkbGJpbmRyZXEocC0+ZmQsIDIsIGVidWYpIDwgMCkgfHwKLQkgICAgIGRsYmluZGFjayhwLT5mZCwgKGNoYXIgKilidWYsIGVidWYsIE5VTEwpIDwgMCkKKwlpZiAoKGRsYmluZHJlcShwLT5mZCwgMTUzNywgcC0+ZXJyYnVmKSA8IDAgJiYKKwkgICAgIGRsYmluZHJlcShwLT5mZCwgMiwgcC0+ZXJyYnVmKSA8IDApIHx8CisJICAgICBkbGJpbmRhY2socC0+ZmQsIChjaGFyICopYnVmLCBwLT5lcnJidWYsIE5VTEwpIDwgMCkKIAkJZ290byBiYWQ7CiAjZWxpZiBkZWZpbmVkKERMX0hQX1JBV0RMUykKIAkvKgogCSoqIEhQLVVYIDEwLjB4IGFuZCAxMC4xeC4KIAkqLwotCWlmIChkbF9kb2hwdXhiaW5kKHAtPmZkLCBlYnVmKSA8IDApCisJaWYgKGRsX2RvaHB1eGJpbmQocC0+ZmQsIHAtPmVycmJ1ZikgPCAwKQogCQlnb3RvIGJhZDsKLQlpZiAocC0+c2VuZF9mZCA+PSAwKSB7CisJaWYgKHBkLT5zZW5kX2ZkID49IDApIHsKIAkJLyoKIAkJKiogWFhYIC0gaWYgdGhpcyBmYWlscywganVzdCBjbG9zZSBzZW5kX2ZkIGFuZAogCQkqKiBzZXQgaXQgdG8gLTEsIHNvIHRoYXQgeW91IGNhbid0IHNlbmQgYnV0IGNhbgogCQkqKiBzdGlsbCByZWNlaXZlPwogCQkqLwotCQlpZiAoZGxfZG9ocHV4YmluZChwLT5zZW5kX2ZkLCBlYnVmKSA8IDApCisJCWlmIChkbF9kb2hwdXhiaW5kKHBkLT5zZW5kX2ZkLCBwLT5lcnJidWYpIDwgMCkKIAkJCWdvdG8gYmFkOwogCX0KICNlbHNlIC8qIG5laXRoZXIgQUlYIG5vciBIUC1VWCAqLwpAQCAtNjg3LDggKzU5NCw4IEBACiAJKiogTm90IFNpbml4LCBhbmQgbmVpdGhlciBBSVggbm9yIEhQLVVYIC0gU29sYXJpcywgYW5kIGFueSBvdGhlcgogCSoqIE9TIHVzaW5nIERMUEkuCiAJKiovCi0JaWYgKGRsYmluZHJlcShwLT5mZCwgMCwgZWJ1ZikgPCAwIHx8Ci0JICAgIGRsYmluZGFjayhwLT5mZCwgKGNoYXIgKilidWYsIGVidWYsIE5VTEwpIDwgMCkKKwlpZiAoZGxiaW5kcmVxKHAtPmZkLCAwLCBwLT5lcnJidWYpIDwgMCB8fAorCSAgICBkbGJpbmRhY2socC0+ZmQsIChjaGFyICopYnVmLCBwLT5lcnJidWYsIE5VTEwpIDwgMCkKIAkJZ290byBiYWQ7CiAjZW5kaWYgLyogQUlYIHZzLiBIUC1VWCB2cy4gb3RoZXIgKi8KICNlbmRpZiAvKiAhSFAtVVggOSBhbmQgIUhQLVVYIDEwLjIwIG9yIGxhdGVyIGFuZCAhU0lOSVggKi8KQEAgLTcwMiwxOSArNjA5LDIyIEBACiAJCSoqIGhlbHAsIGFuZCBtYXkgYnJlYWsgdGhpbmdzLgogCQkqLwogCQlpZiAoc3RyaW9jdGwocC0+ZmQsIEFfUFJPTUlTQ09OX1JFUSwgMCwgTlVMTCkgPCAwKSB7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQV9QUk9NSVNDT05fUkVROiAlcyIsCi0JCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJBX1BST01JU0NPTl9SRVE6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJZ290byBiYWQ7CiAJCX0KIAl9IGVsc2UKICNlbmRpZgotCWlmIChwcm9taXNjKSB7CisJaWYgKHAtPm9wdC5wcm9taXNjKSB7CiAJCS8qCiAJCSoqIEVuYWJsZSBwcm9taXNjdW91cyAobm90IG5lY2Vzc2FyeSBvbiBzZW5kIEZEKQogCQkqLwotCQlpZiAoZGxwcm9taXNjb25yZXEocC0+ZmQsIERMX1BST01JU0NfUEhZUywgZWJ1ZikgPCAwIHx8Ci0JCSAgICBkbG9rYWNrKHAtPmZkLCAicHJvbWlzY19waHlzIiwgKGNoYXIgKilidWYsIGVidWYpIDwgMCkKKwkJc3RhdHVzID0gZGxwcm9taXNjb24ocCwgRExfUFJPTUlTQ19QSFlTKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChzdGF0dXMgPT0gUENBUF9FUlJPUl9QRVJNX0RFTklFRCkKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BST01JU0NfUEVSTV9ERU5JRUQ7CiAJCQlnb3RvIGJhZDsKKwkJfQogCiAJCS8qCiAJCSoqIFRyeSB0byBlbmFibGUgbXVsdGljYXN0ICh5b3Ugd291bGQgaGF2ZSB0aG91Z2h0CkBAIC03MjIsMTAgKzYzMiw5IEBACiAJCSoqIEhQLVVYIG9yIFNJTklYKSAoTm90IG5lY2Vzc2FyeSBvbiBzZW5kIEZEKQogCQkqLwogI2lmICFkZWZpbmVkKF9faHB1eCkgJiYgIWRlZmluZWQoc2luaXgpCi0JCWlmIChkbHByb21pc2NvbnJlcShwLT5mZCwgRExfUFJPTUlTQ19NVUxUSSwgZWJ1ZikgPCAwIHx8Ci0JCSAgICBkbG9rYWNrKHAtPmZkLCAicHJvbWlzY19tdWx0aSIsIChjaGFyICopYnVmLCBlYnVmKSA8IDApCi0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAiV0FSTklORzogRExfUFJPTUlTQ19NVUxUSSBmYWlsZWQgKCVzKVxuIiwgZWJ1Zik7CisJCXN0YXR1cyA9IGRscHJvbWlzY29uKHAsIERMX1BST01JU0NfTVVMVEkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXN0YXR1cyA9IFBDQVBfV0FSTklORzsKICNlbmRpZgogCX0KIAkvKgpAQCAtNzM0LDIxICs2NDMsMjcgQEAKIAkqKiB1bmRlciBTSU5JWCkgKE5vdCBuZWNlc3Nhcnkgb24gc2VuZCBGRCkKIAkqLwogI2lmbmRlZiBzaW5peAotCWlmICgKLSNpZmRlZiBfX2hwdXgKLQkgICAgIXByb21pc2MgJiYKKyNpZiBkZWZpbmVkKF9faHB1eCkKKwkvKiBIUC1VWCAtIG9ubHkgZG8gdGhpcyB3aGVuIG5vdCBpbiBwcm9taXNjdW91cyBtb2RlICovCisJaWYgKCFwLT5vcHQucHJvbWlzYykgeworI2VsaWYgZGVmaW5lZChIQVZFX1NPTEFSSVMpCisJLyogU29sYXJpcyAtIGRvbid0IGRvIHRoaXMgb24gU3VuQVRNIGRldmljZXMgKi8KKwlpZiAoIWlzYXRtKSB7CisjZWxzZQorCS8qIEV2ZXJ5dGhpbmcgZWxzZSAoZXhjZXB0IGZvciBTSU5JWCkgLSBhbHdheXMgZG8gdGhpcyAqLworCXsKICNlbmRpZgotI2lmZGVmIEhBVkVfU09MQVJJUwotCSAgICAhaXNhdG0gJiYKLSNlbmRpZgotCSAgICAoZGxwcm9taXNjb25yZXEocC0+ZmQsIERMX1BST01JU0NfU0FQLCBlYnVmKSA8IDAgfHwKLQkgICAgZGxva2FjayhwLT5mZCwgInByb21pc2Nfc2FwIiwgKGNoYXIgKilidWYsIGVidWYpIDwgMCkpIHsKLQkJLyogTm90IGZhdGFsIGlmIHByb21pc2Mgc2luY2UgdGhlIERMX1BST01JU0NfUEhZUyB3b3JrZWQgKi8KLQkJaWYgKHByb21pc2MpCi0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAiV0FSTklORzogRExfUFJPTUlTQ19TQVAgZmFpbGVkICglcylcbiIsIGVidWYpOwotCQllbHNlCi0JCQlnb3RvIGJhZDsKKwkJc3RhdHVzID0gZGxwcm9taXNjb24ocCwgRExfUFJPTUlTQ19TQVApOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJLyoKKwkJCSAqIE5vdCBmYXRhbCwgc2luY2UgdGhlIERMX1BST01JU0NfUEhZUyBtb2RlIHdvcmtlZC4KKwkJCSAqIFJlcG9ydCBpdCBhcyBhIHdhcm5pbmcsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWlmIChwLT5vcHQucHJvbWlzYykKKwkJCQlzdGF0dXMgPSBQQ0FQX1dBUk5JTkc7CisJCQllbHNlCisJCQkJZ290byBiYWQ7CisJCX0KIAl9CiAjZW5kaWYgLyogc2luaXggKi8KIApAQCAtNzU3LDIwICs2NzIsMjAgQEAKIAkqKiBwcm9taXNjdW91cyBvcHRpb25zLgogCSovCiAjaWYgZGVmaW5lZChIQVZFX0hQVVg5KSB8fCBkZWZpbmVkKEhBVkVfSFBVWDEwXzIwX09SX0xBVEVSKQotCWlmIChkbF9kb2hwdXhiaW5kKHAtPmZkLCBlYnVmKSA8IDApCisJaWYgKGRsX2RvaHB1eGJpbmQocC0+ZmQsIHAtPmVycmJ1ZikgPCAwKQogCQlnb3RvIGJhZDsKIAkvKgogCSoqIFdlIGRvbid0IHNldCBwcm9taXNjdW91cyBtb2RlIG9uIHRoZSBzZW5kIEZELCBidXQgd2UnbGwgZGVmZXIKIAkqKiBiaW5kaW5nIGl0IGFueXdheSwganVzdCB0byBrZWVwIHRoZSBIUC1VWCA5LzEwLjIwIG9yIGxhdGVyCiAJKiogY29kZSB0b2dldGhlci4KIAkqLwotCWlmIChwLT5zZW5kX2ZkID49IDApIHsKKwlpZiAocGQtPnNlbmRfZmQgPj0gMCkgewogCQkvKgogCQkqKiBYWFggLSBpZiB0aGlzIGZhaWxzLCBqdXN0IGNsb3NlIHNlbmRfZmQgYW5kCiAJCSoqIHNldCBpdCB0byAtMSwgc28gdGhhdCB5b3UgY2FuJ3Qgc2VuZCBidXQgY2FuCiAJCSoqIHN0aWxsIHJlY2VpdmU/CiAJCSovCi0JCWlmIChkbF9kb2hwdXhiaW5kKHAtPnNlbmRfZmQsIGVidWYpIDwgMCkKKwkJaWYgKGRsX2RvaHB1eGJpbmQocGQtPnNlbmRfZmQsIHAtPmVycmJ1ZikgPCAwKQogCQkJZ290byBiYWQ7CiAJfQogI2VuZGlmCkBAIC03ODAsNjMgKzY5NSwxMyBAQAogCSoqIFhYWCAtIGdldCBTQVAgbGVuZ3RoIGFuZCBhZGRyZXNzIGxlbmd0aCBhcyB3ZWxsLCBmb3IgdXNlCiAJKiogd2hlbiBzZW5kaW5nIHBhY2tldHMuCiAJKi8KLQlpZiAoZGxpbmZvcmVxKHAtPmZkLCBlYnVmKSA8IDAgfHwKLQkgICAgZGxpbmZvYWNrKHAtPmZkLCAoY2hhciAqKWJ1ZiwgZWJ1ZikgPCAwKQorCWlmIChkbGluZm9yZXEocC0+ZmQsIHAtPmVycmJ1ZikgPCAwIHx8CisJICAgIGRsaW5mb2FjayhwLT5mZCwgKGNoYXIgKilidWYsIHAtPmVycmJ1ZikgPCAwKQogCQlnb3RvIGJhZDsKIAotCWluZm9wID0gJigodW5pb24gRExfcHJpbWl0aXZlcyAqKWJ1ZiktPmluZm9fYWNrOwotCXN3aXRjaCAoaW5mb3AtPmRsX21hY190eXBlKSB7Ci0KLQljYXNlIERMX0NTTUFDRDoKLQljYXNlIERMX0VUSEVSOgotCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7Ci0JCXAtPm9mZnNldCA9IDI7Ci0JCS8qCi0JCSAqIFRoaXMgaXMgKHByZXN1bWFibHkpIGEgcmVhbCBFdGhlcm5ldCBjYXB0dXJlOyBnaXZlIGl0IGEKLQkJICogbGluay1sYXllci10eXBlIGxpc3Qgd2l0aCBETFRfRU4xME1CIGFuZCBETFRfRE9DU0lTLCBzbwotCQkgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiBsZXQgeW91IGNob29zZSBpdCwgaW4gY2FzZSB5b3UncmUKLQkJICogY2FwdHVyaW5nIERPQ1NJUyB0cmFmZmljIHRoYXQgYSBDaXNjbyBDYWJsZSBNb2RlbQotCQkgKiBUZXJtaW5hdGlvbiBTeXN0ZW0gaXMgcHV0dGluZyBvdXQgb250byBhbiBFdGhlcm5ldCAoaXQKLQkJICogZG9lc24ndCBwdXQgYW4gRXRoZXJuZXQgaGVhZGVyIG9udG8gdGhlIHdpcmUsIGl0IHB1dHMgcmF3Ci0JCSAqIERPQ1NJUyBmcmFtZXMgb3V0IG9uIHRoZSB3aXJlIGluc2lkZSB0aGUgbG93LWxldmVsCi0JCSAqIEV0aGVybmV0IGZyYW1pbmcpLgotCQkgKi8KLQkJcC0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKLQkJLyoKLQkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KLQkJICovCi0JCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7Ci0JCQlwLT5kbHRfbGlzdFswXSA9IERMVF9FTjEwTUI7Ci0JCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7Ci0JCQlwLT5kbHRfY291bnQgPSAyOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBETF9GRERJOgotCQlwLT5saW5rdHlwZSA9IERMVF9GRERJOwotCQlwLT5vZmZzZXQgPSAzOwotCQlicmVhazsKLQotCWNhc2UgRExfVFBSOgotCQkvKgotCQkgKiBYWFggLSB3aGF0IGFib3V0IERMX1RQQj8gIElzIHRoYXQgVG9rZW4gQnVzPwotCQkgKi8JCi0JCXAtPmxpbmt0eXBlID0gRExUX0lFRUU4MDI7Ci0JCXAtPm9mZnNldCA9IDI7Ci0JCWJyZWFrOwotCi0jaWZkZWYgSEFWRV9TT0xBUklTCi0JY2FzZSBETF9JUEFUTToKLQkJcC0+bGlua3R5cGUgPSBETFRfU1VOQVRNOwotCQlwLT5vZmZzZXQgPSAwOwkvKiB3b3JrcyBmb3IgTEFORSBhbmQgTExDIGVuY2Fwc3VsYXRpb24gKi8KLQkJYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJ1bmtub3duIG1hYyB0eXBlICVsdSIsCi0JCSAgICAodW5zaWduZWQgbG9uZylpbmZvcC0+ZGxfbWFjX3R5cGUpOworCWluZm9wID0gJihNQUtFX0RMX1BSSU1JVElWRVMoYnVmKSktPmluZm9fYWNrOworCWlmIChwY2FwX3Byb2Nlc3NfbWFjdHlwZShwLCBpbmZvcC0+ZGxfbWFjX3R5cGUpICE9IDApCiAJCWdvdG8gYmFkOwotCX0KIAogI2lmZGVmCURMSU9DUkFXCiAJLyoKQEAgLTg0NCw5MyArNzA5LDU2IEBACiAJKiogaGVhZGVyLgogCSovCiAJaWYgKHN0cmlvY3RsKHAtPmZkLCBETElPQ1JBVywgMCwgTlVMTCkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJETElPQ1JBVzogJXMiLAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJETElPQ1JBVzogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICi0JLyoKLQkqKiBBbm90aGVyIG5vbiBzdGFuZGFyZCBjYWxsIHRvIGdldCB0aGUgZGF0YSBuaWNlbHkgYnVmZmVyZWQKLQkqLwotCWlmIChpb2N0bChwLT5mZCwgSV9QVVNILCAiYnVmbW9kIikgIT0gMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiSV9QVVNIIGJ1Zm1vZDogJXMiLAotCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGJhZDsKLQl9CisJc3MgPSBwLT5zbmFwc2hvdDsKIAogCS8qCi0JKiogTm93IHRoYXQgdGhlIGJ1Zm1vZCBpcyBwdXNoZWQgbGV0cyBjb25maWd1cmUgaXQuCi0JKioKIAkqKiBUaGVyZSBpcyBhIGJ1ZyBpbiBidWZtb2QoNykuIFdoZW4gZGVhbGluZyB3aXRoIG1lc3NhZ2VzIG9mCiAJKiogbGVzcyB0aGFuIHNuYXBsZW4gc2l6ZSBpdCBzdHJpcHMgZGF0YSBmcm9tIHRoZSBiZWdpbm5pbmcgbm90CiAJKiogdGhlIGVuZC4KIAkqKgotCSoqIFRoaXMgYnVnIGlzIHN1cHBvc2VkIHRvIGJlIGZpeGVkIGluIDUuMy4yLiBBbHNvLCB0aGVyZSBpcyBhCi0JKiogcGF0Y2ggYXZhaWxhYmxlLiBBc2sgZm9yIGJ1Z2lkIDExNDkwNjUuCisJKiogVGhpcyBidWcgaXMgZml4ZWQgaW4gNS4zLjIuIEFsc28sIHRoZXJlIGlzIGEgcGF0Y2ggYXZhaWxhYmxlLgorCSoqIEFzayBmb3IgYnVnaWQgMTE0OTA2NS4KIAkqLwotCXNzID0gc25hcGxlbjsKICNpZmRlZiBIQVZFX1NPTEFSSVMKIAlyZWxlYXNlID0gZ2V0X3JlbGVhc2UoJm9zbWFqb3IsICZvc21pbm9yLCAmb3NtaWNybyk7CiAJaWYgKG9zbWFqb3IgPT0gNSAmJiAob3NtaW5vciA8PSAyIHx8IChvc21pbm9yID09IDMgJiYgb3NtaWNybyA8IDIpKSAmJgogCSAgICBnZXRlbnYoIkJVRk1PRF9GSVhFRCIpID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCSJXQVJOSU5HOiBidWZtb2QgaXMgYnJva2VuIGluIFN1bk9TICVzOyBpZ25vcmluZyBzbmFwbGVuLlxuIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkiV0FSTklORzogYnVmbW9kIGlzIGJyb2tlbiBpbiBTdW5PUyAlczsgaWdub3Jpbmcgc25hcGxlbi4iLAogCQkgICAgcmVsZWFzZSk7CiAJCXNzID0gMDsKKwkJc3RhdHVzID0gUENBUF9XQVJOSU5HOwogCX0KICNlbmRpZgotCWlmIChzcyA+IDAgJiYKLQkgICAgc3RyaW9jdGwocC0+ZmQsIFNCSU9DU1NOQVAsIHNpemVvZihzcyksIChjaGFyICopJnNzKSAhPSAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTQklPQ1NTTkFQOiAlcyIsCi0JCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisKKwkvKiBQdXNoIGFuZCBjb25maWd1cmUgYnVmbW9kLiAqLworCWlmIChwY2FwX2NvbmZfYnVmbW9kKHAsIHNzKSAhPSAwKQogCQlnb3RvIGJhZDsKLQl9Ci0KLQkvKgotCSoqIFNldCB1cCB0aGUgYnVmbW9kIHRpbWVvdXQKLQkqLwotCWlmICh0b19tcyAhPSAwKSB7Ci0JCXN0cnVjdCB0aW1ldmFsIHRvOwotCi0JCXRvLnR2X3NlYyA9IHRvX21zIC8gMTAwMDsKLQkJdG8udHZfdXNlYyA9ICh0b19tcyAqIDEwMDApICUgMTAwMDAwMDsKLQkJaWYgKHN0cmlvY3RsKHAtPmZkLCBTQklPQ1NUSU1FLCBzaXplb2YodG8pLCAoY2hhciAqKSZ0bykgIT0gMCkgewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNCSU9DU1RJTUU6ICVzIiwKLQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGJhZDsKLQkJfQotCX0KLQotCS8qCi0JKiogU2V0IHRoZSBjaHVuayBsZW5ndGguCi0JKi8KLQljaHVua3NpemUgPSBDSFVOS1NJWkU7Ci0JaWYgKHN0cmlvY3RsKHAtPmZkLCBTQklPQ1NDSFVOSywgc2l6ZW9mKGNodW5rc2l6ZSksIChjaGFyICopJmNodW5rc2l6ZSkKLQkgICAgIT0gMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0JJT0NTQ0hVTktQOiAlcyIsCi0JCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gYmFkOwotCX0KICNlbmRpZgogCiAJLyoKIAkqKiBBcyB0aGUgbGFzdCBvcGVyYXRpb24gZmx1c2ggdGhlIHJlYWQgc2lkZS4KIAkqLwogCWlmIChpb2N0bChwLT5mZCwgSV9GTFVTSCwgRkxVU0hSKSAhPSAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGTFVTSFI6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRkxVU0hSOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAotCS8qIEFsbG9jYXRlIGRhdGEgYnVmZmVyICovCi0JcC0+YnVmc2l6ZSA9IFBLVEJVRlNJWkU7Ci0JcC0+YnVmZmVyID0gKHVfY2hhciAqKW1hbGxvYyhwLT5idWZzaXplICsgcC0+b2Zmc2V0KTsKLQlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKLQkJc3RybGNweShlYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7CisJLyogQWxsb2NhdGUgZGF0YSBidWZmZXIuICovCisJaWYgKHBjYXBfYWxsb2NfZGF0YWJ1ZihwKSAhPSAwKQogCQlnb3RvIGJhZDsKLQl9CisKKwkvKiBTdWNjZXNzIC0gYnV0IHBlcmhhcHMgd2l0aCBhIHdhcm5pbmcgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJc3RhdHVzID0gMDsKIAogCS8qCiAJICogInAtPmZkIiBpcyBhbiBGRCBmb3IgYSBTVFJFQU1TIGRldmljZSwgc28gInNlbGVjdCgpIiBhbmQKQEAgLTk0NiwyMSArNzc0LDEyIEBACiAJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwogCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfZGxwaTsKLQlwLT5jbG9zZV9vcCA9IHBjYXBfY2xvc2VfZGxwaTsKKwlwLT5jbGVhbnVwX29wID0gcGNhcF9jbGVhbnVwX2RscGk7CiAKLQlyZXR1cm4gKHApOworCXJldHVybiAoc3RhdHVzKTsKIGJhZDoKLQlpZiAocC0+ZmQgPj0gMCkKLQkJY2xvc2UocC0+ZmQpOwotCWlmIChwLT5zZW5kX2ZkID49IDApCi0JCWNsb3NlKHAtPnNlbmRfZmQpOwotCS8qCi0JICogR2V0IHJpZCBvZiBhbnkgbGluay1sYXllciB0eXBlIGxpc3Qgd2UgYWxsb2NhdGVkLgotCSAqLwotCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKQotCQlmcmVlKHAtPmRsdF9saXN0KTsKLQlmcmVlKHApOwotCXJldHVybiAoTlVMTCk7CisJcGNhcF9jbGVhbnVwX2RscGkocCk7CisJcmV0dXJuIChzdGF0dXMpOwogfQogCiAvKgpAQCAtMTAxNSwxMSArODM0LDE4IEBACiBzdGF0aWMgaW50CiBkbF9kb2F0dGFjaChpbnQgZmQsIGludCBwcGEsIGNoYXIgKmVidWYpCiB7CisJZGxfYXR0YWNoX3JlcV90CXJlcTsKIAlicGZfdV9pbnQzMiBidWZbTUFYRExCVUZdOworCWludCBlcnI7CiAKLQlpZiAoZGxhdHRhY2hyZXEoZmQsIHBwYSwgZWJ1ZikgPCAwIHx8Ci0JICAgIGRsb2thY2soZmQsICJhdHRhY2giLCAoY2hhciAqKWJ1ZiwgZWJ1ZikgPCAwKQotCQlyZXR1cm4gKC0xKTsKKwlyZXEuZGxfcHJpbWl0aXZlID0gRExfQVRUQUNIX1JFUTsKKwlyZXEuZGxfcHBhID0gcHBhOworCWlmIChzZW5kX3JlcXVlc3QoZmQsIChjaGFyICopJnJlcSwgc2l6ZW9mKHJlcSksICJhdHRhY2giLCBlYnVmKSA8IDApCisJCXJldHVybiAoUENBUF9FUlJPUik7CisKKwllcnIgPSBkbG9rYWNrKGZkLCAiYXR0YWNoIiwgKGNoYXIgKilidWYsIGVidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gKGVycik7CiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMTA3NCw2ICs5MDAsMjcgQEAKIH0KICNlbmRpZgogCisjZGVmaW5lIFNUUklOR0lGWShuKQkjbgorCitzdGF0aWMgaW50CitkbHByb21pc2NvbihwY2FwX3QgKnAsIGJwZl91X2ludDMyIGxldmVsKQoreworCWRsX3Byb21pc2Nvbl9yZXFfdCByZXE7CisJYnBmX3VfaW50MzIgYnVmW01BWERMQlVGXTsKKwlpbnQgZXJyOworCisJcmVxLmRsX3ByaW1pdGl2ZSA9IERMX1BST01JU0NPTl9SRVE7CisJcmVxLmRsX2xldmVsID0gbGV2ZWw7CisJaWYgKHNlbmRfcmVxdWVzdChwLT5mZCwgKGNoYXIgKikmcmVxLCBzaXplb2YocmVxKSwgInByb21pc2NvbiIsCisJICAgIHAtPmVycmJ1ZikgPCAwKQorCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCWVyciA9IGRsb2thY2socC0+ZmQsICJwcm9taXNjb24iIFNUUklOR0lGWShsZXZlbCksIChjaGFyICopYnVmLAorCSAgICBwLT5lcnJidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gKGVycik7CisJcmV0dXJuICgwKTsKK30KKwogaW50CiBwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7CkBAIC0xMTU5LDEwICsxMDA2LDEwIEBACiAJaWYgKGdldG1zZyhmZCwgJmN0bCwgKHN0cnVjdCBzdHJidWYqKU5VTEwsICZmbGFncykgPCAwKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWN2X2FjazogJXMgZ2V0bXNnOiAlcyIsCiAJCSAgICB3aGF0LCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAotCWRscCA9ICh1bmlvbiBETF9wcmltaXRpdmVzICopIGN0bC5idWY7CisJZGxwID0gTUFLRV9ETF9QUklNSVRJVkVTKGN0bC5idWYpOwogCXN3aXRjaCAoZGxwLT5kbF9wcmltaXRpdmUpIHsKIAogCWNhc2UgRExfSU5GT19BQ0s6CkBAIC0xMTgzLDI3ICsxMDMwLDM0IEBACiAJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJyZWN2X2FjazogJXM6IFVOSVggZXJyb3IgLSAlcyIsCiAJCQkgICAgd2hhdCwgcGNhcF9zdHJlcnJvcihkbHAtPmVycm9yX2Fjay5kbF91bml4X2Vycm5vKSk7CisJCQlpZiAoZGxwLT5lcnJvcl9hY2suZGxfdW5peF9lcnJubyA9PSBFUEVSTSB8fAorCQkJICAgIGRscC0+ZXJyb3JfYWNrLmRsX3VuaXhfZXJybm8gPT0gRUFDQ0VTKQorCQkJCXJldHVybiAoUENBUF9FUlJPUl9QRVJNX0RFTklFRCk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlY3ZfYWNrOiAlczogJXMiLAogCQkJICAgIHdoYXQsIGRsc3RyZXJyb3IoZGxwLT5lcnJvcl9hY2suZGxfZXJybm8pKTsKKwkJCWlmIChkbHAtPmVycm9yX2Fjay5kbF9lcnJubyA9PSBETF9CQURQUEEpCisJCQkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKKwkJCWVsc2UgaWYgKGRscC0+ZXJyb3JfYWNrLmRsX2Vycm5vID09IERMX0FDQ0VTUykKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1JfUEVSTV9ERU5JRUQpOwogCQkJYnJlYWs7CiAJCX0KLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAKIAlkZWZhdWx0OgogCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInJlY3ZfYWNrOiAlczogVW5leHBlY3RlZCBwcmltaXRpdmUgYWNrICVzIiwKIAkJICAgIHdoYXQsIGRscHJpbShkbHAtPmRsX3ByaW1pdGl2ZSkpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlpZiAoY3RsLmxlbiA8IHNpemUpIHsKIAkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJyZWN2X2FjazogJXM6IEFjayB0b28gc21hbGwgKCVkIDwgJWQpIiwKIAkJICAgIHdoYXQsIGN0bC5sZW4sIHNpemUpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAJcmV0dXJuIChjdGwubGVuKTsKIH0KQEAgLTE0MTMsMTcgKzEyNjcsNiBAQAogfQogCiBzdGF0aWMgaW50Ci1kbGF0dGFjaHJlcShpbnQgZmQsIGJwZl91X2ludDMyIHBwYSwgY2hhciAqZWJ1ZikKLXsKLQlkbF9hdHRhY2hfcmVxX3QJcmVxOwotCi0JcmVxLmRsX3ByaW1pdGl2ZSA9IERMX0FUVEFDSF9SRVE7Ci0JcmVxLmRsX3BwYSA9IHBwYTsKLQotCXJldHVybiAoc2VuZF9yZXF1ZXN0KGZkLCAoY2hhciAqKSZyZXEsIHNpemVvZihyZXEpLCAiYXR0YWNoIiwgZWJ1ZikpOwotfQotCi1zdGF0aWMgaW50CiBkbGJpbmRyZXEoaW50IGZkLCBicGZfdV9pbnQzMiBzYXAsIGNoYXIgKmVidWYpCiB7CiAKQEAgLTE0NTEsMTcgKzEyOTQsNiBAQAogfQogCiBzdGF0aWMgaW50Ci1kbHByb21pc2NvbnJlcShpbnQgZmQsIGJwZl91X2ludDMyIGxldmVsLCBjaGFyICplYnVmKQotewotCWRsX3Byb21pc2Nvbl9yZXFfdCByZXE7Ci0KLQlyZXEuZGxfcHJpbWl0aXZlID0gRExfUFJPTUlTQ09OX1JFUTsKLQlyZXEuZGxfbGV2ZWwgPSBsZXZlbDsKLQotCXJldHVybiAoc2VuZF9yZXF1ZXN0KGZkLCAoY2hhciAqKSZyZXEsIHNpemVvZihyZXEpLCAicHJvbWlzY29uIiwgZWJ1ZikpOwotfQotCi1zdGF0aWMgaW50CiBkbG9rYWNrKGludCBmZCwgY29uc3QgY2hhciAqd2hhdCwgY2hhciAqYnVmcCwgY2hhciAqZWJ1ZikKIHsKIApAQCAtMTQ4Niw2ICsxMzE4LDI0IEBACiAJcmV0dXJuIChyZWN2X2FjayhmZCwgRExfSU5GT19BQ0tfU0laRSwgImluZm8iLCBidWZwLCBlYnVmLCBOVUxMKSk7CiB9CiAKKyNpZmRlZiBIQVZFX0RMUElfUEFTU0lWRQorLyoKKyAqIEVuYWJsZSBETFBJIHBhc3NpdmUgbW9kZS4gV2UgZG8gbm90IGNhcmUgaWYgdGhpcyByZXF1ZXN0IGZhaWxzLCBhcyB0aGlzCisgKiBpbmRpY2F0ZXMgdGhlIHVuZGVybHlpbmcgRExQSSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBsaW5rIGFnZ3JlZ2F0aW9uLgorICovCitzdGF0aWMgdm9pZAorZGxwYXNzaXZlKGludCBmZCwgY2hhciAqZWJ1ZikKK3sKKwlkbF9wYXNzaXZlX3JlcV90IHJlcTsKKwlicGZfdV9pbnQzMiBidWZbTUFYRExCVUZdOworCisJcmVxLmRsX3ByaW1pdGl2ZSA9IERMX1BBU1NJVkVfUkVROworCisJaWYgKHNlbmRfcmVxdWVzdChmZCwgKGNoYXIgKikmcmVxLCBzaXplb2YocmVxKSwgImRscGFzc2l2ZSIsIGVidWYpID09IDApCisJICAgICh2b2lkKSBkbG9rYWNrKGZkLCAiZGxwYXNzaXZlIiwgKGNoYXIgKilidWYsIGVidWYpOworfQorI2VuZGlmCisKICNpZmRlZiBETF9IUF9SQVdETFMKIC8qCiAgKiBUaGVyZSdzIGFuIGFjayAqaWYqIHRoZXJlJ3MgYW4gZXJyb3IuCkBAIC0xNDk4LDcgKzEzNDgsNyBAQAogCXVuaW9uIERMX3ByaW1pdGl2ZXMgKmRscDsKIAlpbnQgZGxlbjsKIAotCWRscCA9ICh1bmlvbiBETF9wcmltaXRpdmVzKikgYnVmOworCWRscCA9IE1BS0VfRExfUFJJTUlUSVZFUyhidWYpOwogCiAJZGxwLT5kbF9wcmltaXRpdmUgPSBETF9IUF9SQVdEQVRBX1JFUTsKIAlkbGVuID0gRExfSFBfUkFXREFUQV9SRVFfU0laRTsKQEAgLTE1MjIsMjYgKzEzNzIsNiBAQAogfQogI2VuZGlmIC8qIERMX0hQX1JBV0RMUyAqLwogCi0jaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKLXN0YXRpYyBpbnQKLXN0cmlvY3RsKGludCBmZCwgaW50IGNtZCwgaW50IGxlbiwgY2hhciAqZHApCi17Ci0Jc3RydWN0IHN0cmlvY3RsIHN0cjsKLQlpbnQgcmM7Ci0KLQlzdHIuaWNfY21kID0gY21kOwotCXN0ci5pY190aW1vdXQgPSAtMTsKLQlzdHIuaWNfbGVuID0gbGVuOwotCXN0ci5pY19kcCA9IGRwOwotCXJjID0gaW9jdGwoZmQsIElfU1RSLCAmc3RyKTsKLQotCWlmIChyYyA8IDApCi0JCXJldHVybiAocmMpOwotCWVsc2UKLQkJcmV0dXJuIChzdHIuaWNfbGVuKTsKLX0KLSNlbmRpZgotCiAjaWYgZGVmaW5lZChIQVZFX1NPTEFSSVMpICYmIGRlZmluZWQoSEFWRV9TWVNfQlVGTU9EX0gpCiBzdGF0aWMgY2hhciAqCiBnZXRfcmVsZWFzZShicGZfdV9pbnQzMiAqbWFqb3JwLCBicGZfdV9pbnQzMiAqbWlub3JwLCBicGZfdV9pbnQzMiAqbWljcm9wKQpAQCAtMTYzMSw3ICsxNDYxLDcgQEAKIAogCW1lbXNldCgoY2hhciAqKWJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwogCWlmIChzZW5kX3JlcXVlc3QoZmQsIChjaGFyICopJnJlcSwgc2l6ZW9mKHJlcSksICJocHBwYSIsIGVidWYpIDwgMCkKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAKIAljdGwubWF4bGVuID0gRExfSFBfUFBBX0FDS19TSVpFOwogCWN0bC5sZW4gPSAwOwpAQCAtMTY1NCw3ICsxNDg0LDcgQEAKIAlpZiAoZ2V0bXNnKGZkLCAmY3RsLCAoc3RydWN0IHN0cmJ1ZiAqKU5VTEwsICZmbGFncykgPCAwKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSBnZXRtc2c6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlkbHAgPSAoZGxfaHBfcHBhX2Fja190ICopY3RsLmJ1ZjsKQEAgLTE2NjIsMjEgKzE0OTIsMjEgQEAKIAkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJnZXRfZGxwaV9wcGE6IGhwcHBhIHVuZXhwZWN0ZWQgcHJpbWl0aXZlIGFjayAweCV4IiwKIAkJICAgIChicGZfdV9pbnQzMilkbHAtPmRsX3ByaW1pdGl2ZSk7Ci0JCXJldHVybiAoLTEpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCWlmIChjdGwubGVuIDwgRExfSFBfUFBBX0FDS19TSVpFKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSBhY2sgdG9vIHNtYWxsICglZCA8ICVsdSkiLAogCQkgICAgIGN0bC5sZW4sICh1bnNpZ25lZCBsb25nKURMX0hQX1BQQV9BQ0tfU0laRSk7Ci0JCXJldHVybiAoLTEpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCS8qIGFsbG9jYXRlIGJ1ZmZlciAqLwogCWlmICgocHBhX2RhdGFfYnVmID0gKGNoYXIgKiltYWxsb2MoZGxwLT5kbF9sZW5ndGgpKSA9PSBOVUxMKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSBtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAJY3RsLm1heGxlbiA9IGRscC0+ZGxfbGVuZ3RoOwogCWN0bC5sZW4gPSAwOwpAQCAtMTY4NiwxNCArMTUxNiwxNCBAQAogCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImdldF9kbHBpX3BwYTogaHBwcGEgZ2V0bXNnOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZnJlZShwcGFfZGF0YV9idWYpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAJaWYgKGN0bC5sZW4gPCBkbHAtPmRsX2xlbmd0aCkgewogCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkgICAgImdldF9kbHBpX3BwYTogaHBwcGEgYWNrIHRvbyBzbWFsbCAoJWQgPCAlZCkiLAotCQkgICAgY3RsLmxlbiwgZGxwLT5kbF9sZW5ndGgpOworCQkgICAgImdldF9kbHBpX3BwYTogaHBwcGEgYWNrIHRvbyBzbWFsbCAoJWQgPCAlbHUpIiwKKwkJICAgIGN0bC5sZW4sICh1bnNpZ25lZCBsb25nKWRscC0+ZGxfbGVuZ3RoKTsKIAkJZnJlZShwcGFfZGF0YV9idWYpOwotCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlhcCA9IChkbF9ocF9wcGFfYWNrX3QgKilidWY7CkBAIC0xNzUwLDcgKzE1ODAsNyBAQAogCQlpZiAoc3RhdChkbmFtZSwgJnN0YXRidWYpIDwgMCkgewogCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInN0YXQ6ICVzOiAlcyIsCiAJCQkgICAgZG5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJldHVybiAoLTEpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJfQogCQltYWpkZXYgPSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpOwogCkBAIC0xNzY3LDEzICsxNTk3LDEzIEBACiAJaWYgKGkgPT0gYXAtPmRsX2NvdW50KSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiY2FuJ3QgZmluZCAvZGV2L2RscGkgUFBBIGZvciAlcyVkIiwgZGV2aWNlLCB1bml0KTsKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSk7CiAJfQogCWlmIChpcC0+ZGxfaGR3X3N0YXRlID09IEhEV19ERUFEKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXMlZDogaGFyZHdhcmUgc3RhdGU6IERPV05cbiIsIGRldmljZSwgdW5pdCk7CiAJCWZyZWUocHBhX2RhdGFfYnVmKTsKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAJfQogCXBwYSA9IGlwLT5kbF9wcGE7CiAJZnJlZShwcGFfZGF0YV9idWYpOwpAQCAtMTg3MSwzICsxNzAxLDI0IEBACiAJcmV0dXJuIChjYyk7CiB9CiAjZW5kaWYKKworcGNhcF90ICoKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworI2lmZGVmIERMX0hQX1JBV0RMUworCXN0cnVjdCBwY2FwX2RscGkgKnBkOworI2VuZGlmCisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kbHBpKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworI2lmZGVmIERMX0hQX1JBV0RMUworCXBkID0gcC0+cHJpdjsKKwlwZC0+c2VuZF9mZCA9IC0xOwkvKiBpdCBoYXNuJ3QgYmVlbiBvcGVuZWQgeWV0ICovCisjZW5kaWYKKworCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV9kbHBpOworCXJldHVybiAocCk7Cit9CmRpZmYgLS1naXQgYS9wY2FwLWRvcy5jIGIvcGNhcC1kb3MuYwppbmRleCAwNzAwZDZiLi5jZWNjNzNjIDEwMDY0NAotLS0gYS9wY2FwLWRvcy5jCisrKyBiL3BjYXAtZG9zLmMKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRE9TLWxpYnBjYXAKLSAqICBQb3J0ZWQgdG8gRE9TL0RPU1ggYnkgRy4gVmFuZW0gPGdpdmFAYmduZXR0Lm5vPgorICogIFBvcnRlZCB0byBET1MvRE9TWCBieSBHLiBWYW5lbSA8Z3ZhbmVtQGJyb2FkcGFyay5ubz4KICAqCiAgKiAgcGNhcC1kb3MuYzogSW50ZXJmYWNlIHRvIFBLVERSVlIsIE5ESVMyIGFuZCAzMi1iaXQgcG1vZGUKICAqICAgICAgICAgICAgICBuZXR3b3JrIGRyaXZlcnMuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRvcy5jLHYgMS4xLjIuMSAyMDA1LzA1LzAzIDE4OjU0OjM1IGd1eSBFeHAgJCAoTEJMKQorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRvcy5jLHYgMS43IDIwMDgtMDQtMjIgMTc6MTY6MzAgZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC05Nyw5ICs5NywxMCBAQAogCiBzdGF0aWMgc3RydWN0IGRldmljZSAqaGFuZGxlX3RvX2RldmljZSBbMjBdOwogCitzdGF0aWMgaW50ICBwY2FwX2FjdGl2YXRlX2RvcyAocGNhcF90ICpwKTsKIHN0YXRpYyBpbnQgIHBjYXBfcmVhZF9kb3MgKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpkYXRhKTsKLXN0YXRpYyB2b2lkIHBjYXBfY2xvc2VfZG9zIChwY2FwX3QgKnApOworc3RhdGljIHZvaWQgcGNhcF9jbGVhbnVwX2RvcyAocGNhcF90ICpwKTsKIHN0YXRpYyBpbnQgIHBjYXBfc3RhdHNfZG9zIChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKTsKIHN0YXRpYyBpbnQgIHBjYXBfc2VuZHBhY2tldF9kb3MgKHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKIHN0YXRpYyBpbnQgIHBjYXBfc2V0ZmlsdGVyX2RvcyAocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKTsKQEAgLTE0Myw1OCArMTQ0LDczIEBACiB9CiAKIC8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBNUy1ET1MuCisgKi8KK3N0cnVjdCBwY2FwX2RvcyB7CisJdm9pZCAoKndhaXRfcHJvYykodm9pZCk7IC8qICAgICAgICAgIGNhbGwgcHJvYyB3aGlsZSB3YWl0aW5nICovCisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OworfTsKKworcGNhcF90ICpwY2FwX2NyZWF0ZV9pbnRlcmZhY2UgKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sKKwlwY2FwX3QgKnA7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kb3MpKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX2RvczsKKwlyZXR1cm4gKHApOworfQorCisvKgogICogT3BlbiBNQUMtZHJpdmVyIHdpdGggbmFtZSAnZGV2aWNlX25hbWUnIGZvciBsaXZlIGNhcHR1cmUgb2YKICAqIG5ldHdvcmsgcGFja2V0cy4KICAqLwotcGNhcF90ICpwY2FwX29wZW5fbGl2ZSAoY29uc3QgY2hhciAqZGV2aWNlX25hbWUsIGludCBzbmFwbGVuLCBpbnQgcHJvbWlzYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0X21zLCBjaGFyICplcnJidWYpCitzdGF0aWMgaW50IHBjYXBfYWN0aXZhdGVfZG9zIChwY2FwX3QgKnBjYXApCiB7IAotICBzdHJ1Y3QgcGNhcCAqcGNhcDsKKyAgc3RydWN0IHBjYXBfZG9zICpwY2FwZCA9IHBjYXAtPnByaXY7CiAKLSAgaWYgKHNuYXBsZW4gPCBFVEhfTUlOKQotICAgICAgc25hcGxlbiA9IEVUSF9NSU47Ci0KLSAgaWYgKHNuYXBsZW4gPiBFVEhfTUFYKSAgIC8qIHNpbGVudGx5IGFjY2VwdCBhbmQgdHJ1bmNhdGUgbGFyZ2UgTVRVcyAqLwotICAgICAgc25hcGxlbiA9IEVUSF9NQVg7Ci0KLSAgcGNhcCA9IGNhbGxvYyAoc2l6ZW9mKCpwY2FwKSwgMSk7Ci0gIGlmICghcGNhcCkKLSAgewotICAgIHN0cmNweSAoZXJyYnVmLCAiTm90IGVub3VnaCBtZW1vcnkgKHBjYXApIik7Ci0gICAgcmV0dXJuIChOVUxMKTsKKyAgaWYgKHBjYXAtPm9wdC5yZm1vbikgeworICAgIC8qCisgICAgICogTm8gbW9uaXRvciBtb2RlIG9uIERPUy4KKyAgICAgKi8KKyAgICByZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKICAgfQogCi0gIHBjYXAtPnNuYXBzaG90ICAgICAgICAgID0gbWF4IChFVEhfTUlOKzgsIHNuYXBsZW4pOworICBpZiAocGNhcC0+c25hcHNob3QgPCBFVEhfTUlOKzgpCisgICAgICBwY2FwLT5zbmFwc2hvdCA9IEVUSF9NSU4rODsKKworICBpZiAocGNhcC0+c25hcHNob3QgPiBFVEhfTUFYKSAgIC8qIHNpbGVudGx5IGFjY2VwdCBhbmQgdHJ1bmNhdGUgbGFyZ2UgTVRVcyAqLworICAgICAgcGNhcC0+c25hcHNob3QgPSBFVEhfTUFYOworCiAgIHBjYXAtPmxpbmt0eXBlICAgICAgICAgID0gRExUX0VOMTBNQjsgIC8qICEhICovCi0gIHBjYXAtPmludGVyX3BhY2tldF93YWl0ID0gdGltZW91dF9tczsKLSAgcGNhcC0+Y2xvc2Vfb3AgICAgICAgICAgPSBwY2FwX2Nsb3NlX2RvczsKKyAgcGNhcC0+Y2xlYW51cF9vcCAgICAgICAgPSBwY2FwX2NsZWFudXBfZG9zOwogICBwY2FwLT5yZWFkX29wICAgICAgICAgICA9IHBjYXBfcmVhZF9kb3M7CiAgIHBjYXAtPnN0YXRzX29wICAgICAgICAgID0gcGNhcF9zdGF0c19kb3M7CiAgIHBjYXAtPmluamVjdF9vcCAgICAgICAgID0gcGNhcF9zZW5kcGFja2V0X2RvczsKICAgcGNhcC0+c2V0ZmlsdGVyX29wICAgICAgPSBwY2FwX3NldGZpbHRlcl9kb3M7Ci0JcGNhcC0+c2V0ZGlyZWN0aW9uX29wICAgPSBOVUxMOyAvKiBOb3QgaW1wbGVtZW50ZWQuKi8KKyAgcGNhcC0+c2V0ZGlyZWN0aW9uX29wICAgPSBOVUxMOyAvKiBOb3QgaW1wbGVtZW50ZWQuKi8KICAgcGNhcC0+ZmQgICAgICAgICAgICAgICAgPSArK3JlZl9jb3VudDsKIAogICBpZiAocGNhcC0+ZmQgPT0gMSkgIC8qIGZpcnN0IHRpbWUgd2UncmUgY2FsbGVkICovCiAgIHsKLSAgICBpZiAoIWluaXRfd2F0dDMyKHBjYXAsIGRldmljZV9uYW1lLCBlcnJidWYpIHx8Ci0gICAgICAgICFmaXJzdF9pbml0KGRldmljZV9uYW1lLCBlcnJidWYsIHByb21pc2MpKQorICAgIGlmICghaW5pdF93YXR0MzIocGNhcCwgcGNhcC0+b3B0LnNvdXJjZSwgcGNhcC0+ZXJyYnVmKSB8fAorICAgICAgICAhZmlyc3RfaW5pdChwY2FwLT5vcHQuc291cmNlLCBwY2FwLT5lcnJidWYsIHBjYXAtPm9wdC5wcm9taXNjKSkKICAgICB7Ci0gICAgICBmcmVlIChwY2FwKTsKLSAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICByZXR1cm4gKFBDQVBfRVJST1IpOwogICAgIH0gCiAgICAgYXRleGl0IChjbG9zZV9kcml2ZXIpOwogICB9Ci0gIGVsc2UgaWYgKHN0cmljbXAoYWN0aXZlX2Rldi0+bmFtZSxkZXZpY2VfbmFtZSkpCisgIGVsc2UgaWYgKHN0cmljbXAoYWN0aXZlX2Rldi0+bmFtZSxwY2FwLT5vcHQuc291cmNlKSkKICAgewotICAgIHNucHJpbnRmIChlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisgICAgc25wcmludGYgKHBjYXAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKICAgICAgICAgICAgICAgIkNhbm5vdCB1c2UgZGlmZmVyZW50IGRldmljZXMgc2ltdWx0YW5lb3VzbHkgIgotICAgICAgICAgICAgICAiKGAlcycgdnMuIGAlcycpIiwgYWN0aXZlX2Rldi0+bmFtZSwgZGV2aWNlX25hbWUpOwotICAgIGZyZWUgKHBjYXApOwotICAgIHBjYXAgPSBOVUxMOworICAgICAgICAgICAgICAiKGAlcycgdnMuIGAlcycpIiwgYWN0aXZlX2Rldi0+bmFtZSwgcGNhcC0+b3B0LnNvdXJjZSk7CisgICAgcmV0dXJuIChQQ0FQX0VSUk9SKTsKICAgfQogICBoYW5kbGVfdG9fZGV2aWNlIFtwY2FwLT5mZC0xXSA9IGFjdGl2ZV9kZXY7Ci0gIHJldHVybiAocGNhcCk7CisgIHJldHVybiAoMCk7CiB9CiAKIC8qCkBAIC0yMDQsMTYgKzIyMCwxNiBAQAogc3RhdGljIGludAogcGNhcF9yZWFkX29uZSAocGNhcF90ICpwLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqZGF0YSkKIHsKKyAgc3RydWN0IHBjYXBfZG9zICpwZCA9IHAtPnByaXY7CiAgIHN0cnVjdCBwY2FwX3BrdGhkciBwY2FwOwotICBzdHJ1Y3QgYnBmX2luc24gICAqZmNvZGUgPSBwLT5mY29kZS5iZl9pbnNuczsKLSAgc3RydWN0IHRpbWV2YWwgICAgIG5vdywgZXhwaXJ5OworICBzdHJ1Y3QgdGltZXZhbCAgICAgbm93LCBleHBpcnkgPSB7IDAsMCB9OwogICBCWVRFICAqcnhfYnVmOwogICBpbnQgICAgcnhfbGVuID0gMDsKIAotICBpZiAocC0+aW50ZXJfcGFja2V0X3dhaXQgPiAwKQorICBpZiAocC0+b3B0LnRpbWVvdXQgPiAwKQogICB7CiAgICAgZ2V0dGltZW9mZGF5MiAoJm5vdywgTlVMTCk7Ci0gICAgZXhwaXJ5LnR2X3VzZWMgPSBub3cudHZfdXNlYyArIDEwMDBVTCAqIHAtPmludGVyX3BhY2tldF93YWl0OworICAgIGV4cGlyeS50dl91c2VjID0gbm93LnR2X3VzZWMgKyAxMDAwVUwgKiBwLT5vcHQudGltZW91dDsKICAgICBleHBpcnkudHZfc2VjICA9IG5vdy50dl9zZWM7CiAgICAgd2hpbGUgKGV4cGlyeS50dl91c2VjID49IDEwMDAwMDBMKQogICAgIHsKQEAgLTI1OCw3ICsyNzQsNyBAQAogICAgICAgcGNhcC5sZW4gICAgPSByeF9sZW47CiAKICAgICAgIGlmIChjYWxsYmFjayAmJgotICAgICAgICAgICghZmNvZGUgfHwgYnBmX2ZpbHRlcihmY29kZSwgcnhfYnVmLCBwY2FwLmxlbiwgcGNhcC5jYXBsZW4pKSkKKyAgICAgICAgICAoIXAtPmZjb2RlLmJmX2luc25zIHx8IGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIHJ4X2J1ZiwgcGNhcC5sZW4sIHBjYXAuY2FwbGVuKSkpCiAgICAgICB7CiAgICAgICAgIGZpbHRlcl9jb3VudCsrOwogCkBAIC0yODIsMTAgKzI5OCwxMCBAQAogICAgICAgcmV0dXJuICgxKTsKICAgICB9CiAKLSAgICAvKiBJZiBub3QgdG8gd2FpdCBmb3IgYSBwYWNrZXQgb3IgcGNhcF9jbG9zZSgpIGNhbGxlZCBmcm9tCisgICAgLyogSWYgbm90IHRvIHdhaXQgZm9yIGEgcGFja2V0IG9yIHBjYXBfY2xlYW51cF9kb3MoKSBjYWxsZWQgZnJvbQogICAgICAqIGUuZy4gU0lHSU5UIGhhbmRsZXIsIGV4aXQgbG9vcCBub3cuCiAgICAgICovCi0gICAgaWYgKHAtPmludGVyX3BhY2tldF93YWl0IDw9IDAgfHwgKHZvbGF0aWxlIGludClwLT5mZCA8PSAwKQorICAgIGlmIChwLT5vcHQudGltZW91dCA8PSAwIHx8ICh2b2xhdGlsZSBpbnQpcC0+ZmQgPD0gMCkKICAgICAgICBicmVhazsKIAogICAgIGdldHRpbWVvZmRheTIgKCZub3csIE5VTEwpOwpAQCAtMzAzLDcgKzMxOSw3IEBACiAKICAgaWYgKHJ4X2xlbiA8IDApICAgICAgICAgICAgLyogcmVjZWl2ZSBlcnJvciAqLwogICB7Ci0gICAgcC0+bWQuc3RhdC5wc19kcm9wKys7CisgICAgcGQtPnN0YXQucHNfZHJvcCsrOwogI2lmZGVmIFVTRV8zMkJJVF9EUklWRVJTCiAgICAgaWYgKHBjYXBfcGt0X2RlYnVnID4gMSkKICAgICAgICBwcmludGsgKCJwa3QtZXJyICVzXG4iLCBwa3RJbmZvLmVycm9yKTsKQEAgLTMxNiw5ICszMzIsMTAgQEAKIHN0YXRpYyBpbnQKIHBjYXBfcmVhZF9kb3MgKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKmRhdGEpCiB7CisgIHN0cnVjdCBwY2FwX2RvcyAqcGQgPSBwLT5wcml2OwogICBpbnQgcmMsIG51bSA9IDA7CiAKLSAgd2hpbGUgKG51bSA8PSBjbnQgfHwgKGNudCA8IDApKQorICB3aGlsZSAobnVtIDw9IGNudCB8fCBQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKGNudCkpCiAgIHsKICAgICBpZiAocC0+ZmQgPD0gMCkKICAgICAgICByZXR1cm4gKC0xKTsKQEAgLTMzOCw2ICszNTUsNyBAQAogc3RhdGljIGludCBwY2FwX3N0YXRzX2RvcyAocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykKIHsKICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworICBzdHJ1Y3QgcGNhcF9kb3MgICAgICAgICAqcGQ7CiAgIHN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXYgPSBwID8gZ2V0X2RldmljZShwLT5mZCkgOiBOVUxMOwogCiAgIGlmICghZGV2KQpAQCAtMzU0LDEyICszNzIsMTMgQEAKIAogICBGTFVTSEsoKTsKIAotICBwLT5tZC5zdGF0LnBzX3JlY3YgICA9IHN0YXRzLT5yeF9wYWNrZXRzOwotICBwLT5tZC5zdGF0LnBzX2Ryb3AgICs9IHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzOwotICBwLT5tZC5zdGF0LnBzX2lmZHJvcCA9IHN0YXRzLT5yeF9kcm9wcGVkICsgIC8qIHF1ZXVlIGZ1bGwgKi8KKyAgcGQgPSBwLT5wcml2OworICBwZC0+c3RhdC5wc19yZWN2ICAgPSBzdGF0cy0+cnhfcGFja2V0czsKKyAgcGQtPnN0YXQucHNfZHJvcCAgKz0gc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CisgIHBkLT5zdGF0LnBzX2lmZHJvcCA9IHN0YXRzLT5yeF9kcm9wcGVkICsgIC8qIHF1ZXVlIGZ1bGwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy0+cnhfZXJyb3JzOyAgICAvKiBIVyBlcnJvcnMgKi8KICAgaWYgKHBzKQotICAgICAqcHMgPSBwLT5tZC5zdGF0OworICAgICAqcHMgPSBwZC0+c3RhdDsKIAogICByZXR1cm4gKDApOwogfQpAQCAtNDIxLDEyICs0NDAsMTUgQEAKIC8qCiAgKiBDbG9zZSBwY2FwIGRldmljZS4gTm90IGNhbGxlZCBmb3Igb2ZmbGluZSBjYXB0dXJlcy4KICAqLwotc3RhdGljIHZvaWQgcGNhcF9jbG9zZV9kb3MgKHBjYXBfdCAqcCkKK3N0YXRpYyB2b2lkIHBjYXBfY2xlYW51cF9kb3MgKHBjYXBfdCAqcCkKIHsKKyAgc3RydWN0IHBjYXBfZG9zICpwZDsKKwogICBpZiAocCAmJiAhZXhjX29jY3VyZWQpCiAgIHsKKyAgICBwZCA9IHAtPnByaXY7CiAgICAgaWYgKHBjYXBfc3RhdHMocCxOVUxMKSA8IDApCi0gICAgICAgcC0+bWQuc3RhdC5wc19kcm9wID0gMDsKKyAgICAgICBwZC0+c3RhdC5wc19kcm9wID0gMDsKICAgICBpZiAoIWdldF9kZXZpY2UocC0+ZmQpKQogICAgICAgIHJldHVybjsKIApAQCAtNDc3LDcgKzQ5OSw3IEBACiB7CiAgIGlmICghX3dhdHRfaXNfaW5pdCkKICAgewotICAgIHN0cmNweSAoZXJyYnVmLCAicGNhcF9vcGVuX29mZmxpbmUoKSBvciBwY2FwX29wZW5fbGl2ZSgpIG11c3QgYmUgIgorICAgIHN0cmNweSAoZXJyYnVmLCAicGNhcF9vcGVuX29mZmxpbmUoKSBvciBwY2FwX2FjdGl2YXRlKCkgbXVzdCBiZSAiCiAgICAgICAgICAgICAgICAgICAgICJjYWxsZWQgZmlyc3QiKTsKICAgICByZXR1cm4gKC0xKTsKICAgfQpAQCAtNTg1LDEwICs2MDcsMTIgQEAKICAqLwogdm9pZCBwY2FwX3NldF93YWl0IChwY2FwX3QgKnAsIHZvaWQgKCp5aWVsZCkodm9pZCksIGludCB3YWl0KQogeworICBzdHJ1Y3QgcGNhcF9kb3MgKnBkOwogICBpZiAocCkKICAgewotICAgIHAtPndhaXRfcHJvYyAgICAgICAgID0geWllbGQ7Ci0gICAgcC0+aW50ZXJfcGFja2V0X3dhaXQgPSB3YWl0OworICAgIHBkICAgICAgICAgICAgICAgICAgID0gcC0+cHJpdjsKKyAgICBwZC0+d2FpdF9wcm9jICAgICAgICA9IHlpZWxkOworICAgIHAtPm9wdC50aW1lb3V0ICAgICAgICA9IHdhaXQ7CiAgIH0KIH0KIApAQCAtNzM0LDEzICs3NTgsMTMgQEAKICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhdGNoaW5nIHNpZ25hbCAlZC5cbiIsIHNpZyk7CiAgIH0KICAgZXhjX29jY3VyZWQgPSAxOwotICBwY2FwX2Nsb3NlX2RvcyAoTlVMTCk7CisgIHBjYXBfY2xlYW51cF9kb3MgKE5VTEwpOwogfQogI2VuZGlmICAvKiBfX0RKR1BQX18gKi8KIAogCiAvKgotICogT3BlbiB0aGUgcGNhcCBkZXZpY2UgZm9yIHRoZSBmaXJzdCBjbGllbnQgY2FsbGluZyBwY2FwX29wZW5fbGl2ZSgpCisgKiBPcGVuIHRoZSBwY2FwIGRldmljZSBmb3IgdGhlIGZpcnN0IGNsaWVudCBjYWxsaW5nIHBjYXBfYWN0aXZhdGUoKQogICovCiBzdGF0aWMgaW50IGZpcnN0X2luaXQgKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmVidWYsIGludCBwcm9taXNjKQogewpAQCAtOTkxLDcgKzEwMTUsNyBAQAogICogQXBwbGljYXRpb24gY29uZmlnIGhvb2tzIHRvIHNldCB2YXJpb3VzIGRyaXZlciBwYXJhbWV0ZXJzLgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgY29uZmlnX3RhYmxlIGRlYnVnX3RhYltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfdGFibGUgZGVidWdfdGFiW10gPSB7CiAgICAgICAgICAgICB7ICJQS1QuREVCVUciLCAgICAgICBBUkdfQVRPSSwgICAmcGNhcF9wa3RfZGVidWcgICAgfSwKICAgICAgICAgICAgIHsgIlBLVC5WRUNUT1IiLCAgICAgIEFSR19BVE9YX1csIE5VTEwgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgeyAiTkRJUy5ERUJVRyIsICAgICAgQVJHX0FUT0ksICAgTlVMTCAgICAgICAgICAgICAgIH0sCmRpZmYgLS1naXQgYS9wY2FwLWRvcy5oIGIvcGNhcC1kb3MuaAppbmRleCBjOTczN2JhLi5mNDc0NDM3IDEwMDY0NAotLS0gYS9wY2FwLWRvcy5oCisrKyBiL3BjYXAtZG9zLmgKQEAgLTIsNyArMiw3IEBACiAgKiBJbnRlcm5hbCBkZXRhaWxzIGZvciBsaWJwY2FwIG9uIERPUy4KICAqIDMyLWJpdCB0YXJnZXRzOiBkamdwcCwgUGhhcmxhcCBvciBET1M0R1cuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRvcy5oLHYgMS4xIDIwMDQvMTIvMTggMDg6NTI6MTAgZ3V5IEV4cCAkIChMQkwpCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZG9zLmgsdiAxLjEgMjAwNC0xMi0xOCAwODo1MjoxMCBndXkgRXhwICQgKExCTCkKICAqLwogCiAjaWZuZGVmIF9fUENBUF9ET1NfSApkaWZmIC0tZ2l0IGEvcGNhcC1lbmV0LmMgYi9wY2FwLWVuZXQuYwppbmRleCBhNDg0MjA3Li41YWQ5MjFjIDEwMDY0NAotLS0gYS9wY2FwLWVuZXQuYworKysgYi9wY2FwLWVuZXQuYwpAQCAtOCw3ICs4LDcgQEAKICAqLwogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1lbmV0LmMsdiAxLjggMjAwMy8xMS8xNSAyMzoyNDowMiBndXkgRXhwICQiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZW5ldC5jLHYgMS45IDIwMDYtMTAtMDQgMTg6MDk6MjIgZ3V5IEV4cCAkIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIAogI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPHBjYXAtYnBmLmg+CisjaW5jbHVkZSA8cGNhcC9icGYuaD4KICNpbmNsdWRlIDxuZXQvZW5ldC5oPgogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpkaWZmIC0tZ2l0IGEvcGNhcC1maWx0ZXIubWFubWlzYy5pbiBiL3BjYXAtZmlsdGVyLm1hbm1pc2MuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxMWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtZmlsdGVyLm1hbm1pc2MuaW4KQEAgLTAsMCArMSw5NTQgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZmlsdGVyLm1hbm1pc2MuaW4sdiAxLjEgMjAwOC0xMC0yMSAwNzozMzowMSBndXkgRXhwICQgKExCTCkKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtRklMVEVSIEBNQU5fTUlTQ19JTkZPQCAiNiBKYW51YXJ5IDIwMDgiCisuU0ggTkFNRQorcGNhcC1maWx0ZXIgXC0gcGFja2V0IGZpbHRlciBzeW50YXgKKy5icgorLmFkCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgcGNhcF9jb21waWxlKCkKK2lzIHVzZWQgdG8gY29tcGlsZSBhIHN0cmluZyBpbnRvIGEgZmlsdGVyIHByb2dyYW0uCitUaGUgcmVzdWx0aW5nIGZpbHRlciBwcm9ncmFtIGNhbiB0aGVuIGJlIGFwcGxpZWQgdG8KK3NvbWUgc3RyZWFtIG9mIHBhY2tldHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhY2tldHMgd2lsbCBiZSBzdXBwbGllZCB0bworLkJSIHBjYXBfbG9vcCgpICwKKy5CUiBwY2FwX2Rpc3BhdGNoKCkgLAorLkJSIHBjYXBfbmV4dCgpICwKK29yCisuQlIgcGNhcF9uZXh0X2V4KCkgLgorLkxQCitUaGUgXGZJZmlsdGVyIGV4cHJlc3Npb25cZlAgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUKKy5JUiBwcmltaXRpdmVzIC4KK1ByaW1pdGl2ZXMgdXN1YWxseSBjb25zaXN0IG9mIGFuCisuSSBpZAorKG5hbWUgb3IgbnVtYmVyKSBwcmVjZWRlZCBieSBvbmUgb3IgbW9yZSBxdWFsaWZpZXJzLgorVGhlcmUgYXJlIHRocmVlCitkaWZmZXJlbnQga2luZHMgb2YgcXVhbGlmaWVyOgorLklQIFxmSXR5cGVcZlAKKy5JIHR5cGUKK3F1YWxpZmllcnMgc2F5IHdoYXQga2luZCBvZiB0aGluZyB0aGUgaWQgbmFtZSBvciBudW1iZXIgcmVmZXJzIHRvLgorUG9zc2libGUgdHlwZXMgYXJlCisuQlIgaG9zdCAsCisuQiBuZXQgLAorLkIgcG9ydAorYW5kCisuQlIgcG9ydHJhbmdlIC4KK0UuZy4sIGBob3N0IGZvbycsIGBuZXQgMTI4LjMnLCBgcG9ydCAyMCcsIGBwb3J0cmFuZ2UgNjAwMC02MDA4Jy4KK0lmIHRoZXJlIGlzIG5vIHR5cGUKK3F1YWxpZmllciwKKy5CIGhvc3QKK2lzIGFzc3VtZWQuCisuSVAgXGZJZGlyXGZQCisuSSBkaXIKK3F1YWxpZmllcnMgc3BlY2lmeSBhIHBhcnRpY3VsYXIgdHJhbnNmZXIgZGlyZWN0aW9uIHRvIGFuZC9vciBmcm9tCisuSVIgaWQgLgorUG9zc2libGUgZGlyZWN0aW9ucyBhcmUKKy5CUiBzcmMgLAorLkJSIGRzdCAsCisuQlIgInNyYyBvciBkc3QiICwKKy5CUiAic3JjIGFuZCBkc3QiICwKKy5CUiByYSAsCisuQlIgdGEgLAorLkJSIGFkZHIxICwKKy5CUiBhZGRyMiAsCisuQlIgYWRkcjMgLAorYW5kCisuQlIgYWRkcjQgLgorRS5nLiwgYHNyYyBmb28nLCBgZHN0IG5ldCAxMjguMycsIGBzcmMgb3IgZHN0IHBvcnQgZnRwLWRhdGEnLgorSWYKK3RoZXJlIGlzIG5vIGRpciBxdWFsaWZpZXIsCisuQiAic3JjIG9yIGRzdCIKK2lzIGFzc3VtZWQuCitUaGUKKy5CUiByYSAsCisuQlIgdGEgLAorLkJSIGFkZHIxICwKKy5CUiBhZGRyMiAsCisuQlIgYWRkcjMgLAorYW5kCisuQiBhZGRyNAorcXVhbGlmaWVycyBhcmUgb25seSB2YWxpZCBmb3IgSUVFRSA4MDIuMTEgV2lyZWxlc3MgTEFOIGxpbmsgbGF5ZXJzLgorRm9yIHNvbWUgbGluayBsYXllcnMsIHN1Y2ggYXMgU0xJUCBhbmQgdGhlIGBgY29va2VkJycgTGludXggY2FwdHVyZSBtb2RlCit1c2VkIGZvciB0aGUgYGBhbnknJyBkZXZpY2UgYW5kIGZvciBzb21lIG90aGVyIGRldmljZSB0eXBlcywgdGhlCisuQiBpbmJvdW5kCithbmQKKy5CIG91dGJvdW5kCitxdWFsaWZpZXJzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBkZXNpcmVkIGRpcmVjdGlvbi4KKy5JUCBcZklwcm90b1xmUAorLkkgcHJvdG8KK3F1YWxpZmllcnMgcmVzdHJpY3QgdGhlIG1hdGNoIHRvIGEgcGFydGljdWxhciBwcm90b2NvbC4KK1Bvc3NpYmxlCitwcm90b3MgYXJlOgorLkJSIGV0aGVyICwKKy5CUiBmZGRpICwKKy5CUiB0ciAsCisuQlIgd2xhbiAsCisuQlIgaXAgLAorLkJSIGlwNiAsCisuQlIgYXJwICwKKy5CUiByYXJwICwKKy5CUiBkZWNuZXQgLAorLkIgdGNwCithbmQKKy5CUiB1ZHAgLgorRS5nLiwgYGV0aGVyIHNyYyBmb28nLCBgYXJwIG5ldCAxMjguMycsIGB0Y3AgcG9ydCAyMScsIGB1ZHAgcG9ydHJhbmdlCis3MDAwLTcwMDknLCBgd2xhbiBhZGRyMiAwOjI6Mzo0OjU6NicuCitJZiB0aGVyZSBpcworbm8gcHJvdG8gcXVhbGlmaWVyLCBhbGwgcHJvdG9jb2xzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdHlwZSBhcmUKK2Fzc3VtZWQuCitFLmcuLCBgc3JjIGZvbycgbWVhbnMgYChpcCBvciBhcnAgb3IgcmFycCkgc3JjIGZvbycKKyhleGNlcHQgdGhlIGxhdHRlciBpcyBub3QgbGVnYWwgc3ludGF4KSwgYG5ldCBiYXInIG1lYW5zIGAoaXAgb3IKK2FycCBvciByYXJwKSBuZXQgYmFyJyBhbmQgYHBvcnQgNTMnIG1lYW5zIGAodGNwIG9yIHVkcCkgcG9ydCA1MycuCisuTFAKK1tgZmRkaScgaXMgYWN0dWFsbHkgYW4gYWxpYXMgZm9yIGBldGhlcic7IHRoZSBwYXJzZXIgdHJlYXRzIHRoZW0KK2lkZW50aWNhbGx5IGFzIG1lYW5pbmcgYGB0aGUgZGF0YSBsaW5rIGxldmVsIHVzZWQgb24gdGhlIHNwZWNpZmllZAorbmV0d29yayBpbnRlcmZhY2UuJycgIEZEREkgaGVhZGVycyBjb250YWluIEV0aGVybmV0LWxpa2Ugc291cmNlCithbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBhbmQgb2Z0ZW4gY29udGFpbiBFdGhlcm5ldC1saWtlIHBhY2tldAordHlwZXMsIHNvIHlvdSBjYW4gZmlsdGVyIG9uIHRoZXNlIEZEREkgZmllbGRzIGp1c3QgYXMgd2l0aCB0aGUKK2FuYWxvZ291cyBFdGhlcm5ldCBmaWVsZHMuCitGRERJIGhlYWRlcnMgYWxzbyBjb250YWluIG90aGVyIGZpZWxkcywKK2J1dCB5b3UgY2Fubm90IG5hbWUgdGhlbSBleHBsaWNpdGx5IGluIGEgZmlsdGVyIGV4cHJlc3Npb24uCisuTFAKK1NpbWlsYXJseSwgYHRyJyBhbmQgYHdsYW4nIGFyZSBhbGlhc2VzIGZvciBgZXRoZXInOyB0aGUgcHJldmlvdXMKK3BhcmFncmFwaCdzIHN0YXRlbWVudHMgYWJvdXQgRkRESSBoZWFkZXJzIGFsc28gYXBwbHkgdG8gVG9rZW4gUmluZworYW5kIDgwMi4xMSB3aXJlbGVzcyBMQU4gaGVhZGVycy4gIEZvciA4MDIuMTEgaGVhZGVycywgdGhlIGRlc3RpbmF0aW9uCithZGRyZXNzIGlzIHRoZSBEQSBmaWVsZCBhbmQgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIHRoZSBTQSBmaWVsZDsgdGhlCitCU1NJRCwgUkEsIGFuZCBUQSBmaWVsZHMgYXJlbid0IHRlc3RlZC5dCisuTFAKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBgcHJpbWl0aXZlJyBrZXl3b3JkcwordGhhdCBkb24ndCBmb2xsb3cgdGhlIHBhdHRlcm46CisuQlIgZ2F0ZXdheSAsCisuQlIgYnJvYWRjYXN0ICwKKy5CUiBsZXNzICwKKy5CIGdyZWF0ZXIKK2FuZCBhcml0aG1ldGljIGV4cHJlc3Npb25zLgorQWxsIG9mIHRoZXNlIGFyZSBkZXNjcmliZWQgYmVsb3cuCisuTFAKK01vcmUgY29tcGxleCBmaWx0ZXIgZXhwcmVzc2lvbnMgYXJlIGJ1aWx0IHVwIGJ5IHVzaW5nIHRoZSB3b3JkcworLkJSIGFuZCAsCisuQiBvcgorYW5kCisuQiBub3QKK3RvIGNvbWJpbmUgcHJpbWl0aXZlcy4KK0UuZy4sIGBob3N0IGZvbyBhbmQgbm90IHBvcnQgZnRwIGFuZCBub3QgcG9ydCBmdHAtZGF0YScuCitUbyBzYXZlIHR5cGluZywgaWRlbnRpY2FsIHF1YWxpZmllciBsaXN0cyBjYW4gYmUgb21pdHRlZC4KK0UuZy4sCitgdGNwIGRzdCBwb3J0IGZ0cCBvciBmdHAtZGF0YSBvciBkb21haW4nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMKK2B0Y3AgZHN0IHBvcnQgZnRwIG9yIHRjcCBkc3QgcG9ydCBmdHAtZGF0YSBvciB0Y3AgZHN0IHBvcnQgZG9tYWluJy4KKy5MUAorQWxsb3dhYmxlIHByaW1pdGl2ZXMgYXJlOgorLklQICJcZkJkc3QgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBkZXN0aW5hdGlvbiBmaWVsZCBvZiB0aGUgcGFja2V0IGlzIFxmSWhvc3RcZlAsCit3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGFkZHJlc3Mgb3IgYSBuYW1lLgorLklQICJcZkJzcmMgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBzb3VyY2UgZmllbGQgb2YgdGhlIHBhY2tldCBpcyBcZklob3N0XGZQLgorLklQICJcZkJob3N0IFxmSWhvc3RcZlAiCitUcnVlIGlmIGVpdGhlciB0aGUgSVB2NC92NiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb2YgdGhlIHBhY2tldCBpcyBcZklob3N0XGZQLgorLklQCitBbnkgb2YgdGhlIGFib3ZlIGhvc3QgZXhwcmVzc2lvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoIHRoZSBrZXl3b3JkcywKK1xmQmlwXGZQLCBcZkJhcnBcZlAsIFxmQnJhcnBcZlAsIG9yIFxmQmlwNlxmUCBhcyBpbjoKKy5pbiArLjVpCisubmYKK1xmQmlwIGhvc3QgXGZJaG9zdFxmUgorLmZpCisuaW4gLS41aQord2hpY2ggaXMgZXF1aXZhbGVudCB0bzoKKy5pbiArLjVpCisubmYKK1xmQmV0aGVyIHByb3RvIFxmSVxcaXBcZkIgYW5kIGhvc3QgXGZJaG9zdFxmUgorLmZpCisuaW4gLS41aQorSWYgXGZJaG9zdFxmUiBpcyBhIG5hbWUgd2l0aCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMsIGVhY2ggYWRkcmVzcyB3aWxsCitiZSBjaGVja2VkIGZvciBhIG1hdGNoLgorLklQICJcZkJldGhlciBkc3QgXGZJZWhvc3RcZlAiCitUcnVlIGlmIHRoZSBFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIFxmSWVob3N0XGZQLgorXGZJRWhvc3RcZlAKK21heSBiZSBlaXRoZXIgYSBuYW1lIGZyb20gL2V0Yy9ldGhlcnMgb3IgYSBudW1iZXIgKHNlZQorLklSIGV0aGVycyAoM04pCitmb3IgbnVtZXJpYyBmb3JtYXQpLgorLklQICJcZkJldGhlciBzcmMgXGZJZWhvc3RcZlAiCitUcnVlIGlmIHRoZSBFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcyBpcyBcZkllaG9zdFxmUC4KKy5JUCAiXGZCZXRoZXIgaG9zdCBcZkllaG9zdFxmUCIKK1RydWUgaWYgZWl0aGVyIHRoZSBFdGhlcm5ldCBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBcZkllaG9zdFxmUC4KKy5JUCAiXGZCZ2F0ZXdheVxmUCBcZklob3N0XGZQIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHVzZWQgXGZJaG9zdFxmUCBhcyBhIGdhdGV3YXkuCitJLmUuLCB0aGUgRXRoZXJuZXQKK3NvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIHdhcyBcZklob3N0XGZQIGJ1dCBuZWl0aGVyIHRoZSBJUCBzb3VyY2UKK25vciB0aGUgSVAgZGVzdGluYXRpb24gd2FzIFxmSWhvc3RcZlAuCitcZklIb3N0XGZQIG11c3QgYmUgYSBuYW1lIGFuZAorbXVzdCBiZSBmb3VuZCBib3RoIGJ5IHRoZSBtYWNoaW5lJ3MgaG9zdC1uYW1lLXRvLUlQLWFkZHJlc3MgcmVzb2x1dGlvbgorbWVjaGFuaXNtcyAoaG9zdCBuYW1lIGZpbGUsIEROUywgTklTLCBldGMuKSBhbmQgYnkgdGhlIG1hY2hpbmUncworaG9zdC1uYW1lLXRvLUV0aGVybmV0LWFkZHJlc3MgcmVzb2x1dGlvbiBtZWNoYW5pc20gKC9ldGMvZXRoZXJzLCBldGMuKS4KKyhBbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gaXMKKy5pbiArLjVpCisubmYKK1xmQmV0aGVyIGhvc3QgXGZJZWhvc3QgXGZCYW5kIG5vdCBob3N0IFxmSWhvc3RcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIG5hbWVzIG9yIG51bWJlcnMgZm9yIFxmSWhvc3QgLyBlaG9zdFxmUC4pCitUaGlzIHN5bnRheCBkb2VzIG5vdCB3b3JrIGluIElQdjYtZW5hYmxlZCBjb25maWd1cmF0aW9uIGF0IHRoaXMgbW9tZW50LgorLklQICJcZkJkc3QgbmV0IFxmSW5ldFxmUiIKK1RydWUgaWYgdGhlIElQdjQvdjYgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKK251bWJlciBvZiBcZkluZXRcZlAuCitcZklOZXRcZlAgbWF5IGJlIGVpdGhlciBhIG5hbWUgZnJvbSB0aGUgbmV0d29ya3MgZGF0YWJhc2UKKygvZXRjL25ldHdvcmtzLCBldGMuKSBvciBhIG5ldHdvcmsgbnVtYmVyLgorQW4gSVB2NCBuZXR3b3JrIG51bWJlciBjYW4gYmUgd3JpdHRlbiBhcyBhIGRvdHRlZCBxdWFkIChlLmcuLCAxOTIuMTY4LjEuMCksCitkb3R0ZWQgdHJpcGxlIChlLmcuLCAxOTIuMTY4LjEpLCBkb3R0ZWQgcGFpciAoZS5nLCAxNzIuMTYpLCBvciBzaW5nbGUKK251bWJlciAoZS5nLiwgMTApOyB0aGUgbmV0bWFzayBpcyAyNTUuMjU1LjI1NS4yNTUgZm9yIGEgZG90dGVkIHF1YWQKKyh3aGljaCBtZWFucyB0aGF0IGl0J3MgcmVhbGx5IGEgaG9zdCBtYXRjaCksIDI1NS4yNTUuMjU1LjAgZm9yIGEgZG90dGVkCit0cmlwbGUsIDI1NS4yNTUuMC4wIGZvciBhIGRvdHRlZCBwYWlyLCBvciAyNTUuMC4wLjAgZm9yIGEgc2luZ2xlIG51bWJlci4KK0FuIElQdjYgbmV0d29yayBudW1iZXIgbXVzdCBiZSB3cml0dGVuIG91dCBmdWxseTsgdGhlIG5ldG1hc2sgaXMKK2ZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmLCBzbyBJUHY2ICJuZXR3b3JrIiBtYXRjaGVzIGFyZSByZWFsbHkgYWx3YXlzCitob3N0IG1hdGNoZXMsIGFuZCBhIG5ldHdvcmsgbWF0Y2ggcmVxdWlyZXMgYSBuZXRtYXNrIGxlbmd0aC4KKy5JUCAiXGZCc3JjIG5ldCBcZkluZXRcZlIiCitUcnVlIGlmIHRoZSBJUHY0L3Y2IHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaGFzIGEgbmV0d29yaworbnVtYmVyIG9mIFxmSW5ldFxmUC4KKy5JUCAiXGZCbmV0IFxmSW5ldFxmUiIKK1RydWUgaWYgZWl0aGVyIHRoZSBJUHY0L3Y2IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaGFzIGEgbmV0d29yaworbnVtYmVyIG9mIFxmSW5ldFxmUC4KKy5JUCAiXGZCbmV0IFxmSW5ldFxmUiBcZkJtYXNrIFxmSW5ldG1hc2tcZlIiCitUcnVlIGlmIHRoZSBJUHY0IGFkZHJlc3MgbWF0Y2hlcyBcZkluZXRcZlIgd2l0aCB0aGUgc3BlY2lmaWMgXGZJbmV0bWFza1xmUi4KK01heSBiZSBxdWFsaWZpZWQgd2l0aCBcZkJzcmNcZlIgb3IgXGZCZHN0XGZSLgorTm90ZSB0aGF0IHRoaXMgc3ludGF4IGlzIG5vdCB2YWxpZCBmb3IgSVB2NiBcZkluZXRcZlIuCisuSVAgIlxmQm5ldCBcZkluZXRcZlIvXGZJbGVuXGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBhZGRyZXNzIG1hdGNoZXMgXGZJbmV0XGZSIHdpdGggYSBuZXRtYXNrIFxmSWxlblxmUgorYml0cyB3aWRlLgorTWF5IGJlIHF1YWxpZmllZCB3aXRoIFxmQnNyY1xmUiBvciBcZkJkc3RcZlIuCisuSVAgIlxmQmRzdCBwb3J0IFxmSXBvcnRcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgaXAvdGNwLCBpcC91ZHAsIGlwNi90Y3Agb3IgaXA2L3VkcCBhbmQgaGFzIGEKK2Rlc3RpbmF0aW9uIHBvcnQgdmFsdWUgb2YgXGZJcG9ydFxmUC4KK1RoZSBcZklwb3J0XGZQIGNhbiBiZSBhIG51bWJlciBvciBhIG5hbWUgdXNlZCBpbiAvZXRjL3NlcnZpY2VzIChzZWUKKy5JUiB0Y3AgKDRQKQorYW5kCisuSVIgdWRwICg0UCkpLgorSWYgYSBuYW1lIGlzIHVzZWQsIGJvdGggdGhlIHBvcnQKK251bWJlciBhbmQgcHJvdG9jb2wgYXJlIGNoZWNrZWQuCitJZiBhIG51bWJlciBvciBhbWJpZ3VvdXMgbmFtZSBpcyB1c2VkLAorb25seSB0aGUgcG9ydCBudW1iZXIgaXMgY2hlY2tlZCAoZS5nLiwgXGZCZHN0IHBvcnQgNTEzXGZSIHdpbGwgcHJpbnQgYm90aAordGNwL2xvZ2luIHRyYWZmaWMgYW5kIHVkcC93aG8gdHJhZmZpYywgYW5kIFxmQnBvcnQgZG9tYWluXGZSIHdpbGwgcHJpbnQKK2JvdGggdGNwL2RvbWFpbiBhbmQgdWRwL2RvbWFpbiB0cmFmZmljKS4KKy5JUCAiXGZCc3JjIHBvcnQgXGZJcG9ydFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBzb3VyY2UgcG9ydCB2YWx1ZSBvZiBcZklwb3J0XGZQLgorLklQICJcZkJwb3J0IFxmSXBvcnRcZlIiCitUcnVlIGlmIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIHBvcnQgb2YgdGhlIHBhY2tldCBpcyBcZklwb3J0XGZQLgorLklQICJcZkJkc3QgcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGlwL3RjcCwgaXAvdWRwLCBpcDYvdGNwIG9yIGlwNi91ZHAgYW5kIGhhcyBhCitkZXN0aW5hdGlvbiBwb3J0IHZhbHVlIGJldHdlZW4gXGZJcG9ydDFcZlAgYW5kIFxmSXBvcnQyXGZQLgorLkkgcG9ydDEKK2FuZAorLkkgcG9ydDIKK2FyZSBpbnRlcnByZXRlZCBpbiB0aGUgc2FtZSBmYXNoaW9uIGFzIHRoZQorLkkgcG9ydAorcGFyYW1ldGVyIGZvcgorLkJSIHBvcnQgLgorLklQICJcZkJzcmMgcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIHNvdXJjZSBwb3J0IHZhbHVlIGJldHdlZW4gXGZJcG9ydDFcZlAgYW5kCitcZklwb3J0MlxmUC4KKy5JUCAiXGZCcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBwb3J0IG9mIHRoZSBwYWNrZXQgaXMgYmV0d2VlbgorXGZJcG9ydDFcZlAgYW5kIFxmSXBvcnQyXGZQLgorLklQCitBbnkgb2YgdGhlIGFib3ZlIHBvcnQgb3IgcG9ydCByYW5nZSBleHByZXNzaW9ucyBjYW4gYmUgcHJlcGVuZGVkIHdpdGgKK3RoZSBrZXl3b3JkcywgXGZCdGNwXGZQIG9yIFxmQnVkcFxmUCwgYXMgaW46CisuaW4gKy41aQorLm5mCitcZkJ0Y3Agc3JjIHBvcnQgXGZJcG9ydFxmUgorLmZpCisuaW4gLS41aQord2hpY2ggbWF0Y2hlcyBvbmx5IHRjcCBwYWNrZXRzIHdob3NlIHNvdXJjZSBwb3J0IGlzIFxmSXBvcnRcZlAuCisuSVAgIlxmQmxlc3MgXGZJbGVuZ3RoXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXGZJbGVuZ3RoXGZQLgorVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorLmluICsuNWkKKy5uZgorXGZCbGVuIDw9IFxmSWxlbmd0aFxmUC4KKy5maQorLmluIC0uNWkKKy5JUCAiXGZCZ3JlYXRlciBcZklsZW5ndGhcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaGFzIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcZklsZW5ndGhcZlAuCitUaGlzIGlzIGVxdWl2YWxlbnQgdG86CisuaW4gKy41aQorLm5mCitcZkJsZW4gPj0gXGZJbGVuZ3RoXGZQLgorLmZpCisuaW4gLS41aQorLklQICJcZkJpcCBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY0IHBhY2tldCAoc2VlCisuSVIgaXAgKDRQKSkKK29mIHByb3RvY29sIHR5cGUgXGZJcHJvdG9jb2xcZlAuCitcZklQcm90b2NvbFxmUCBjYW4gYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBuYW1lcworXGZCaWNtcFxmUCwgXGZCaWNtcDZcZlAsIFxmQmlnbXBcZlAsIFxmQmlncnBcZlAsIFxmQnBpbVxmUCwgXGZCYWhcZlAsCitcZkJlc3BcZlAsIFxmQnZycnBcZlAsIFxmQnVkcFxmUCwgb3IgXGZCdGNwXGZQLgorTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVycyBcZkJ0Y3BcZlAsIFxmQnVkcFxmUCwgYW5kIFxmQmljbXBcZlAgYXJlIGFsc28KK2tleXdvcmRzIGFuZCBtdXN0IGJlIGVzY2FwZWQgdmlhIGJhY2tzbGFzaCAoXFwpLCB3aGljaCBpcyBcXFxcIGluIHRoZSBDLXNoZWxsLgorTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCisuSVAgIlxmQmlwNiBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IHBhY2tldCBvZiBwcm90b2NvbCB0eXBlIFxmSXByb3RvY29sXGZQLgorTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCisuSVAgIlxmQnByb3RvIFxmSXByb3RvY29sXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgb3IgSVB2NiBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZQorXGZJcHJvdG9jb2xcZlAuICBOb3RlIHRoYXQgdGhpcyBwcmltaXRpdmUgZG9lcyBub3QgY2hhc2UgdGhlIHByb3RvY29sCitoZWFkZXIgY2hhaW4uCisuSVAgICJcZkJ0Y3BcZlIsIFxmQnVkcFxmUiwgXGZCaWNtcFxmUiIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCcHJvdG8gXGZJcFxmUlxmQgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KKy5JUCAiXGZCaXA2IHByb3RvY2hhaW4gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgSVB2NiBwYWNrZXQsCithbmQgY29udGFpbnMgcHJvdG9jb2wgaGVhZGVyIHdpdGggdHlwZSBcZklwcm90b2NvbFxmUgoraW4gaXRzIHByb3RvY29sIGhlYWRlciBjaGFpbi4KK0ZvciBleGFtcGxlLAorLmluICsuNWkKKy5uZgorXGZCaXA2IHByb3RvY2hhaW4gNlxmUgorLmZpCisuaW4gLS41aQorbWF0Y2hlcyBhbnkgSVB2NiBwYWNrZXQgd2l0aCBUQ1AgcHJvdG9jb2wgaGVhZGVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCitUaGUgcGFja2V0IG1heSBjb250YWluLCBmb3IgZXhhbXBsZSwKK2F1dGhlbnRpY2F0aW9uIGhlYWRlciwgcm91dGluZyBoZWFkZXIsIG9yIGhvcC1ieS1ob3Agb3B0aW9uIGhlYWRlciwKK2JldHdlZW4gSVB2NiBoZWFkZXIgYW5kIFRDUCBoZWFkZXIuCitUaGUgQlBGIGNvZGUgZW1pdHRlZCBieSB0aGlzIHByaW1pdGl2ZSBpcyBjb21wbGV4IGFuZAorY2Fubm90IGJlIG9wdGltaXplZCBieSB0aGUgQlBGIG9wdGltaXplciBjb2RlLCBzbyB0aGlzIGNhbiBiZSBzb21ld2hhdAorc2xvdy4KKy5JUCAiXGZCaXAgcHJvdG9jaGFpbiBcZklwcm90b2NvbFxmUiIKK0VxdWl2YWxlbnQgdG8gXGZCaXA2IHByb3RvY2hhaW4gXGZJcHJvdG9jb2xcZlIsIGJ1dCB0aGlzIGlzIGZvciBJUHY0LgorLklQICJcZkJwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgb3IgSVB2NiBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZQorXGZJcHJvdG9jb2xcZlAuICBOb3RlIHRoYXQgdGhpcyBwcmltaXRpdmUgY2hhc2VzIHRoZSBwcm90b2NvbAoraGVhZGVyIGNoYWluLgorLklQICJcZkJldGhlciBicm9hZGNhc3RcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gRXRoZXJuZXQgYnJvYWRjYXN0IHBhY2tldC4KK1RoZSBcZklldGhlclxmUAora2V5d29yZCBpcyBvcHRpb25hbC4KKy5JUCAiXGZCaXAgYnJvYWRjYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgYnJvYWRjYXN0IHBhY2tldC4KK0l0IGNoZWNrcyBmb3IgYm90aCB0aGUgYWxsLXplcm9lcyBhbmQgYWxsLW9uZXMgYnJvYWRjYXN0IGNvbnZlbnRpb25zLAorYW5kIGxvb2tzIHVwIHRoZSBzdWJuZXQgbWFzayBvbiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzCitiZWluZyBkb25lLgorLklQCitJZiB0aGUgc3VibmV0IG1hc2sgb2YgdGhlIGludGVyZmFjZSBvbiB3aGljaCB0aGUgY2FwdHVyZSBpcyBiZWluZyBkb25lCitpcyBub3QgYXZhaWxhYmxlLCBlaXRoZXIgYmVjYXVzZSB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUgaGFzIG5vIG5ldG1hc2sgb3IgYmVjYXVzZSB0aGUgY2FwdHVyZSBpcyBiZWluZyBkb25lIG9uIHRoZSBMaW51eAorImFueSIgaW50ZXJmYWNlLCB3aGljaCBjYW4gY2FwdHVyZSBvbiBtb3JlIHRoYW4gb25lIGludGVyZmFjZSwgdGhpcworY2hlY2sgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuCisuSVAgIlxmQmV0aGVyIG11bHRpY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBFdGhlcm5ldCBtdWx0aWNhc3QgcGFja2V0LgorVGhlIFxmQmV0aGVyXGZQCitrZXl3b3JkIGlzIG9wdGlvbmFsLgorVGhpcyBpcyBzaG9ydGhhbmQgZm9yIGBcZkJldGhlclswXSAmIDEgIT0gMFxmUCcuCisuSVAgIlxmQmlwIG11bHRpY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY0IG11bHRpY2FzdCBwYWNrZXQuCisuSVAgIlxmQmlwNiBtdWx0aWNhc3RcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NiBtdWx0aWNhc3QgcGFja2V0LgorLklQICAiXGZCZXRoZXIgcHJvdG8gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgb2YgZXRoZXIgdHlwZSBcZklwcm90b2NvbFxmUi4KK1xmSVByb3RvY29sXGZQIGNhbiBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIG5hbWVzCitcZkJpcFxmUCwgXGZCaXA2XGZQLCBcZkJhcnBcZlAsIFxmQnJhcnBcZlAsIFxmQmF0YWxrXGZQLCBcZkJhYXJwXGZQLAorXGZCZGVjbmV0XGZQLCBcZkJzY2FcZlAsIFxmQmxhdFxmUCwgXGZCbW9wZGxcZlAsIFxmQm1vcHJjXGZQLAorXGZCaXNvXGZQLCBcZkJzdHBcZlAsIFxmQmlweFxmUCwgb3IgXGZCbmV0YmV1aVxmUC4KK05vdGUgdGhlc2UgaWRlbnRpZmllcnMgYXJlIGFsc28ga2V5d29yZHMKK2FuZCBtdXN0IGJlIGVzY2FwZWQgdmlhIGJhY2tzbGFzaCAoXFwpLgorLklQCitbSW4gdGhlIGNhc2Ugb2YgRkRESSAoZS5nLiwgYFxmQmZkZGkgcHJvdG9jb2wgYXJwXGZSJyksIFRva2VuIFJpbmcKKyhlLmcuLCBgXGZCdHIgcHJvdG9jb2wgYXJwXGZSJyksIGFuZCBJRUVFIDgwMi4xMSB3aXJlbGVzcyBMQU5TIChlLmcuLAorYFxmQndsYW4gcHJvdG9jb2wgYXJwXGZSJyksIGZvciBtb3N0IG9mIHRob3NlIHByb3RvY29scywgdGhlCitwcm90b2NvbCBpZGVudGlmaWNhdGlvbiBjb21lcyBmcm9tIHRoZSA4MDIuMiBMb2dpY2FsIExpbmsgQ29udHJvbCAoTExDKQoraGVhZGVyLCB3aGljaCBpcyB1c3VhbGx5IGxheWVyZWQgb24gdG9wIG9mIHRoZSBGRERJLCBUb2tlbiBSaW5nLCBvcgorODAyLjExIGhlYWRlci4KKy5JUAorV2hlbiBmaWx0ZXJpbmcgZm9yIG1vc3QgcHJvdG9jb2wgaWRlbnRpZmllcnMgb24gRkRESSwgVG9rZW4gUmluZywgb3IKKzgwMi4xMSwgdGhlIGZpbHRlciBjaGVja3Mgb25seSB0aGUgcHJvdG9jb2wgSUQgZmllbGQgb2YgYW4gTExDIGhlYWRlcgoraW4gc28tY2FsbGVkIFNOQVAgZm9ybWF0IHdpdGggYW4gT3JnYW5pemF0aW9uYWwgVW5pdCBJZGVudGlmaWVyIChPVUkpIG9mCisweDAwMDAwMCwgZm9yIGVuY2Fwc3VsYXRlZCBFdGhlcm5ldDsgaXQgZG9lc24ndCBjaGVjayB3aGV0aGVyIHRoZSBwYWNrZXQKK2lzIGluIFNOQVAgZm9ybWF0IHdpdGggYW4gT1VJIG9mIDB4MDAwMDAwLgorVGhlIGV4Y2VwdGlvbnMgYXJlOgorLlJTCisuVFAKK1xmQmlzb1xmUAordGhlIGZpbHRlciBjaGVja3MgdGhlIERTQVAgKERlc3RpbmF0aW9uIFNlcnZpY2UgQWNjZXNzIFBvaW50KSBhbmQKK1NTQVAgKFNvdXJjZSBTZXJ2aWNlIEFjY2VzcyBQb2ludCkgZmllbGRzIG9mIHRoZSBMTEMgaGVhZGVyOworLlRQCitcZkJzdHBcZlAgYW5kIFxmQm5ldGJldWlcZlAKK3RoZSBmaWx0ZXIgY2hlY2tzIHRoZSBEU0FQIG9mIHRoZSBMTEMgaGVhZGVyOworLlRQCitcZkJhdGFsa1xmUAordGhlIGZpbHRlciBjaGVja3MgZm9yIGEgU05BUC1mb3JtYXQgcGFja2V0IHdpdGggYW4gT1VJIG9mIDB4MDgwMDA3CithbmQgdGhlIEFwcGxlVGFsayBldHlwZS4KKy5SRQorLklQCitJbiB0aGUgY2FzZSBvZiBFdGhlcm5ldCwgdGhlIGZpbHRlciBjaGVja3MgdGhlIEV0aGVybmV0IHR5cGUgZmllbGQKK2ZvciBtb3N0IG9mIHRob3NlIHByb3RvY29scy4gIFRoZSBleGNlcHRpb25zIGFyZToKKy5SUworLlRQCitcZkJpc29cZlAsIFxmQnN0cFxmUCwgYW5kIFxmQm5ldGJldWlcZlAKK3RoZSBmaWx0ZXIgY2hlY2tzIGZvciBhbiA4MDIuMyBmcmFtZSBhbmQgdGhlbiBjaGVja3MgdGhlIExMQyBoZWFkZXIgYXMKK2l0IGRvZXMgZm9yIEZEREksIFRva2VuIFJpbmcsIGFuZCA4MDIuMTE7CisuVFAKK1xmQmF0YWxrXGZQCit0aGUgZmlsdGVyIGNoZWNrcyBib3RoIGZvciB0aGUgQXBwbGVUYWxrIGV0eXBlIGluIGFuIEV0aGVybmV0IGZyYW1lIGFuZAorZm9yIGEgU05BUC1mb3JtYXQgcGFja2V0IGFzIGl0IGRvZXMgZm9yIEZEREksIFRva2VuIFJpbmcsIGFuZCA4MDIuMTE7CisuVFAKK1xmQmFhcnBcZlAKK3RoZSBmaWx0ZXIgY2hlY2tzIGZvciB0aGUgQXBwbGVUYWxrIEFSUCBldHlwZSBpbiBlaXRoZXIgYW4gRXRoZXJuZXQKK2ZyYW1lIG9yIGFuIDgwMi4yIFNOQVAgZnJhbWUgd2l0aCBhbiBPVUkgb2YgMHgwMDAwMDA7CisuVFAKK1xmQmlweFxmUAordGhlIGZpbHRlciBjaGVja3MgZm9yIHRoZSBJUFggZXR5cGUgaW4gYW4gRXRoZXJuZXQgZnJhbWUsIHRoZSBJUFgKK0RTQVAgaW4gdGhlIExMQyBoZWFkZXIsIHRoZSA4MDIuMy13aXRoLW5vLUxMQy1oZWFkZXIgZW5jYXBzdWxhdGlvbiBvZgorSVBYLCBhbmQgdGhlIElQWCBldHlwZSBpbiBhIFNOQVAgZnJhbWUuCisuUkUKKy5JUCAiXGZCaXBcZlIsIFxmQmlwNlxmUiwgXGZCYXJwXGZSLCBcZkJyYXJwXGZSLCBcZkJhdGFsa1xmUiwgXGZCYWFycFxmUiwgXGZCZGVjbmV0XGZSLCBcZkJpc29cZlIsIFxmQnN0cFxmUiwgXGZCaXB4XGZSLCBcZkJuZXRiZXVpXGZQIgorQWJicmV2aWF0aW9ucyBmb3I6CisuaW4gKy41aQorLm5mCitcZkJldGhlciBwcm90byBcZklwXGZSCisuZmkKKy5pbiAtLjVpCit3aGVyZSBcZklwXGZSIGlzIG9uZSBvZiB0aGUgYWJvdmUgcHJvdG9jb2xzLgorLklQICJcZkJsYXRcZlIsIFxmQm1vcHJjXGZSLCBcZkJtb3BkbFxmUiIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCZXRoZXIgcHJvdG8gXGZJcFxmUgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KK05vdGUgdGhhdCBub3QgYWxsIGFwcGxpY2F0aW9ucyB1c2luZworLkJSIHBjYXAgKDNQQ0FQKQorY3VycmVudGx5IGtub3cgaG93IHRvIHBhcnNlIHRoZXNlIHByb3RvY29scy4KKy5JUCAiXGZCZGVjbmV0IHNyYyBcZklob3N0XGZSIgorVHJ1ZSBpZiB0aGUgREVDTkVUIHNvdXJjZSBhZGRyZXNzIGlzCisuSVIgaG9zdCAsCit3aGljaCBtYXkgYmUgYW4gYWRkcmVzcyBvZiB0aGUgZm9ybSBgYDEwLjEyMycnLCBvciBhIERFQ05FVCBob3N0CituYW1lLgorW0RFQ05FVCBob3N0IG5hbWUgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBVTFRSSVggc3lzdGVtcwordGhhdCBhcmUgY29uZmlndXJlZCB0byBydW4gREVDTkVULl0KKy5JUCAiXGZCZGVjbmV0IGRzdCBcZklob3N0XGZSIgorVHJ1ZSBpZiB0aGUgREVDTkVUIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMKKy5JUiBob3N0IC4KKy5JUCAiXGZCZGVjbmV0IGhvc3QgXGZJaG9zdFxmUiIKK1RydWUgaWYgZWl0aGVyIHRoZSBERUNORVQgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMKKy5JUiBob3N0IC4KKy5JUCAiXGZCaWZuYW1lIFxmSWludGVyZmFjZVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIGFzIGNvbWluZyBmcm9tIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIChhcHBsaWVzCitvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5IE9wZW5CU0QncyBvciBGcmVlQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJvbiBcZklpbnRlcmZhY2VcZlIiCitTeW5vbnltb3VzIHdpdGggdGhlCisuQiBpZm5hbWUKK21vZGlmaWVyLgorLklQICJcZkJybnIgXGZJbnVtXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBQRiBydWxlIG51bWJlcgorKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3Mgb3IgRnJlZUJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCcnVsZW51bSBcZkludW1cZlIiCitTeW5vbnltb3VzIHdpdGggdGhlCisuQiBybnIKK21vZGlmaWVyLgorLklQICJcZkJyZWFzb24gXGZJY29kZVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIHdpdGggdGhlIHNwZWNpZmllZCBQRiByZWFzb24gY29kZS4gIFRoZSBrbm93bgorY29kZXMgYXJlOgorLkJSIG1hdGNoICwKKy5CUiBiYWQtb2Zmc2V0ICwKKy5CUiBmcmFnbWVudCAsCisuQlIgc2hvcnQgLAorLkJSIG5vcm1hbGl6ZSAsCithbmQKKy5CIG1lbW9yeQorKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3Mgb3IgRnJlZUJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCcnNldCBcZkluYW1lXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBQRiBydWxlc2V0CituYW1lIG9mIGFuIGFuY2hvcmVkIHJ1bGVzZXQgKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3MKK29yIEZyZWVCU0QncworLkJSIHBmICg0KSkuCisuSVAgIlxmQnJ1bGVzZXQgXGZJbmFtZVxmUiIKK1N5bm9ub21vdXMgd2l0aCB0aGUKKy5CIHJzZXQKK21vZGlmaWVyLgorLklQICJcZkJzcm5yIFxmSW51bVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIGFzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgUEYgcnVsZSBudW1iZXIKK29mIGFuIGFuY2hvcmVkIHJ1bGVzZXQgKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3Mgb3IKK0ZyZWVCU0QncworLkJSIHBmICg0KSkuCisuSVAgIlxmQnN1YnJ1bGVudW0gXGZJbnVtXGZSIgorU3lub25vbW91cyB3aXRoIHRoZQorLkIgc3JucgorbW9kaWZpZXIuCisuSVAgIlxmQmFjdGlvbiBcZklhY3RcZlIiCitUcnVlIGlmIFBGIHRvb2sgdGhlIHNwZWNpZmllZCBhY3Rpb24gd2hlbiB0aGUgcGFja2V0IHdhcyBsb2dnZWQuICBLbm93biBhY3Rpb25zCithcmU6CisuQiBwYXNzCithbmQKKy5CIGJsb2NrCithbmQsIHdpdGggbGF0ZXIgdmVyc2lvbnMgb2YKKy5CUiBwZiAoNCkpLAorLkJSIG5hdCAsCisuQlIgcmRyICwKKy5CIGJpbmF0CithbmQKKy5CIHNjcnViCisoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5IE9wZW5CU0QncyBvciBGcmVlQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJ3bGFuIHJhIFxmSWVob3N0XGZSIgorVHJ1ZSBpZiB0aGUgSUVFRSA4MDIuMTEgUkEgaXMKKy5JUiBlaG9zdCAuCitUaGUgUkEgZmllbGQgaXMgdXNlZCBpbiBhbGwgZnJhbWVzIGV4Y2VwdCBmb3IgbWFuYWdlbWVudCBmcmFtZXMuCisuSVAgIlxmQndsYW4gdGEgXGZJZWhvc3RcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBUQSBpcworLklSIGVob3N0IC4KK1RoZSBUQSBmaWVsZCBpcyB1c2VkIGluIGFsbCBmcmFtZXMgZXhjZXB0IGZvciBtYW5hZ2VtZW50IGZyYW1lcyBhbmQKK0NUUyAoQ2xlYXIgVG8gU2VuZCkgYW5kIEFDSyAoQWNrbm93bGVkZ21lbnQpIGNvbnRyb2wgZnJhbWVzLgorLklQICJcZkJ3bGFuIGFkZHIxIFxmSWVob3N0XGZSIgorVHJ1ZSBpZiB0aGUgZmlyc3QgSUVFRSA4MDIuMTEgYWRkcmVzcyBpcworLklSIGVob3N0IC4KKy5JUCAiXGZCd2xhbiBhZGRyMiBcZkllaG9zdFxmUiIKK1RydWUgaWYgdGhlIHNlY29uZCBJRUVFIDgwMi4xMSBhZGRyZXNzLCBpZiBwcmVzZW50LCBpcworLklSIGVob3N0IC4KK1RoZSBzZWNvbmQgYWRkcmVzcyBmaWVsZCBpcyB1c2VkIGluIGFsbCBmcmFtZXMgZXhjZXB0IGZvciBDVFMgKENsZWFyIFRvCitTZW5kKSBhbmQgQUNLIChBY2tub3dsZWRnbWVudCkgY29udHJvbCBmcmFtZXMuCisuSVAgIlxmQndsYW4gYWRkcjMgXGZJZWhvc3RcZlIiCitUcnVlIGlmIHRoZSB0aGlyZCBJRUVFIDgwMi4xMSBhZGRyZXNzLCBpZiBwcmVzZW50LCBpcworLklSIGVob3N0IC4KK1RoZSB0aGlyZCBhZGRyZXNzIGZpZWxkIGlzIHVzZWQgaW4gbWFuYWdlbWVudCBhbmQgZGF0YSBmcmFtZXMsIGJ1dCBub3QKK2luIGNvbnRyb2wgZnJhbWVzLgorLklQICJcZkJ3bGFuIGFkZHI0IFxmSWVob3N0XGZSIgorVHJ1ZSBpZiB0aGUgZm91cnRoIElFRUUgODAyLjExIGFkZHJlc3MsIGlmIHByZXNlbnQsIGlzCisuSVIgZWhvc3QgLgorVGhlIGZvdXJ0aCBhZGRyZXNzIGZpZWxkIGlzIG9ubHkgdXNlZCBmb3IKK1dEUyAoV2lyZWxlc3MgRGlzdHJpYnV0aW9uIFN5c3RlbSkgZnJhbWVzLgorLklQICJcZkJ0eXBlIFxmSXdsYW5fdHlwZVxmUiIKK1RydWUgaWYgdGhlIElFRUUgODAyLjExIGZyYW1lIHR5cGUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIFxmSXdsYW5fdHlwZVxmUi4KK1ZhbGlkIFxmSXdsYW5fdHlwZVxmUnMgYXJlOgorXGZCbWd0XGZQLAorXGZCY3RsXGZQCithbmQgXGZCZGF0YVxmUC4KKy5JUCAiXGZCdHlwZSBcZkl3bGFuX3R5cGUgXGZCc3VidHlwZSBcZkl3bGFuX3N1YnR5cGVcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3R5cGVcZlIKK2FuZCBmcmFtZSBzdWJ0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3N1YnR5cGVcZlIuCisuSVAKK0lmIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl90eXBlXGZSIGlzIFxmQm1ndFxmUCwKK3RoZW4gdmFsaWQgXGZJd2xhbl9zdWJ0eXBlXGZScyBhcmU6CitcZkJhc3NvYy1yZXFcZlAsCitcZkJhc3NvYy1yZXNwXGZQLAorXGZCcmVhc3NvYy1yZXFcZlAsCitcZkJyZWFzc29jLXJlc3BcZlAsCitcZkJwcm9iZS1yZXFcZlAsCitcZkJwcm9iZS1yZXNwXGZQLAorXGZCYmVhY29uXGZQLAorXGZCYXRpbVxmUCwKK1xmQmRpc2Fzc29jXGZQLAorXGZCYXV0aFxmUCBhbmQKK1xmQmRlYXV0aFxmUC4KKy5JUAorSWYgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3R5cGVcZlIgaXMgXGZCY3RsXGZQLAordGhlbiB2YWxpZCBcZkl3bGFuX3N1YnR5cGVcZlJzIGFyZToKK1xmQnBzLXBvbGxcZlAsCitcZkJydHNcZlAsCitcZkJjdHNcZlAsCitcZkJhY2tcZlAsCitcZkJjZi1lbmRcZlAgYW5kCitcZkJjZi1lbmQtYWNrXGZQLgorLklQCitJZiB0aGUgc3BlY2lmaWVkIFxmSXdsYW5fdHlwZVxmUiBpcyBcZkJkYXRhXGZQLAordGhlbiB2YWxpZCBcZkl3bGFuX3N1YnR5cGVcZlJzIGFyZToKK1xmQmRhdGFcZlAsCitcZkJkYXRhLWNmLWFja1xmUCwKK1xmQmRhdGEtY2YtcG9sbFxmUCwKK1xmQmRhdGEtY2YtYWNrLXBvbGxcZlAsCitcZkJudWxsXGZQLAorXGZCY2YtYWNrXGZQLAorXGZCY2YtcG9sbFxmUCwKK1xmQmNmLWFjay1wb2xsXGZQLAorXGZCcW9zLWRhdGFcZlAsCitcZkJxb3MtZGF0YS1jZi1hY2tcZlAsCitcZkJxb3MtZGF0YS1jZi1wb2xsXGZQLAorXGZCcW9zLWRhdGEtY2YtYWNrLXBvbGxcZlAsCitcZkJxb3NcZlAsCitcZkJxb3MtY2YtcG9sbFxmUCBhbmQKK1xmQnFvcy1jZi1hY2stcG9sbFxmUC4KKy5JUCAiXGZCc3VidHlwZSBcZkl3bGFuX3N1YnR5cGVcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSBzdWJ0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3N1YnR5cGVcZlIKK2FuZCBmcmFtZSBoYXMgdGhlIHR5cGUgdG8gd2hpY2ggdGhlIHNwZWNpZmllZCBcZkl3bGFuX3N1YnR5cGVcZlIgYmVsb25ncy4KKy5JUCAiXGZCZGlyIFxmSWRpclxmUiIKK1RydWUgaWYgdGhlIElFRUUgODAyLjExIGZyYW1lIGRpcmVjdGlvbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQKKy5JUiBkaXIgLgorVmFsaWQgZGlyZWN0aW9ucyBhcmU6CisuQlIgbm9kcyAsCisuQlIgdG9kcyAsCisuQlIgZnJvbWRzICwKKy5CUiBkc3RvZHMgLAorb3IgYSBudW1lcmljIHZhbHVlLgorLklQICJcZkJ2bGFuIFxmSVt2bGFuX2lkXVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJRUVFIDgwMi4xUSBWTEFOIHBhY2tldC4KK0lmIFxmSVt2bGFuX2lkXVxmUiBpcyBzcGVjaWZpZWQsIG9ubHkgdHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyB0aGUgc3BlY2lmaWVkCitcZkl2bGFuX2lkXGZSLgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJ2bGFuXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCit0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBWTEFOIHBhY2tldC4gIFRoZSBcZkJ2bGFuCitcZklbdmxhbl9pZF1cZlIgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSwgdG8gZmlsdGVyIG9uIFZMQU4KK2hpZXJhcmNoaWVzLiAgRWFjaCB1c2Ugb2YgdGhhdCBleHByZXNzaW9uIGluY3JlbWVudHMgdGhlIGZpbHRlciBvZmZzZXRzCitieSA0LgorLklQCitGb3IgZXhhbXBsZToKKy5pbiArLjVpCisubmYKK1xmQnZsYW4gMTAwICYmIHZsYW4gMjAwXGZSCisuZmkKKy5pbiAtLjVpCitmaWx0ZXJzIG9uIFZMQU4gMjAwIGVuY2Fwc3VsYXRlZCB3aXRoaW4gVkxBTiAxMDAsIGFuZAorLmluICsuNWkKKy5uZgorXGZCdmxhbiAmJiB2bGFuIDMwMCAmJiBpcFxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBJUHY0IHByb3RvY29scyBlbmNhcHN1bGF0ZWQgaW4gVkxBTiAzMDAgZW5jYXBzdWxhdGVkIHdpdGhpbiBhbnkKK2hpZ2hlciBvcmRlciBWTEFOLgorLklQICJcZkJtcGxzIFxmSVtsYWJlbF9udW1dXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIE1QTFMgcGFja2V0LgorSWYgXGZJW2xhYmVsX251bV1cZlIgaXMgc3BlY2lmaWVkLCBvbmx5IHRydWUgaXMgdGhlIHBhY2tldCBoYXMgdGhlIHNwZWNpZmllZAorXGZJbGFiZWxfbnVtXGZSLgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJtcGxzXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCit0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBNUExTLWVuY2Fwc3VsYXRlZCBJUCBwYWNrZXQuICBUaGUKK1xmQm1wbHMgXGZJW2xhYmVsX251bV1cZlIgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSwgdG8KK2ZpbHRlciBvbiBNUExTIGhpZXJhcmNoaWVzLiAgRWFjaCB1c2Ugb2YgdGhhdCBleHByZXNzaW9uIGluY3JlbWVudHMgdGhlCitmaWx0ZXIgb2Zmc2V0cyBieSA0LiAKKy5JUAorRm9yIGV4YW1wbGU6CisuaW4gKy41aQorLm5mCitcZkJtcGxzIDEwMDAwMCAmJiBtcGxzIDEwMjRcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgcGFja2V0cyB3aXRoIGFuIG91dGVyIGxhYmVsIG9mIDEwMDAwMCBhbmQgYW4gaW5uZXIgbGFiZWwgb2YKKzEwMjQsIGFuZAorLmluICsuNWkKKy5uZgorXGZCbXBscyAmJiBtcGxzIDEwMjQgJiYgaG9zdCAxOTIuOS4yMDAuMVxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBwYWNrZXRzIHRvIG9yIGZyb20gMTkyLjkuMjAwLjEgd2l0aCBhbiBpbm5lciBsYWJlbCBvZiAxMDI0IGFuZAorYW55IG91dGVyIGxhYmVsLgorLklQIFxmQnBwcG9lZFxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGEgUFBQLW92ZXItRXRoZXJuZXQgRGlzY292ZXJ5IHBhY2tldCAoRXRoZXJuZXQKK3R5cGUgMHg4ODYzKS4KKy5JUCAiXGZCcHBwb2VzIFxmSVtzZXNzaW9uX2lkXVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhIFBQUC1vdmVyLUV0aGVybmV0IFNlc3Npb24gcGFja2V0IChFdGhlcm5ldAordHlwZSAweDg4NjQpLgorSWYgXGZJW3Nlc3Npb25faWRdXGZSIGlzIHNwZWNpZmllZCwgb25seSB0cnVlIGlmIHRoZSBwYWNrZXQgaGFzIHRoZSBzcGVjaWZpZWQKK1xmSXNlc3Npb25faWRcZlIuCitOb3RlIHRoYXQgdGhlIGZpcnN0IFxmQnBwcG9lc1xmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIGRlY29kaW5nIG9mZnNldHMgZm9yIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUiBvbgordGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGEgUFBQb0Ugc2Vzc2lvbiBwYWNrZXQuCisuSVAKK0ZvciBleGFtcGxlOgorLmluICsuNWkKKy5uZgorXGZCcHBwb2VzIDB4MjcgJiYgaXBcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgSVB2NCBwcm90b2NvbHMgZW5jYXBzdWxhdGVkIGluIFBQUG9FIHNlc3Npb24gaWQgMHgyNy4KKy5JUCAiXGZCaXNvIHByb3RvIFxmSXByb3RvY29sXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIE9TSSBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZSBcZklwcm90b2NvbFxmUC4KK1xmSVByb3RvY29sXGZQIGNhbiBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIG5hbWVzCitcZkJjbG5wXGZQLCBcZkJlc2lzXGZQLCBvciBcZkJpc2lzXGZQLgorLklQICJcZkJjbG5wXGZSLCBcZkJlc2lzXGZSLCBcZkJpc2lzXGZSIgorQWJicmV2aWF0aW9ucyBmb3I6CisuaW4gKy41aQorLm5mCitcZkJpc28gcHJvdG8gXGZJcFxmUgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KKy5JUCAiXGZCbDFcZlIsIFxmQmwyXGZSLCBcZkJpaWhcZlIsIFxmQmxzcFxmUiwgXGZCc25wXGZSLCBcZkJjc25wXGZSLCBcZkJwc25wXGZSIgorQWJicmV2aWF0aW9ucyBmb3IgSVMtSVMgUERVIHR5cGVzLgorLklQICJcZkJ2cGlcZlAgXGZJblxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIHdpdGggYQordmlydHVhbCBwYXRoIGlkZW50aWZpZXIgb2YKKy5JUiBuIC4KKy5JUCAiXGZCdmNpXGZQIFxmSW5cZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCB3aXRoIGEKK3ZpcnR1YWwgY2hhbm5lbCBpZGVudGlmaWVyIG9mCisuSVIgbiAuCisuSVAgXGZCbGFuZVxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithbiBBVE0gTEFORSBwYWNrZXQuCitOb3RlIHRoYXQgdGhlIGZpcnN0IFxmQmxhbmVcZlIga2V5d29yZCBlbmNvdW50ZXJlZCBpbiBcZklleHByZXNzaW9uXGZSCitjaGFuZ2VzIHRoZSB0ZXN0cyBkb25lIGluIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUgorb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGVpdGhlciBhIExBTkUgZW11bGF0ZWQgRXRoZXJuZXQKK3BhY2tldCBvciBhIExBTkUgTEUgQ29udHJvbCBwYWNrZXQuICBJZiBcZkJsYW5lXGZSIGlzbid0IHNwZWNpZmllZCwgdGhlCit0ZXN0cyBhcmUgZG9uZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYW4KK0xMQy1lbmNhcHN1bGF0ZWQgcGFja2V0LgorLklQIFxmQmxsY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithbiBMTEMtZW5jYXBzdWxhdGVkIHBhY2tldC4KKy5JUCBcZkJvYW1mNHNcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYSBzZWdtZW50IE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgVkNJPTMpLgorLklQIFxmQm9hbWY0ZVxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithbiBlbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgVkNJPTQpLgorLklQIFxmQm9hbWY0XGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2Egc2VnbWVudCBvciBlbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgKFZDST0zIHwgVkNJPTQpKS4KKy5JUCBcZkJvYW1cZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYSBzZWdtZW50IG9yIGVuZC10by1lbmQgT0FNIEY0IGZsb3cgY2VsbCAoVlBJPTAgJiAoVkNJPTMgfCBWQ0k9NCkpLgorLklQIFxmQm1ldGFjXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgbWV0YSBzaWduYWxpbmcgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9MSkuCisuSVAgXGZCYmNjXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgYnJvYWRjYXN0IHNpZ25hbGluZyBjaXJjdWl0IChWUEk9MCAmIFZDST0yKS4KKy5JUCBcZkJzY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhIHNpZ25hbGluZyBjaXJjdWl0IChWUEk9MCAmIFZDST01KS4KKy5JUCBcZkJpbG1pY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhbiBJTE1JIGNpcmN1aXQgKFZQST0wICYgVkNJPTE2KS4KKy5JUCBcZkJjb25uZWN0bXNnXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgc2lnbmFsaW5nIGNpcmN1aXQgYW5kIGlzIGEgUS4yOTMxIFNldHVwLCBDYWxsIFByb2NlZWRpbmcsIENvbm5lY3QsCitDb25uZWN0IEFjaywgUmVsZWFzZSwgb3IgUmVsZWFzZSBEb25lIG1lc3NhZ2UuCisuSVAgXGZCbWV0YWNvbm5lY3RcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYSBtZXRhIHNpZ25hbGluZyBjaXJjdWl0IGFuZCBpcyBhIFEuMjkzMSBTZXR1cCwgQ2FsbCBQcm9jZWVkaW5nLCBDb25uZWN0LAorUmVsZWFzZSwgb3IgUmVsZWFzZSBEb25lIG1lc3NhZ2UuCisuSVAgICJcZklleHByIHJlbG9wIGV4cHJcZlIiCitUcnVlIGlmIHRoZSByZWxhdGlvbiBob2xkcywgd2hlcmUgXGZJcmVsb3BcZlIgaXMgb25lIG9mID4sIDwsID49LCA8PSwgPSwKKyE9LCBhbmQgXGZJZXhwclxmUiBpcyBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgaW50ZWdlcgorY29uc3RhbnRzIChleHByZXNzZWQgaW4gc3RhbmRhcmQgQyBzeW50YXgpLCB0aGUgbm9ybWFsIGJpbmFyeSBvcGVyYXRvcnMKK1srLCAtLCAqLCAvLCAmLCB8LCA8PCwgPj5dLCBhIGxlbmd0aCBvcGVyYXRvciwgYW5kIHNwZWNpYWwgcGFja2V0IGRhdGEKK2FjY2Vzc29ycy4gIE5vdGUgdGhhdCBhbGwgY29tcGFyaXNvbnMgYXJlIHVuc2lnbmVkLCBzbyB0aGF0LCBmb3IgZXhhbXBsZSwKKzB4ODAwMDAwMDAgYW5kIDB4ZmZmZmZmZmYgYXJlID4gMC4KK1RvIGFjY2VzcworZGF0YSBpbnNpZGUgdGhlIHBhY2tldCwgdXNlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorLmluICsuNWkKKy5uZgorXGZJcHJvdG9cZkIgWyBcZklleHByXGZCIDogXGZJc2l6ZVxmQiBdXGZSCisuZmkKKy5pbiAtLjVpCitcZklQcm90b1xmUiBpcyBvbmUgb2YgXGZCZXRoZXIsIGZkZGksIHRyLCB3bGFuLCBwcHAsIHNsaXAsIGxpbmssCitpcCwgYXJwLCByYXJwLCB0Y3AsIHVkcCwgaWNtcCwgaXA2XGZSIG9yIFxmQnJhZGlvXGZSLCBhbmQKK2luZGljYXRlcyB0aGUgcHJvdG9jb2wgbGF5ZXIgZm9yIHRoZSBpbmRleCBvcGVyYXRpb24uCisoXGZCZXRoZXIsIGZkZGksIHdsYW4sIHRyLCBwcHAsIHNsaXBcZlIgYW5kIFxmQmxpbmtcZlIgYWxsIHJlZmVyIHRvIHRoZQorbGluayBsYXllci4gXGZCcmFkaW9cZlIgcmVmZXJzIHRvIHRoZSAicmFkaW8gaGVhZGVyIiBhZGRlZCB0byBzb21lCis4MDIuMTEgY2FwdHVyZXMuKQorTm90ZSB0aGF0IFxmSXRjcCwgdWRwXGZSIGFuZCBvdGhlciB1cHBlci1sYXllciBwcm90b2NvbCB0eXBlcyBvbmx5CithcHBseSB0byBJUHY0LCBub3QgSVB2NiAodGhpcyB3aWxsIGJlIGZpeGVkIGluIHRoZSBmdXR1cmUpLgorVGhlIGJ5dGUgb2Zmc2V0LCByZWxhdGl2ZSB0byB0aGUgaW5kaWNhdGVkIHByb3RvY29sIGxheWVyLCBpcworZ2l2ZW4gYnkgXGZJZXhwclxmUi4KK1xmSVNpemVcZlIgaXMgb3B0aW9uYWwgYW5kIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorZmllbGQgb2YgaW50ZXJlc3Q7IGl0IGNhbiBiZSBlaXRoZXIgb25lLCB0d28sIG9yIGZvdXIsIGFuZCBkZWZhdWx0cyB0byBvbmUuCitUaGUgbGVuZ3RoIG9wZXJhdG9yLCBpbmRpY2F0ZWQgYnkgdGhlIGtleXdvcmQgXGZCbGVuXGZQLCBnaXZlcyB0aGUKK2xlbmd0aCBvZiB0aGUgcGFja2V0LgorCitGb3IgZXhhbXBsZSwgYFxmQmV0aGVyWzBdICYgMSAhPSAwXGZQJyBjYXRjaGVzIGFsbCBtdWx0aWNhc3QgdHJhZmZpYy4KK1RoZSBleHByZXNzaW9uIGBcZkJpcFswXSAmIDB4ZiAhPSA1XGZQJworY2F0Y2hlcyBhbGwgSVB2NCBwYWNrZXRzIHdpdGggb3B0aW9ucy4KK1RoZSBleHByZXNzaW9uCitgXGZCaXBbNjoyXSAmIDB4MWZmZiA9IDBcZlAnCitjYXRjaGVzIG9ubHkgdW5mcmFnbWVudGVkIElQdjQgZGF0YWdyYW1zIGFuZCBmcmFnIHplcm8gb2YgZnJhZ21lbnRlZAorSVB2NCBkYXRhZ3JhbXMuCitUaGlzIGNoZWNrIGlzIGltcGxpY2l0bHkgYXBwbGllZCB0byB0aGUgXGZCdGNwXGZQIGFuZCBcZkJ1ZHBcZlAKK2luZGV4IG9wZXJhdGlvbnMuCitGb3IgaW5zdGFuY2UsIFxmQnRjcFswXVxmUCBhbHdheXMgbWVhbnMgdGhlIGZpcnN0CitieXRlIG9mIHRoZSBUQ1AgXGZJaGVhZGVyXGZQLCBhbmQgbmV2ZXIgbWVhbnMgdGhlIGZpcnN0IGJ5dGUgb2YgYW4KK2ludGVydmVuaW5nIGZyYWdtZW50LgorCitTb21lIG9mZnNldHMgYW5kIGZpZWxkIHZhbHVlcyBtYXkgYmUgZXhwcmVzc2VkIGFzIG5hbWVzIHJhdGhlciB0aGFuCithcyBudW1lcmljIHZhbHVlcy4KK1RoZSBmb2xsb3dpbmcgcHJvdG9jb2wgaGVhZGVyIGZpZWxkIG9mZnNldHMgYXJlCithdmFpbGFibGU6IFxmQmljbXB0eXBlXGZQIChJQ01QIHR5cGUgZmllbGQpLCBcZkJpY21wY29kZVxmUCAoSUNNUAorY29kZSBmaWVsZCksIGFuZCBcZkJ0Y3BmbGFnc1xmUCAoVENQIGZsYWdzIGZpZWxkKS4KKworVGhlIGZvbGxvd2luZyBJQ01QIHR5cGUgZmllbGQgdmFsdWVzIGFyZSBhdmFpbGFibGU6IFxmQmljbXAtZWNob3JlcGx5XGZQLAorXGZCaWNtcC11bnJlYWNoXGZQLCBcZkJpY21wLXNvdXJjZXF1ZW5jaFxmUCwgXGZCaWNtcC1yZWRpcmVjdFxmUCwKK1xmQmljbXAtZWNob1xmUCwgXGZCaWNtcC1yb3V0ZXJhZHZlcnRcZlAsIFxmQmljbXAtcm91dGVyc29saWNpdFxmUCwKK1xmQmljbXAtdGlteGNlZWRcZlAsIFxmQmljbXAtcGFyYW1wcm9iXGZQLCBcZkJpY21wLXRzdGFtcFxmUCwKK1xmQmljbXAtdHN0YW1wcmVwbHlcZlAsIFxmQmljbXAtaXJlcVxmUCwgXGZCaWNtcC1pcmVxcmVwbHlcZlAsCitcZkJpY21wLW1hc2tyZXFcZlAsIFxmQmljbXAtbWFza3JlcGx5XGZQLgorCitUaGUgZm9sbG93aW5nIFRDUCBmbGFncyBmaWVsZCB2YWx1ZXMgYXJlIGF2YWlsYWJsZTogXGZCdGNwLWZpblxmUCwKK1xmQnRjcC1zeW5cZlAsIFxmQnRjcC1yc3RcZlAsIFxmQnRjcC1wdXNoXGZQLAorXGZCdGNwLWFja1xmUCwgXGZCdGNwLXVyZ1xmUC4KKy5MUAorUHJpbWl0aXZlcyBtYXkgYmUgY29tYmluZWQgdXNpbmc6CisuSVAKK0EgcGFyZW50aGVzaXplZCBncm91cCBvZiBwcmltaXRpdmVzIGFuZCBvcGVyYXRvcnMKKyhwYXJlbnRoZXNlcyBhcmUgc3BlY2lhbCB0byB0aGUgU2hlbGwgYW5kIG11c3QgYmUgZXNjYXBlZCkuCisuSVAKK05lZ2F0aW9uIChgXGZCIVxmUCcgb3IgYFxmQm5vdFxmUCcpLgorLklQCitDb25jYXRlbmF0aW9uIChgXGZCJiZcZlAnIG9yIGBcZkJhbmRcZlAnKS4KKy5JUAorQWx0ZXJuYXRpb24gKGBcZkJ8fFxmUCcgb3IgYFxmQm9yXGZQJykuCisuTFAKK05lZ2F0aW9uIGhhcyBoaWdoZXN0IHByZWNlZGVuY2UuCitBbHRlcm5hdGlvbiBhbmQgY29uY2F0ZW5hdGlvbiBoYXZlIGVxdWFsIHByZWNlZGVuY2UgYW5kIGFzc29jaWF0ZQorbGVmdCB0byByaWdodC4KK05vdGUgdGhhdCBleHBsaWNpdCBcZkJhbmRcZlIgdG9rZW5zLCBub3QganV4dGFwb3NpdGlvbiwKK2FyZSBub3cgcmVxdWlyZWQgZm9yIGNvbmNhdGVuYXRpb24uCisuTFAKK0lmIGFuIGlkZW50aWZpZXIgaXMgZ2l2ZW4gd2l0aG91dCBhIGtleXdvcmQsIHRoZSBtb3N0IHJlY2VudCBrZXl3b3JkCitpcyBhc3N1bWVkLgorRm9yIGV4YW1wbGUsCisuaW4gKy41aQorLm5mCitcZkJub3QgaG9zdCB2cyBhbmQgYWNlXGZSCisuZmkKKy5pbiAtLjVpCitpcyBzaG9ydCBmb3IKKy5pbiArLjVpCisubmYKK1xmQm5vdCBob3N0IHZzIGFuZCBob3N0IGFjZVxmUgorLmZpCisuaW4gLS41aQord2hpY2ggc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoCisuaW4gKy41aQorLm5mCitcZkJub3QgKCBob3N0IHZzIG9yIGFjZSApXGZSCisuZmkKKy5pbiAtLjVpCisuU0ggRVhBTVBMRVMKKy5MUAorVG8gc2VsZWN0IGFsbCBwYWNrZXRzIGFycml2aW5nIGF0IG9yIGRlcGFydGluZyBmcm9tIFxmSXN1bmRvd25cZlA6CisuUlMKKy5uZgorXGZCaG9zdCBzdW5kb3duXGZQCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgdHJhZmZpYyBiZXR3ZWVuIFxmSWhlbGlvc1xmUiBhbmQgZWl0aGVyIFxmSWhvdFxmUiBvciBcZklhY2VcZlI6CisuUlMKKy5uZgorXGZCaG9zdCBoZWxpb3MgYW5kIFxcKCBob3Qgb3IgYWNlIFxcKVxmUAorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBJUCBwYWNrZXRzIGJldHdlZW4gXGZJYWNlXGZSIGFuZCBhbnkgaG9zdCBleGNlcHQgXGZJaGVsaW9zXGZSOgorLlJTCisubmYKK1xmQmlwIGhvc3QgYWNlIGFuZCBub3QgaGVsaW9zXGZQCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgYWxsIHRyYWZmaWMgYmV0d2VlbiBsb2NhbCBob3N0cyBhbmQgaG9zdHMgYXQgQmVya2VsZXk6CisuUlMKKy5uZgorLkIKK25ldCB1Y2ItZXRoZXIKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBhbGwgZnRwIHRyYWZmaWMgdGhyb3VnaCBpbnRlcm5ldCBnYXRld2F5IFxmSXNudXBcZlA6CisuUlMKKy5uZgorLkIKK2dhdGV3YXkgc251cCBhbmQgKHBvcnQgZnRwIG9yIGZ0cC1kYXRhKQorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IHRyYWZmaWMgbmVpdGhlciBzb3VyY2VkIGZyb20gbm9yIGRlc3RpbmVkIGZvciBsb2NhbCBob3N0cworKGlmIHlvdSBnYXRld2F5IHRvIG9uZSBvdGhlciBuZXQsIHRoaXMgc3R1ZmYgc2hvdWxkIG5ldmVyIG1ha2UgaXQKK29udG8geW91ciBsb2NhbCBuZXQpLgorLlJTCisubmYKKy5CCitpcCBhbmQgbm90IG5ldCBcZklsb2NhbG5ldFxmUAorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IHRoZSBzdGFydCBhbmQgZW5kIHBhY2tldHMgKHRoZSBTWU4gYW5kIEZJTiBwYWNrZXRzKSBvZiBlYWNoCitUQ1AgY29udmVyc2F0aW9uIHRoYXQgaW52b2x2ZXMgYSBub24tbG9jYWwgaG9zdC4KKy5SUworLm5mCisuQgordGNwW3RjcGZsYWdzXSAmICh0Y3Atc3lufHRjcC1maW4pICE9IDAgYW5kIG5vdCBzcmMgYW5kIGRzdCBuZXQgXGZJbG9jYWxuZXRcZlAKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBhbGwgSVB2NCBIVFRQIHBhY2tldHMgdG8gYW5kIGZyb20gcG9ydCA4MCwgaS5lLiBwcmludCBvbmx5CitwYWNrZXRzIHRoYXQgY29udGFpbiBkYXRhLCBub3QsIGZvciBleGFtcGxlLCBTWU4gYW5kIEZJTiBwYWNrZXRzIGFuZAorQUNLLW9ubHkgcGFja2V0cy4gIChJUHY2IGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuKQorLlJTCisubmYKKy5CCit0Y3AgcG9ydCA4MCBhbmQgKCgoaXBbMjoyXSAtICgoaXBbMF0mMHhmKTw8MikpIC0gKCh0Y3BbMTJdJjB4ZjApPj4yKSkgIT0gMCkKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBJUCBwYWNrZXRzIGxvbmdlciB0aGFuIDU3NiBieXRlcyBzZW50IHRocm91Z2ggZ2F0ZXdheSBcZklzbnVwXGZQOgorLlJTCisubmYKKy5CCitnYXRld2F5IHNudXAgYW5kIGlwWzI6Ml0gPiA1NzYKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBJUCBicm9hZGNhc3Qgb3IgbXVsdGljYXN0IHBhY2tldHMgdGhhdCB3ZXJlCisuSSBub3QKK3NlbnQgdmlhIEV0aGVybmV0IGJyb2FkY2FzdCBvciBtdWx0aWNhc3Q6CisuUlMKKy5uZgorLkIKK2V0aGVyWzBdICYgMSA9IDAgYW5kIGlwWzE2XSA+PSAyMjQKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBhbGwgSUNNUCBwYWNrZXRzIHRoYXQgYXJlIG5vdCBlY2hvIHJlcXVlc3RzL3JlcGxpZXMgKGkuZS4sIG5vdAorcGluZyBwYWNrZXRzKToKKy5SUworLm5mCisuQgoraWNtcFtpY21wdHlwZV0gIT0gaWNtcC1lY2hvIGFuZCBpY21wW2ljbXB0eXBlXSAhPSBpY21wLWVjaG9yZXBseQorLmZpCisuUkUKKy5TSCAiU0VFIEFMU08iCitwY2FwKDNQQ0FQKQorLlNIIEJVR1MKK1BsZWFzZSBzZW5kIHByb2JsZW1zLCBidWdzLCBxdWVzdGlvbnMsIGRlc2lyYWJsZSBlbmhhbmNlbWVudHMsIGV0Yy4gdG86CisuTFAKKy5SUwordGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnCisuUkUKKy5MUAorRmlsdGVyIGV4cHJlc3Npb25zIG9uIGZpZWxkcyBvdGhlciB0aGFuIHRob3NlIGluIFRva2VuIFJpbmcgaGVhZGVycyB3aWxsCitub3QgY29ycmVjdGx5IGhhbmRsZSBzb3VyY2Utcm91dGVkIFRva2VuIFJpbmcgcGFja2V0cy4KKy5MUAorRmlsdGVyIGV4cHJlc3Npb25zIG9uIGZpZWxkcyBvdGhlciB0aGFuIHRob3NlIGluIDgwMi4xMSBoZWFkZXJzIHdpbGwgbm90Citjb3JyZWN0bHkgaGFuZGxlIDgwMi4xMSBkYXRhIHBhY2tldHMgd2l0aCBib3RoIFRvIERTIGFuZCBGcm9tIERTIHNldC4KKy5MUAorLkJSICJpcDYgcHJvdG8iCitzaG91bGQgY2hhc2UgaGVhZGVyIGNoYWluLCBidXQgYXQgdGhpcyBtb21lbnQgaXQgZG9lcyBub3QuCisuQlIgImlwNiBwcm90b2NoYWluIgoraXMgc3VwcGxpZWQgZm9yIHRoaXMgYmVoYXZpb3IuCisuTFAKK0FyaXRobWV0aWMgZXhwcmVzc2lvbiBhZ2FpbnN0IHRyYW5zcG9ydCBsYXllciBoZWFkZXJzLCBsaWtlIFxmQnRjcFswXVxmUCwKK2RvZXMgbm90IHdvcmsgYWdhaW5zdCBJUHY2IHBhY2tldHMuCitJdCBvbmx5IGxvb2tzIGF0IElQdjQgcGFja2V0cy4KZGlmZiAtLWdpdCBhL3BjYXAtaW50LmggYi9wY2FwLWludC5oCmluZGV4IDMwNzFjNzcuLjBjMjdlYzcgMTAwNjQ0Ci0tLSBhL3BjYXAtaW50LmgKKysrIGIvcGNhcC1pbnQuaApAQCAtMzAsMjAgKzMwLDIxIEBACiAgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAgKiBTVUNIIERBTUFHRS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtaW50LmgsdiAxLjY4LjIuMTEgMjAwNy8wNi8yMiAwNjo0Mzo1OCBndXkgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1pbnQuaCx2IDEuOTQgMjAwOC0wOS0xNiAwMDoyMDoyMyBndXkgRXhwICQgKExCTCkKICAqLwogCiAjaWZuZGVmIHBjYXBfaW50X2gKLSNkZWZpbmUgcGNhcF9pbnRfaAorI2RlZmluZQlwY2FwX2ludF9oCisKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jaW5jbHVkZSA8cGNhcC5oPgotCiAjaWZkZWYgV0lOMzIKICNpbmNsdWRlIDxQYWNrZXQzMi5oPgorZXh0ZXJuIENSSVRJQ0FMX1NFQ1RJT04gZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbjsKICNlbmRpZiAvKiBXSU4zMiAqLwogCiAjaWZkZWYgTVNET1MKQEAgLTUxLDYgKzUyLDIzIEBACiAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgogCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxMjAwKSkgLyogd2UgYXJlIGNvbXBpbGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gNiwgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhlIExMIHN1ZmZpeCovCisKKy8qCisgKiBTd2FwIGJ5dGUgb3JkZXJpbmcgb2YgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCBvbiBhIGJpZyBlbmRpYW4KKyAqIG1hY2hpbmUuCisgKi8KKyNkZWZpbmUgU1dBUExMKHVsbCkgICgodWxsICYgMHhmZjAwMDAwMDAwMDAwMDAwKSA+PiA1NikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwZmYwMDAwMDAwMDAwMDApID4+IDQwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMGZmMDAwMDAwMDAwMCkgPj4gMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwMDBmZjAwMDAwMDAwKSA+PiA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwMDAwMDAwZmYwMDAwMDApIDw8IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMDAwMDAwMGZmMDAwMCkgPDwgMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwMDAwMDAwMDBmZjAwKSA8PCA0MCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwMDAwMDAwMDAwMDAwZmYpIDw8IDU2KQorCisjZWxzZSAvKiBBIHJlY2VudCBWaXN1YWwgc3R1ZGlvIGNvbXBpbGVyIG9yIG5vdCBWQyAqLworCiAvKgogICogU3dhcCBieXRlIG9yZGVyaW5nIG9mIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAgb24gYSBiaWcgZW5kaWFuCiAgKiBtYWNoaW5lLgpAQCAtNjQsMTA2ICs4Miw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwMDAwMDAwMDBmZjAwTEwpIDw8IDQwKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMDAwMDAwMDAwMDBmZkxMKSA8PCA1NikKIAotLyoKLSAqIFNhdmVmaWxlCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0JTk9UX1NXQVBQRUQsCi0JU1dBUFBFRCwKLQlNQVlCRV9TV0FQUEVECi19IHN3YXBwZWRfdHlwZV90OworI2VuZGlmIC8qIF9NU0NfVkVSICovCiAKLXN0cnVjdCBwY2FwX3NmIHsKLQlGSUxFICpyZmlsZTsKLQlpbnQgc3dhcHBlZDsKLQlpbnQgaGRyc2l6ZTsKLQlzd2FwcGVkX3R5cGVfdCBsZW5ndGhzX3N3YXBwZWQ7Ci0JaW50IHZlcnNpb25fbWFqb3I7Ci0JaW50IHZlcnNpb25fbWlub3I7Ci0JdV9jaGFyICpiYXNlOworc3RydWN0IHBjYXBfb3B0IHsKKwljaGFyCSpzb3VyY2U7CisJaW50CXRpbWVvdXQ7CS8qIHRpbWVvdXQgZm9yIGJ1ZmZlcmluZyAqLworCWludAlidWZmZXJfc2l6ZTsKKwlpbnQJcHJvbWlzYzsKKwlpbnQJcmZtb247CQkvKiBtb25pdG9yIG1vZGUgKi8KKwlpbnQJaW1tZWRpYXRlOwkvKiBpbW1lZGlhdGUgbW9kZSAtIGRlbGl2ZXIgcGFja2V0cyBhcyBzb29uIGFzIHRoZXkgYXJyaXZlICovCisJaW50CXRzdGFtcF90eXBlOworCWludAl0c3RhbXBfcHJlY2lzaW9uOwogfTsKIAotc3RydWN0IHBjYXBfbWQgewotCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKLQkvKlhYWCovCi0JaW50IHVzZV9icGY7CQkvKiB1c2luZyBrZXJuZWwgZmlsdGVyICovCi0JdV9sb25nCVRvdFBrdHM7CS8qIGNhbid0IG9mbG93IGZvciA3OSBocnMgb24gZXRoZXIgKi8KLQl1X2xvbmcJVG90QWNjZXB0ZWQ7CS8qIGNvdW50IGFjY2VwdGVkIGJ5IGZpbHRlciAqLwotCXVfbG9uZwlUb3REcm9wczsJLyogY291bnQgb2YgZHJvcHBlZCBwYWNrZXRzICovCi0JbG9uZwlUb3RNaXNzZWQ7CS8qIG1pc3NlZCBieSBpL2YgZHVyaW5nIHRoaXMgcnVuICovCi0JbG9uZwlPcmlnTWlzc2VkOwkvKiBtaXNzZWQgYnkgaS9mIGJlZm9yZSB0aGlzIHJ1biAqLwotCWNoYXIJKmRldmljZTsJLyogZGV2aWNlIG5hbWUgKi8KLSNpZmRlZiBsaW51eAotCWludAlzb2NrX3BhY2tldDsJLyogdXNpbmcgTGludXggMi4wIGNvbXBhdGlibGUgaW50ZXJmYWNlICovCi0JaW50CXRpbWVvdXQ7CS8qIHRpbWVvdXQgc3BlY2lmaWVkIHRvIHBjYXBfb3Blbl9saXZlICovCi0JaW50CWNsZWFyX3Byb21pc2M7CS8qIG11c3QgY2xlYXIgcHJvbWlzY3VvdXMgbW9kZSB3aGVuIHdlIGNsb3NlICovCi0JaW50CWNvb2tlZDsJCS8qIHVzaW5nIFNPQ0tfREdSQU0gcmF0aGVyIHRoYW4gU09DS19SQVcgKi8KLQlpbnQJaWZpbmRleDsJLyogaW50ZXJmYWNlIGluZGV4IG9mIGRldmljZSB3ZSdyZSBib3VuZCB0byAqLwotCWludAlsb19pZmluZGV4OwkvKiBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGxvb3BiYWNrIGRldmljZSAqLwotCXN0cnVjdCBwY2FwICpuZXh0OwkvKiBsaXN0IG9mIG9wZW4gcHJvbWlzY3VvdXMgc29ja19wYWNrZXQgcGNhcHMgKi8KLQl1X2ludAlwYWNrZXRzX3JlYWQ7CS8qIGNvdW50IG9mIHBhY2tldHMgcmVhZCB3aXRoIHJlY3Zmcm9tKCkgKi8KK3R5cGVkZWYgaW50CSgqYWN0aXZhdGVfb3BfdCkocGNhcF90ICopOwordHlwZWRlZiBpbnQJKCpjYW5fc2V0X3JmbW9uX29wX3QpKHBjYXBfdCAqKTsKK3R5cGVkZWYgaW50CSgqcmVhZF9vcF90KShwY2FwX3QgKiwgaW50IGNudCwgcGNhcF9oYW5kbGVyLCB1X2NoYXIgKik7Cit0eXBlZGVmIGludAkoKmluamVjdF9vcF90KShwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwordHlwZWRlZiBpbnQJKCpzZXRmaWx0ZXJfb3BfdCkocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK3R5cGVkZWYgaW50CSgqc2V0ZGlyZWN0aW9uX29wX3QpKHBjYXBfdCAqLCBwY2FwX2RpcmVjdGlvbl90KTsKK3R5cGVkZWYgaW50CSgqc2V0X2RhdGFsaW5rX29wX3QpKHBjYXBfdCAqLCBpbnQpOwordHlwZWRlZiBpbnQJKCpnZXRub25ibG9ja19vcF90KShwY2FwX3QgKiwgY2hhciAqKTsKK3R5cGVkZWYgaW50CSgqc2V0bm9uYmxvY2tfb3BfdCkocGNhcF90ICosIGludCwgY2hhciAqKTsKK3R5cGVkZWYgaW50CSgqc3RhdHNfb3BfdCkocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CisjaWZkZWYgV0lOMzIKK3R5cGVkZWYgaW50CSgqc2V0YnVmZl9vcF90KShwY2FwX3QgKiwgaW50KTsKK3R5cGVkZWYgaW50CSgqc2V0bW9kZV9vcF90KShwY2FwX3QgKiwgaW50KTsKK3R5cGVkZWYgaW50CSgqc2V0bWludG9jb3B5X29wX3QpKHBjYXBfdCAqLCBpbnQpOwordHlwZWRlZiBBZGFwdGVyICooKmdldGFkYXB0ZXJfb3BfdCkocGNhcF90ICopOwogI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0RBR19BUEkKLSNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQotCXVfY2hhcgkqZGFnX21lbV9ib3R0b207CS8qIERBRyBjYXJkIGN1cnJlbnQgbWVtb3J5IGJvdHRvbSBwb2ludGVyICovCi0JdV9jaGFyCSpkYWdfbWVtX3RvcDsJLyogREFHIGNhcmQgY3VycmVudCBtZW1vcnkgdG9wIHBvaW50ZXIgKi8KLSNlbHNlCi0Jdm9pZAkqZGFnX21lbV9iYXNlOwkvKiBEQUcgY2FyZCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0JdV9pbnQJZGFnX21lbV9ib3R0b207CS8qIERBRyBjYXJkIGN1cnJlbnQgbWVtb3J5IGJvdHRvbSBvZmZzZXQgKi8KLQl1X2ludAlkYWdfbWVtX3RvcDsJLyogREFHIGNhcmQgY3VycmVudCBtZW1vcnkgdG9wIG9mZnNldCAqLwotI2VuZGlmIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCi0JaW50CWRhZ19mY3NfYml0czsJLyogTnVtYmVyIG9mIGNoZWNrc3VtIGJpdHMgZnJvbSBsaW5rIGxheWVyICovCi0JaW50CWRhZ19vZmZzZXRfZmxhZ3M7IC8qIEZsYWdzIHRvIHBhc3MgdG8gZGFnX29mZnNldCgpLiAqLwotCWludAlkYWdfc3RyZWFtOwkvKiBEQUcgc3RyZWFtIG51bWJlciAqLwotCWludAlkYWdfdGltZW91dDsJLyogdGltZW91dCBzcGVjaWZpZWQgdG8gcGNhcF9vcGVuX2xpdmUuCi0JCQkJICogU2FtZSBhcyBpbiBsaW51eCBhYm92ZSwgaW50cm9kdWNlCi0JCQkJICogZ2VuZXJhbGx5PyAqLwotI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLwotfTsKK3R5cGVkZWYgdm9pZAkoKmNsZWFudXBfb3BfdCkocGNhcF90ICopOwogCiAvKgotICogVWx0cml4LCBERUMgT1NGLzFeSF5IXkheSF5IXkheSF5IXkhEaWdpdGFsIFVOSVheSF5IXkheSF5IXkheSF5IXkheSF5IXkgKLSAqIFRydTY0IFVOSVgsIGFuZCBzb21lIHZlcnNpb25zIG9mIE5ldEJTRCBwYWQgRkRESSBwYWNrZXRzIHRvIG1ha2UgZXZlcnl0aGluZwotICogbGluZSB1cCBvbiBhIG5pY2UgYm91bmRhcnkuCisgKiBXZSBwdXQgYWxsIHRoZSBzdHVmZiB1c2VkIGluIHRoZSByZWFkIGNvZGUgcGF0aCBhdCB0aGUgYmVnaW5uaW5nLAorICogdG8gdHJ5IHRvIGtlZXAgaXQgdG9nZXRoZXIgaW4gdGhlIHNhbWUgY2FjaGUgbGluZSBvciBsaW5lcy4KICAqLwotI2lmZGVmIF9fTmV0QlNEX18KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4JLyogbmVlZGVkIHRvIGRlY2xhcmUgX19OZXRCU0RfVmVyc2lvbl9fICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQodWx0cml4KSB8fCBkZWZpbmVkKF9fb3NmX18pIHx8IChkZWZpbmVkKF9fTmV0QlNEX18pICYmIF9fTmV0QlNEX1ZlcnNpb25fXyA+IDEwNjAwMDAwMCkKLSNkZWZpbmUgICAgICAgUENBUF9GRERJUEFEIDMKLSNlbmRpZgotCiBzdHJ1Y3QgcGNhcCB7CisJLyoKKwkgKiBNZXRob2QgdG8gY2FsbCB0byByZWFkIHBhY2tldHMgb24gYSBsaXZlIGNhcHR1cmUuCisJICovCisJcmVhZF9vcF90IHJlYWRfb3A7CisKKwkvKgorCSAqIE1ldGhvZCB0byBjYWxsIHRvIHJlYWQgdG8gcmVhZCBwYWNrZXRzIGZyb20gYSBzYXZlZmlsZS4KKwkgKi8KKwlpbnQgKCpuZXh0X3BhY2tldF9vcCkocGNhcF90ICosIHN0cnVjdCBwY2FwX3BrdGhkciAqLCB1X2NoYXIgKiopOworCiAjaWZkZWYgV0lOMzIKIAlBREFQVEVSICphZGFwdGVyOwogCUxQUEFDS0VUIFBhY2tldDsKLQlpbnQgdGltZW91dDsKIAlpbnQgbm9uYmxvY2s7CiAjZWxzZQogCWludCBmZDsKIAlpbnQgc2VsZWN0YWJsZV9mZDsKLQlpbnQgc2VuZF9mZDsKICNlbmRpZiAvKiBXSU4zMiAqLwotCWludCBzbmFwc2hvdDsKLQlpbnQgbGlua3R5cGU7Ci0JaW50IHR6b2ZmOwkJLyogdGltZXpvbmUgb2Zmc2V0ICovCi0JaW50IG9mZnNldDsJCS8qIG9mZnNldCBmb3IgcHJvcGVyIGFsaWdubWVudCAqLwotCi0JaW50IGJyZWFrX2xvb3A7CQkvKiBmbGFnIHNldCB0byBmb3JjZSBicmVhayBmcm9tIHBhY2tldC1yZWFkaW5nIGxvb3AgKi8KLQotI2lmZGVmIFBDQVBfRkRESVBBRAotCWludCBmZGRpcGFkOwotI2VuZGlmCi0KLSNpZmRlZiBNU0RPUwotICAgICAgICBpbnQgaW50ZXJfcGFja2V0X3dhaXQ7ICAgLyogb2ZmbGluZTogd2FpdCBiZXR3ZWVuIHBhY2tldHMgKi8KLSAgICAgICAgdm9pZCAoKndhaXRfcHJvYykodm9pZCk7IC8qICAgICAgICAgIGNhbGwgcHJvYyB3aGlsZSB3YWl0aW5nICovCi0jZW5kaWYKLQotCXN0cnVjdCBwY2FwX3NmIHNmOwotCXN0cnVjdCBwY2FwX21kIG1kOwogCiAJLyoKIAkgKiBSZWFkIGJ1ZmZlci4KQEAgLTE3Myw2ICsxNDUsMzQgQEAKIAl1X2NoYXIgKmJwOwogCWludCBjYzsKIAorCWludCBicmVha19sb29wOwkJLyogZmxhZyBzZXQgdG8gZm9yY2UgYnJlYWsgZnJvbSBwYWNrZXQtcmVhZGluZyBsb29wICovCisKKwl2b2lkICpwcml2OwkJLyogcHJpdmF0ZSBkYXRhIGZvciBtZXRob2RzICovCisKKwlpbnQgc3dhcHBlZDsKKwlGSUxFICpyZmlsZTsJCS8qIG51bGwgaWYgbGl2ZSBjYXB0dXJlLCBub24tbnVsbCBpZiBzYXZlZmlsZSAqLworCWludCBmZGRpcGFkOworCXN0cnVjdCBwY2FwICpuZXh0OwkvKiBsaXN0IG9mIG9wZW4gcGNhcHMgdGhhdCBuZWVkIHN0dWZmIGNsZWFyZWQgb24gY2xvc2UgKi8KKworCS8qCisJICogRmlsZSB2ZXJzaW9uIG51bWJlcjsgbWVhbmluZ2Z1bCBvbmx5IGZvciBhIHNhdmVmaWxlLCBidXQgd2UKKwkgKiBrZWVwIGl0IGhlcmUgc28gdGhhdCBhcHBzIHRoYXQgKG1pc3Rha2VubHkpIGFzayBmb3IgdGhlCisJICogdmVyc2lvbiBudW1iZXJzIHdpbGwgZ2V0IHRoZSBzYW1lIHplcm8gdmFsdWVzIHRoYXQgdGhleQorCSAqIGFsd2F5cyBkaWQuCisJICovCisJaW50IHZlcnNpb25fbWFqb3I7CisJaW50IHZlcnNpb25fbWlub3I7CisKKwlpbnQgc25hcHNob3Q7CisJaW50IGxpbmt0eXBlOwkJLyogTmV0d29yayBsaW5rdHlwZSAqLworCWludCBsaW5rdHlwZV9leHQ7ICAgICAgIC8qIEV4dGVuZGVkIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgbGlua3R5cGUgZmllbGQgb2YgYSBmaWxlICovCisJaW50IHR6b2ZmOwkJLyogdGltZXpvbmUgb2Zmc2V0ICovCisJaW50IG9mZnNldDsJCS8qIG9mZnNldCBmb3IgcHJvcGVyIGFsaWdubWVudCAqLworCWludCBhY3RpdmF0ZWQ7CQkvKiB0cnVlIGlmIHRoZSBjYXB0dXJlIGlzIHJlYWxseSBzdGFydGVkICovCisJaW50IG9sZHN0eWxlOwkJLyogaWYgd2UncmUgb3BlbmluZyB3aXRoIHBjYXBfb3Blbl9saXZlKCkgKi8KKworCXN0cnVjdCBwY2FwX29wdCBvcHQ7CisKIAkvKgogCSAqIFBsYWNlIGhvbGRlciBmb3IgcGNhcF9uZXh0KCkuCiAJICovCkBAIC0xODIsMTkgKzE4Miw2IEBACiAJcGNhcF9kaXJlY3Rpb25fdCBkaXJlY3Rpb247CiAKIAkvKgotCSAqIE1ldGhvZHMuCi0JICovCi0JaW50CSgqcmVhZF9vcCkocGNhcF90ICosIGludCBjbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOwotCWludAkoKmluamVjdF9vcCkocGNhcF90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKLQlpbnQJKCpzZXRmaWx0ZXJfb3ApKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7Ci0JaW50CSgqc2V0ZGlyZWN0aW9uX29wKShwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7Ci0JaW50CSgqc2V0X2RhdGFsaW5rX29wKShwY2FwX3QgKiwgaW50KTsKLQlpbnQJKCpnZXRub25ibG9ja19vcCkocGNhcF90ICosIGNoYXIgKik7Ci0JaW50CSgqc2V0bm9uYmxvY2tfb3ApKHBjYXBfdCAqLCBpbnQsIGNoYXIgKik7Ci0JaW50CSgqc3RhdHNfb3ApKHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOwotCXZvaWQJKCpjbG9zZV9vcCkocGNhcF90ICopOwotCi0JLyoKIAkgKiBQbGFjZWhvbGRlciBmb3IgZmlsdGVyIGNvZGUgaWYgYnBmIG5vdCBpbiBrZXJuZWwuCiAJICovCiAJc3RydWN0IGJwZl9wcm9ncmFtIGZjb2RlOwpAQCAtMjAyLDggKzE4OSw0MiBAQAogCWNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkUgKyAxXTsKIAlpbnQgZGx0X2NvdW50OwogCXVfaW50ICpkbHRfbGlzdDsKKwlpbnQgdHN0YW1wX3R5cGVfY291bnQ7CisJdV9pbnQgKnRzdGFtcF90eXBlX2xpc3Q7CisJaW50IHRzdGFtcF9wcmVjaXNpb25fY291bnQ7CisJdV9pbnQgKnRzdGFtcF9wcmVjaXNpb25fbGlzdDsKIAogCXN0cnVjdCBwY2FwX3BrdGhkciBwY2FwX2hlYWRlcjsJLyogVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwY2FwX25leHRfZXgoKSB0byB3b3JrICovCisKKwkvKgorCSAqIE1vcmUgbWV0aG9kcy4KKwkgKi8KKwlhY3RpdmF0ZV9vcF90IGFjdGl2YXRlX29wOworCWNhbl9zZXRfcmZtb25fb3BfdCBjYW5fc2V0X3JmbW9uX29wOworCWluamVjdF9vcF90IGluamVjdF9vcDsKKwlzZXRmaWx0ZXJfb3BfdCBzZXRmaWx0ZXJfb3A7CisJc2V0ZGlyZWN0aW9uX29wX3Qgc2V0ZGlyZWN0aW9uX29wOworCXNldF9kYXRhbGlua19vcF90IHNldF9kYXRhbGlua19vcDsKKwlnZXRub25ibG9ja19vcF90IGdldG5vbmJsb2NrX29wOworCXNldG5vbmJsb2NrX29wX3Qgc2V0bm9uYmxvY2tfb3A7CisJc3RhdHNfb3BfdCBzdGF0c19vcDsKKworCS8qCisJICogUm91dGluZSB0byB1c2UgYXMgY2FsbGJhY2sgZm9yIHBjYXBfbmV4dCgpL3BjYXBfbmV4dF9leCgpLgorCSAqLworCXBjYXBfaGFuZGxlciBvbmVzaG90X2NhbGxiYWNrOworCisjaWZkZWYgV0lOMzIKKwkvKgorCSAqIFRoZXNlIGFyZSwgYXQgbGVhc3QgY3VycmVudGx5LCBzcGVjaWZpYyB0byB0aGUgV2luMzIgTlBGCisJICogZHJpdmVyLgorCSAqLworCXNldGJ1ZmZfb3BfdCBzZXRidWZmX29wOworCXNldG1vZGVfb3BfdCBzZXRtb2RlX29wOworCXNldG1pbnRvY29weV9vcF90IHNldG1pbnRvY29weV9vcDsKKwlnZXRhZGFwdGVyX29wX3QgZ2V0YWRhcHRlcl9vcDsKKyNlbmRpZgorCWNsZWFudXBfb3BfdCBjbGVhbnVwX29wOwogfTsKIAogLyoKQEAgLTIzMSw4ICsyNTIsOCBAQAogICoKICAqCWludHJvZHVjZSBhIG5ldyBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgZm9ybWF0OwogICoKLSAqCXNlbmQgbWFpbCB0byAidGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnIiwgcmVxdWVzdGluZyBhIG5ldwotICoJbWFnaWMgbnVtYmVyIGZvciB5b3VyIG5ldyBjYXB0dXJlIGZpbGUgZm9ybWF0LCBhbmQsIHdoZW4KKyAqCXNlbmQgbWFpbCB0byAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiwgcmVxdWVzdGluZworICoJYSBuZXcgbWFnaWMgbnVtYmVyIGZvciB5b3VyIG5ldyBjYXB0dXJlIGZpbGUgZm9ybWF0LCBhbmQsIHdoZW4KICAqCXlvdSBnZXQgdGhlIG5ldyBtYWdpYyBudW1iZXIsIHB1dCBpdCBpbiAic2F2ZWZpbGUuYyI7CiAgKgogICoJdXNlIHRoYXQgbWFnaWMgbnVtYmVyIGZvciBzYXZlIGZpbGVzIHdpdGggdGhlIGNoYW5nZWQgcmVjb3JkCkBAIC0yNDIsOSArMjYzLDEzIEBACiAgKgl0aGUgb2xkIHJlY29yZCBoZWFkZXIgYXMgd2VsbCBhcyBmaWxlcyB3aXRoIHRoZSBuZXcgcmVjb3JkIGhlYWRlcgogICoJKHVzaW5nIHRoZSBtYWdpYyBudW1iZXIgdG8gZGV0ZXJtaW5lIHRoZSBoZWFkZXIgZm9ybWF0KS4KICAqCi0gKiBUaGVuIHN1cHBseSB0aGUgY2hhbmdlcyB0byAicGF0Y2hlc0B0Y3BkdW1wLm9yZyIsIHNvIHRoYXQgZnV0dXJlCi0gKiB2ZXJzaW9ucyBvZiBsaWJwY2FwIGFuZCBwcm9ncmFtcyB0aGF0IHVzZSBpdCAoc3VjaCBhcyB0Y3BkdW1wKSB3aWxsCi0gKiBiZSBhYmxlIHRvIHJlYWQgeW91ciBuZXcgY2FwdHVyZSBmaWxlIGZvcm1hdC4KKyAqIFRoZW4gc3VwcGx5IHRoZSBjaGFuZ2VzIGJ5IGZvcmtpbmcgdGhlIGJyYW5jaCBhdAorICoKKyAqCWh0dHBzOi8vZ2l0aHViLmNvbS90aGUtdGNwZHVtcC1ncm91cC9saWJwY2FwL2lzc3VlcworICoKKyAqIGFuZCBpc3N1aW5nIGEgcHVsbCByZXF1ZXN0LCBzbyB0aGF0IGZ1dHVyZSB2ZXJzaW9ucyBvZiBsaWJwY2FwIGFuZAorICogcHJvZ3JhbXMgdGhhdCB1c2UgaXQgKHN1Y2ggYXMgdGNwZHVtcCkgd2lsbCBiZSBhYmxlIHRvIHJlYWQgeW91ciBuZXcKKyAqIGNhcHR1cmUgZmlsZSBmb3JtYXQuCiAgKi8KIAogc3RydWN0IHBjYXBfc2ZfcGt0aGRyIHsKQEAgLTI3Miw2ICsyOTcsMTYgQEAKICAgICB1bnNpZ25lZCBjaGFyIHBrdF90eXBlOwogfTsKIAorLyoKKyAqIFVzZXIgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBvbmUtc2hvdCBjYWxsYmFjayB1c2VkIGZvciBwY2FwX25leHQoKQorICogYW5kIHBjYXBfbmV4dF9leCgpLgorICovCitzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSB7CisJc3RydWN0IHBjYXBfcGt0aGRyICpoZHI7CisJY29uc3QgdV9jaGFyICoqcGt0OworCXBjYXBfdCAqcGQ7Cit9OworCiBpbnQJeXlsZXgodm9pZCk7CiAKICNpZm5kZWYgbWluCkBAIC0zMDIsNiArMzM3LDEyIEBACiAjZW5kaWYKIAogLyoKKyAqIERvZXMgdGhlIHBhY2tldCBjb3VudCBhcmd1bWVudCB0byBhIG1vZHVsZSdzIHJlYWQgcm91dGluZSBzYXkKKyAqICJzdXBwbHkgcGFja2V0cyB1bnRpbCB5b3UgcnVuIG91dCBvZiBwYWNrZXRzIj8KKyAqLworI2RlZmluZSBQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKGNvdW50KQkoKGNvdW50KSA8PSAwKQorCisvKgogICogUm91dGluZXMgdGhhdCBtb3N0IHBjYXAgaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgZm9yIG5vbi1ibG9ja2luZyBtb2RlLgogICovCiAjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQpAQCAtMzA5LDE3ICszNTAsMzkgQEAKIGludAlwY2FwX3NldG5vbmJsb2NrX2ZkKHBjYXBfdCAqcCwgaW50LCBjaGFyICopOwogI2VuZGlmCiAKLXZvaWQJcGNhcF9jbG9zZV9jb21tb24ocGNhcF90ICopOworLyoKKyAqIEludGVybmFsIGludGVyZmFjZXMgZm9yICJwY2FwX2NyZWF0ZSgpIi4KKyAqCisgKiAicGNhcF9jcmVhdGVfaW50ZXJmYWNlKCkiIGlzIHRoZSByb3V0aW5lIHRvIGRvIGEgcGNhcF9jcmVhdGUgb24KKyAqIGEgcmVndWxhciBuZXR3b3JrIGludGVyZmFjZS4gIFRoZXJlIGFyZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMKKyAqIG9mIHRoaXMsIG9uZSBmb3IgZWFjaCBwbGF0Zm9ybSB0eXBlIChMaW51eCwgQlBGLCBETFBJLCBldGMuKSwKKyAqIHdpdGggdGhlIG9uZSB1c2VkIGNob3NlbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyAqCisgKiAicGNhcF9jcmVhdGVfY29tbW9uKCkiIGFsbG9jYXRlcyBhbmQgZmlsbHMgaW4gYSBwY2FwX3QsIGZvciB1c2UKKyAqIGJ5IHBjYXBfY3JlYXRlIHJvdXRpbmVzLgorICovCitwY2FwX3QJKnBjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICosIGNoYXIgKik7CitwY2FwX3QJKnBjYXBfY3JlYXRlX2NvbW1vbihjb25zdCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KTsKK2ludAlwY2FwX2RvX2FkZGV4aXQocGNhcF90ICopOwordm9pZAlwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShwY2FwX3QgKik7Cit2b2lkCXBjYXBfcmVtb3ZlX2Zyb21fcGNhcHNfdG9fY2xvc2UocGNhcF90ICopOwordm9pZAlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocGNhcF90ICopOworaW50CXBjYXBfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqKTsKK2ludAlwY2FwX2NoZWNrX2FjdGl2YXRlZChwY2FwX3QgKik7CiAKIC8qCiAgKiBJbnRlcm5hbCBpbnRlcmZhY2VzIGZvciAicGNhcF9maW5kYWxsZGV2cygpIi4KICAqCi0gKiAicGNhcF9wbGF0Zm9ybV9maW5kZGV2cygpIiBpcyBhIHBsYXRmb3JtLWRlcGVuZGVudCByb3V0aW5lIHRvCi0gKiBhZGQgZGV2aWNlcyBub3QgZm91bmQgYnkgdGhlICJzdGFuZGFyZCIgbWVjaGFuaXNtcyAoU0lPQ0dJRkNPTkYsCi0gKiAiZ2V0aWZhZGRycygpIiwgZXRjLi4KKyAqICJwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoKSIgZmluZHMgaW50ZXJmYWNlcyB1c2luZyB0aGUKKyAqICJzdGFuZGFyZCIgbWVjaGFuaXNtcyAoU0lPQ0dJRkNPTkYsICJnZXRpZmFkZHJzKCkiLCBldGMuKS4KICAqCi0gKiAicGNhcF9hZGRfaWYoKSIgYWRkcyBhbiBpbnRlcmZhY2UgdG8gdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcy4KKyAqICJwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKCkiIGlzIGEgcGxhdGZvcm0tZGVwZW5kZW50IHJvdXRpbmUgdG8KKyAqIGFkZCBkZXZpY2VzIG5vdCBmb3VuZCBieSB0aGUgInN0YW5kYXJkIiBtZWNoYW5pc21zLgorICoKKyAqICJwY2FwX2FkZF9pZigpIiBhZGRzIGFuIGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzLCBmb3IKKyAqIHVzZSBieSB2YXJpb3VzICJmaW5kIGludGVyZmFjZXMiIHJvdXRpbmVzLgogICovCitpbnQJcGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKHBjYXBfaWZfdCAqKiwgY2hhciAqKTsKIGludAlwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKiwgY2hhciAqKTsKIGludAlhZGRfYWRkcl90b19pZmxpc3QocGNhcF9pZl90ICoqLCBjb25zdCBjaGFyICosIHVfaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwKIAkgICAgc2l6ZV90LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LApAQCAtMzI5LDYgKzM5MiwyOCBAQAogaW50CWFkZF9vcl9maW5kX2lmKHBjYXBfaWZfdCAqKiwgcGNhcF9pZl90ICoqLCBjb25zdCBjaGFyICosIHVfaW50LAogCSAgICBjb25zdCBjaGFyICosIGNoYXIgKik7CiAKKy8qCisgKiBJbnRlcm5hbCBpbnRlcmZhY2VzIGZvciAicGNhcF9vcGVuX29mZmxpbmUoKSIuCisgKgorICogInBjYXBfb3Blbl9vZmZsaW5lX2NvbW1vbigpIiBhbGxvY2F0ZXMgYW5kIGZpbGxzIGluIGEgcGNhcF90LCBmb3IgdXNlCisgKiBieSBwY2FwX29wZW5fb2ZmbGluZSByb3V0aW5lcy4KKyAqCisgKiAic2ZfY2xlYW51cCgpIiBjbG9zZXMgdGhlIGZpbGUgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCBhIHBjYXBfdCwgaWYKKyAqIGFwcHJvcHJpYXRlLCBhbmQgZnJlZXMgYWxsIGRhdGEgY29tbW9uIHRvIGFsbCBtb2R1bGVzIGZvciBoYW5kbGluZworICogc2F2ZWZpbGUgdHlwZXMuCisgKi8KK3BjYXBfdAkqcGNhcF9vcGVuX29mZmxpbmVfY29tbW9uKGNoYXIgKmVidWYsIHNpemVfdCBzaXplKTsKK3ZvaWQJc2ZfY2xlYW51cChwY2FwX3QgKnApOworCisvKgorICogSW50ZXJuYWwgaW50ZXJmYWNlcyBmb3IgYm90aCAicGNhcF9jcmVhdGUoKSIgYW5kIHJvdXRpbmVzIHRoYXQKKyAqIG9wZW4gc2F2ZWZpbGVzLgorICoKKyAqICJwY2FwX29uZXNob3QoKSIgaXMgdGhlIHN0YW5kYXJkIG9uZS1zaG90IGNhbGxiYWNrIGZvciAicGNhcF9uZXh0KCkiCisgKiBhbmQgInBjYXBfbmV4dF9leCgpIi4KKyAqLwordm9pZAlwY2FwX29uZXNob3QodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CisKICNpZmRlZiBXSU4zMgogY2hhcgkqcGNhcF93aW4zMnN0cmVycm9yKHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9wY2FwLWxpYmRscGkuYyBiL3BjYXAtbGliZGxwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzkzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLWxpYmRscGkuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIFRoaXMgY29kZSBjb250cmlidXRlZCBieSBTYWd1biBTaGFreWEgKHNhZ3VuLnNoYWt5YUBzdW4uY29tKQorICovCisvKgorICogUGFja2V0IGNhcHR1cmUgcm91dGluZXMgZm9yIERMUEkgdXNpbmcgbGliZGxwaSB1bmRlciBTdW5PUyA1LjExLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorCSJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbGliZGxwaS5jLHYgMS42IDIwMDgtMDQtMTQgMjA6NDA6NTggZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9idWZtb2QuaD4KKyNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisjaW5jbHVkZSA8bGliZGxwaS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgImRscGlzdWJzLmgiCisKKy8qIEZvcndhcmRzLiAqLworc3RhdGljIGludCBkbHByb21pc2NvbihwY2FwX3QgKiwgYnBmX3VfaW50MzIpOworc3RhdGljIGludCBwY2FwX3JlYWRfbGliZGxwaShwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgcGNhcF9pbmplY3RfbGliZGxwaShwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgcGNhcF9saWJkbHBpX2Vycihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICopOworc3RhdGljIHZvaWQgcGNhcF9jbGVhbnVwX2xpYmRscGkocGNhcF90ICopOworCisvKgorICogbGlzdF9pbnRlcmZhY2VzKCkgd2lsbCBsaXN0IGFsbCB0aGUgbmV0d29yayBsaW5rcyB0aGF0IGFyZQorICogYXZhaWxhYmxlIG9uIGEgc3lzdGVtLgorICovCitzdGF0aWMgYm9vbGVhbl90IGxpc3RfaW50ZXJmYWNlcyhjb25zdCBjaGFyICosIHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IGxpbmtuYW1lbGlzdCB7CisJY2hhcglsaW5rbmFtZVtETFBJX0xJTktOQU1FX01BWF07CisJc3RydWN0IGxpbmtuYW1lbGlzdCAqbG5sX25leHQ7Cit9IGxpbmtuYW1lbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCBsaW5rd2FsayB7CisJbGlua25hbWVsaXN0X3QJKmx3X2xpc3Q7CisJaW50CQlsd19lcnI7Cit9IGxpbmt3YWxrX3Q7CisKKy8qCisgKiBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQKKyAqIGZvciBlYWNoIGxpbmtuYW1lbGlzdF90ICJlbnRyeSIgYWxsb2NhdGVkLgorICovCitzdGF0aWMgYm9vbGVhbl90CitsaXN0X2ludGVyZmFjZXMoY29uc3QgY2hhciAqbGlua25hbWUsIHZvaWQgKmFyZykKK3sKKwlsaW5rd2Fsa190CSpsd3AgPSBhcmc7CisJbGlua25hbWVsaXN0X3QJKmVudHJ5OworCisJaWYgKChlbnRyeSA9IGNhbGxvYygxLCBzaXplb2YobGlua25hbWVsaXN0X3QpKSkgPT0gTlVMTCkgeworCQlsd3AtPmx3X2VyciA9IEVOT01FTTsKKwkJcmV0dXJuIChCX1RSVUUpOworCX0KKwkodm9pZCkgc3RybGNweShlbnRyeS0+bGlua25hbWUsIGxpbmtuYW1lLCBETFBJX0xJTktOQU1FX01BWCk7CisKKwlpZiAobHdwLT5sd19saXN0ID09IE5VTEwpIHsKKwkJbHdwLT5sd19saXN0ID0gZW50cnk7CisJfSBlbHNlIHsKKwkJZW50cnktPmxubF9uZXh0ID0gbHdwLT5sd19saXN0OworCQlsd3AtPmx3X2xpc3QgPSBlbnRyeTsKKwl9CisKKwlyZXR1cm4gKEJfRkFMU0UpOworfQorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX2xpYmRscGkocGNhcF90ICpwKQoreworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKwlpbnQgcmV0djsKKwlkbHBpX2hhbmRsZV90IGRoOworCWRscGlfaW5mb190IGRsaW5mbzsKKwlpbnQgZXJyID0gUENBUF9FUlJPUjsKKworCS8qCisJICogRW5hYmxlIFNvbGFyaXMgcmF3IGFuZCBwYXNzaXZlIERMUEkgZXh0ZW5zaW9uczsKKwkgKiBkbHBpX29wZW4oKSB3aWxsIG5vdCBmYWlsIGlmIHRoZSB1bmRlcmx5aW5nIGxpbmsgZG9lcyBub3Qgc3VwcG9ydAorCSAqIHBhc3NpdmUgbW9kZS4gU2VlIGRscGkoN1ApIGZvciBkZXRhaWxzLgorCSAqLworCXJldHYgPSBkbHBpX29wZW4ocC0+b3B0LnNvdXJjZSwgJmRoLCBETFBJX1JBV3xETFBJX1BBU1NJVkUpOworCWlmIChyZXR2ICE9IERMUElfU1VDQ0VTUykgeworCQlpZiAocmV0diA9PSBETFBJX0VMSU5LTkFNRUlOVkFMIHx8IHJldHYgPT0gRExQSV9FTk9MSU5LKQorCQkJZXJyID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwkJZWxzZSBpZiAocmV0diA9PSBETF9TWVNFUlIgJiYKKwkJICAgIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpKQorCQkJZXJyID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuc291cmNlLCAiZGxwaV9vcGVuIiwgcmV0diwKKwkJICAgIHAtPmVycmJ1Zik7CisJCXJldHVybiAoZXJyKTsKKwl9CisJcGQtPmRscGlfaGQgPSBkaDsKKworCWlmIChwLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogVGhpcyBkZXZpY2UgZXhpc3RzLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCBtb25pdG9yIG1vZGUKKwkJICogYW55IHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgRExQSS4KKwkJICovCisJCWVyciA9IFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBCaW5kIHdpdGggRExQSV9BTllfU0FQLiAqLworCWlmICgocmV0diA9IGRscGlfYmluZChwZC0+ZGxwaV9oZCwgRExQSV9BTllfU0FQLCAwKSkgIT0gRExQSV9TVUNDRVNTKSB7CisJCXBjYXBfbGliZGxwaV9lcnIocC0+b3B0LnNvdXJjZSwgImRscGlfYmluZCIsIHJldHYsIHAtPmVycmJ1Zik7CisJCWdvdG8gYmFkOworCX0KKworCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlLiAqLworCWlmIChwLT5vcHQucHJvbWlzYykgeworCQllcnIgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX1BIWVMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJLyoKKwkJCSAqICJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNhcHR1cmUgb24KKwkJCSAqIHRoaXMgZGV2aWNlIiBhbmQgInlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24KKwkJCSAqIHRvIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBvbiB0aGlzCisJCQkgKiBkZXZpY2UiIGFyZSBkaWZmZXJlbnQ7IGxldCB0aGUgdXNlciBrbm93LAorCQkJICogc28gaWYgdGhleSBjYW4ndCBnZXQgcGVybWlzc2lvbiB0bworCQkJICogY2FwdHVyZSBpbiBwcm9taXNjdW91cyBtb2RlLCB0aGV5IGNhbiBhdAorCQkJICogbGVhc3QgdHJ5IHRvIGNhcHR1cmUgaW4gbm9uLXByb21pc2N1b3VzCisJCQkgKiBtb2RlLgorCQkJICoKKwkJCSAqIFhYWCAtIHlvdSBtaWdodCBoYXZlIHRvIGNhcHR1cmUgaW4KKwkJCSAqIHByb21pc2N1b3VzIG1vZGUgdG8gc2VlIG91dGdvaW5nIHBhY2tldHMuCisJCQkgKi8KKwkJCWlmIChlcnIgPT0gUENBUF9FUlJPUl9QRVJNX0RFTklFRCkKKwkJCQllcnIgPSBQQ0FQX0VSUk9SX1BST01JU0NfUEVSTV9ERU5JRUQ7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRyeSB0byBlbmFibGUgbXVsdGljYXN0LiAqLworCQllcnIgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX01VTFRJKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBUcnkgdG8gZW5hYmxlIFNBUCBwcm9taXNjdWl0eS4gKi8KKwllcnIgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX1NBUCk7CisJaWYgKGVyciA8IDApIHsKKwkJLyoKKwkJICogTm90IGZhdGFsLCBzaW5jZSB0aGUgRExfUFJPTUlTQ19QSFlTIG1vZGUgd29ya2VkLgorCQkgKiBSZXBvcnQgaXQgYXMgYSB3YXJuaW5nLCBob3dldmVyLgorCQkgKi8KKwkJaWYgKHAtPm9wdC5wcm9taXNjKQorCQkJZXJyID0gUENBUF9XQVJOSU5HOworCQllbHNlCisJCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgbGluayB0eXBlLiAgKi8KKwlpZiAoKHJldHYgPSBkbHBpX2luZm8ocGQtPmRscGlfaGQsICZkbGluZm8sIDApKSAhPSBETFBJX1NVQ0NFU1MpIHsKKwkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuc291cmNlLCAiZGxwaV9pbmZvIiwgcmV0diwgcC0+ZXJyYnVmKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKHBjYXBfcHJvY2Vzc19tYWN0eXBlKHAsIGRsaW5mby5kaV9tYWN0eXBlKSAhPSAwKQorCQlnb3RvIGJhZDsKKworCXAtPmZkID0gZGxwaV9mZChwZC0+ZGxwaV9oZCk7CisKKwkvKiBQdXNoIGFuZCBjb25maWd1cmUgYnVmbW9kLiAqLworCWlmIChwY2FwX2NvbmZfYnVmbW9kKHAsIHAtPnNuYXBzaG90KSAhPSAwKQorCQlnb3RvIGJhZDsKKworCS8qCisJICogRmx1c2ggdGhlIHJlYWQgc2lkZS4KKwkgKi8KKwlpZiAoaW9jdGwocC0+ZmQsIElfRkxVU0gsIEZMVVNIUikgIT0gMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGTFVTSFI6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogQWxsb2NhdGUgZGF0YSBidWZmZXIuICovCisJaWYgKHBjYXBfYWxsb2NfZGF0YWJ1ZihwKSAhPSAwKQorCQlnb3RvIGJhZDsKKworCS8qCisJICogInAtPmZkIiBpcyBhIEZEIGZvciBhIFNUUkVBTVMgZGV2aWNlLCBzbyAic2VsZWN0KCkiIGFuZAorCSAqICJwb2xsKCkiIHNob3VsZCB3b3JrIG9uIGl0LgorCSAqLworCXAtPnNlbGVjdGFibGVfZmQgPSBwLT5mZDsKKworCXAtPnJlYWRfb3AgPSBwY2FwX3JlYWRfbGliZGxwaTsKKwlwLT5pbmplY3Rfb3AgPSBwY2FwX2luamVjdF9saWJkbHBpOworCXAtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07CS8qIE5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwlwLT5zZXRkaXJlY3Rpb25fb3AgPSBOVUxMOwkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KKwlwLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBDYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwlwLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCXAtPnN0YXRzX29wID0gcGNhcF9zdGF0c19kbHBpOworCXAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfbGliZGxwaTsKKworCXJldHVybiAoMCk7CitiYWQ6CisJcGNhcF9jbGVhbnVwX2xpYmRscGkocCk7CisJcmV0dXJuIChlcnIpOworfQorCisjZGVmaW5lIFNUUklOR0lGWShuKQkjbgorCitzdGF0aWMgaW50CitkbHByb21pc2NvbihwY2FwX3QgKnAsIGJwZl91X2ludDMyIGxldmVsKQoreworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKwlpbnQgcmV0djsKKwlpbnQgZXJyOworCisJcmV0diA9IGRscGlfcHJvbWlzY29uKHBkLT5kbHBpX2hkLCBsZXZlbCk7CisJaWYgKHJldHYgIT0gRExQSV9TVUNDRVNTKSB7CisJCWlmIChyZXR2ID09IERMX1NZU0VSUiAmJgorCQkgICAgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykpCisJCQllcnIgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQllbHNlCisJCQllcnIgPSBQQ0FQX0VSUk9SOworCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5zb3VyY2UsICJkbHBpX3Byb21pc2NvbiIgU1RSSU5HSUZZKGxldmVsKSwKKwkJICAgIHJldHYsIHAtPmVycmJ1Zik7CisJCXJldHVybiAoZXJyKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEluIFNvbGFyaXMsIHRoZSAic3RhbmRhcmQiIG1lY2hhbmlzbSIgaS5lIFNJT0NHTElGQ09ORiB3aWxsIG9ubHkgZmluZAorICogbmV0d29yayBsaW5rcyB0aGF0IGFyZSBwbHVtYmVkIGFuZCBhcmUgdXAuIGRscGlfd2FsaygzRExQSSkgd2lsbCBmaW5kCisgKiBhZGRpdGlvbmFsIG5ldHdvcmsgbGlua3MgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorICovCitpbnQKK3BjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3sKKwlpbnQgcmV0diA9IDA7CisKKwlsaW5rbmFtZWxpc3RfdAkqZW50cnksICpuZXh0OworCWxpbmt3YWxrX3QJbHcgPSB7TlVMTCwgMH07CisJaW50IAkJc2F2ZV9lcnJubzsKKworCS8qIGRscGlfd2FsaygpIGZvciBsb29wYmFjayB3aWxsIGJlIGFkZGVkIGhlcmUuICovCisKKwlkbHBpX3dhbGsobGlzdF9pbnRlcmZhY2VzLCAmbHcsIDApOworCisJaWYgKGx3Lmx3X2VyciAhPSAwKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJkbHBpX3dhbGs6ICVzIiwgcGNhcF9zdHJlcnJvcihsdy5sd19lcnIpKTsKKwkJcmV0diA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQWRkIGxpbmtuYW1lIGlmIGl0IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsaXN0LiAqLworCWZvciAoZW50cnkgPSBsdy5sd19saXN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5sbmxfbmV4dCkgeworCQlpZiAocGNhcF9hZGRfaWYoYWxsZGV2c3AsIGVudHJ5LT5saW5rbmFtZSwgMCwgTlVMTCwgZXJyYnVmKSA8IDApCisJCQlyZXR2ID0gLTE7CisJfQorZG9uZToKKwlzYXZlX2Vycm5vID0gZXJybm87CisJZm9yIChlbnRyeSA9IGx3Lmx3X2xpc3Q7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gbmV4dCkgeworCQluZXh0ID0gZW50cnktPmxubF9uZXh0OworCQlmcmVlKGVudHJ5KTsKKwl9CisJZXJybm8gPSBzYXZlX2Vycm5vOworCisJcmV0dXJuIChyZXR2KTsKK30KKworLyoKKyAqIFJlYWQgZGF0YSByZWNlaXZlZCBvbiBETFBJIGhhbmRsZS4gUmV0dXJucyAtMiBpZiB0b2xkIHRvIHRlcm1pbmF0ZSwgZWxzZQorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVhZC4KKyAqLworc3RhdGljIGludAorcGNhcF9yZWFkX2xpYmRscGkocGNhcF90ICpwLCBpbnQgY291bnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKwlpbnQgbGVuOworCXVfY2hhciAqYnVmcDsKKwlzaXplX3QgbXNnbGVuOworCWludCByZXR2OworCisJbGVuID0gcC0+Y2M7CisJaWYgKGxlbiAhPSAwKSB7CisJCWJ1ZnAgPSBwLT5icDsKKwkJZ290byBwcm9jZXNzX3BrdHM7CisJfQorCWRvIHsKKwkJLyogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8gKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCS8qCisJCQkgKiBZZXMgLSBjbGVhciB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0IGhhcywKKwkJCSAqIGFuZCByZXR1cm4gLTIgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3ZXJlIHRvbGQgdG8KKwkJCSAqIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJCSAqLworCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gKC0yKTsKKwkJfQorCisJCW1zZ2xlbiA9IHAtPmJ1ZnNpemU7CisJCWJ1ZnAgPSBwLT5idWZmZXIgKyBwLT5vZmZzZXQ7CisKKwkJcmV0diA9IGRscGlfcmVjdihwZC0+ZGxwaV9oZCwgTlVMTCwgTlVMTCwgYnVmcCwKKwkJICAgICZtc2dsZW4sIC0xLCBOVUxMKTsKKwkJaWYgKHJldHYgIT0gRExQSV9TVUNDRVNTKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBtb3N0IGxpa2VseSBhIGNhbGwgdG8gdGVybWluYXRlIG91dCBvZiB0aGUKKwkJCSAqIGxvb3AuIFNvLCBkbyBub3QgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UsIGluc3RlYWQKKwkJCSAqIGNoZWNrIGlmICJwY2FwX2JyZWFrbG9vcCgpIiBoYXMgYmVlbiBjYWxsZWQgYWJvdmUuCisJCQkgKi8KKwkJCWlmIChyZXR2ID09IERMX1NZU0VSUiAmJiBlcnJubyA9PSBFSU5UUikgeworCQkJCWxlbiA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwY2FwX2xpYmRscGlfZXJyKGRscGlfbGlua25hbWUocGQtPmRscGlfaGQpLAorCQkJICAgICJkbHBpX3JlY3YiLCByZXR2LCBwLT5lcnJidWYpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJbGVuID0gbXNnbGVuOworCX0gd2hpbGUgKGxlbiA9PSAwKTsKKworcHJvY2Vzc19wa3RzOgorCXJldHVybiAocGNhcF9wcm9jZXNzX3BrdHMocCwgY2FsbGJhY2ssIHVzZXIsIGNvdW50LCBidWZwLCBsZW4pKTsKK30KKworc3RhdGljIGludAorcGNhcF9pbmplY3RfbGliZGxwaShwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBjYXBfZGxwaSAqcGQgPSBwLT5wcml2OworCWludCByZXR2OworCisJcmV0diA9IGRscGlfc2VuZChwZC0+ZGxwaV9oZCwgTlVMTCwgMCwgYnVmLCBzaXplLCBOVUxMKTsKKwlpZiAocmV0diAhPSBETFBJX1NVQ0NFU1MpIHsKKwkJcGNhcF9saWJkbHBpX2VycihkbHBpX2xpbmtuYW1lKHBkLT5kbHBpX2hkKSwgImRscGlfc2VuZCIsIHJldHYsCisJCSAgICBwLT5lcnJidWYpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJLyoKKwkgKiBkbHBpX3NlbmQoM0RMUEkpIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YKKwkgKiBieXRlcyBzZW50IG9uIHRoZSB3aXJlLiBCYXNlZCBvbiB0aGUgZmFjdCB0aGF0IERMUElfU1VDQ0VTUyB3YXMKKwkgKiByZXR1cm5lZCB3ZSBhcmUgYXNzdW1pbmcgJ3NpemUnIGJ5dGVzIHdlcmUgc2VudC4KKwkgKi8KKwlyZXR1cm4gKHNpemUpOworfQorCisvKgorICogQ2xvc2UgZGxwaSBoYW5kbGUuCisgKi8KK3N0YXRpYyB2b2lkCitwY2FwX2NsZWFudXBfbGliZGxwaShwY2FwX3QgKnApCit7CisJc3RydWN0IHBjYXBfZGxwaSAqcGQgPSBwLT5wcml2OworCisJaWYgKHBkLT5kbHBpX2hkICE9IE5VTEwpIHsKKwkJZGxwaV9jbG9zZShwZC0+ZGxwaV9oZCk7CisJCXBkLT5kbHBpX2hkID0gTlVMTDsKKwkJcC0+ZmQgPSAtMTsKKwl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworfQorCisvKgorICogV3JpdGUgZXJyb3IgbWVzc2FnZSB0byBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitwY2FwX2xpYmRscGlfZXJyKGNvbnN0IGNoYXIgKmxpbmtuYW1lLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgZXJyLCBjaGFyICplcnJidWYpCit7CisJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibGlicGNhcDogJXMgZmFpbGVkIG9uICVzOiAlcyIsCisJICAgIGZ1bmMsIGxpbmtuYW1lLCBkbHBpX3N0cmVycm9yKGVycikpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sKKwlwY2FwX3QgKnA7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kbHBpKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV9saWJkbHBpOworCXJldHVybiAocCk7Cit9CmRpZmYgLS1naXQgYS9wY2FwLWxpbmt0eXBlLm1hbm1pc2MuaW4gYi9wY2FwLWxpbmt0eXBlLm1hbm1pc2MuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwNDM4NwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtbGlua3R5cGUubWFubWlzYy5pbgpAQCAtMCwwICsxLDUwIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWxpbmt0eXBlLm1hbm1pc2MuaW4sdiAxLjMgMjAwOC0xMC0yNyAyMjo1MjozMCBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtTElOS1RZUEUgQE1BTl9NSVNDX0lORk9AICIyMyBPY3RvYmVyIDIwMDgiCisuU0ggTkFNRQorcGNhcC1saW5rdHlwZSBcLSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBzdXBwb3J0ZWQgYnkgbGlicGNhcAorLlNIIERFU0NSSVBUSU9OCitGb3IgYSBsaXZlIGNhcHR1cmUgb3IgYGBzYXZlZmlsZScnLCBsaWJwY2FwIHN1cHBsaWVzLCBhcyB0aGUgcmV0dXJuCit2YWx1ZSBvZiB0aGUKKy5CUiBwY2FwX2RhdGFsaW5rICgzUENBUCkKK3JvdXRpbmUsIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbGluay1sYXllciBoZWFkZXIgYXQgdGhlCitiZWdpbm5pbmcgb2YgdGhlIHBhY2tldHMgaXQgcHJvdmlkZXMuICBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgdHlwZQorb2YgbGluay1sYXllciBoZWFkZXIgdGhhdCB0aGUgcGFja2V0cyBiZWluZyBjYXB0dXJlZCBoYXZlIG9uIHRoZSBuZXR3b3JrCitmcm9tIHdoaWNoIHRoZXkncmUgYmVpbmcgY2FwdHVyZWQ7IGZvciBleGFtcGxlLCBwYWNrZXRzIGZyb20gYW4gSUVFRQorODAyLjExIG5ldHdvcmsgbWlnaHQgYmUgcHJvdmlkZWQgYnkgbGlicGNhcCB3aXRoIEV0aGVybmV0IGhlYWRlcnMgdGhhdAordGhlIG5ldHdvcmsgYWRhcHRlciBvciB0aGUgbmV0d29yayBhZGFwdGVyIGRyaXZlciBnZW5lcmF0ZXMgZnJvbSB0aGUKKzgwMi4xMSBoZWFkZXJzLiAgVGhlIG5hbWVzIGZvciB0aG9zZSB2YWx1ZXMgYmVnaW4gd2l0aAorLkJSIERMVF8gLAorc28gdGhleSBhcmUgc29tZXRpbWVzIGNhbGxlZCAiRExUXyB2YWx1ZXMiLgorLlBQCitUaGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSBmaWVsZCBpbiB0aGUgc2F2ZWZpbGUKK2hlYWRlciBhcmUsIGluIG1vc3QgYnV0IG5vdCBhbGwgY2FzZXMsIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZXMgcmV0dXJuZWQKK2J5CisuQlIgcGNhcF9kYXRhbGluaygpIC4KK1RoZSBuYW1lcyBmb3IgdGhvc2UgdmFsdWVzIGJlZ2luIHdpdGgKKy5CUiBMSU5LVFlQRV8gLgorLlBQCitUaGUgbGluay1sYXllciBoZWFkZXIgdHlwZXMgc3VwcG9ydGVkIGJ5IGxpYnBjYXAgYXJlIGRlc2NyaWJlZCBhdAoraHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbC4KKy5TSCBTRUUgQUxTTworcGNhcF9kYXRhbGluaygzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXAtbGludXguYyBiL3BjYXAtbGludXguYwppbmRleCBiYTliMTI1Li5kYzQyNzM1IDEwMDY0NAotLS0gYS9wY2FwLWxpbnV4LmMKKysrIGIvcGNhcC1saW51eC5jCkBAIC0yMywxMSArMjMsNTMgQEAKICAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgogICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECiAgKiAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqICBNb2RpZmljYXRpb25zOiAgICAgQWRkZWQgUEFDS0VUX01NQVAgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+IAorICogICAgICAgICAgICAgICAgICAgICBBZGRlZCBUUEFDS0VUX1YzIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgR2Fib3IgVGF0YXJrYSA8Z2Fib3IudGF0YXJrYUBlcmljc3Nvbi5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBwcmV2aW91cyB3b3JrcyBvZjoKKyAqICAgICAgICAgICAgICAgICAgICAgU2ltb24gUGF0YXJpbiA8cGF0YXJpbkBjcy51bmliby5pdD4KKyAqICAgICAgICAgICAgICAgICAgICAgUGhpbCBXb29kIDxjcHdAbGFubC5nb3Y+CisgKgorICogTW9uaXRvci1tb2RlIHN1cHBvcnQgZm9yIG1hYzgwMjExIGluY2x1ZGVzIGNvZGUgdGFrZW4gZnJvbSB0aGUgaXcKKyAqIGNvbW1hbmQ7IHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGF0IGNvZGUgaXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDgJSm9oYW5uZXMgQmVyZworICogQ29weXJpZ2h0IChjKSAyMDA3CQlBbmR5IEx1dG9taXJza2kKKyAqIENvcHlyaWdodCAoYykgMjAwNwkJTWlrZSBLZXJzaGF3CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgJCUfDoWJvciBTdGVmYW5paworICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIAorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgogICovCiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbGludXguYyx2IDEuMTEwLjIuMTQgMjAwNi8xMC8xMiAxNzoyNjo1OCBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbGludXguYyx2IDEuMTY0IDIwMDgtMTItMTQgMjI6MDA6NTcgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAvKgpAQCAtNzMsMzMgKzExNSwzNyBAQAogICovCiAKIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2RlZmluZSBfR05VX1NPVVJDRQorCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKLSNpbmNsdWRlICJwY2FwLWludC5oIgotI2luY2x1ZGUgInNsbC5oIgotCi0jaWZkZWYgSEFWRV9EQUdfQVBJCi0jaW5jbHVkZSAicGNhcC1kYWcuaCIKLSNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KLQotI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQotI2luY2x1ZGUgInBjYXAtc2VwdGVsLmgiCi0jZW5kaWYgLyogSEFWRV9TRVBURUxfQVBJICovCi0JICAKICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKyNpbmNsdWRlICJwY2FwL3NsbC5oIgorI2luY2x1ZGUgInBjYXAvdmxhbi5oIgogCiAvKgogICogSWYgUEZfUEFDS0VUIGlzIGRlZmluZWQsIHdlIGNhbiB1c2Uge1NPQ0tfUkFXLFNPQ0tfREdSQU19L1BGX1BBQ0tFVApAQCAtMTQxLDcgKzE4NywyNiBAQAogICAqLwogIyBpZmRlZiBQQUNLRVRfSE9TVAogIyAgZGVmaW5lIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKKyMgIGlmZGVmIFBBQ0tFVF9BVVhEQVRBCisjICAgZGVmaW5lIEhBVkVfUEFDS0VUX0FVWERBVEEKKyMgIGVuZGlmIC8qIFBBQ0tFVF9BVVhEQVRBICovCiAjIGVuZGlmIC8qIFBBQ0tFVF9IT1NUICovCisKKworIC8qIGNoZWNrIGZvciBtZW1vcnkgbWFwcGVkIGFjY2VzcyBhdmFpYmlsaXR5LiBXZSBhc3N1bWUgZXZlcnkgbmVlZGVkIAorICAqIHN0cnVjdCBpcyBkZWZpbmVkIGlmIHRoZSBtYWNybyBUUEFDS0VUX0hEUkxFTiBpcyBkZWZpbmVkLCBiZWNhdXNlIGl0CisgICogdXNlcyBtYW55IHJpbmcgcmVsYXRlZCBzdHJ1Y3RzIGFuZCBtYWNyb3MgKi8KKyMgaWZkZWYgVFBBQ0tFVF9IRFJMRU4KKyMgIGRlZmluZSBIQVZFX1BBQ0tFVF9SSU5HCisjICBpZmRlZiBUUEFDS0VUM19IRFJMRU4KKyMgICBkZWZpbmUgSEFWRV9UUEFDS0VUMworIyAgZW5kaWYgLyogVFBBQ0tFVDNfSERSTEVOICovCisjICBpZmRlZiBUUEFDS0VUMl9IRFJMRU4KKyMgICBkZWZpbmUgSEFWRV9UUEFDS0VUMgorIyAgZWxzZSAgLyogVFBBQ0tFVDJfSERSTEVOICovCisjICAgZGVmaW5lIFRQQUNLRVRfVjEJMCAgICAvKiBPbGQga2VybmVsIHdpdGggb25seSBWMSwgc28gbm8gVFBBQ0tFVF9WbiBkZWZpbmVkICovCisjICBlbmRpZiAvKiBUUEFDS0VUMl9IRFJMRU4gKi8KKyMgZW5kaWYgLyogVFBBQ0tFVF9IRFJMRU4gKi8KICNlbmRpZiAvKiBQRl9QQUNLRVQgKi8KIAogI2lmZGVmIFNPX0FUVEFDSF9GSUxURVIKQEAgLTE0OSw3ICsyMTQsMzggQEAKICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNlbmRpZgogCi0jaWZuZGVmIF9fR0xJQkNfXworI2lmZGVmIEhBVkVfTElOVVhfTkVUX1RTVEFNUF9ICisjaW5jbHVkZSA8bGludXgvbmV0X3RzdGFtcC5oPgorI2VuZGlmCisKKy8qCisgKiBHb3QgV2lyZWxlc3MgRXh0ZW5zaW9ucz8KKyAqLworI2lmZGVmIEhBVkVfTElOVVhfV0lSRUxFU1NfSAorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjZW5kaWYgLyogSEFWRV9MSU5VWF9XSVJFTEVTU19IICovCisKKy8qCisgKiBHb3QgbGlibmw/CisgKi8KKyNpZmRlZiBIQVZFX0xJQk5MCisjaW5jbHVkZSA8bGludXgvbmw4MDIxMS5oPgorCisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2dlbmwuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvZmFtaWx5Lmg+CisjaW5jbHVkZSA8bmV0bGluay9nZW5sL2N0cmwuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL21zZy5oPgorI2luY2x1ZGUgPG5ldGxpbmsvYXR0ci5oPgorI2VuZGlmIC8qIEhBVkVfTElCTkwgKi8KKworLyoKKyAqIEdvdCBldGh0b29sIHN1cHBvcnQ/CisgKi8KKyNpZmRlZiBIQVZFX0xJTlVYX0VUSFRPT0xfSAorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU09DS0xFTl9UCiB0eXBlZGVmIGludAkJc29ja2xlbl90OwogI2VuZGlmCiAKQEAgLTE4NSwzNCArMjgxLDExOCBAQAogI2RlZmluZSBCSUdHRVJfVEhBTl9BTExfTVRVUwkoNjQqMTAyNCkKIAogLyoKLSAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucworICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gTGludXggU09DS19QQUNLRVQgb3IgUEZfUEFDS0VUIHNvY2tldHMuCisgKi8KK3N0cnVjdCBwY2FwX2xpbnV4IHsKKwl1X2ludAlwYWNrZXRzX3JlYWQ7CS8qIGNvdW50IG9mIHBhY2tldHMgcmVhZCB3aXRoIHJlY3Zmcm9tKCkgKi8KKwlsb25nCXByb2NfZHJvcHBlZDsJLyogcGFja2V0cyByZXBvcnRlZCBkcm9wcGVkIGJ5IC9wcm9jL25ldC9kZXYgKi8KKwlzdHJ1Y3QgcGNhcF9zdGF0IHN0YXQ7CisKKwljaGFyCSpkZXZpY2U7CS8qIGRldmljZSBuYW1lICovCisJaW50CWZpbHRlcl9pbl91c2VybGFuZDsgLyogbXVzdCBmaWx0ZXIgaW4gdXNlcmxhbmQgKi8KKwlpbnQJYmxvY2tzX3RvX2ZpbHRlcl9pbl91c2VybGFuZDsKKwlpbnQJbXVzdF9kb19vbl9jbG9zZTsgLyogc3R1ZmYgd2UgbXVzdCBkbyB3aGVuIHdlIGNsb3NlICovCisJaW50CXRpbWVvdXQ7CS8qIHRpbWVvdXQgZm9yIGJ1ZmZlcmluZyAqLworCWludAlzb2NrX3BhY2tldDsJLyogdXNpbmcgTGludXggMi4wIGNvbXBhdGlibGUgaW50ZXJmYWNlICovCisJaW50CWNvb2tlZDsJCS8qIHVzaW5nIFNPQ0tfREdSQU0gcmF0aGVyIHRoYW4gU09DS19SQVcgKi8KKwlpbnQJaWZpbmRleDsJLyogaW50ZXJmYWNlIGluZGV4IG9mIGRldmljZSB3ZSdyZSBib3VuZCB0byAqLworCWludAlsb19pZmluZGV4OwkvKiBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGxvb3BiYWNrIGRldmljZSAqLworCWJwZl91X2ludDMyIG9sZG1vZGU7CS8qIG1vZGUgdG8gcmVzdG9yZSB3aGVuIHR1cm5pbmcgbW9uaXRvciBtb2RlIG9mZiAqLworCWNoYXIJKm1vbmRldmljZTsJLyogbWFjODAyMTEgbW9uaXRvciBkZXZpY2Ugd2UgY3JlYXRlZCAqLworCXVfY2hhcgkqbW1hcGJ1ZjsJLyogbWVtb3J5LW1hcHBlZCByZWdpb24gcG9pbnRlciAqLworCXNpemVfdAltbWFwYnVmbGVuOwkvKiBzaXplIG9mIHJlZ2lvbiAqLworCWludAl2bGFuX29mZnNldDsJLyogb2Zmc2V0IGF0IHdoaWNoIHRvIGluc2VydCB2bGFuIHRhZ3M7IGlmIC0xLCBkb24ndCBpbnNlcnQgKi8KKwl1X2ludAl0cF92ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRwYWNrZXRfaGRyIGZvciBtbWFwZWQgcmluZyAqLworCXVfaW50CXRwX2hkcmxlbjsJLyogaGRybGVuIG9mIHRwYWNrZXRfaGRyIGZvciBtbWFwZWQgcmluZyAqLworCXVfY2hhcgkqb25lc2hvdF9idWZmZXI7IC8qIGJ1ZmZlciBmb3IgY29weSBvZiBwYWNrZXQgKi8KKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJdW5zaWduZWQgY2hhciAqY3VycmVudF9wYWNrZXQ7IC8qIEN1cnJlbnQgcGFja2V0IHdpdGhpbiB0aGUgVFBBQ0tFVF9WMyBibG9jay4gTW92ZSB0byBuZXh0IGJsb2NrIGlmIE5VTEwuICovCisJaW50IHBhY2tldHNfbGVmdDsgLyogVW5oYW5kbGVkIHBhY2tldHMgbGVmdCB3aXRoaW4gdGhlIGJsb2NrIGZyb20gcHJldmlvdXMgY2FsbCB0byBwY2FwX3JlYWRfbGludXhfbW1hcF92MyBpbiBjYXNlIG9mIFRQQUNLRVRfVjMuICovCisjZW5kaWYKK307CisKKy8qCisgKiBTdHVmZiB0byBkbyB3aGVuIHdlIGNsb3NlLgorICovCisjZGVmaW5lIE1VU1RfQ0xFQVJfUFJPTUlTQwkweDAwMDAwMDAxCS8qIGNsZWFyIHByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUgTVVTVF9DTEVBUl9SRk1PTgkweDAwMDAwMDAyCS8qIGNsZWFyIHJmbW9uIChtb25pdG9yKSBtb2RlICovCisjZGVmaW5lIE1VU1RfREVMRVRFX01PTklGCTB4MDAwMDAwMDQJLyogZGVsZXRlIG1vbml0b3ItbW9kZSBpbnRlcmZhY2UgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4KICAqLwogc3RhdGljIHZvaWQgbWFwX2FycGhyZF90b19kbHQocGNhcF90ICosIGludCwgaW50KTsKLXN0YXRpYyBpbnQgbGl2ZV9vcGVuX29sZChwY2FwX3QgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgY2hhciAqKTsKLXN0YXRpYyBpbnQgbGl2ZV9vcGVuX25ldyhwY2FwX3QgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgY2hhciAqKTsKKyNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCitzdGF0aWMgc2hvcnQgaW50IG1hcF9wYWNrZXRfdHlwZV90b19zbGxfdHlwZShzaG9ydCBpbnQpOworI2VuZGlmCitzdGF0aWMgaW50IHBjYXBfYWN0aXZhdGVfbGludXgocGNhcF90ICopOworc3RhdGljIGludCBhY3RpdmF0ZV9vbGQocGNhcF90ICopOworc3RhdGljIGludCBhY3RpdmF0ZV9uZXcocGNhcF90ICopOworc3RhdGljIGludCBhY3RpdmF0ZV9tbWFwKHBjYXBfdCAqLCBpbnQgKik7CitzdGF0aWMgaW50IHBjYXBfY2FuX3NldF9yZm1vbl9saW51eChwY2FwX3QgKik7CiBzdGF0aWMgaW50IHBjYXBfcmVhZF9saW51eChwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKIHN0YXRpYyBpbnQgcGNhcF9yZWFkX3BhY2tldChwY2FwX3QgKiwgcGNhcF9oYW5kbGVyLCB1X2NoYXIgKik7CiBzdGF0aWMgaW50IHBjYXBfaW5qZWN0X2xpbnV4KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CiBzdGF0aWMgaW50IHBjYXBfc3RhdHNfbGludXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CiBzdGF0aWMgaW50IHBjYXBfc2V0ZmlsdGVyX2xpbnV4KHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CiBzdGF0aWMgaW50IHBjYXBfc2V0ZGlyZWN0aW9uX2xpbnV4KHBjYXBfdCAqLCBwY2FwX2RpcmVjdGlvbl90KTsKLXN0YXRpYyB2b2lkIHBjYXBfY2xvc2VfbGludXgocGNhcF90ICopOworc3RhdGljIGludCBwY2FwX3NldF9kYXRhbGlua19saW51eChwY2FwX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHBjYXBfY2xlYW51cF9saW51eChwY2FwX3QgKik7CisKK3VuaW9uIHRoZHIgeworCXN0cnVjdCB0cGFja2V0X2hkcgkJKmgxOworI2lmZGVmIEhBVkVfVFBBQ0tFVDIKKwlzdHJ1Y3QgdHBhY2tldDJfaGRyCQkqaDI7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJc3RydWN0IHRwYWNrZXRfYmxvY2tfZGVzYwkqaDM7CisjZW5kaWYKKwl2b2lkCQkJCSpyYXc7Cit9OworCisjaWZkZWYgSEFWRV9QQUNLRVRfUklORworI2RlZmluZSBSSU5HX0dFVF9GUkFNRShoKSAoKCh1bmlvbiB0aGRyICoqKWgtPmJ1ZmZlcilbaC0+b2Zmc2V0XSkKKworc3RhdGljIHZvaWQgZGVzdHJveV9yaW5nKHBjYXBfdCAqaGFuZGxlKTsKK3N0YXRpYyBpbnQgY3JlYXRlX3JpbmcocGNhcF90ICpoYW5kbGUsIGludCAqc3RhdHVzKTsKK3N0YXRpYyBpbnQgcHJlcGFyZV90cGFja2V0X3NvY2tldChwY2FwX3QgKmhhbmRsZSk7CitzdGF0aWMgdm9pZCBwY2FwX2NsZWFudXBfbGludXhfbW1hcChwY2FwX3QgKik7CitzdGF0aWMgaW50IHBjYXBfcmVhZF9saW51eF9tbWFwX3YxKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciAsIHVfY2hhciAqKTsKKyNpZmRlZiBIQVZFX1RQQUNLRVQyCitzdGF0aWMgaW50IHBjYXBfcmVhZF9saW51eF9tbWFwX3YyKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciAsIHVfY2hhciAqKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVFBBQ0tFVDMKK3N0YXRpYyBpbnQgcGNhcF9yZWFkX2xpbnV4X21tYXBfdjMocGNhcF90ICosIGludCwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOworI2VuZGlmCitzdGF0aWMgaW50IHBjYXBfc2V0ZmlsdGVyX2xpbnV4X21tYXAocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK3N0YXRpYyBpbnQgcGNhcF9zZXRub25ibG9ja19tbWFwKHBjYXBfdCAqcCwgaW50IG5vbmJsb2NrLCBjaGFyICplcnJidWYpOworc3RhdGljIGludCBwY2FwX2dldG5vbmJsb2NrX21tYXAocGNhcF90ICpwLCBjaGFyICplcnJidWYpOworc3RhdGljIHZvaWQgcGNhcF9vbmVzaG90X21tYXAodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsCisgICAgY29uc3QgdV9jaGFyICpieXRlcyk7CisjZW5kaWYKIAogLyoKICAqIFdyYXAgc29tZSBpb2N0bCBjYWxscwogICovCiAjaWZkZWYgSEFWRV9QRl9QQUNLRVRfU09DS0VUUwogc3RhdGljIGludAlpZmFjZV9nZXRfaWQoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOwotI2VuZGlmCisjZW5kaWYgLyogSEFWRV9QRl9QQUNLRVRfU09DS0VUUyAqLwogc3RhdGljIGludAlpZmFjZV9nZXRfbXR1KGludCBmZCwgY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKTsKIHN0YXRpYyBpbnQgCWlmYWNlX2dldF9hcnB0eXBlKGludCBmZCwgY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKTsKICNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCiBzdGF0aWMgaW50IAlpZmFjZV9iaW5kKGludCBmZCwgaW50IGlmaW5kZXgsIGNoYXIgKmVidWYpOwotI2VuZGlmCisjaWZkZWYgSVdfTU9ERV9NT05JVE9SCitzdGF0aWMgaW50CWhhc193ZXh0KGludCBzb2NrX2ZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworI2VuZGlmIC8qIElXX01PREVfTU9OSVRPUiAqLworc3RhdGljIGludAllbnRlcl9yZm1vbl9tb2RlKHBjYXBfdCAqaGFuZGxlLCBpbnQgc29ja19mZCwKKyAgICBjb25zdCBjaGFyICpkZXZpY2UpOworI2VuZGlmIC8qIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMgKi8KK3N0YXRpYyBpbnQJaWZhY2VfZ2V0X29mZmxvYWQocGNhcF90ICpoYW5kbGUpOwogc3RhdGljIGludCAJaWZhY2VfYmluZF9vbGQoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOwogCiAjaWZkZWYgU09fQVRUQUNIX0ZJTFRFUgotc3RhdGljIGludAlmaXhfcHJvZ3JhbShwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHNvY2tfZnByb2cgKmZjb2RlKTsKK3N0YXRpYyBpbnQJZml4X3Byb2dyYW0ocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBzb2NrX2Zwcm9nICpmY29kZSwKKyAgICBpbnQgaXNfbWFwcGVkKTsKIHN0YXRpYyBpbnQJZml4X29mZnNldChzdHJ1Y3QgYnBmX2luc24gKnApOwogc3RhdGljIGludAlzZXRfa2VybmVsX2ZpbHRlcihwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHNvY2tfZnByb2cgKmZjb2RlKTsKIHN0YXRpYyBpbnQJcmVzZXRfa2VybmVsX2ZpbHRlcihwY2FwX3QgKmhhbmRsZSk7CkBAIC0yMjEsOCArNDAxLDgyOSBAQAogCT0gQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAwKTsKIHN0YXRpYyBzdHJ1Y3Qgc29ja19mcHJvZwl0b3RhbF9mY29kZQogCT0geyAxLCAmdG90YWxfaW5zbiB9OworI2VuZGlmIC8qIFNPX0FUVEFDSF9GSUxURVIgKi8KKworcGNhcF90ICoKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpoYW5kbGU7CisKKwloYW5kbGUgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX2xpbnV4KSk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWhhbmRsZS0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX2xpbnV4OworCWhhbmRsZS0+Y2FuX3NldF9yZm1vbl9vcCA9IHBjYXBfY2FuX3NldF9yZm1vbl9saW51eDsKKyNpZiBkZWZpbmVkKEhBVkVfTElOVVhfTkVUX1RTVEFNUF9IKSAmJiBkZWZpbmVkKFBBQ0tFVF9USU1FU1RBTVApCisJLyoKKwkgKiBXZSBjbGFpbSB0aGF0IHdlIHN1cHBvcnQ6CisJICoKKwkgKglzb2Z0d2FyZSB0aW1lIHN0YW1wcywgd2l0aCBubyBkZXRhaWxzIGFib3V0IHRoZWlyIHByZWNpc2lvbjsKKwkgKgloYXJkd2FyZSB0aW1lIHN0YW1wcywgc3luY2VkIHRvIHRoZSBob3N0IHRpbWU7CisJICoJaGFyZHdhcmUgdGltZSBzdGFtcHMsIG5vdCBzeW5jZWQgdG8gdGhlIGhvc3QgdGltZS4KKwkgKgorCSAqIFhYWCAtIHdlIGNhbid0IGFzayBhIGRldmljZSB3aGV0aGVyIGl0IHN1cHBvcnRzCisJICogaGFyZHdhcmUgdGltZSBzdGFtcHMsIHNvIHdlIGp1c3QgY2xhaW0gYWxsIGRldmljZXMgZG8uCisJICovCisJaGFuZGxlLT50c3RhbXBfdHlwZV9jb3VudCA9IDM7CisJaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0ID0gbWFsbG9jKDMgKiBzaXplb2YodV9pbnQpKTsKKwlpZiAoaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0ID09IE5VTEwpIHsKKwkJZnJlZShoYW5kbGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0WzBdID0gUENBUF9UU1RBTVBfSE9TVDsKKwloYW5kbGUtPnRzdGFtcF90eXBlX2xpc3RbMV0gPSBQQ0FQX1RTVEFNUF9BREFQVEVSOworCWhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdFsyXSA9IFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQ7CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoU0lPQ0dTVEFNUE5TKSAmJiBkZWZpbmVkKFNPX1RJTUVTVEFNUE5TKQorCS8qCisJICogV2UgY2xhaW0gdGhhdCB3ZSBzdXBwb3J0IG1pY3Jvc2Vjb25kIGFuZCBuYW5vc2Vjb25kIHRpbWUKKwkgKiBzdGFtcHMuCisJICoKKwkgKiBYWFggLSB3aXRoIGFkYXB0ZXItc3VwcGxpZWQgdGltZSBzdGFtcHMsIGNhbiB3ZSBjaG9vc2UKKwkgKiBtaWNyb3NlY29uZCBvciBuYW5vc2Vjb25kIHRpbWUgc3RhbXBzIG9uIGFyYml0cmFyeQorCSAqIGFkYXB0ZXJzPworCSAqLworCWhhbmRsZS0+dHN0YW1wX3ByZWNpc2lvbl9jb3VudCA9IDI7CisJaGFuZGxlLT50c3RhbXBfcHJlY2lzaW9uX2xpc3QgPSBtYWxsb2MoMiAqIHNpemVvZih1X2ludCkpOworCWlmIChoYW5kbGUtPnRzdGFtcF9wcmVjaXNpb25fbGlzdCA9PSBOVUxMKSB7CisJCWlmIChoYW5kbGUtPnRzdGFtcF90eXBlX2xpc3QgIT0gTlVMTCkKKwkJCWZyZWUoaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0KTsKKwkJZnJlZShoYW5kbGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaGFuZGxlLT50c3RhbXBfcHJlY2lzaW9uX2xpc3RbMF0gPSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk87CisJaGFuZGxlLT50c3RhbXBfcHJlY2lzaW9uX2xpc3RbMV0gPSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTzsKKyNlbmRpZiAvKiBkZWZpbmVkKFNJT0NHU1RBTVBOUykgJiYgZGVmaW5lZChTT19USU1FU1RBTVBOUykgKi8KKworCXJldHVybiBoYW5kbGU7Cit9CisKKyNpZmRlZiBIQVZFX0xJQk5MCisvKgorICogSWYgaW50ZXJmYWNlIHtpZn0gaXMgYSBtYWM4MDIxMSBkcml2ZXIsIHRoZSBmaWxlCisgKiAvc3lzL2NsYXNzL25ldC97aWZ9L3BoeTgwMjExIGlzIGEgc3ltbGluayB0bworICogL3N5cy9jbGFzcy9pZWVlODAyMTEve3BoeWRldn0sIGZvciBzb21lIHtwaHlkZXZ9LgorICoKKyAqIE9uIEZlZG9yYSA5LCB3aXRoIGEgMi42LjI2LjMtMjkga2VybmVsLCBteSBaeWRhcyBzdGljaywgYXQKKyAqIGxlYXN0LCBoYXMgYSAid21hc3RlcjAiIGRldmljZSBhbmQgYSAid2xhbjAiIGRldmljZTsgdGhlCisgKiBsYXR0ZXIgaXMgdGhlIG9uZSB3aXRoIHRoZSBJUCBhZGRyZXNzLiAgQm90aCBzaG93IHVwIGluCisgKiAidGNwZHVtcCAtRCIgb3V0cHV0LiAgQ2FwdHVyaW5nIG9uIHRoZSB3bWFzdGVyMCBkZXZpY2UKKyAqIGNhcHR1cmVzIHdpdGggODAyLjExIGhlYWRlcnMuCisgKgorICogYWlybW9uLW5nIHNlYXJjaGVzIHRocm91Z2ggL3N5cy9jbGFzcy9uZXQgZm9yIGRldmljZXMgbmFtZWQKKyAqIG1vbk4sIHN0YXJ0aW5nIHdpdGggbW9uMDsgYXMgc29vbiBhcyBvbmUgKmRvZXNuJ3QqIGV4aXN0LAorICogaXQgY2hvb3NlcyB0aGF0IGFzIHRoZSBtb25pdG9yIGRldmljZSBuYW1lLiAgSWYgdGhlICJpdyIKKyAqIGNvbW1hbmQgZXhpc3RzLCBpdCBkb2VzICJpdyBkZXYge2lmfSBpbnRlcmZhY2UgYWRkIHttb25pZn0KKyAqIHR5cGUgbW9uaXRvciIsIHdoZXJlIHttb25pZn0gaXMgdGhlIG1vbml0b3IgZGV2aWNlLiAgSXQKKyAqIHRoZW4gKHNpZ2gpIHNsZWVwcyAuMSBzZWNvbmQsIGFuZCB0aGVuIGNvbmZpZ3VyZXMgdGhlCisgKiBkZXZpY2UgdXAuICBPdGhlcndpc2UsIGlmIC9zeXMvY2xhc3MvaWVlZTgwMjExL3twaHlkZXZ9L2FkZF9pZmFjZQorICogaXMgYSBmaWxlLCBpdCB3cml0ZXMge21vbmRldn0sIHdpdGhvdXQgYSBuZXdsaW5lLCB0byB0aGF0IGZpbGUsCisgKiBhbmQgYWdhaW4gKHNpZ2gpIHNsZWVwcyAuMSBzZWNvbmQsIGFuZCB0aGVuIGl3Y29uZmlnJ3MgdGhhdAorICogZGV2aWNlIGludG8gbW9uaXRvciBtb2RlIGFuZCBjb25maWd1cmVzIGl0IHVwLiAgT3RoZXJ3aXNlLAorICogeW91IGNhbid0IGRvIG1vbml0b3IgbW9kZS4KKyAqCisgKiBBbGwgdGhlc2UgZGV2aWNlcyBhcmUgImdsdWVkIiB0b2dldGhlciBieSBoYXZpbmcgdGhlCisgKiAvc3lzL2NsYXNzL25ldC97ZGV2aWNlfS9waHk4MDIxMSBsaW5rcyBwb2ludGluZyB0byB0aGUgc2FtZQorICogcGxhY2UsIHNvLCBnaXZlbiBhIHdtYXN0ZXIsIHdsYW4sIG9yIG1vbiBkZXZpY2UsIHlvdSBjYW4KKyAqIGZpbmQgdGhlIG90aGVyIGRldmljZXMgYnkgbG9va2luZyBmb3IgZGV2aWNlcyB3aXRoCisgKiB0aGUgc2FtZSBwaHk4MDIxMSBsaW5rLgorICoKKyAqIFRvIHR1cm4gbW9uaXRvciBtb2RlIG9mZiwgZGVsZXRlIHRoZSBtb25pdG9yIGludGVyZmFjZSwKKyAqIGVpdGhlciB3aXRoICJpdyBkZXYge21vbmlmfSBpbnRlcmZhY2UgZGVsIiBvciBieSBzZW5kaW5nCisgKiB7bW9uaWZ9LCB3aXRoIG5vIE5MLCBkb3duIC9zeXMvY2xhc3MvaWVlZTgwMjExL3twaHlkZXZ9L3JlbW92ZV9pZmFjZQorICoKKyAqIE5vdGU6IGlmIHlvdSB0cnkgdG8gY3JlYXRlIGEgbW9uaXRvciBkZXZpY2UgbmFtZWQgIm1vbk4iLCBhbmQKKyAqIHRoZXJlJ3MgYWxyZWFkeSBhICJtb25OIiBkZXZpY2UsIGl0IGZhaWxzLCBhcyBsZWFzdCB3aXRoCisgKiB0aGUgbmV0bGluayBpbnRlcmZhY2UgKHdoaWNoIGlzIHdoYXQgaXcgdXNlcyksIHdpdGggYSByZXR1cm4KKyAqIHZhbHVlIG9mIC1FTkZJTEUuICAoUmV0dXJuIHZhbHVlcyBhcmUgbmVnYXRpdmUgZXJybm9zLikgIFdlCisgKiBjb3VsZCBwcm9iYWJseSB1c2UgdGhhdCB0byBmaW5kIGFuIHVudXNlZCBkZXZpY2UuCisgKgorICogWWVzLCB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgbW9uaXRvciBkZXZpY2VzIGZvciBhIGdpdmVuCisgKiBwaHlzaWNhbCBkZXZpY2UuCisqLworCisvKgorICogSXMgdGhpcyBhIG1hYzgwMjExIGRldmljZT8gIElmIHNvLCBmaWxsIGluIHRoZSBwaHlzaWNhbCBkZXZpY2UgcGF0aCBhbmQKKyAqIHJldHVybiAxOyBpZiBub3QsIHJldHVybiAwLiAgT24gYW4gZXJyb3IsIGZpbGwgaW4gaGFuZGxlLT5lcnJidWYgYW5kCisgKiByZXR1cm4gUENBUF9FUlJPUi4KKyAqLworc3RhdGljIGludAorZ2V0X21hYzgwMjExX3BoeWRldihwY2FwX3QgKmhhbmRsZSwgY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICpwaHlkZXZfcGF0aCwKKyAgICBzaXplX3QgcGh5ZGV2X21heF9wYXRobGVuKQoreworCWNoYXIgKnBhdGhzdHI7CisJc3NpemVfdCBieXRlc19yZWFkOworCisJLyoKKwkgKiBHZW5lcmF0ZSB0aGUgcGF0aCBzdHJpbmcgZm9yIHRoZSBzeW1saW5rIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UuCisJICovCisJaWYgKGFzcHJpbnRmKCZwYXRoc3RyLCAiL3N5cy9jbGFzcy9uZXQvJXMvcGh5ODAyMTEiLCBkZXZpY2UpID09IC0xKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBDYW4ndCBnZW5lcmF0ZSBwYXRoIG5hbWUgc3RyaW5nIGZvciAvc3lzL2NsYXNzL25ldCBkZXZpY2UiLAorCQkgICAgZGV2aWNlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWJ5dGVzX3JlYWQgPSByZWFkbGluayhwYXRoc3RyLCBwaHlkZXZfcGF0aCwgcGh5ZGV2X21heF9wYXRobGVuKTsKKwlpZiAoYnl0ZXNfcmVhZCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVJTlZBTCkgeworCQkJLyoKKwkJCSAqIERvZXNuJ3QgZXhpc3QsIG9yIG5vdCBhIHN5bWxpbms7IGFzc3VtZSB0aGF0CisJCQkgKiBtZWFucyBpdCdzIG5vdCBhIG1hYzgwMjExIGRldmljZS4KKwkJCSAqLworCQkJZnJlZShwYXRoc3RyKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBDYW4ndCByZWFkbGluayAlczogJXMiLCBkZXZpY2UsIHBhdGhzdHIsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCQlmcmVlKHBhdGhzdHIpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJZnJlZShwYXRoc3RyKTsKKwlwaHlkZXZfcGF0aFtieXRlc19yZWFkXSA9ICdcMCc7CisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBIQVZFX0xJQk5MX1NPQ0tFVFMKKyNkZWZpbmUgZ2V0X25sX2Vycm1zZwlubF9nZXRlcnJvcgorI2Vsc2UKKy8qIGxpYm5sIDIueCBjb21wYXRpYmlsaXR5IGNvZGUgKi8KKworI2RlZmluZSBubF9zb2NrIG5sX2hhbmRsZQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBubF9oYW5kbGUgKgorbmxfc29ja2V0X2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG5sX2hhbmRsZV9hbGxvYygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25sX3NvY2tldF9mcmVlKHN0cnVjdCBubF9oYW5kbGUgKmgpCit7CisJbmxfaGFuZGxlX2Rlc3Ryb3koaCk7Cit9CisKKyNkZWZpbmUgZ2V0X25sX2Vycm1zZwlzdHJlcnJvcgorCitzdGF0aWMgaW5saW5lIGludAorX19nZW5sX2N0cmxfYWxsb2NfY2FjaGUoc3RydWN0IG5sX2hhbmRsZSAqaCwgc3RydWN0IG5sX2NhY2hlICoqY2FjaGUpCit7CisJc3RydWN0IG5sX2NhY2hlICp0bXAgPSBnZW5sX2N0cmxfYWxsb2NfY2FjaGUoaCk7CisJaWYgKCF0bXApCisJCXJldHVybiAtRU5PTUVNOworCSpjYWNoZSA9IHRtcDsKKwlyZXR1cm4gMDsKK30KKyNkZWZpbmUgZ2VubF9jdHJsX2FsbG9jX2NhY2hlIF9fZ2VubF9jdHJsX2FsbG9jX2NhY2hlCisjZW5kaWYgLyogIUhBVkVfTElCTkxfU09DS0VUUyAqLworCitzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSB7CisJc3RydWN0IG5sX3NvY2sgKm5sX3NvY2s7CisJc3RydWN0IG5sX2NhY2hlICpubF9jYWNoZTsKKwlzdHJ1Y3QgZ2VubF9mYW1pbHkgKm5sODAyMTE7Cit9OworCitzdGF0aWMgaW50CitubDgwMjExX2luaXQocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqZGV2aWNlKQoreworCWludCBlcnI7CisKKwlzdGF0ZS0+bmxfc29jayA9IG5sX3NvY2tldF9hbGxvYygpOworCWlmICghc3RhdGUtPm5sX3NvY2spIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIGhhbmRsZSIsIGRldmljZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCWlmIChnZW5sX2Nvbm5lY3Qoc3RhdGUtPm5sX3NvY2spKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBmYWlsZWQgdG8gY29ubmVjdCB0byBnZW5lcmljIG5ldGxpbmsiLCBkZXZpY2UpOworCQlnb3RvIG91dF9oYW5kbGVfZGVzdHJveTsKKwl9CisKKwllcnIgPSBnZW5sX2N0cmxfYWxsb2NfY2FjaGUoc3RhdGUtPm5sX3NvY2ssICZzdGF0ZS0+bmxfY2FjaGUpOworCWlmIChlcnIgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZ2VuZXJpYyBuZXRsaW5rIGNhY2hlOiAlcyIsCisJCSAgICBkZXZpY2UsIGdldF9ubF9lcnJtc2coLWVycikpOworCQlnb3RvIG91dF9oYW5kbGVfZGVzdHJveTsKKwl9CisKKwlzdGF0ZS0+bmw4MDIxMSA9IGdlbmxfY3RybF9zZWFyY2hfYnlfbmFtZShzdGF0ZS0+bmxfY2FjaGUsICJubDgwMjExIik7CisJaWYgKCFzdGF0ZS0+bmw4MDIxMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogbmw4MDIxMSBub3QgZm91bmQiLCBkZXZpY2UpOworCQlnb3RvIG91dF9jYWNoZV9mcmVlOworCX0KKworCXJldHVybiAwOworCitvdXRfY2FjaGVfZnJlZToKKwlubF9jYWNoZV9mcmVlKHN0YXRlLT5ubF9jYWNoZSk7CitvdXRfaGFuZGxlX2Rlc3Ryb3k6CisJbmxfc29ja2V0X2ZyZWUoc3RhdGUtPm5sX3NvY2spOworCXJldHVybiBQQ0FQX0VSUk9SOworfQorCitzdGF0aWMgdm9pZAorbmw4MDIxMV9jbGVhbnVwKHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSkKK3sKKwlnZW5sX2ZhbWlseV9wdXQoc3RhdGUtPm5sODAyMTEpOworCW5sX2NhY2hlX2ZyZWUoc3RhdGUtPm5sX2NhY2hlKTsKKwlubF9zb2NrZXRfZnJlZShzdGF0ZS0+bmxfc29jayk7Cit9CisKK3N0YXRpYyBpbnQKK2FkZF9tb25faWYocGNhcF90ICpoYW5kbGUsIGludCBzb2NrX2ZkLCBzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsCisgICAgY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICptb25kZXZpY2UpCit7CisJaW50IGlmaW5kZXg7CisJc3RydWN0IG5sX21zZyAqbXNnOworCWludCBlcnI7CisKKwlpZmluZGV4ID0gaWZhY2VfZ2V0X2lkKHNvY2tfZmQsIGRldmljZSwgaGFuZGxlLT5lcnJidWYpOworCWlmIChpZmluZGV4ID09IC0xKQorCQlyZXR1cm4gUENBUF9FUlJPUjsKKworCW1zZyA9IG5sbXNnX2FsbG9jKCk7CisJaWYgKCFtc2cpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIG1zZyIsIGRldmljZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCWdlbmxtc2dfcHV0KG1zZywgMCwgMCwgZ2VubF9mYW1pbHlfZ2V0X2lkKHN0YXRlLT5ubDgwMjExKSwgMCwKKwkJICAgIDAsIE5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0UsIDApOworCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIGlmaW5kZXgpOworCU5MQV9QVVRfU1RSSU5HKG1zZywgTkw4MDIxMV9BVFRSX0lGTkFNRSwgbW9uZGV2aWNlKTsKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRlRZUEUsIE5MODAyMTFfSUZUWVBFX01PTklUT1IpOworCisJZXJyID0gbmxfc2VuZF9hdXRvX2NvbXBsZXRlKHN0YXRlLT5ubF9zb2NrLCBtc2cpOworCWlmIChlcnIgPCAwKSB7CisjaWYgZGVmaW5lZCBIQVZFX0xJQk5MX05MRQorCQlpZiAoZXJyID09IC1OTEVfRkFJTFVSRSkgeworI2Vsc2UKKwkJaWYgKGVyciA9PSAtRU5GSUxFKSB7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBEZXZpY2Ugbm90IGF2YWlsYWJsZTsgb3VyIGNhbGxlciBzaG91bGQganVzdAorCQkJICoga2VlcCB0cnlpbmcuICAobGlibmwgMi54IG1hcHMgRU5GSUxFIHRvCisJCQkgKiBOTEVfRkFJTFVSRTsgaXQgY2FuIGFsc28gbWFwIG90aGVyIGVycm9ycworCQkJICogdG8gdGhhdCwgYnV0IHRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvCisJCQkgKiBhYm91dCB0aGF0LikKKwkJCSAqLworCQkJbmxtc2dfZnJlZShtc2cpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUmVhbCBmYWlsdXJlLCBub3QganVzdCAidGhhdCBkZXZpY2UgaXMgbm90CisJCQkgKiBhdmFpbGFibGUuCisJCQkgKi8KKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIlczogbmxfc2VuZF9hdXRvX2NvbXBsZXRlIGZhaWxlZCBhZGRpbmcgJXMgaW50ZXJmYWNlOiAlcyIsCisJCQkgICAgZGV2aWNlLCBtb25kZXZpY2UsIGdldF9ubF9lcnJtc2coLWVycikpOworCQkJbmxtc2dfZnJlZShtc2cpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwl9CisJZXJyID0gbmxfd2FpdF9mb3JfYWNrKHN0YXRlLT5ubF9zb2NrKTsKKwlpZiAoZXJyIDwgMCkgeworI2lmIGRlZmluZWQgSEFWRV9MSUJOTF9OTEUKKwkJaWYgKGVyciA9PSAtTkxFX0ZBSUxVUkUpIHsKKyNlbHNlCisJCWlmIChlcnIgPT0gLUVORklMRSkgeworI2VuZGlmCisJCQkvKgorCQkJICogRGV2aWNlIG5vdCBhdmFpbGFibGU7IG91ciBjYWxsZXIgc2hvdWxkIGp1c3QKKwkJCSAqIGtlZXAgdHJ5aW5nLiAgKGxpYm5sIDIueCBtYXBzIEVORklMRSB0bworCQkJICogTkxFX0ZBSUxVUkU7IGl0IGNhbiBhbHNvIG1hcCBvdGhlciBlcnJvcnMKKwkJCSAqIHRvIHRoYXQsIGJ1dCB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbworCQkJICogYWJvdXQgdGhhdC4pCisJCQkgKi8KKwkJCW5sbXNnX2ZyZWUobXNnKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlYWwgZmFpbHVyZSwgbm90IGp1c3QgInRoYXQgZGV2aWNlIGlzIG5vdAorCQkJICogYXZhaWxhYmxlLgorCQkJICovCisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiJXM6IG5sX3dhaXRfZm9yX2FjayBmYWlsZWQgYWRkaW5nICVzIGludGVyZmFjZTogJXMiLAorCQkJICAgIGRldmljZSwgbW9uZGV2aWNlLCBnZXRfbmxfZXJybXNnKC1lcnIpKTsKKwkJCW5sbXNnX2ZyZWUobXNnKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJfQorCisJLyoKKwkgKiBTdWNjZXNzLgorCSAqLworCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gMTsKKworbmxhX3B1dF9mYWlsdXJlOgorCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiJXM6IG5sX3B1dCBmYWlsZWQgYWRkaW5nICVzIGludGVyZmFjZSIsCisJICAgIGRldmljZSwgbW9uZGV2aWNlKTsKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIFBDQVBfRVJST1I7Cit9CisKK3N0YXRpYyBpbnQKK2RlbF9tb25faWYocGNhcF90ICpoYW5kbGUsIGludCBzb2NrX2ZkLCBzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsCisgICAgY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICptb25kZXZpY2UpCit7CisJaW50IGlmaW5kZXg7CisJc3RydWN0IG5sX21zZyAqbXNnOworCWludCBlcnI7CisKKwlpZmluZGV4ID0gaWZhY2VfZ2V0X2lkKHNvY2tfZmQsIG1vbmRldmljZSwgaGFuZGxlLT5lcnJidWYpOworCWlmIChpZmluZGV4ID09IC0xKQorCQlyZXR1cm4gUENBUF9FUlJPUjsKKworCW1zZyA9IG5sbXNnX2FsbG9jKCk7CisJaWYgKCFtc2cpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIG1zZyIsIGRldmljZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCWdlbmxtc2dfcHV0KG1zZywgMCwgMCwgZ2VubF9mYW1pbHlfZ2V0X2lkKHN0YXRlLT5ubDgwMjExKSwgMCwKKwkJICAgIDAsIE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UsIDApOworCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIGlmaW5kZXgpOworCisJZXJyID0gbmxfc2VuZF9hdXRvX2NvbXBsZXRlKHN0YXRlLT5ubF9zb2NrLCBtc2cpOworCWlmIChlcnIgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBubF9zZW5kX2F1dG9fY29tcGxldGUgZmFpbGVkIGRlbGV0aW5nICVzIGludGVyZmFjZTogJXMiLAorCQkgICAgZGV2aWNlLCBtb25kZXZpY2UsIGdldF9ubF9lcnJtc2coLWVycikpOworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwllcnIgPSBubF93YWl0X2Zvcl9hY2soc3RhdGUtPm5sX3NvY2spOworCWlmIChlcnIgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBubF93YWl0X2Zvcl9hY2sgZmFpbGVkIGFkZGluZyAlcyBpbnRlcmZhY2U6ICVzIiwKKwkJICAgIGRldmljZSwgbW9uZGV2aWNlLCBnZXRfbmxfZXJybXNnKC1lcnIpKTsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwkvKgorCSAqIFN1Y2Nlc3MuCisJICovCisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiAxOworCitubGFfcHV0X2ZhaWx1cmU6CisJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICIlczogbmxfcHV0IGZhaWxlZCBkZWxldGluZyAlcyBpbnRlcmZhY2UiLAorCSAgICBkZXZpY2UsIG1vbmRldmljZSk7CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiBQQ0FQX0VSUk9SOworfQorCitzdGF0aWMgaW50CitlbnRlcl9yZm1vbl9tb2RlX21hYzgwMjExKHBjYXBfdCAqaGFuZGxlLCBpbnQgc29ja19mZCwgY29uc3QgY2hhciAqZGV2aWNlKQoreworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWludCByZXQ7CisJY2hhciBwaHlkZXZfcGF0aFtQQVRIX01BWCsxXTsKKwlzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSBubHN0YXRlOworCXN0cnVjdCBpZnJlcSBpZnI7CisJdV9pbnQgbjsKKworCS8qCisJICogSXMgdGhpcyBhIG1hYzgwMjExIGRldmljZT8KKwkgKi8KKwlyZXQgPSBnZXRfbWFjODAyMTFfcGh5ZGV2KGhhbmRsZSwgZGV2aWNlLCBwaHlkZXZfcGF0aCwgUEFUSF9NQVgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwkvKiBlcnJvciAqLworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CS8qIG5vIGVycm9yLCBidXQgbm90IG1hYzgwMjExIGRldmljZSAqLworCisJLyoKKwkgKiBYWFggLSBpcyB0aGlzIGFscmVhZHkgYSBtb25OIGRldmljZT8KKwkgKiBJZiBzbywgd2UncmUgZG9uZS4KKwkgKiBJcyB0aGF0IGRldGVybWluZWQgYnkgb2xkIFdpcmVsZXNzIEV4dGVuc2lvbnMgaW9jdGxzPworCSAqLworCisJLyoKKwkgKiBPSywgaXQncyBhcHBhcmVudGx5IGEgbWFjODAyMTEgZGV2aWNlLgorCSAqIFRyeSB0byBmaW5kIGFuIHVudXNlZCBtb25OIGRldmljZSBmb3IgaXQuCisJICovCisJcmV0ID0gbmw4MDIxMV9pbml0KGhhbmRsZSwgJm5sc3RhdGUsIGRldmljZSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCWZvciAobiA9IDA7IG4gPCBVSU5UX01BWDsgbisrKSB7CisJCS8qCisJCSAqIFRyeSBtb257bn0uCisJCSAqLworCQljaGFyIG1vbmRldmljZVszKzEwKzFdOwkvKiBtb257VUlOVF9NQVh9XDAgKi8KKworCQlzbnByaW50Zihtb25kZXZpY2UsIHNpemVvZiBtb25kZXZpY2UsICJtb24ldSIsIG4pOworCQlyZXQgPSBhZGRfbW9uX2lmKGhhbmRsZSwgc29ja19mZCwgJm5sc3RhdGUsIGRldmljZSwgbW9uZGV2aWNlKTsKKwkJaWYgKHJldCA9PSAxKSB7CisJCQloYW5kbGVwLT5tb25kZXZpY2UgPSBzdHJkdXAobW9uZGV2aWNlKTsKKwkJCWdvdG8gYWRkZWQ7CisJCX0KKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qCisJCQkgKiBIYXJkIGZhaWx1cmUuICBKdXN0IHJldHVybiByZXQ7IGhhbmRsZS0+ZXJyYnVmCisJCQkgKiBoYXMgYWxyZWFkeSBiZWVuIHNldC4KKwkJCSAqLworCQkJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIiVzOiBObyBmcmVlIG1vbk4gaW50ZXJmYWNlcyIsIGRldmljZSk7CisJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwlyZXR1cm4gUENBUF9FUlJPUjsKKworYWRkZWQ6CisKKyNpZiAwCisJLyoKKwkgKiBTbGVlcCBmb3IgLjEgc2Vjb25kcy4KKwkgKi8KKwlkZWxheS50dl9zZWMgPSAwOworCWRlbGF5LnR2X25zZWMgPSA1MDAwMDAwMDA7CisJbmFub3NsZWVwKCZkZWxheSwgTlVMTCk7CisjZW5kaWYKKworCS8qCisJICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIGFycmFuZ2UgdG8gaGF2ZQorCSAqICJwY2FwX2Nsb3NlX2FsbCgpIiBjYWxsZWQgd2hlbiB3ZSBleGl0LgorCSAqLworCWlmICghcGNhcF9kb19hZGRleGl0KGhhbmRsZSkpIHsKKwkJLyoKKwkJICogImF0ZXhpdCgpIiBmYWlsZWQ7IGRvbid0IHB1dCB0aGUgaW50ZXJmYWNlCisJCSAqIGluIHJmbW9uIG1vZGUsIGp1c3QgZ2l2ZSB1cC4KKwkJICovCisJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwl9CisKKwkvKgorCSAqIE5vdyBjb25maWd1cmUgdGhlIG1vbml0b3IgaW50ZXJmYWNlIHVwLgorCSAqLworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweShpZnIuaWZyX25hbWUsIGhhbmRsZXAtPm1vbmRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBDYW4ndCBnZXQgZmxhZ3MgZm9yICVzOiAlcyIsIGRldmljZSwKKwkJICAgIGhhbmRsZXAtPm1vbmRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZGVsX21vbl9pZihoYW5kbGUsIHNvY2tfZmQsICZubHN0YXRlLCBkZXZpY2UsCisJCSAgICBoYW5kbGVwLT5tb25kZXZpY2UpOworCQlubDgwMjExX2NsZWFudXAoJm5sc3RhdGUpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJaWZyLmlmcl9mbGFncyB8PSBJRkZfVVB8SUZGX1JVTk5JTkc7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IENhbid0IHNldCBmbGFncyBmb3IgJXM6ICVzIiwgZGV2aWNlLAorCQkgICAgaGFuZGxlcC0+bW9uZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOworCQlkZWxfbW9uX2lmKGhhbmRsZSwgc29ja19mZCwgJm5sc3RhdGUsIGRldmljZSwKKwkJICAgIGhhbmRsZXAtPm1vbmRldmljZSk7CisJCW5sODAyMTFfY2xlYW51cCgmbmxzdGF0ZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qCisJICogU3VjY2Vzcy4gIENsZWFuIHVwIHRoZSBsaWJubCBzdGF0ZS4KKwkgKi8KKwlubDgwMjExX2NsZWFudXAoJm5sc3RhdGUpOworCisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBkZWxldGUgdGhlIG1vbml0b3IgZGV2aWNlIHdoZW4gd2UgY2xvc2UKKwkgKiB0aGUgaGFuZGxlLgorCSAqLworCWhhbmRsZXAtPm11c3RfZG9fb25fY2xvc2UgfD0gTVVTVF9ERUxFVEVfTU9OSUY7CisKKwkvKgorCSAqIEFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHBjYXBzIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KKwkgKi8KKwlwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShoYW5kbGUpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSEFWRV9MSUJOTCAqLworCitzdGF0aWMgaW50CitwY2FwX2Nhbl9zZXRfcmZtb25fbGludXgocGNhcF90ICpoYW5kbGUpCit7CisjaWZkZWYgSEFWRV9MSUJOTAorCWNoYXIgcGh5ZGV2X3BhdGhbUEFUSF9NQVgrMV07CisJaW50IHJldDsKKyNlbmRpZgorI2lmZGVmIElXX01PREVfTU9OSVRPUgorCWludCBzb2NrX2ZkOworCXN0cnVjdCBpd3JlcSBpcmVxOworI2VuZGlmCisKKwlpZiAoc3RyY21wKGhhbmRsZS0+b3B0LnNvdXJjZSwgImFueSIpID09IDApIHsKKwkJLyoKKwkJICogTW9uaXRvciBtb2RlIG1ha2VzIG5vIHNlbnNlIG9uIHRoZSAiYW55IiBkZXZpY2UuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBIQVZFX0xJQk5MCisJLyoKKwkgKiBCbGVhaC4gIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0byBhc2sgYSBtYWM4MDIxMQorCSAqIGRldmljZSwgdGhyb3VnaCBsaWJubCwgd2hldGhlciBpdCBzdXBwb3J0cyBtb25pdG9yIG1vZGU7CisJICogd2UnbGwganVzdCBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgYXBwZWFycyB0byBiZSBhCisJICogbWFjODAyMTEgZGV2aWNlIGFuZCwgaWYgc28sIGFzc3VtZSB0aGUgZGV2aWNlIHN1cHBvcnRzCisJICogbW9uaXRvciBtb2RlLgorCSAqCisJICogd21hc3RlciBkZXZpY2VzIGRvbid0IGFwcGVhciB0byBzdXBwb3J0IHRoZSBXaXJlbGVzcworCSAqIEV4dGVuc2lvbnMsIGJ1dCB3ZSBjYW4gY3JlYXRlIGEgbW9uIGRldmljZSBmb3IgYQorCSAqIHdtYXN0ZXIgZGV2aWNlLCBzbyB3ZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgd2hldGhlcgorCSAqIGEgbWFjODAyMTEgZGV2aWNlIHN1cHBvcnRzIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zLgorCSAqLworCXJldCA9IGdldF9tYWM4MDIxMV9waHlkZXYoaGFuZGxlLCBoYW5kbGUtPm9wdC5zb3VyY2UsIHBoeWRldl9wYXRoLAorCSAgICBQQVRIX01BWCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CS8qIGVycm9yICovCisJaWYgKHJldCA9PSAxKQorCQlyZXR1cm4gMTsJLyogbWFjODAyMTEgZGV2aWNlICovCisjZW5kaWYKKworI2lmZGVmIElXX01PREVfTU9OSVRPUgorCS8qCisJICogQmxlYWguICBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBpb2N0bCB0byB1c2UgdG8gYXNrCisJICogd2hldGhlciBhIGRldmljZSBzdXBwb3J0cyBtb25pdG9yIG1vZGU7IHdlJ2xsIGp1c3QgZG8KKwkgKiBTSU9DR0lXTU9ERSBhbmQsIGlmIGl0IHN1Y2NlZWRzLCBhc3N1bWUgdGhlIGRldmljZSBzdXBwb3J0cworCSAqIG1vbml0b3IgbW9kZS4KKwkgKgorCSAqIE9wZW4gYSBzb2NrZXQgb24gd2hpY2ggdG8gYXR0ZW1wdCB0byBnZXQgdGhlIG1vZGUuCisJICogKFdlIGFzc3VtZSB0aGF0IGlmIHdlIGhhdmUgV2lyZWxlc3MgRXh0ZW5zaW9ucyBzdXBwb3J0CisJICogd2UgYWxzbyBoYXZlIFBGX1BBQ0tFVCBzdXBwb3J0LikKKwkgKi8KKwlzb2NrX2ZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19SQVcsIGh0b25zKEVUSF9QX0FMTCkpOworCWlmIChzb2NrX2ZkID09IC0xKSB7CisJCSh2b2lkKXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBnZXQgdGhlIGN1cnJlbnQgbW9kZS4KKwkgKi8KKwlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBoYW5kbGUtPm9wdC5zb3VyY2UsCisJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXTU9ERSwgJmlyZXEpICE9IC0xKSB7CisJCS8qCisJCSAqIFdlbGwsIHdlIGdvdCB0aGUgbW9kZTsgYXNzdW1lIHdlIGNhbiBzZXQgaXQuCisJCSAqLworCQljbG9zZShzb2NrX2ZkKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKKwkJLyogVGhlIGRldmljZSBkb2Vzbid0IGV2ZW4gZXhpc3QuICovCisJCSh2b2lkKXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNJT0NHSVdNT0RFIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNvY2tfZmQpOworCQlyZXR1cm4gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwl9CisJY2xvc2Uoc29ja19mZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdyYWJzIHRoZSBudW1iZXIgb2YgZHJvcHBlZCBwYWNrZXRzIGJ5IHRoZSBpbnRlcmZhY2UgZnJvbSAvcHJvYy9uZXQvZGV2LgorICoKKyAqIFhYWCAtIHdoYXQgYWJvdXQgL3N5cy9jbGFzcy9uZXQve2ludGVyZmFjZSBuYW1lfS9yeF8qPyAgVGhlcmUgYXJlCisgKiBpbmRpdmlkdWFsIGRldmljZXMgZ2l2aW5nLCBpbiBBU0NJSSwgdmFyaW91cyByeF8gYW5kIHR4XyBzdGF0aXN0aWNzLgorICoKKyAqIE9yIGNhbiB3ZSBnZXQgdGhlbSBpbiBiaW5hcnkgZm9ybSBmcm9tIG5ldGxpbms/CisgKi8KK3N0YXRpYyBsb25nIGludAorbGludXhfaWZfZHJvcHMoY29uc3QgY2hhciAqIGlmX25hbWUpCit7CisJY2hhciBidWZmZXJbNTEyXTsKKwljaGFyICogYnVmcHRyOworCUZJTEUgKiBmaWxlOworCWludCBmaWVsZF90b19jb252ZXJ0ID0gMywgaWZfbmFtZV9zeiA9IHN0cmxlbihpZl9uYW1lKTsKKwlsb25nIGludCBkcm9wcGVkX3BrdHMgPSAwOworCQorCWZpbGUgPSBmb3BlbigiL3Byb2MvbmV0L2RldiIsICJyIik7CisJaWYgKCFmaWxlKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICghZHJvcHBlZF9wa3RzICYmIGZnZXRzKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCBmaWxlICkpCisJeworCQkvKiAJc2VhcmNoIGZvciAnYnl0ZXMnIC0tIGlmIGl0cyBpbiB0aGVyZSwgdGhlbgorCQkJdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGdyYWIgdGhlIGZvdXJ0aCBmaWVsZC4gb3RoZXJ3aXNlCisJCQlncmFiIHRoZSB0aGlyZCBmaWVsZC4gKi8KKwkJaWYgKGZpZWxkX3RvX2NvbnZlcnQgIT0gNCAmJiBzdHJzdHIoYnVmZmVyLCAiYnl0ZXMiKSkKKwkJeworCQkJZmllbGRfdG9fY29udmVydCA9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCQorCQkvKiBmaW5kIGlmYWNlIGFuZCBtYWtlIHN1cmUgaXQgYWN0dWFsbHkgbWF0Y2hlcyAtLSBzcGFjZSBiZWZvcmUgdGhlIG5hbWUgYW5kIDogYWZ0ZXIgaXQgKi8KKwkJaWYgKChidWZwdHIgPSBzdHJzdHIoYnVmZmVyLCBpZl9uYW1lKSkgJiYKKwkJCShidWZwdHIgPT0gYnVmZmVyIHx8ICooYnVmcHRyLTEpID09ICcgJykgJiYKKwkJCSooYnVmcHRyICsgaWZfbmFtZV9zeikgPT0gJzonKQorCQl7CisJCQlidWZwdHIgPSBidWZwdHIgKyBpZl9uYW1lX3N6ICsgMTsKKworCQkJLyogZ3JhYiB0aGUgbnRoIGZpZWxkIGZyb20gaXQgKi8KKwkJCXdoaWxlKCAtLWZpZWxkX3RvX2NvbnZlcnQgJiYgKmJ1ZnB0ciAhPSAnXDAnKQorCQkJeworCQkJCXdoaWxlICgqYnVmcHRyICE9ICdcMCcgJiYgKihidWZwdHIrKykgPT0gJyAnKTsKKwkJCQl3aGlsZSAoKmJ1ZnB0ciAhPSAnXDAnICYmICooYnVmcHRyKyspICE9ICcgJyk7CisJCQl9CisJCQkKKwkJCS8qIGdldCByaWQgb2YgYW55IGZpbmFsIHNwYWNlcyAqLworCQkJd2hpbGUgKCpidWZwdHIgIT0gJ1wwJyAmJiAqYnVmcHRyID09ICcgJykgYnVmcHRyKys7CisJCQkKKwkJCWlmICgqYnVmcHRyICE9ICdcMCcpCisJCQkJZHJvcHBlZF9wa3RzID0gc3RydG9sKGJ1ZnB0ciwgTlVMTCwgMTApOworCisJCQlicmVhazsKKwkJfQorCX0KKwkKKwlmY2xvc2UoZmlsZSk7CisJcmV0dXJuIGRyb3BwZWRfcGt0czsKK30gCisKKworLyoKKyAqIFdpdGggb2xkZXIga2VybmVscyBwcm9taXNjdW91cyBtb2RlIGlzIGtpbmQgb2YgaW50ZXJlc3RpbmcgYmVjYXVzZSB3ZQorICogaGF2ZSB0byByZXNldCB0aGUgaW50ZXJmYWNlIGJlZm9yZSBleGl0aW5nLiBUaGUgcHJvYmxlbSBjYW4ndCByZWFsbHkKKyAqIGJlIHNvbHZlZCB3aXRob3V0IHNvbWUgZGFlbW9uIHRha2luZyBjYXJlIG9mIG1hbmFnaW5nIHVzYWdlIGNvdW50cy4KKyAqIElmIHdlIHB1dCB0aGUgaW50ZXJmYWNlIGludG8gcHJvbWlzY3VvdXMgbW9kZSwgd2Ugc2V0IGEgZmxhZyBpbmRpY2F0aW5nCisgKiB0aGF0IHdlIG11c3QgdGFrZSBpdCBvdXQgb2YgdGhhdCBtb2RlIHdoZW4gdGhlIGludGVyZmFjZSBpcyBjbG9zZWQsCisgKiBhbmQsIHdoZW4gY2xvc2luZyB0aGUgaW50ZXJmYWNlLCBpZiB0aGF0IGZsYWcgaXMgc2V0IHdlIHRha2UgaXQgb3V0CisgKiBvZiBwcm9taXNjdW91cyBtb2RlLgorICoKKyAqIEV2ZW4gd2l0aCBuZXdlciBrZXJuZWxzLCB3ZSBoYXZlIHRoZSBzYW1lIGlzc3VlIHdpdGggcmZtb24gbW9kZS4KKyAqLworCitzdGF0aWMgdm9pZAlwY2FwX2NsZWFudXBfbGludXgoIHBjYXBfdCAqaGFuZGxlICkKK3sKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwlzdHJ1Y3QgaWZyZXEJaWZyOworI2lmZGVmIEhBVkVfTElCTkwKKwlzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSBubHN0YXRlOworCWludCByZXQ7CisjZW5kaWYgLyogSEFWRV9MSUJOTCAqLworI2lmZGVmIElXX01PREVfTU9OSVRPUgorCWludCBvbGRmbGFnczsKKwlzdHJ1Y3QgaXdyZXEgaXJlcTsKKyNlbmRpZiAvKiBJV19NT0RFX01PTklUT1IgKi8KKworCWlmIChoYW5kbGVwLT5tdXN0X2RvX29uX2Nsb3NlICE9IDApIHsKKwkJLyoKKwkJICogVGhlcmUncyBzb21ldGhpbmcgd2UgaGF2ZSB0byBkbyB3aGVuIGNsb3NpbmcgdGhpcworCQkgKiBwY2FwX3QuCisJCSAqLworCQlpZiAoaGFuZGxlcC0+bXVzdF9kb19vbl9jbG9zZSAmIE1VU1RfQ0xFQVJfUFJPTUlTQykgeworCQkJLyoKKwkJCSAqIFdlIHB1dCB0aGUgaW50ZXJmYWNlIGludG8gcHJvbWlzY3VvdXMgbW9kZTsKKwkJCSAqIHRha2UgaXQgb3V0IG9mIHByb21pc2N1b3VzIG1vZGUuCisJCQkgKgorCQkJICogWFhYIC0gaWYgc29tZWJvZHkgZWxzZSB3YW50cyBpdCBpbiBwcm9taXNjdW91cworCQkJICogbW9kZSwgdGhpcyBjb2RlIGNhbm5vdCBrbm93IHRoYXQsIHNvIGl0J2xsIHRha2UKKwkJCSAqIGl0IG91dCBvZiBwcm9taXNjdW91cyBtb2RlLiAgVGhhdCdzIG5vdCBmaXhhYmxlCisJCQkgKiBpbiAyLjBbLnhdIGtlcm5lbHMuCisJCQkgKi8KKwkJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaGFuZGxlcC0+ZGV2aWNlLAorCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSAlcyBmbGFncyAoU0lPQ0dJRkZMQUdTIGZhaWxlZDogJXMpLlxuIgorCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIKKwkJCQkgICAgIkhpbnQ6IFRoaXMgY2FuJ3QgaGFwcGVuIHdpdGggTGludXggPj0gMi4yLjAuXG4iLAorCQkJCSAgICBoYW5kbGVwLT5kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChpZnIuaWZyX2ZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJCQkJLyoKKwkJCQkJICogUHJvbWlzY3VvdXMgbW9kZSBpcyBjdXJyZW50bHkgb247CisJCQkJCSAqIHR1cm4gaXQgb2ZmLgorCQkJCQkgKi8KKwkJCQkJaWZyLmlmcl9mbGFncyAmPSB+SUZGX1BST01JU0M7CisJCQkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lGRkxBR1MsCisJCQkJCSAgICAmaWZyKSA9PSAtMSkgeworCQkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkgICAgIkNhbid0IHJlc3RvcmUgaW50ZXJmYWNlICVzIGZsYWdzIChTSU9DU0lGRkxBR1MgZmFpbGVkOiAlcykuXG4iCisJCQkJCQkgICAgIlBsZWFzZSBhZGp1c3QgbWFudWFsbHkuXG4iCisJCQkJCQkgICAgIkhpbnQ6IFRoaXMgY2FuJ3QgaGFwcGVuIHdpdGggTGludXggPj0gMi4yLjAuXG4iLAorCQkJCQkJICAgIGhhbmRsZXAtPmRldmljZSwKKwkJCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKyNpZmRlZiBIQVZFX0xJQk5MCisJCWlmIChoYW5kbGVwLT5tdXN0X2RvX29uX2Nsb3NlICYgTVVTVF9ERUxFVEVfTU9OSUYpIHsKKwkJCXJldCA9IG5sODAyMTFfaW5pdChoYW5kbGUsICZubHN0YXRlLCBoYW5kbGVwLT5kZXZpY2UpOworCQkJaWYgKHJldCA+PSAwKSB7CisJCQkJcmV0ID0gZGVsX21vbl9pZihoYW5kbGUsIGhhbmRsZS0+ZmQsICZubHN0YXRlLAorCQkJCSAgICBoYW5kbGVwLT5kZXZpY2UsIGhhbmRsZXAtPm1vbmRldmljZSk7CisJCQkJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwkJCX0KKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCBkZWxldGUgbW9uaXRvciBpbnRlcmZhY2UgJXMgKCVzKS5cbiIKKwkJCQkgICAgIlBsZWFzZSBkZWxldGUgbWFudWFsbHkuXG4iLAorCQkJCSAgICBoYW5kbGVwLT5tb25kZXZpY2UsIGhhbmRsZS0+ZXJyYnVmKTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEhBVkVfTElCTkwgKi8KKworI2lmZGVmIElXX01PREVfTU9OSVRPUgorCQlpZiAoaGFuZGxlcC0+bXVzdF9kb19vbl9jbG9zZSAmIE1VU1RfQ0xFQVJfUkZNT04pIHsKKwkJCS8qCisJCQkgKiBXZSBwdXQgdGhlIGludGVyZmFjZSBpbnRvIHJmbW9uIG1vZGU7CisJCQkgKiB0YWtlIGl0IG91dCBvZiByZm1vbiBtb2RlLgorCQkJICoKKwkJCSAqIFhYWCAtIGlmIHNvbWVib2R5IGVsc2Ugd2FudHMgaXQgaW4gcmZtb24KKwkJCSAqIG1vZGUsIHRoaXMgY29kZSBjYW5ub3Qga25vdyB0aGF0LCBzbyBpdCdsbCB0YWtlCisJCQkgKiBpdCBvdXQgb2YgcmZtb24gbW9kZS4KKwkJCSAqLworCisJCQkvKgorCQkJICogRmlyc3QsIHRha2UgdGhlIGludGVyZmFjZSBkb3duIGlmIGl0J3MgdXA7CisJCQkgKiBvdGhlcndpc2UsIHdlIG1pZ2h0IGdldCBFQlVTWS4KKwkJCSAqIElmIHdlIGdldCBlcnJvcnMsIGp1c3QgZHJpdmUgb24gYW5kIHByaW50CisJCQkgKiBhIHdhcm5pbmcgaWYgd2UgY2FuJ3QgcmVzdG9yZSB0aGUgbW9kZS4KKwkJCSAqLworCQkJb2xkZmxhZ3MgPSAwOworCQkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBoYW5kbGVwLT5kZXZpY2UsCisJCQkgICAgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCQkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgIT0gLTEpIHsKKwkJCQlpZiAoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgeworCQkJCQlvbGRmbGFncyA9IGlmci5pZnJfZmxhZ3M7CisJCQkJCWlmci5pZnJfZmxhZ3MgJj0gfklGRl9VUDsKKwkJCQkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpCisJCQkJCQlvbGRmbGFncyA9IDA7CS8qIGRpZG4ndCBzZXQsIGRvbid0IHJlc3RvcmUgKi8KKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgcmVzdG9yZSB0aGUgbW9kZS4KKwkJCSAqLworCQkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgaGFuZGxlcC0+ZGV2aWNlLAorCQkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXQorCQkJICAgID0gMDsKKwkJCWlyZXEudS5tb2RlID0gaGFuZGxlcC0+b2xkbW9kZTsKKwkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lXTU9ERSwgJmlyZXEpID09IC0xKSB7CisJCQkJLyoKKwkJCQkgKiBTY2llbnRpc3QsIHlvdSd2ZSBmYWlsZWQuCisJCQkJICovCisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSAlcyB3aXJlbGVzcyBtb2RlIChTSU9DU0lXTU9ERSBmYWlsZWQ6ICVzKS5cbiIKKwkJCQkgICAgIlBsZWFzZSBhZGp1c3QgbWFudWFsbHkuXG4iLAorCQkJCSAgICBoYW5kbGVwLT5kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgYnJpbmcgdGhlIGludGVyZmFjZSBiYWNrIHVwIGlmIHdlIGJyb3VnaHQKKwkJCSAqIGl0IGRvd24uCisJCQkgKi8KKwkJCWlmIChvbGRmbGFncyAhPSAwKSB7CisJCQkJaWZyLmlmcl9mbGFncyA9IG9sZGZsYWdzOworCQkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkgICAgIkNhbid0IGJyaW5nIGludGVyZmFjZSAlcyBiYWNrIHVwIChTSU9DU0lGRkxBR1MgZmFpbGVkOiAlcykuXG4iCisJCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIsCisJCQkJCSAgICBoYW5kbGVwLT5kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLyogSVdfTU9ERV9NT05JVE9SICovCisKKwkJLyoKKwkJICogVGFrZSB0aGlzIHBjYXAgb3V0IG9mIHRoZSBsaXN0IG9mIHBjYXBzIGZvciB3aGljaCB3ZQorCQkgKiBoYXZlIHRvIHRha2UgdGhlIGludGVyZmFjZSBvdXQgb2Ygc29tZSBtb2RlLgorCQkgKi8KKwkJcGNhcF9yZW1vdmVfZnJvbV9wY2Fwc190b19jbG9zZShoYW5kbGUpOworCX0KKworCWlmIChoYW5kbGVwLT5tb25kZXZpY2UgIT0gTlVMTCkgeworCQlmcmVlKGhhbmRsZXAtPm1vbmRldmljZSk7CisJCWhhbmRsZXAtPm1vbmRldmljZSA9IE5VTEw7CisJfQorCWlmIChoYW5kbGVwLT5kZXZpY2UgIT0gTlVMTCkgeworCQlmcmVlKGhhbmRsZXAtPmRldmljZSk7CisJCWhhbmRsZXAtPmRldmljZSA9IE5VTEw7CisJfQorCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihoYW5kbGUpOworfQorCiAvKgogICogIEdldCBhIGhhbmRsZSBmb3IgYSBsaXZlIGNhcHR1cmUgZnJvbSB0aGUgZ2l2ZW4gZGV2aWNlLiBZb3UgY2FuCiAgKiAgcGFzcyBOVUxMIGFzIGRldmljZSB0byBnZXQgYWxsIHBhY2thZ2VzICh3aXRob3V0IGxpbmsgbGV2ZWwKQEAgLTIzMCw3MCArMTIzMSw1OSBAQAogICogIHdpbGwgYmUgc2V0IHRvIHByb21pc2NvdXMgbW9kZSAoWFhYOiBJIHRoaW5rIHRoaXMgdXNhZ2Ugc2hvdWxkCiAgKiAgYmUgZGVwcmVjYXRlZCBhbmQgZnVuY3Rpb25zIGJlIGFkZGVkIHRvIHNlbGVjdCB0aGF0IGxhdGVyIGFsbG93CiAgKiAgbW9kaWZpY2F0aW9uIG9mIHRoYXQgdmFsdWVzIC0tIFRvcnN0ZW4pLgotICoKLSAqICBTZWUgYWxzbyBwY2FwKDMpLgogICovCi1wY2FwX3QgKgotcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywKLSAgICBjaGFyICplYnVmKQorc3RhdGljIGludAorcGNhcF9hY3RpdmF0ZV9saW51eChwY2FwX3QgKmhhbmRsZSkKIHsKLQlwY2FwX3QJCSpoYW5kbGU7Ci0JaW50CQltdHU7Ci0JaW50CQllcnI7Ci0JaW50CQlsaXZlX29wZW5fb2sgPSAwOwotCXN0cnVjdCB1dHNuYW1lCXV0c25hbWU7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJY29uc3QgY2hhcgkqZGV2aWNlOworCWludAkJc3RhdHVzID0gMDsKIAotI2lmZGVmIEhBVkVfREFHX0FQSQotCWlmIChzdHJzdHIoZGV2aWNlLCAiZGFnIikpIHsKLQkJcmV0dXJuIGRhZ19vcGVuX2xpdmUoZGV2aWNlLCBzbmFwbGVuLCBwcm9taXNjLCB0b19tcywgZWJ1Zik7Ci0JfQotI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLworCWRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKIAotI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQotCWlmIChzdHJzdHIoZGV2aWNlLCAic2VwdGVsIikpIHsKLQkJcmV0dXJuIHNlcHRlbF9vcGVuX2xpdmUoZGV2aWNlLCBzbmFwbGVuLCBwcm9taXNjLCB0b19tcywgZWJ1Zik7Ci0JfQotI2VuZGlmIC8qIEhBVkVfU0VQVEVMX0FQSSAqLwotCi0JLyogQWxsb2NhdGUgYSBoYW5kbGUgZm9yIHRoaXMgc2Vzc2lvbi4gKi8KLQotCWhhbmRsZSA9IG1hbGxvYyhzaXplb2YoKmhhbmRsZSkpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCi0JCQkgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgcGNhcCBzdHJ1Y3R1cmUuICovCi0KLQltZW1zZXQoaGFuZGxlLCAwLCBzaXplb2YoKmhhbmRsZSkpOwotCWhhbmRsZS0+c25hcHNob3QJPSBzbmFwbGVuOwotCWhhbmRsZS0+bWQudGltZW91dAk9IHRvX21zOworCWhhbmRsZS0+aW5qZWN0X29wID0gcGNhcF9pbmplY3RfbGludXg7CisJaGFuZGxlLT5zZXRmaWx0ZXJfb3AgPSBwY2FwX3NldGZpbHRlcl9saW51eDsKKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IHBjYXBfc2V0ZGlyZWN0aW9uX2xpbnV4OworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gcGNhcF9zZXRfZGF0YWxpbmtfbGludXg7CisJaGFuZGxlLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfZmQ7CisJaGFuZGxlLT5jbGVhbnVwX29wID0gcGNhcF9jbGVhbnVwX2xpbnV4OworCWhhbmRsZS0+cmVhZF9vcCA9IHBjYXBfcmVhZF9saW51eDsKKwloYW5kbGUtPnN0YXRzX29wID0gcGNhcF9zdGF0c19saW51eDsKIAogCS8qCi0JICogTlVMTCBhbmQgImFueSIgYXJlIHNwZWNpYWwgZGV2aWNlcyB3aGljaCBnaXZlIHVzIHRoZSBoaW50IHRvCi0JICogbW9uaXRvciBhbGwgZGV2aWNlcy4KKwkgKiBUaGUgImFueSIgZGV2aWNlIGlzIGEgc3BlY2lhbCBkZXZpY2Ugd2hpY2ggY2F1c2VzIHVzIG5vdAorCSAqIHRvIGJpbmQgdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBhbmQgdGh1cyB0byBsb29rIGF0IGFsbAorCSAqIGRldmljZXMuCiAJICovCi0JaWYgKCFkZXZpY2UgfHwgc3RyY21wKGRldmljZSwgImFueSIpID09IDApIHsKLQkJZGV2aWNlCQkJPSBOVUxMOwotCQloYW5kbGUtPm1kLmRldmljZQk9IHN0cmR1cCgiYW55Iik7Ci0JCWlmIChwcm9taXNjKSB7Ci0JCQlwcm9taXNjID0gMDsKKwlpZiAoc3RyY21wKGRldmljZSwgImFueSIpID09IDApIHsKKwkJaWYgKGhhbmRsZS0+b3B0LnByb21pc2MpIHsKKwkJCWhhbmRsZS0+b3B0LnByb21pc2MgPSAwOwogCQkJLyogSnVzdCBhIHdhcm5pbmcuICovCi0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIlByb21pc2N1b3VzIG1vZGUgbm90IHN1cHBvcnRlZCBvbiB0aGUgXCJhbnlcIiBkZXZpY2UiKTsKKwkJCXN0YXR1cyA9IFBDQVBfV0FSTklOR19QUk9NSVNDX05PVFNVUDsKIAkJfQotCi0JfSBlbHNlCi0JCWhhbmRsZS0+bWQuZGV2aWNlCT0gc3RyZHVwKGRldmljZSk7Ci0KLQlpZiAoaGFuZGxlLT5tZC5kZXZpY2UgPT0gTlVMTCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic3RyZHVwOiAlcyIsCi0JCQkgcGNhcF9zdHJlcnJvcihlcnJubykgKTsKLQkJZnJlZShoYW5kbGUpOwotCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwloYW5kbGVwLT5kZXZpY2UJPSBzdHJkdXAoZGV2aWNlKTsKKwlpZiAoaGFuZGxlcC0+ZGV2aWNlID09IE5VTEwpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzdHJkdXA6ICVzIiwKKwkJCSBwY2FwX3N0cmVycm9yKGVycm5vKSApOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJCisJLyogY29weSB0aW1lb3V0IHZhbHVlICovCisJaGFuZGxlcC0+dGltZW91dCA9IGhhbmRsZS0+b3B0LnRpbWVvdXQ7CisKKwkvKgorCSAqIElmIHdlJ3JlIGluIHByb21pc2N1b3VzIG1vZGUsIHRoZW4gd2UgcHJvYmFibHkgd2FudCAKKwkgKiB0byBzZWUgd2hlbiB0aGUgaW50ZXJmYWNlIGRyb3BzIHBhY2tldHMgdG9vLCBzbyBnZXQgYW4KKwkgKiBpbml0aWFsIGNvdW50IGZyb20gL3Byb2MvbmV0L2RldgorCSAqLworCWlmIChoYW5kbGUtPm9wdC5wcm9taXNjKQorCQloYW5kbGVwLT5wcm9jX2Ryb3BwZWQgPSBsaW51eF9pZl9kcm9wcyhoYW5kbGVwLT5kZXZpY2UpOworCiAJLyoKIAkgKiBDdXJyZW50IExpbnV4IGtlcm5lbHMgdXNlIHRoZSBwcm90b2NvbCBmYW1pbHkgUEZfUEFDS0VUIHRvCiAJICogYWxsb3cgZGlyZWN0IGFjY2VzcyB0byBhbGwgcGFja2V0cyBvbiB0aGUgbmV0d29yayB3aGlsZQpAQCAtMzAzLDExOSArMTI5Myw4NyBAQAogCSAqIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbGRlciBrZXJuZWxzIGZvciBhIHdoaWxlIHNvIHdlIGFyZQogCSAqIHRyeWluZyBib3RoIG1ldGhvZHMgd2l0aCB0aGUgbmV3ZXIgbWV0aG9kIHByZWZlcnJlZC4KIAkgKi8KLQotCWlmICgoZXJyID0gbGl2ZV9vcGVuX25ldyhoYW5kbGUsIGRldmljZSwgcHJvbWlzYywgdG9fbXMsIGVidWYpKSA9PSAxKQotCQlsaXZlX29wZW5fb2sgPSAxOwotCWVsc2UgaWYgKGVyciA9PSAwKSB7Ci0JCS8qIE5vbi1mYXRhbCBlcnJvcjsgdHJ5IG9sZCB3YXkgKi8KLQkJaWYgKGxpdmVfb3Blbl9vbGQoaGFuZGxlLCBkZXZpY2UsIHByb21pc2MsIHRvX21zLCBlYnVmKSkKLQkJCWxpdmVfb3Blbl9vayA9IDE7Ci0JfQotCWlmICghbGl2ZV9vcGVuX29rKSB7CisJc3RhdHVzID0gYWN0aXZhdGVfbmV3KGhhbmRsZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKIAkJLyoKLQkJICogQm90aCBtZXRob2RzIHRvIG9wZW4gdGhlIHBhY2tldCBzb2NrZXQgZmFpbGVkLiBUaWR5Ci0JCSAqIHVwIGFuZCByZXBvcnQgb3VyIGZhaWx1cmUgKGVidWYgaXMgZXhwZWN0ZWQgdG8gYmUKLQkJICogc2V0IGJ5IHRoZSBmdW5jdGlvbnMgYWJvdmUpLgorCQkgKiBGYXRhbCBlcnJvciB3aXRoIHRoZSBuZXcgd2F5OyBqdXN0IGZhaWwuCisJCSAqIHN0YXR1cyBoYXMgdGhlIGVycm9yIHJldHVybjsgaWYgaXQncyBQQ0FQX0VSUk9SLAorCQkgKiBoYW5kbGUtPmVycmJ1ZiBoYXMgYmVlbiBzZXQgYXBwcm9wcmlhdGVseS4KIAkJICovCisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHN0YXR1cyA9PSAxKSB7CisJCS8qCisJCSAqIFN1Y2Nlc3MuCisJCSAqIFRyeSB0byB1c2UgbWVtb3J5LW1hcHBlZCBhY2Nlc3MuCisJCSAqLworCQlzd2l0Y2ggKGFjdGl2YXRlX21tYXAoaGFuZGxlLCAmc3RhdHVzKSkgewogCi0JCWlmIChoYW5kbGUtPm1kLmRldmljZSAhPSBOVUxMKQotCQkJZnJlZShoYW5kbGUtPm1kLmRldmljZSk7Ci0JCWZyZWUoaGFuZGxlKTsKLQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgMToKKwkJCS8qCisJCQkgKiBXZSBzdWNjZWVkZWQuICBzdGF0dXMgaGFzIGJlZW4KKwkJCSAqIHNldCB0byB0aGUgc3RhdHVzIHRvIHJldHVybiwKKwkJCSAqIHdoaWNoIG1pZ2h0IGJlIDAsIG9yIG1pZ2h0IGJlCisJCQkgKiBhIFBDQVBfV0FSTklOR18gdmFsdWUuCisJCQkgKi8KKwkJCXJldHVybiBzdGF0dXM7CisKKwkJY2FzZSAwOgorCQkJLyoKKwkJCSAqIEtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgaXQgLSBqdXN0IGNvbnRpbnVlCisJCQkgKiB3aXRoIG5vbi1tZW1vcnktbWFwcGVkIGFjY2Vzcy4KKwkJCSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAtMToKKwkJCS8qCisJCQkgKiBXZSBmYWlsZWQgdG8gc2V0IHVwIHRvIHVzZSBpdCwgb3IgdGhlIGtlcm5lbAorCQkJICogc3VwcG9ydHMgaXQsIGJ1dCB3ZSBmYWlsZWQgdG8gZW5hYmxlIGl0LgorCQkJICogc3RhdHVzIGhhcyBiZWVuIHNldCB0byB0aGUgZXJyb3Igc3RhdHVzIHRvCisJCQkgKiByZXR1cm4gYW5kLCBpZiBpdCdzIFBDQVBfRVJST1IsIGhhbmRsZS0+ZXJyYnVmCisJCQkgKiBjb250YWlucyB0aGUgZXJyb3IgbWVzc2FnZS4KKwkJCSAqLworCQkJZ290byBmYWlsOworCQl9CisJfQorCWVsc2UgaWYgKHN0YXR1cyA9PSAwKSB7CisJCS8qIE5vbi1mYXRhbCBlcnJvcjsgdHJ5IG9sZCB3YXkgKi8KKwkJaWYgKChzdGF0dXMgPSBhY3RpdmF0ZV9vbGQoaGFuZGxlKSkgIT0gMSkgeworCQkJLyoKKwkJCSAqIEJvdGggbWV0aG9kcyB0byBvcGVuIHRoZSBwYWNrZXQgc29ja2V0IGZhaWxlZC4KKwkJCSAqIFRpZHkgdXAgYW5kIHJlcG9ydCBvdXIgZmFpbHVyZSAoaGFuZGxlLT5lcnJidWYKKwkJCSAqIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBieSB0aGUgZnVuY3Rpb25zIGFib3ZlKS4KKwkJCSAqLworCQkJZ290byBmYWlsOworCQl9CiAJfQogCiAJLyoKLQkgKiBDb21wdXRlIHRoZSBidWZmZXIgc2l6ZS4KLQkgKgotCSAqIElmIHdlJ3JlIHVzaW5nIFNPQ0tfUEFDS0VULCB0aGlzIG1pZ2h0IGJlIGEgMi4wWy54XSBrZXJuZWwsCi0JICogYW5kIG1pZ2h0IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyAtIGNoZWNrLgorCSAqIFdlIHNldCB1cCB0aGUgc29ja2V0LCBidXQgbm90IHdpdGggbWVtb3J5LW1hcHBlZCBhY2Nlc3MuCiAJICovCi0JaWYgKGhhbmRsZS0+bWQuc29ja19wYWNrZXQgJiYgKHVuYW1lKCZ1dHNuYW1lKSA8IDAgfHwKLQkgICAgc3RybmNtcCh1dHNuYW1lLnJlbGVhc2UsICIyLjAiLCAzKSA9PSAwKSkgeworCXN0YXR1cyA9IDA7CisJaWYgKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplICE9IDApIHsKIAkJLyoKLQkJICogV2UncmUgdXNpbmcgYSBTT0NLX1BBQ0tFVCBzdHJ1Y3R1cmUsIGFuZCBlaXRoZXIKLQkJICogd2UgY291bGRuJ3QgZmluZCBvdXQgd2hhdCBrZXJuZWwgcmVsZWFzZSB0aGlzIGlzLAotCQkgKiBvciBpdCdzIGEgMi4wWy54XSBrZXJuZWwuCi0JCSAqCi0JCSAqIEluIHRoZSAyLjBbLnhdIGtlcm5lbCwgYSAicmVjdmZyb20oKSIgb24KLQkJICogYSBTT0NLX1BBQ0tFVCBzb2NrZXQsIHdpdGggTVNHX1RSVU5DIHNldCwgd2lsbAotCQkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBzbyBpZiB3ZSBwYXNzCi0JCSAqIGEgbGVuZ3RoIGJhc2VkIG9uIHRoZSBzbmFwc2hvdCBsZW5ndGgsIGl0J2xsCi0JCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHBhY2tldAotCQkgKiBjb3BpZWQgdG8gdXNlcmxhbmQsIG5vdCB0aGUgYWN0dWFsIGxlbmd0aAotCQkgKiBvZiB0aGUgcGFja2V0LgotCQkgKgotCQkgKiBUaGlzIG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLCB0aGUgSVAgZGlzc2VjdG9yCi0JCSAqIGluIHRjcGR1bXAgd2lsbCBnZXQgaGFuZGVkIGEgcGFja2V0IGxlbmd0aCBsZXNzCi0JCSAqIHRoYW4gdGhlIGxlbmd0aCBpbiB0aGUgSVAgaGVhZGVyLCBhbmQgd2lsbAotCQkgKiBjb21wbGFpbiBhYm91dCAidHJ1bmNhdGVkLWlwIi4KLQkJICoKLQkJICogU28gd2UgZG9uJ3QgYm90aGVyIHRyeWluZyB0byBjb3B5IGZyb20gdGhlCi0JCSAqIGtlcm5lbCBvbmx5IHRoZSBieXRlcyBpbiB3aGljaCB3ZSdyZSBpbnRlcmVzdGVkLAotCQkgKiBidXQgaW5zdGVhZCBjb3B5IHRoZW0gYWxsLCBqdXN0IGFzIHRoZSBvbGRlcgotCQkgKiB2ZXJzaW9ucyBvZiBsaWJwY2FwIGZvciBMaW51eCBkaWQuCi0JCSAqCi0JCSAqIFRoZSBidWZmZXIgdGhlcmVmb3JlIG5lZWRzIHRvIGJlIGJpZyBlbm91Z2ggdG8KLQkJICogaG9sZCB0aGUgbGFyZ2VzdCBwYWNrZXQgd2UgY2FuIGdldCBmcm9tIHRoaXMKLQkJICogZGV2aWNlLiAgVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgZ2V0IHRoZSBNUlUKLQkJICogb2YgdGhlIG5ldHdvcms7IHdlIGNhbiBvbmx5IGdldCB0aGUgTVRVLiAgVGhlCi0JCSAqIE1UVSBtYXkgYmUgdG9vIHNtYWxsLCBpbiB3aGljaCBjYXNlIGEgcGFja2V0IGxhcmdlcgotCQkgKiB0aGFuIHRoZSBidWZmZXIgc2l6ZSB3aWxsIGJlIHRydW5jYXRlZCAqYW5kKiB3ZQotCQkgKiB3b24ndCBnZXQgdGhlIGFjdHVhbCBwYWNrZXQgc2l6ZS4KLQkJICoKLQkJICogSG93ZXZlciwgaWYgdGhlIHNuYXBzaG90IGxlbmd0aCBpcyBsYXJnZXIgdGhhbgotCQkgKiB0aGUgYnVmZmVyIHNpemUgYmFzZWQgb24gdGhlIE1UVSwgd2UgdXNlIHRoZQotCQkgKiBzbmFwc2hvdCBsZW5ndGggYXMgdGhlIGJ1ZmZlciBzaXplLCBpbnN0ZWFkOwotCQkgKiB0aGlzIG1lYW5zIHRoYXQgd2l0aCBhIHN1ZmZpY2llbnRseSBsYXJnZSBzbmFwc2hvdAotCQkgKiBsZW5ndGggd2Ugd29uJ3QgYXJ0aWZpY2lhbGx5IHRydW5jYXRlIHBhY2tldHMKLQkJICogdG8gdGhlIE1UVS1iYXNlZCBzaXplLgotCQkgKgotCQkgKiBUaGlzIG1lc3MganVzdCBvbmUgb2YgbWFueSBwcm9ibGVtcyB3aXRoIHBhY2tldAotCQkgKiBjYXB0dXJlIG9uIDIuMFsueF0ga2VybmVsczsgeW91IHJlYWxseSB3YW50IGEKLQkJICogMi4yWy54XSBvciBsYXRlciBrZXJuZWwgaWYgeW91IHdhbnQgcGFja2V0IGNhcHR1cmUKLQkJICogdG8gd29yayB3ZWxsLgorCQkgKiBTZXQgdGhlIHNvY2tldCBidWZmZXIgc2l6ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogCQkgKi8KLQkJbXR1ID0gaWZhY2VfZ2V0X210dShoYW5kbGUtPmZkLCBkZXZpY2UsIGVidWYpOwotCQlpZiAobXR1ID09IC0xKSB7Ci0JCQlwY2FwX2Nsb3NlX2xpbnV4KGhhbmRsZSk7Ci0JCQlmcmVlKGhhbmRsZSk7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAorCQkgICAgJmhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplLAorCQkgICAgc2l6ZW9mKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplKSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQlnb3RvIGZhaWw7CiAJCX0KLQkJaGFuZGxlLT5idWZzaXplID0gTUFYX0xJTktIRUFERVJfU0laRSArIG10dTsKLQkJaWYgKGhhbmRsZS0+YnVmc2l6ZSA8IGhhbmRsZS0+c25hcHNob3QpCi0JCQloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFRoaXMgaXMgYSAyLjJbLnhdIG9yIGxhdGVyIGtlcm5lbCAod2Uga25vdyB0aGF0Ci0JCSAqIGVpdGhlciBiZWNhdXNlIHdlJ3JlIG5vdCB1c2luZyBhIFNPQ0tfUEFDS0VUCi0JCSAqIHNvY2tldCAtIFBGX1BBQ0tFVCBpcyBzdXBwb3J0ZWQgb25seSBpbiAyLjIKLQkJICogYW5kIGxhdGVyIGtlcm5lbHMgLSBvciBiZWNhdXNlIHdlIGNoZWNrZWQgdGhlCi0JCSAqIGtlcm5lbCB2ZXJzaW9uKS4KLQkJICoKLQkJICogV2UgY2FuIHNhZmVseSBwYXNzICJyZWN2ZnJvbSgpIiBhIGJ5dGUgY291bnQKLQkJICogYmFzZWQgb24gdGhlIHNuYXBzaG90IGxlbmd0aC4KLQkJICoKLQkJICogSWYgd2UncmUgaW4gY29va2VkIG1vZGUsIG1ha2UgdGhlIHNuYXBzaG90IGxlbmd0aAotCQkgKiBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhICJjb29rZWQgbW9kZSIgaGVhZGVyIHBsdXMKLQkJICogMSBieXRlIG9mIHBhY2tldCBkYXRhIChzbyB3ZSBkb24ndCBwYXNzIGEgYnl0ZQotCQkgKiBjb3VudCBvZiAwIHRvICJyZWN2ZnJvbSgpIikuCi0JCSAqLwotCQlpZiAoaGFuZGxlLT5tZC5jb29rZWQpIHsKLQkJCWlmIChoYW5kbGUtPnNuYXBzaG90IDwgU0xMX0hEUl9MRU4gKyAxKQotCQkJCWhhbmRsZS0+c25hcHNob3QgPSBTTExfSERSX0xFTiArIDE7Ci0JCX0KLQkJaGFuZGxlLT5idWZzaXplID0gaGFuZGxlLT5zbmFwc2hvdDsKIAl9CiAKIAkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCiAKIAloYW5kbGUtPmJ1ZmZlcgkgPSBtYWxsb2MoaGFuZGxlLT5idWZzaXplICsgaGFuZGxlLT5vZmZzZXQpOwogCWlmICghaGFuZGxlLT5idWZmZXIpIHsKLQkgICAgICAgIHNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlwY2FwX2Nsb3NlX2xpbnV4KGhhbmRsZSk7Ci0JCWZyZWUoaGFuZGxlKTsKLQkJcmV0dXJuIE5VTEw7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKgpAQCAtNDI0LDE3ICsxMzgyLDExIEBACiAJICovCiAJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKIAotCWhhbmRsZS0+cmVhZF9vcCA9IHBjYXBfcmVhZF9saW51eDsKLQloYW5kbGUtPmluamVjdF9vcCA9IHBjYXBfaW5qZWN0X2xpbnV4OwotCWhhbmRsZS0+c2V0ZmlsdGVyX29wID0gcGNhcF9zZXRmaWx0ZXJfbGludXg7Ci0JaGFuZGxlLT5zZXRkaXJlY3Rpb25fb3AgPSBwY2FwX3NldGRpcmVjdGlvbl9saW51eDsKLQloYW5kbGUtPnNldF9kYXRhbGlua19vcCA9IE5VTEw7CS8qIGNhbid0IGNoYW5nZSBkYXRhIGxpbmsgdHlwZSAqLwotCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwotCWhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOwotCWhhbmRsZS0+c3RhdHNfb3AgPSBwY2FwX3N0YXRzX2xpbnV4OwotCWhhbmRsZS0+Y2xvc2Vfb3AgPSBwY2FwX2Nsb3NlX2xpbnV4OworCXJldHVybiBzdGF0dXM7CiAKLQlyZXR1cm4gaGFuZGxlOworZmFpbDoKKwlwY2FwX2NsZWFudXBfbGludXgoaGFuZGxlKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgpAQCAtNDUyLDYgKzE0MDQsNDkgQEAKIAlyZXR1cm4gcGNhcF9yZWFkX3BhY2tldChoYW5kbGUsIGNhbGxiYWNrLCB1c2VyKTsKIH0KIAorc3RhdGljIGludAorcGNhcF9zZXRfZGF0YWxpbmtfbGludXgocGNhcF90ICpoYW5kbGUsIGludCBkbHQpCit7CisJaGFuZGxlLT5saW5rdHlwZSA9IGRsdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxpbnV4X2NoZWNrX2RpcmVjdGlvbigpCisgKgorICogRG8gY2hlY2tzIGJhc2VkIG9uIHBhY2tldCBkaXJlY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitsaW51eF9jaGVja19kaXJlY3Rpb24oY29uc3QgcGNhcF90ICpoYW5kbGUsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9sbCAqc2xsKQoreworCXN0cnVjdCBwY2FwX2xpbnV4CSpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCisJaWYgKHNsbC0+c2xsX3BrdHR5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7CisJCS8qCisJCSAqIE91dGdvaW5nIHBhY2tldC4KKwkJICogSWYgdGhpcyBpcyBmcm9tIHRoZSBsb29wYmFjayBkZXZpY2UsIHJlamVjdCBpdDsKKwkJICogd2UnbGwgc2VlIHRoZSBwYWNrZXQgYXMgYW4gaW5jb21pbmcgcGFja2V0IGFzIHdlbGwsCisJCSAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIHNlZSBpdCB0d2ljZS4KKwkJICovCisJCWlmIChzbGwtPnNsbF9pZmluZGV4ID09IGhhbmRsZXAtPmxvX2lmaW5kZXgpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBJZiB0aGUgdXNlciBvbmx5IHdhbnRzIGluY29taW5nIHBhY2tldHMsIHJlamVjdCBpdC4KKwkJICovCisJCWlmIChoYW5kbGUtPmRpcmVjdGlvbiA9PSBQQ0FQX0RfSU4pCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJbmNvbWluZyBwYWNrZXQuCisJCSAqIElmIHRoZSB1c2VyIG9ubHkgd2FudHMgb3V0Z29pbmcgcGFja2V0cywgcmVqZWN0IGl0LgorCQkgKi8KKwkJaWYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9PVVQpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiAgUmVhZCBhIHBhY2tldCBmcm9tIHRoZSBzb2NrZXQgY2FsbGluZyB0aGUgaGFuZGxlciBwcm92aWRlZCBieQogICogIHRoZSB1c2VyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCBvciAtMSBpZiBhbgpAQCAtNDYwLDYgKzE0NTUsNyBAQAogc3RhdGljIGludAogcGNhcF9yZWFkX3BhY2tldChwY2FwX3QgKmhhbmRsZSwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXJkYXRhKQogeworCXN0cnVjdCBwY2FwX2xpbnV4CSpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwogCXVfY2hhcgkJCSpicDsKIAlpbnQJCQlvZmZzZXQ7CiAjaWZkZWYgSEFWRV9QRl9QQUNLRVRfU09DS0VUUwpAQCAtNDY4LDcgKzE0NjQsMTcgQEAKICNlbHNlCiAJc3RydWN0IHNvY2thZGRyCQlmcm9tOwogI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKQorCXN0cnVjdCBpb3ZlYwkJaW92OworCXN0cnVjdCBtc2doZHIJCW1zZzsKKwlzdHJ1Y3QgY21zZ2hkcgkJKmNtc2c7CisJdW5pb24geworCQlzdHJ1Y3QgY21zZ2hkcgljbXNnOworCQljaGFyCQlidWZbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSkpXTsKKwl9IGNtc2dfYnVmOworI2Vsc2UgLyogZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKSAqLwogCXNvY2tsZW5fdAkJZnJvbWxlbjsKKyNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfUEFDS0VUX0FVWERBVEEpICYmIGRlZmluZWQoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kpICovCiAJaW50CQkJcGFja2V0X2xlbiwgY2FwbGVuOwogCXN0cnVjdCBwY2FwX3BrdGhkcglwY2FwX2hlYWRlcjsKIApAQCAtNDc3LDcgKzE0ODMsNyBAQAogCSAqIElmIHRoaXMgaXMgYSBjb29rZWQgZGV2aWNlLCBsZWF2ZSBleHRyYSByb29tIGZvciBhCiAJICogZmFrZSBwYWNrZXQgaGVhZGVyLgogCSAqLwotCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkKKwlpZiAoaGFuZGxlcC0+Y29va2VkKQogCQlvZmZzZXQgPSBTTExfSERSX0xFTjsKIAllbHNlCiAJCW9mZnNldCA9IDA7CkBAIC00ODksNDMgKzE0OTUsOTAgQEAKIAlvZmZzZXQgPSAwOwogI2VuZGlmCiAKLQkvKiBSZWNlaXZlIGEgc2luZ2xlIHBhY2tldCBmcm9tIHRoZSBrZXJuZWwgKi8KLQorCS8qCisJICogUmVjZWl2ZSBhIHNpbmdsZSBwYWNrZXQgZnJvbSB0aGUga2VybmVsLgorCSAqIFdlIGlnbm9yZSBFSU5UUiwgYXMgdGhhdCBtaWdodCBqdXN0IGJlIGR1ZSB0byBhIHNpZ25hbAorCSAqIGJlaW5nIGRlbGl2ZXJlZCAtIGlmIHRoZSBzaWduYWwgc2hvdWxkIGludGVycnVwdCB0aGUKKwkgKiBsb29wLCB0aGUgc2lnbmFsIGhhbmRsZXIgc2hvdWxkIGNhbGwgcGNhcF9icmVha2xvb3AoKQorCSAqIHRvIHNldCBoYW5kbGUtPmJyZWFrX2xvb3AgKHdlIGlnbm9yZSBpdCBvbiBvdGhlcgorCSAqIHBsYXRmb3JtcyBhcyB3ZWxsKS4KKwkgKiBXZSBhbHNvIGlnbm9yZSBFTkVURE9XTiwgc28gdGhhdCB3ZSBjYW4gY29udGludWUgdG8KKwkgKiBjYXB0dXJlIHRyYWZmaWMgaWYgdGhlIGludGVyZmFjZSBnb2VzIGRvd24gYW5kIGNvbWVzCisJICogYmFjayB1cCBhZ2FpbjsgY29tbWVudHMgaW4gdGhlIGtlcm5lbCBpbmRpY2F0ZSB0aGF0CisJICogd2UnbGwganVzdCBibG9jayB3YWl0aW5nIGZvciBwYWNrZXRzIGlmIHdlIHRyeSB0bworCSAqIHJlY2VpdmUgZnJvbSBhIHNvY2tldCB0aGF0IGRlbGl2ZXJlZCBFTkVURE9XTiwgYW5kLAorCSAqIGlmIHdlJ3JlIHVzaW5nIGEgbWVtb3J5LW1hcHBlZCBidWZmZXIsIHdlIHdvbid0IGV2ZW4KKwkgKiBnZXQgbm90aWZpZWQgb2YgIm5ldHdvcmsgZG93biIgZXZlbnRzLgorCSAqLwogCWJwID0gaGFuZGxlLT5idWZmZXIgKyBoYW5kbGUtPm9mZnNldDsKKworI2lmIGRlZmluZWQoSEFWRV9QQUNLRVRfQVVYREFUQSkgJiYgZGVmaW5lZChIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSkKKwltc2cubXNnX25hbWUJCT0gJmZyb207CisJbXNnLm1zZ19uYW1lbGVuCQk9IHNpemVvZihmcm9tKTsKKwltc2cubXNnX2lvdgkJPSAmaW92OworCW1zZy5tc2dfaW92bGVuCQk9IDE7CisJbXNnLm1zZ19jb250cm9sCQk9ICZjbXNnX2J1ZjsKKwltc2cubXNnX2NvbnRyb2xsZW4JPSBzaXplb2YoY21zZ19idWYpOworCW1zZy5tc2dfZmxhZ3MJCT0gMDsKKworCWlvdi5pb3ZfbGVuCQk9IGhhbmRsZS0+YnVmc2l6ZSAtIG9mZnNldDsKKwlpb3YuaW92X2Jhc2UJCT0gYnAgKyBvZmZzZXQ7CisjZW5kaWYgLyogZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKSAqLworCiAJZG8gewogCQkvKgogCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPwogCQkgKi8KIAkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkgewogCQkJLyoKLQkJCSAqIFllcyAtIGNsZWFyIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQKLQkJCSAqIGhhcywgYW5kIHJldHVybiAtMiBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgd2UKLQkJCSAqIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCQkgKiBZZXMgLSBjbGVhciB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0IGhhcywKKwkJCSAqIGFuZCByZXR1cm4gUENBUF9FUlJPUl9CUkVBSyBhcyBhbiBpbmRpY2F0aW9uIHRoYXQKKwkJCSAqIHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCiAJCQkgKi8KIAkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7Ci0JCQlyZXR1cm4gLTI7CisJCQlyZXR1cm4gUENBUF9FUlJPUl9CUkVBSzsKIAkJfQorCisjaWYgZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKQorCQlwYWNrZXRfbGVuID0gcmVjdm1zZyhoYW5kbGUtPmZkLCAmbXNnLCBNU0dfVFJVTkMpOworI2Vsc2UgLyogZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKSAqLwogCQlmcm9tbGVuID0gc2l6ZW9mKGZyb20pOwogCQlwYWNrZXRfbGVuID0gcmVjdmZyb20oCiAJCQloYW5kbGUtPmZkLCBicCArIG9mZnNldCwKIAkJCWhhbmRsZS0+YnVmc2l6ZSAtIG9mZnNldCwgTVNHX1RSVU5DLAogCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwgJmZyb21sZW4pOworI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9QQUNLRVRfQVVYREFUQSkgJiYgZGVmaW5lZChIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSkgKi8KIAl9IHdoaWxlIChwYWNrZXRfbGVuID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKIAogCS8qIENoZWNrIGlmIGFuIGVycm9yIG9jY3VyZWQgKi8KIAogCWlmIChwYWNrZXRfbGVuID09IC0xKSB7Ci0JCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVBR0FJTjoKIAkJCXJldHVybiAwOwkvKiBubyBwYWNrZXQgdGhlcmUgKi8KLQkJZWxzZSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1Ziwgc2l6ZW9mKGhhbmRsZS0+ZXJyYnVmKSwKKworCQljYXNlIEVORVRET1dOOgorCQkJLyoKKwkJCSAqIFRoZSBkZXZpY2Ugb24gd2hpY2ggd2UncmUgY2FwdHVyaW5nIHdlbnQgYXdheS4KKwkJCSAqCisJCQkgKiBYWFggLSB3ZSBzaG91bGQgcmVhbGx5IHJldHVybgorCQkJICogUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAsIGJ1dCBwY2FwX2Rpc3BhdGNoKCkKKwkJCSAqIGV0Yy4gYXJlbid0IGRlZmluZWQgdG8gcmV0dXJuIHRoYXQuCisJCQkgKi8KKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJUaGUgaW50ZXJmYWNlIHdlbnQgZG93biIpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisKKwkJZGVmYXVsdDoKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAicmVjdmZyb206ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KIAl9CiAKICNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCi0JaWYgKCFoYW5kbGUtPm1kLnNvY2tfcGFja2V0KSB7CisJaWYgKCFoYW5kbGVwLT5zb2NrX3BhY2tldCkgewogCQkvKgogCQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBhIHdpbmRvdyBiZXR3ZWVuIHNvY2tldCgpIGFuZAogCQkgKiBiaW5kKCkgd2hlcmUgdGhlIGtlcm5lbCBtYXkgcXVldWUgcGFja2V0cyBmcm9tIGFueQpAQCAtNTM4LDggKzE1OTEsOCBAQAogCQkgKiBmaWx0ZXIgc3VwcG9ydCwgYW5kIGl0J3MgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4KIAkJICogSXQgd291bGQgc2F2ZSBzb21lIGluc3RydWN0aW9ucyBwZXIgcGFja2V0LCBob3dldmVyLikKIAkJICovCi0JCWlmIChoYW5kbGUtPm1kLmlmaW5kZXggIT0gLTEgJiYKLQkJICAgIGZyb20uc2xsX2lmaW5kZXggIT0gaGFuZGxlLT5tZC5pZmluZGV4KQorCQlpZiAoaGFuZGxlcC0+aWZpbmRleCAhPSAtMSAmJgorCQkgICAgZnJvbS5zbGxfaWZpbmRleCAhPSBoYW5kbGVwLT5pZmluZGV4KQogCQkJcmV0dXJuIDA7CiAKIAkJLyoKQEAgLTU0OCwyOSArMTYwMSw4IEBACiAJCSAqIGFkZHJlc3MgcmV0dXJuZWQgZm9yIFNPQ0tfUEFDS0VUIGlzIGEgInNvY2thZGRyX3BrdCIKIAkJICogd2hpY2ggbGFja3MgdGhlIHJlbGV2YW50IHBhY2tldCB0eXBlIGluZm9ybWF0aW9uLgogCQkgKi8KLQkJaWYgKGZyb20uc2xsX3BrdHR5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7Ci0JCQkvKgotCQkJICogT3V0Z29pbmcgcGFja2V0LgotCQkJICogSWYgdGhpcyBpcyBmcm9tIHRoZSBsb29wYmFjayBkZXZpY2UsIHJlamVjdCBpdDsKLQkJCSAqIHdlJ2xsIHNlZSB0aGUgcGFja2V0IGFzIGFuIGluY29taW5nIHBhY2tldCBhcyB3ZWxsLAotCQkJICogYW5kIHdlIGRvbid0IHdhbnQgdG8gc2VlIGl0IHR3aWNlLgotCQkJICovCi0JCQlpZiAoZnJvbS5zbGxfaWZpbmRleCA9PSBoYW5kbGUtPm1kLmxvX2lmaW5kZXgpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgdXNlciBvbmx5IHdhbnRzIGluY29taW5nIHBhY2tldHMsIHJlamVjdCBpdC4KLQkJCSAqLwotCQkJaWYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9JTikKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJbmNvbWluZyBwYWNrZXQuCi0JCQkgKiBJZiB0aGUgdXNlciBvbmx5IHdhbnRzIG91dGdvaW5nIHBhY2tldHMsIHJlamVjdCBpdC4KLQkJCSAqLwotCQkJaWYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9PVVQpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KKwkJaWYgKCFsaW51eF9jaGVja19kaXJlY3Rpb24oaGFuZGxlLCAmZnJvbSkpCisJCQlyZXR1cm4gMDsKIAl9CiAjZW5kaWYKIApAQCAtNTc4LDcgKzE2MTAsNyBAQAogCS8qCiAJICogSWYgdGhpcyBpcyBhIGNvb2tlZCBkZXZpY2UsIGZpbGwgaW4gdGhlIGZha2UgcGFja2V0IGhlYWRlci4KIAkgKi8KLQlpZiAoaGFuZGxlLT5tZC5jb29rZWQpIHsKKwlpZiAoaGFuZGxlcC0+Y29va2VkKSB7CiAJCS8qCiAJCSAqIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBmYWtlIGhlYWRlciB0byB0aGUgbGVuZ3RoCiAJCSAqIG9mIHBhY2tldCBkYXRhIHdlIHJlYWQuCkBAIC01ODYsNDIgKzE2MTgsNyBAQAogCQlwYWNrZXRfbGVuICs9IFNMTF9IRFJfTEVOOwogCiAJCWhkcnAgPSAoc3RydWN0IHNsbF9oZWFkZXIgKilicDsKLQotCQkvKgotCQkgKiBNYXAgdGhlIFBBQ0tFVF8gdmFsdWUgdG8gYSBMSU5VWF9TTExfIHZhbHVlOyB3ZQotCQkgKiB3YW50IHRoZSBzYW1lIG51bWVyaWNhbCB2YWx1ZSB0byBiZSB1c2VkIGluCi0JCSAqIHRoZSBsaW5rLWxheWVyIGhlYWRlciBldmVuIGlmIHRoZSBudW1lcmljYWwgdmFsdWVzCi0JCSAqIGZvciB0aGUgUEFDS0VUXyAjZGVmaW5lcyBjaGFuZ2UsIHNvIHRoYXQgcHJvZ3JhbXMKLQkJICogdGhhdCBsb29rIGF0IHRoZSBwYWNrZXQgdHlwZSBmaWVsZCB3aWxsIGFsd2F5cyBiZQotCQkgKiBhYmxlIHRvIGhhbmRsZSBETFRfTElOVVhfU0xMIGNhcHR1cmVzLgotCQkgKi8KLQkJc3dpdGNoIChmcm9tLnNsbF9wa3R0eXBlKSB7Ci0KLQkJY2FzZSBQQUNLRVRfSE9TVDoKLQkJCWhkcnAtPnNsbF9wa3R0eXBlID0gaHRvbnMoTElOVVhfU0xMX0hPU1QpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQUNLRVRfQlJPQURDQVNUOgotCQkJaGRycC0+c2xsX3BrdHR5cGUgPSBodG9ucyhMSU5VWF9TTExfQlJPQURDQVNUKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUEFDS0VUX01VTFRJQ0FTVDoKLQkJCWhkcnAtPnNsbF9wa3R0eXBlID0gaHRvbnMoTElOVVhfU0xMX01VTFRJQ0FTVCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6Ci0JCQloZHJwLT5zbGxfcGt0dHlwZSA9IGh0b25zKExJTlVYX1NMTF9PVEhFUkhPU1QpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQUNLRVRfT1VUR09JTkc6Ci0JCQloZHJwLT5zbGxfcGt0dHlwZSA9IGh0b25zKExJTlVYX1NMTF9PVVRHT0lORyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJaGRycC0+c2xsX3BrdHR5cGUgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0KKwkJaGRycC0+c2xsX3BrdHR5cGUgPSBtYXBfcGFja2V0X3R5cGVfdG9fc2xsX3R5cGUoZnJvbS5zbGxfcGt0dHlwZSk7CiAJCWhkcnAtPnNsbF9oYXR5cGUgPSBodG9ucyhmcm9tLnNsbF9oYXR5cGUpOwogCQloZHJwLT5zbGxfaGFsZW4gPSBodG9ucyhmcm9tLnNsbF9oYWxlbik7CiAJCW1lbWNweShoZHJwLT5zbGxfYWRkciwgZnJvbS5zbGxfYWRkciwKQEAgLTYzMCw3ICsxNjI3LDQ1IEBACiAJCSAgICAgIGZyb20uc2xsX2hhbGVuKTsKIAkJaGRycC0+c2xsX3Byb3RvY29sID0gZnJvbS5zbGxfcHJvdG9jb2w7CiAJfQorCisjaWYgZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKQorCWlmIChoYW5kbGVwLT52bGFuX29mZnNldCAhPSAtMSkgeworCQlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOyBjbXNnOyBjbXNnID0gQ01TR19OWFRIRFIoJm1zZywgY21zZykpIHsKKwkJCXN0cnVjdCB0cGFja2V0X2F1eGRhdGEgKmF1eDsKKwkJCXVuc2lnbmVkIGludCBsZW47CisJCQlzdHJ1Y3Qgdmxhbl90YWcgKnRhZzsKKworCQkJaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCB0cGFja2V0X2F1eGRhdGEpKSB8fAorCQkJICAgIGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX1BBQ0tFVCB8fAorCQkJICAgIGNtc2ctPmNtc2dfdHlwZSAhPSBQQUNLRVRfQVVYREFUQSkKKwkJCQljb250aW51ZTsKKworCQkJYXV4ID0gKHN0cnVjdCB0cGFja2V0X2F1eGRhdGEgKilDTVNHX0RBVEEoY21zZyk7CisjaWYgZGVmaW5lZChUUF9TVEFUVVNfVkxBTl9WQUxJRCkKKwkJCWlmICgoYXV4LT50cF92bGFuX3RjaSA9PSAwKSAmJiAhKGF1eC0+dHBfc3RhdHVzICYgVFBfU1RBVFVTX1ZMQU5fVkFMSUQpKQorI2Vsc2UKKwkJCWlmIChhdXgtPnRwX3ZsYW5fdGNpID09IDApIC8qIHRoaXMgaXMgYW1iaWdpb3VzIGJ1dCB3aXRob3V0IHRoZQorCQkJCQkJVFBfU1RBVFVTX1ZMQU5fVkFMSUQgZmxhZywgdGhlcmUgaXMKKwkJCQkJCW5vdGhpbmcgdGhhdCB3ZSBjYW4gZG8gKi8KICNlbmRpZgorCQkJCWNvbnRpbnVlOworCisJCQlsZW4gPSBwYWNrZXRfbGVuID4gaW92Lmlvdl9sZW4gPyBpb3YuaW92X2xlbiA6IHBhY2tldF9sZW47CisJCQlpZiAobGVuIDwgKHVuc2lnbmVkIGludCkgaGFuZGxlcC0+dmxhbl9vZmZzZXQpCisJCQkJYnJlYWs7CisKKwkJCWJwIC09IFZMQU5fVEFHX0xFTjsKKwkJCW1lbW1vdmUoYnAsIGJwICsgVkxBTl9UQUdfTEVOLCBoYW5kbGVwLT52bGFuX29mZnNldCk7CisKKwkJCXRhZyA9IChzdHJ1Y3Qgdmxhbl90YWcgKikoYnAgKyBoYW5kbGVwLT52bGFuX29mZnNldCk7CisJCQl0YWctPnZsYW5fdHBpZCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKKwkJCXRhZy0+dmxhbl90Y2kgPSBodG9ucyhhdXgtPnRwX3ZsYW5fdGNpKTsKKworCQkJcGFja2V0X2xlbiArPSBWTEFOX1RBR19MRU47CisJCX0KKwl9CisjZW5kaWYgLyogZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKSAqLworI2VuZGlmIC8qIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMgKi8KIAogCS8qCiAJICogWFhYOiBBY2NvcmRpbmcgdG8gdGhlIGtlcm5lbCBzb3VyY2Ugd2Ugc2hvdWxkIGdldCB0aGUgcmVhbApAQCAtNjY5LDcgKzE3MDQsNyBAQAogCQljYXBsZW4gPSBoYW5kbGUtPnNuYXBzaG90OwogCiAJLyogUnVuIHRoZSBwYWNrZXQgZmlsdGVyIGlmIG5vdCB1c2luZyBrZXJuZWwgZmlsdGVyICovCi0JaWYgKCFoYW5kbGUtPm1kLnVzZV9icGYgJiYgaGFuZGxlLT5mY29kZS5iZl9pbnNucykgeworCWlmIChoYW5kbGVwLT5maWx0ZXJfaW5fdXNlcmxhbmQgJiYgaGFuZGxlLT5mY29kZS5iZl9pbnNucykgewogCQlpZiAoYnBmX2ZpbHRlcihoYW5kbGUtPmZjb2RlLmJmX2luc25zLCBicCwKIAkJICAgICAgICAgICAgICAgIHBhY2tldF9sZW4sIGNhcGxlbikgPT0gMCkKIAkJewpAQCAtNjgwLDExICsxNzE1LDI0IEBACiAKIAkvKiBGaWxsIGluIG91ciBvd24gaGVhZGVyIGRhdGEgKi8KIAotCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR1NUQU1QLCAmcGNhcF9oZWFkZXIudHMpID09IC0xKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBzaXplb2YoaGFuZGxlLT5lcnJidWYpLAotCQkJICJTSU9DR1NUQU1QOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwkvKiBnZXQgdGltZXN0YW1wIGZvciB0aGlzIHBhY2tldCAqLworI2lmIGRlZmluZWQoU0lPQ0dTVEFNUE5TKSAmJiBkZWZpbmVkKFNPX1RJTUVTVEFNUE5TKQorCWlmIChoYW5kbGUtPm9wdC50c3RhbXBfcHJlY2lzaW9uID09IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5PKSB7CisJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR1NUQU1QTlMsICZwY2FwX2hlYWRlci50cykgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkiU0lPQ0dTVEFNUE5TOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ0dTVEFNUCwgJnBjYXBfaGVhZGVyLnRzKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJTSU9DR1NUQU1QOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisgICAgICAgIH0KKwogCXBjYXBfaGVhZGVyLmNhcGxlbgk9IGNhcGxlbjsKIAlwY2FwX2hlYWRlci5sZW4JCT0gcGFja2V0X2xlbjsKIApAQCAtNzIxLDE3ICsxNzY5LDE4IEBACiAJICogdGhlIGNvdW50IGlzIG1vcmUgZXhwZW5zaXZlIHRoYW4gYWx3YXlzIHRlc3RpbmcgYSBmbGFnCiAJICogaW4gbWVtb3J5LgogCSAqCi0JICogV2Uga2VlcCB0aGUgY291bnQgaW4gIm1kLnBhY2tldHNfcmVhZCIsIGFuZCB1c2UgdGhhdCBmb3IKLQkgKiAicHNfcmVjdiIgaWYgd2UgY2FuJ3QgZ2V0IHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGtlcm5lbC4KKwkgKiBXZSBrZWVwIHRoZSBjb3VudCBpbiAiaGFuZGxlcC0+cGFja2V0c19yZWFkIiwgYW5kIHVzZSB0aGF0CisJICogZm9yICJwc19yZWN2IiBpZiB3ZSBjYW4ndCBnZXQgdGhlIHN0YXRpc3RpY3MgZnJvbSB0aGUga2VybmVsLgogCSAqIFdlIGRvIHRoYXQgYmVjYXVzZSwgaWYgd2UgKmNhbiogZ2V0IHRoZSBzdGF0aXN0aWNzIGZyb20KLQkgKiB0aGUga2VybmVsLCB3ZSB1c2UgIm1kLnN0YXQucHNfcmVjdiIgYW5kICJtZC5zdGF0LnBzX2Ryb3AiCi0JICogYXMgcnVubmluZyBjb3VudHMsIGFzIHJlYWRpbmcgdGhlIHN0YXRpc3RpY3MgZnJvbSB0aGUKLQkgKiBrZXJuZWwgcmVzZXRzIHRoZSBrZXJuZWwgc3RhdGlzdGljcywgYW5kIGlmIHdlIGRpcmVjdGx5Ci0JICogaW5jcmVtZW50ICJtZC5zdGF0LnBzX3JlY3YiIGhlcmUsIHRoYXQgbWVhbnMgaXQgd2lsbAotCSAqIGNvdW50IHBhY2tldHMgKnR3aWNlKiBvbiBzeXN0ZW1zIHdoZXJlIHdlIGNhbiBnZXQga2VybmVsCi0JICogc3RhdGlzdGljcyAtIG9uY2UgaGVyZSwgYW5kIG9uY2UgaW4gcGNhcF9zdGF0c19saW51eCgpLgorCSAqIHRoZSBrZXJuZWwsIHdlIHVzZSAiaGFuZGxlcC0+c3RhdC5wc19yZWN2IiBhbmQKKwkgKiAiaGFuZGxlcC0+c3RhdC5wc19kcm9wIiBhcyBydW5uaW5nIGNvdW50cywgYXMgcmVhZGluZyB0aGUKKwkgKiBzdGF0aXN0aWNzIGZyb20gdGhlIGtlcm5lbCByZXNldHMgdGhlIGtlcm5lbCBzdGF0aXN0aWNzLAorCSAqIGFuZCBpZiB3ZSBkaXJlY3RseSBpbmNyZW1lbnQgImhhbmRsZXAtPnN0YXQucHNfcmVjdiIgaGVyZSwKKwkgKiB0aGF0IG1lYW5zIGl0IHdpbGwgY291bnQgcGFja2V0cyAqdHdpY2UqIG9uIHN5c3RlbXMgd2hlcmUKKwkgKiB3ZSBjYW4gZ2V0IGtlcm5lbCBzdGF0aXN0aWNzIC0gb25jZSBoZXJlLCBhbmQgb25jZSBpbgorCSAqIHBjYXBfc3RhdHNfbGludXgoKS4KIAkgKi8KLQloYW5kbGUtPm1kLnBhY2tldHNfcmVhZCsrOworCWhhbmRsZXAtPnBhY2tldHNfcmVhZCsrOwogCiAJLyogQ2FsbCB0aGUgdXNlciBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiAqLwogCWNhbGxiYWNrKHVzZXJkYXRhLCAmcGNhcF9oZWFkZXIsIGJwKTsKQEAgLTc0MiwxMiArMTc5MSwxMyBAQAogc3RhdGljIGludAogcGNhcF9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CiAJaW50IHJldDsKIAogI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKLQlpZiAoIWhhbmRsZS0+bWQuc29ja19wYWNrZXQpIHsKKwlpZiAoIWhhbmRsZXAtPnNvY2tfcGFja2V0KSB7CiAJCS8qIFBGX1BBQ0tFVCBzb2NrZXQgKi8KLQkJaWYgKGhhbmRsZS0+bWQuaWZpbmRleCA9PSAtMSkgeworCQlpZiAoaGFuZGxlcC0+aWZpbmRleCA9PSAtMSkgewogCQkJLyoKIAkJCSAqIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBvbiB0aGUgImFueSIgZGV2aWNlLgogCQkJICovCkBAIC03NTcsNyArMTgwNyw3IEBACiAJCQlyZXR1cm4gKC0xKTsKIAkJfQogCi0JCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkgeworCQlpZiAoaGFuZGxlcC0+Y29va2VkKSB7CiAJCQkvKgogCQkJICogV2UgZG9uJ3Qgc3VwcG9ydCBzZW5kaW5nIG9uIHRoZSAiYW55IiBkZXZpY2UuCiAJCQkgKgpAQCAtNzkzLDEwICsxODQzLDQxIEBACiBzdGF0aWMgaW50CiBwY2FwX3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKIHsKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKICNpZmRlZiBIQVZFX1RQQUNLRVRfU1RBVFMKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJLyoKKwkgKiBGb3Igc29ja2V0cyB1c2luZyBUUEFDS0VUX1YxIG9yIFRQQUNLRVRfVjIsIHRoZSBleHRyYQorCSAqIHN0dWZmIGF0IHRoZSBlbmQgb2YgYSBzdHJ1Y3QgdHBhY2tldF9zdGF0c192MyB3aWxsIG5vdAorCSAqIGJlIGZpbGxlZCBpbiwgYW5kIHdlIGRvbid0IGxvb2sgYXQgaXQgc28gdGhpcyBpcyBPSyBldmVuCisJICogZm9yIHRob3NlIHNvY2tldHMuICBJbiBhZGRpdGlvbiwgdGhlIFBGX1BBQ0tFVCBzb2NrZXQKKwkgKiBjb2RlIGluIHRoZSBrZXJuZWwgb25seSB1c2VzIHRoZSBsZW5ndGggcGFyYW1ldGVyIHRvCisJICogY29tcHV0ZSBob3cgbXVjaCBkYXRhIHRvIGNvcHkgb3V0IGFuZCB0byBpbmRpY2F0ZSBob3cKKwkgKiBtdWNoIGRhdGEgd2FzIGNvcGllZCBvdXQsIHNvIGl0J3MgT0sgdG8gYmFzZSBpdCBvbiB0aGUKKwkgKiBzaXplIG9mIGEgc3RydWN0IHRwYWNrZXRfc3RhdHMuCisJICoKKwkgKiBYWFggLSBpdCdzIHByb2JhYmx5IE9LLCBpbiBmYWN0LCB0byBqdXN0IHVzZSBhCisJICogc3RydWN0IHRwYWNrZXRfc3RhdHMgZm9yIFYzIHNvY2tldHMsIGFzIHdlIGRvbid0CisJICogY2FyZSBhYm91dCB0aGUgdHBfZnJlZXplX3FfY250IHN0YXQuCisJICovCisJc3RydWN0IHRwYWNrZXRfc3RhdHNfdjMga3N0YXRzOworI2Vsc2UgLyogSEFWRV9UUEFDS0VUMyAqLwogCXN0cnVjdCB0cGFja2V0X3N0YXRzIGtzdGF0czsKKyNlbmRpZiAvKiBIQVZFX1RQQUNLRVQzICovCiAJc29ja2xlbl90IGxlbiA9IHNpemVvZiAoc3RydWN0IHRwYWNrZXRfc3RhdHMpOwotI2VuZGlmCisjZW5kaWYgLyogSEFWRV9UUEFDS0VUX1NUQVRTICovCisKKwlsb25nIGlmX2Ryb3BwZWQgPSAwOworCQorCS8qIAorCSAqCVRvIGZpbGwgaW4gcHNfaWZkcm9wLCB3ZSBwYXJzZSAvcHJvYy9uZXQvZGV2IGZvciB0aGUgbnVtYmVyCisJICovCisJaWYgKGhhbmRsZS0+b3B0LnByb21pc2MpCisJeworCQlpZl9kcm9wcGVkID0gaGFuZGxlcC0+cHJvY19kcm9wcGVkOworCQloYW5kbGVwLT5wcm9jX2Ryb3BwZWQgPSBsaW51eF9pZl9kcm9wcyhoYW5kbGVwLT5kZXZpY2UpOworCQloYW5kbGVwLT5zdGF0LnBzX2lmZHJvcCArPSAoaGFuZGxlcC0+cHJvY19kcm9wcGVkIC0gaWZfZHJvcHBlZCk7CisJfQogCiAjaWZkZWYgSEFWRV9UUEFDS0VUX1NUQVRTCiAJLyoKQEAgLTgxOCw2ICsxODk5LDggQEAKIAkJICoJZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlIGRyaXZlci4gIEl0IGNvdW50cyBvbmx5CiAJCSAqCXBhY2tldHMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4KIAkJICoKKwkJICoJU2VlIGFib3ZlIGZvciBwc19pZmRyb3AuIAorCQkgKgogCQkgKglCb3RoIHN0YXRpc3RpY3MgaW5jbHVkZSBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tCiAJCSAqCXRoZSBrZXJuZWwgYnkgbGlicGNhcCwgYW5kIHRodXMgbm90IHlldCBzZWVuIGJ5CiAJCSAqCXRoZSBhcHBsaWNhdGlvbi4KQEAgLTg0OSw5ICsxOTMyLDkgQEAKIAkJICogICAgZ2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfU1RBVElTVElDUywgLi4uLgogCQkgKiByZXNldHMgdGhlIGNvdW50ZXJzIHRvIHplcm8uCiAJCSAqLwotCQloYW5kbGUtPm1kLnN0YXQucHNfcmVjdiArPSBrc3RhdHMudHBfcGFja2V0czsKLQkJaGFuZGxlLT5tZC5zdGF0LnBzX2Ryb3AgKz0ga3N0YXRzLnRwX2Ryb3BzOwotCQkqc3RhdHMgPSBoYW5kbGUtPm1kLnN0YXQ7CisJCWhhbmRsZXAtPnN0YXQucHNfcmVjdiArPSBrc3RhdHMudHBfcGFja2V0czsKKwkJaGFuZGxlcC0+c3RhdC5wc19kcm9wICs9IGtzdGF0cy50cF9kcm9wczsKKwkJKnN0YXRzID0gaGFuZGxlcC0+c3RhdDsKIAkJcmV0dXJuIDA7CiAJfQogCWVsc2UKQEAgLTg4MSwyMCArMTk2NCwzNTkgQEAKIAkgKgogCSAqCSJwc19kcm9wIiBpcyBub3Qgc3VwcG9ydGVkLgogCSAqCisJICoJInBzX2lmZHJvcCIgaXMgc3VwcG9ydGVkLiBJdCB3aWxsIHJldHVybiB0aGUgbnVtYmVyCisJICoJb2YgZHJvcHMgdGhlIGludGVyZmFjZSByZXBvcnRzIGluIC9wcm9jL25ldC9kZXYsCisJICoJaWYgdGhhdCBpcyBhdmFpbGFibGUuCisJICoKIAkgKgkicHNfcmVjdiIgZG9lc24ndCBpbmNsdWRlIHBhY2tldHMgbm90IHlldCByZWFkIGZyb20KIAkgKgl0aGUga2VybmVsIGJ5IGxpYnBjYXAuCiAJICoKIAkgKiBXZSBtYWludGFpbiB0aGUgY291bnQgb2YgcGFja2V0cyBwcm9jZXNzZWQgYnkgbGlicGNhcCBpbgotCSAqICJtZC5wYWNrZXRzX3JlYWQiLCBmb3IgcmVhc29ucyBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnQKKwkgKiAiaGFuZGxlcC0+cGFja2V0c19yZWFkIiwgZm9yIHJlYXNvbnMgZGVzY3JpYmVkIGluIHRoZSBjb21tZW50CiAJICogYXQgdGhlIGVuZCBvZiBwY2FwX3JlYWRfcGFja2V0KCkuICBXZSBoYXZlIG5vIGlkZWEgaG93IG1hbnkKLQkgKiBwYWNrZXRzIHdlcmUgZHJvcHBlZC4KKwkgKiBwYWNrZXRzIHdlcmUgZHJvcHBlZCBieSB0aGUga2VybmVsIGJ1ZmZlcnMgLS0gYnV0IHdlIGtub3cgCisJICogaG93IG1hbnkgdGhlIGludGVyZmFjZSBkcm9wcGVkLCBzbyB3ZSBjYW4gcmV0dXJuIHRoYXQuCiAJICovCi0Jc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGUtPm1kLnBhY2tldHNfcmVhZDsKKwkgCisJc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGVwLT5wYWNrZXRzX3JlYWQ7CiAJc3RhdHMtPnBzX2Ryb3AgPSAwOworCXN0YXRzLT5wc19pZmRyb3AgPSBoYW5kbGVwLT5zdGF0LnBzX2lmZHJvcDsKIAlyZXR1cm4gMDsKIH0KIAogLyoKKyAqIEdldCBmcm9tICIvc3lzL2NsYXNzL25ldCIgYWxsIGludGVyZmFjZXMgbGlzdGVkIHRoZXJlOyBpZiB0aGV5J3JlCisgKiBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgd2UgaGF2ZSwgdGhhdCB3b24ndCBhZGQgYW5vdGhlcgorICogaW5zdGFuY2UsIGJ1dCBpZiB0aGV5J3JlIG5vdCwgdGhhdCdsbCBhZGQgdGhlbS4KKyAqCisgKiBXZSBkb24ndCBib3RoZXIgZ2V0dGluZyBhbnkgYWRkcmVzc2VzIGZvciB0aGVtOyBpdCBhcHBlYXJzIHlvdSBjYW4ndAorICogdXNlIFNJT0NHSUZBRERSIG9uIExpbnV4IHRvIGdldCBJUHY2IGFkZHJlc3NlcyBmb3IgaW50ZXJmYWNlcywgYW5kLAorICogYWx0aG91Z2ggc29tZSBvdGhlciB0eXBlcyBvZiBhZGRyZXNzZXMgY2FuIGJlIGZldGNoZWQgd2l0aCBTSU9DR0lGQUREUiwKKyAqIHdlIGRvbid0IGJvdGhlciB3aXRoIHRoZW0gZm9yIG5vdy4KKyAqCisgKiBXZSBhbHNvIGRvbid0IGZhaWwgaWYgd2UgY291bGRuJ3Qgb3BlbiAiL3N5cy9jbGFzcy9uZXQiOyB3ZSBqdXN0IGxlYXZlCisgKiB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIGFzIGlzLCBhbmQgcmV0dXJuIDAsIHNvIHRoYXQgd2UgY2FuIHRyeQorICogc2Nhbm5pbmcgL3Byb2MvbmV0L2Rldi4KKyAqLworc3RhdGljIGludAorc2Nhbl9zeXNfY2xhc3NfbmV0KHBjYXBfaWZfdCAqKmRldmxpc3RwLCBjaGFyICplcnJidWYpCit7CisJRElSICpzeXNfY2xhc3NfbmV0X2Q7CisJaW50IGZkOworCXN0cnVjdCBkaXJlbnQgKmVudDsKKwljaGFyIHN1YnN5c3RlbV9wYXRoW1BBVEhfTUFYKzFdOworCXN0cnVjdCBzdGF0IHN0YXRiOworCWNoYXIgKnA7CisJY2hhciBuYW1lWzUxMl07CS8qIFhYWCAtIHBpY2sgYSBzaXplICovCisJY2hhciAqcSwgKnNhdmVxOworCXN0cnVjdCBpZnJlcSBpZnJmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXN5c19jbGFzc19uZXRfZCA9IG9wZW5kaXIoIi9zeXMvY2xhc3MvbmV0Iik7CisJaWYgKHN5c19jbGFzc19uZXRfZCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIERvbid0IGZhaWwgaWYgaXQgZG9lc24ndCBleGlzdCBhdCBhbGwuCisJCSAqLworCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJcmV0dXJuICgwKTsKKworCQkvKgorCQkgKiBGYWlsIGlmIHdlIGdvdCBzb21lIG90aGVyIGVycm9yLgorCQkgKi8KKwkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IG9wZW4gL3N5cy9jbGFzcy9uZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBhIHNvY2tldCBmcm9tIHdoaWNoIHRvIGZldGNoIGludGVyZmFjZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkodm9pZCljbG9zZWRpcihzeXNfY2xhc3NfbmV0X2QpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWVycm5vID0gMDsKKwkJZW50ID0gcmVhZGRpcihzeXNfY2xhc3NfbmV0X2QpOworCQlpZiAoZW50ID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBFcnJvciBvciBFT0Y7IGlmIGVycm5vICE9IDAsIGl0J3MgYW4gZXJyb3IuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWdub3JlICIuIiBhbmQgIi4uIi4KKwkJICovCisJCWlmIChzdHJjbXAoZW50LT5kX25hbWUsICIuIikgPT0gMCB8fAorCQkgICAgc3RyY21wKGVudC0+ZF9uYW1lLCAiLi4iKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWdub3JlIHBsYWluIGZpbGVzOyB0aGV5IGRvIG5vdCBoYXZlIHN1YmRpcmVjdG9yaWVzCisJCSAqIGFuZCB0aHVzIGhhdmUgbm8gYXR0cmlidXRlcy4KKwkJICovCisJCWlmIChlbnQtPmRfdHlwZSA9PSBEVF9SRUcpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJcyB0aGVyZSBhbiAiaWZpbmRleCIgZmlsZSB1bmRlciB0aGF0IG5hbWU/CisJCSAqIChXZSBkb24ndCBjYXJlIHdoZXRoZXIgaXQncyBhIGRpcmVjdG9yeSBvcgorCQkgKiBhIHN5bWxpbms7IG9sZGVyIGtlcm5lbHMgaGF2ZSBkaXJlY3RvcmllcworCQkgKiBmb3IgZGV2aWNlcywgbmV3ZXIga2VybmVscyBoYXZlIHN5bWxpbmtzIHRvCisJCSAqIGRpcmVjdG9yaWVzLikKKwkJICovCisJCXNucHJpbnRmKHN1YnN5c3RlbV9wYXRoLCBzaXplb2Ygc3Vic3lzdGVtX3BhdGgsCisJCSAgICAiL3N5cy9jbGFzcy9uZXQvJXMvaWZpbmRleCIsIGVudC0+ZF9uYW1lKTsKKwkJaWYgKGxzdGF0KHN1YnN5c3RlbV9wYXRoLCAmc3RhdGIpICE9IDApIHsKKwkJCS8qCisJCQkgKiBTdGF0IGZhaWxlZC4gIEVpdGhlciB0aGVyZSB3YXMgYW4gZXJyb3IKKwkJCSAqIG90aGVyIHRoYW4gRU5PRU5ULCBhbmQgd2UgZG9uJ3Qga25vdyBpZgorCQkJICogdGhpcyBpcyBhbiBpbnRlcmZhY2UsIG9yIGl0J3MgRU5PRU5ULAorCQkJICogYW5kIGVpdGhlciBzb21lIHBhcnQgb2YgIi9zeXMvY2xhc3MvbmV0L3tpZn0iCisJCQkgKiBkaXNhcHBlYXJlZCwgaW4gd2hpY2ggY2FzZSBpdCBwcm9iYWJseSBtZWFucworCQkJICogdGhlIGludGVyZmFjZSBkaXNhcHBlYXJlZCwgb3IgdGhlcmUncyBubworCQkJICogImlmaW5kZXgiIGZpbGUsIHdoaWNoIG1lYW5zIGl0J3Mgbm90IGEKKwkJCSAqIG5ldHdvcmsgaW50ZXJmYWNlLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEdldCB0aGUgaW50ZXJmYWNlIG5hbWUuCisJCSAqLworCQlwID0gJmVudC0+ZF9uYW1lWzBdOworCQlxID0gJm5hbWVbMF07CisJCXdoaWxlICgqcCAhPSAnXDAnICYmIGlzYXNjaWkoKnApICYmICFpc3NwYWNlKCpwKSkgeworCQkJaWYgKCpwID09ICc6JykgeworCQkJCS8qCisJCQkJICogVGhpcyBjb3VsZCBiZSB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYQorCQkJCSAqIG5hbWUgYW5kIGFuIGFsaWFzIG51bWJlciwgb3IgaXQgY291bGQgYmUKKwkJCQkgKiB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYSBuYW1lIHdpdGggbm8KKwkJCQkgKiBhbGlhcyBudW1iZXIgYW5kIHRoZSBuZXh0IGZpZWxkLgorCQkJCSAqCisJCQkJICogSWYgdGhlcmUncyBhIGNvbG9uIGFmdGVyIGRpZ2l0cywgaXQKKwkJCQkgKiBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHRoZSBhbGlhcyBudW1iZXIsCisJCQkJICogb3RoZXJ3aXNlIGl0IHNlcGFyYXRlcyB0aGUgbmFtZSBhbmQgdGhlCisJCQkJICogbmV4dCBmaWVsZC4KKwkJCQkgKi8KKwkJCQlzYXZlcSA9IHE7CisJCQkJd2hpbGUgKGlzYXNjaWkoKnApICYmIGlzZGlnaXQoKnApKQorCQkJCQkqcSsrID0gKnArKzsKKwkJCQlpZiAoKnAgIT0gJzonKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoYXQgd2FzIHRoZSBuZXh0IGZpZWxkLAorCQkJCQkgKiBub3QgdGhlIGFsaWFzIG51bWJlci4KKwkJCQkJICovCisJCQkJCXEgPSBzYXZlcTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQkqcSsrID0gKnArKzsKKwkJfQorCQkqcSA9ICdcMCc7CisKKwkJLyoKKwkJICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBpbnRlcmZhY2UsIGFuZCBza2lwIGl0IGlmCisJCSAqIGl0J3Mgbm90IHVwLgorCQkgKi8KKwkJc3RybmNweShpZnJmbGFncy5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnJmbGFncykgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5YSU8gfHwgZXJybm8gPT0gRU5PREVWKQorCQkJCWNvbnRpbnVlOworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJTSU9DR0lGRkxBR1M6ICUuKnM6ICVzIiwKKwkJCSAgICAoaW50KXNpemVvZihpZnJmbGFncy5pZnJfbmFtZSksCisJCQkgICAgaWZyZmxhZ3MuaWZyX25hbWUsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpZnJmbGFncy5pZnJfZmxhZ3MgJiBJRkZfVVApKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQWRkIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZSwgd2l0aCBubyBhZGRyZXNzZXMuCisJCSAqLworCQlpZiAocGNhcF9hZGRfaWYoZGV2bGlzdHAsIG5hbWUsIGlmcmZsYWdzLmlmcl9mbGFncywgTlVMTCwKKwkJICAgIGVycmJ1ZikgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBGYWlsdXJlLgorCQkJICovCisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZXQgIT0gLTEpIHsKKwkJLyoKKwkJICogV2VsbCwgd2UgZGlkbid0IGZhaWwgZm9yIGFueSBvdGhlciByZWFzb247IGRpZCB3ZQorCQkgKiBmYWlsIGR1ZSB0byBhbiBlcnJvciByZWFkaW5nIHRoZSBkaXJlY3Rvcnk/CisJCSAqLworCQlpZiAoZXJybm8gIT0gMCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJFcnJvciByZWFkaW5nIC9zeXMvY2xhc3MvbmV0OiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gLTE7CisJCX0KKwl9CisKKwkodm9pZCljbG9zZShmZCk7CisJKHZvaWQpY2xvc2VkaXIoc3lzX2NsYXNzX25ldF9kKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBHZXQgZnJvbSAiL3Byb2MvbmV0L2RldiIgYWxsIGludGVyZmFjZXMgbGlzdGVkIHRoZXJlOyBpZiB0aGV5J3JlCisgKiBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgd2UgaGF2ZSwgdGhhdCB3b24ndCBhZGQgYW5vdGhlcgorICogaW5zdGFuY2UsIGJ1dCBpZiB0aGV5J3JlIG5vdCwgdGhhdCdsbCBhZGQgdGhlbS4KKyAqCisgKiBTZWUgY29tbWVudHMgZnJvbSBzY2FuX3N5c19jbGFzc19uZXQoKS4KKyAqLworc3RhdGljIGludAorc2Nhbl9wcm9jX25ldF9kZXYocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1ZikKK3sKKwlGSUxFICpwcm9jX25ldF9mOworCWludCBmZDsKKwljaGFyIGxpbmVidWZbNTEyXTsKKwlpbnQgbGluZW51bTsKKwljaGFyICpwOworCWNoYXIgbmFtZVs1MTJdOwkvKiBYWFggLSBwaWNrIGEgc2l6ZSAqLworCWNoYXIgKnEsICpzYXZlcTsKKwlzdHJ1Y3QgaWZyZXEgaWZyZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlwcm9jX25ldF9mID0gZm9wZW4oIi9wcm9jL25ldC9kZXYiLCAiciIpOworCWlmIChwcm9jX25ldF9mID09IE5VTEwpIHsKKwkJLyoKKwkJICogRG9uJ3QgZmFpbCBpZiBpdCBkb2Vzbid0IGV4aXN0IGF0IGFsbC4KKwkJICovCisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gKDApOworCisJCS8qCisJCSAqIEZhaWwgaWYgd2UgZ290IHNvbWUgb3RoZXIgZXJyb3IuCisJCSAqLworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3Qgb3BlbiAvcHJvYy9uZXQvZGV2OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBzb2NrZXQgZnJvbSB3aGljaCB0byBmZXRjaCBpbnRlcmZhY2UgaW5mb3JtYXRpb24uCisJICovCisJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpZmNsb3NlKHByb2NfbmV0X2YpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlmb3IgKGxpbmVudW0gPSAxOworCSAgICBmZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgcHJvY19uZXRfZikgIT0gTlVMTDsgbGluZW51bSsrKSB7CisJCS8qCisJCSAqIFNraXAgdGhlIGZpcnN0IHR3byBsaW5lcyAtIHRoZXkncmUgaGVhZGVycy4KKwkJICovCisJCWlmIChsaW5lbnVtIDw9IDIpCisJCQljb250aW51ZTsKKworCQlwID0gJmxpbmVidWZbMF07CisKKwkJLyoKKwkJICogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLgorCQkgKi8KKwkJd2hpbGUgKCpwICE9ICdcMCcgJiYgaXNhc2NpaSgqcCkgJiYgaXNzcGFjZSgqcCkpCisJCQlwKys7CisJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICdcbicpCisJCQljb250aW51ZTsJLyogYmxhbmsgbGluZSAqLworCisJCS8qCisJCSAqIEdldCB0aGUgaW50ZXJmYWNlIG5hbWUuCisJCSAqLworCQlxID0gJm5hbWVbMF07CisJCXdoaWxlICgqcCAhPSAnXDAnICYmIGlzYXNjaWkoKnApICYmICFpc3NwYWNlKCpwKSkgeworCQkJaWYgKCpwID09ICc6JykgeworCQkJCS8qCisJCQkJICogVGhpcyBjb3VsZCBiZSB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYQorCQkJCSAqIG5hbWUgYW5kIGFuIGFsaWFzIG51bWJlciwgb3IgaXQgY291bGQgYmUKKwkJCQkgKiB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYSBuYW1lIHdpdGggbm8KKwkJCQkgKiBhbGlhcyBudW1iZXIgYW5kIHRoZSBuZXh0IGZpZWxkLgorCQkJCSAqCisJCQkJICogSWYgdGhlcmUncyBhIGNvbG9uIGFmdGVyIGRpZ2l0cywgaXQKKwkJCQkgKiBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHRoZSBhbGlhcyBudW1iZXIsCisJCQkJICogb3RoZXJ3aXNlIGl0IHNlcGFyYXRlcyB0aGUgbmFtZSBhbmQgdGhlCisJCQkJICogbmV4dCBmaWVsZC4KKwkJCQkgKi8KKwkJCQlzYXZlcSA9IHE7CisJCQkJd2hpbGUgKGlzYXNjaWkoKnApICYmIGlzZGlnaXQoKnApKQorCQkJCQkqcSsrID0gKnArKzsKKwkJCQlpZiAoKnAgIT0gJzonKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoYXQgd2FzIHRoZSBuZXh0IGZpZWxkLAorCQkJCQkgKiBub3QgdGhlIGFsaWFzIG51bWJlci4KKwkJCQkJICovCisJCQkJCXEgPSBzYXZlcTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQkqcSsrID0gKnArKzsKKwkJfQorCQkqcSA9ICdcMCc7CisKKwkJLyoKKwkJICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBpbnRlcmZhY2UsIGFuZCBza2lwIGl0IGlmCisJCSAqIGl0J3Mgbm90IHVwLgorCQkgKi8KKwkJc3RybmNweShpZnJmbGFncy5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnJmbGFncykgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5YSU8pCisJCQkJY29udGludWU7CisJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIlNJT0NHSUZGTEFHUzogJS4qczogJXMiLAorCQkJICAgIChpbnQpc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSwKKwkJCSAgICBpZnJmbGFncy5pZnJfbmFtZSwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGlmcmZsYWdzLmlmcl9mbGFncyAmIElGRl9VUCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBBZGQgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLCB3aXRoIG5vIGFkZHJlc3Nlcy4KKwkJICovCisJCWlmIChwY2FwX2FkZF9pZihkZXZsaXN0cCwgbmFtZSwgaWZyZmxhZ3MuaWZyX2ZsYWdzLCBOVUxMLAorCQkgICAgZXJyYnVmKSA9PSAtMSkgeworCQkJLyoKKwkJCSAqIEZhaWx1cmUuCisJCQkgKi8KKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJldCAhPSAtMSkgeworCQkvKgorCQkgKiBXZWxsLCB3ZSBkaWRuJ3QgZmFpbCBmb3IgYW55IG90aGVyIHJlYXNvbjsgZGlkIHdlCisJCSAqIGZhaWwgZHVlIHRvIGFuIGVycm9yIHJlYWRpbmcgdGhlIGZpbGU/CisJCSAqLworCQlpZiAoZmVycm9yKHByb2NfbmV0X2YpKSB7CisJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIkVycm9yIHJlYWRpbmcgL3Byb2MvbmV0L2RldjogJXMiLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCisJKHZvaWQpY2xvc2UoZmQpOworCSh2b2lkKWZjbG9zZShwcm9jX25ldF9mKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCiAgKiBEZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoZSAiYW55IiBkZXZpY2UuCiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyIGFueV9kZXNjcltdID0gIlBzZXVkby1kZXZpY2UgdGhhdCBjYXB0dXJlcyBvbiBhbGwgaW50ZXJmYWNlcyI7CkBAIC05MDIsMTkgKzIzMjQsMzMgQEAKIGludAogcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogeworCWludCByZXQ7CisKKwkvKgorCSAqIFJlYWQgIi9zeXMvY2xhc3MvbmV0IiwgYW5kIGFkZCB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIGFsbAorCSAqIGludGVyZmFjZXMgbGlzdGVkIHRoZXJlIHRoYXQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlLCBiZWNhdXNlLAorCSAqIG9uIExpbnV4LCBTSU9DR0lGQ09ORiByZXBvcnRzIG9ubHkgaW50ZXJmYWNlcyB3aXRoIElQdjQgYWRkcmVzc2VzLAorCSAqIGFuZCBldmVuIGdldGlmYWRkcnMoKSB3b24ndCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKKwkgKiBpbnRlcmZhY2VzIHdpdGggbm8gYWRkcmVzc2VzLCBzbyB5b3UgbmVlZCB0byByZWFkICIvc3lzL2NsYXNzL25ldCIKKwkgKiB0byBnZXQgdGhlIG5hbWVzIG9mIHRoZSByZXN0IG9mIHRoZSBpbnRlcmZhY2VzLgorCSAqLworCXJldCA9IHNjYW5fc3lzX2NsYXNzX25ldChhbGxkZXZzcCwgZXJyYnVmKTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXR1cm4gKC0xKTsJLyogZmFpbGVkICovCisJaWYgKHJldCA9PSAwKSB7CisJCS8qCisJCSAqIE5vIC9zeXMvY2xhc3MvbmV0OyB0cnkgcmVhZGluZyAvcHJvYy9uZXQvZGV2IGluc3RlYWQuCisJCSAqLworCQlpZiAoc2Nhbl9wcm9jX25ldF9kZXYoYWxsZGV2c3AsIGVycmJ1ZikgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIEFkZCB0aGUgImFueSIgZGV2aWNlLgorCSAqLwogCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgImFueSIsIDAsIGFueV9kZXNjciwgZXJyYnVmKSA8IDApCiAJCXJldHVybiAoLTEpOwogCi0jaWZkZWYgSEFWRV9EQUdfQVBJCi0JaWYgKGRhZ19wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA8IDApCi0JCXJldHVybiAoLTEpOwotI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLwotCi0jaWZkZWYgSEFWRV9TRVBURUxfQVBJCi0JaWYgKHNlcHRlbF9wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA8IDApCi0JCXJldHVybiAoLTEpOwotI2VuZGlmIC8qIEhBVkVfU0VQVEVMX0FQSSAqLwotCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtOTIyLDggKzIzNTgsMTAgQEAKICAqICBBdHRhY2ggdGhlIGdpdmVuIEJQRiBjb2RlIHRvIHRoZSBwYWNrZXQgY2FwdHVyZSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbnQKLXBjYXBfc2V0ZmlsdGVyX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZpbHRlcikKK3BjYXBfc2V0ZmlsdGVyX2xpbnV4X2NvbW1vbihwY2FwX3QgKmhhbmRsZSwgc3RydWN0IGJwZl9wcm9ncmFtICpmaWx0ZXIsCisgICAgaW50IGlzX21tYXBwZWQpCiB7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXA7CiAjaWZkZWYgU09fQVRUQUNIX0ZJTFRFUgogCXN0cnVjdCBzb2NrX2Zwcm9nCWZjb2RlOwogCWludAkJCWNhbl9maWx0ZXJfaW5fa2VybmVsOwpAQCAtOTM0LDEwICsyMzcyLDEyIEBACiAJCXJldHVybiAtMTsKIAlpZiAoIWZpbHRlcikgewogCSAgICAgICAgc3RybmNweShoYW5kbGUtPmVycmJ1ZiwgInNldGZpbHRlcjogTm8gZmlsdGVyIHNwZWNpZmllZCIsCi0JCQlzaXplb2YoaGFuZGxlLT5lcnJidWYpKTsKKwkJCVBDQVBfRVJSQlVGX1NJWkUpOwogCQlyZXR1cm4gLTE7CiAJfQogCisJaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwogCS8qIE1ha2Ugb3VyIHByaXZhdGUgY29weSBvZiB0aGUgZmlsdGVyICovCiAKIAlpZiAoaW5zdGFsbF9icGZfcHJvZ3JhbShoYW5kbGUsIGZpbHRlcikgPCAwKQpAQCAtOTQ4LDcgKzIzODgsNyBAQAogCSAqIFJ1biB1c2VyIGxldmVsIHBhY2tldCBmaWx0ZXIgYnkgZGVmYXVsdC4gV2lsbCBiZSBvdmVycmlkZW4gaWYKIAkgKiBpbnN0YWxsaW5nIGEga2VybmVsIGZpbHRlciBzdWNjZWVkcy4KIAkgKi8KLQloYW5kbGUtPm1kLnVzZV9icGYgPSAwOworCWhhbmRsZXAtPmZpbHRlcl9pbl91c2VybGFuZCA9IDE7CiAKIAkvKiBJbnN0YWxsIGtlcm5lbCBsZXZlbCBmaWx0ZXIgaWYgcG9zc2libGUgKi8KIApAQCAtOTc1LDEzICsyNDE1LDEzIEBACiAJCSAqCiAJCSAqIE9oLCBhbmQgd2UgYWxzbyBuZWVkIHRvIGZpeCBpdCB1cCBzbyB0aGF0IGFsbCAicmV0IgogCQkgKiBpbnN0cnVjdGlvbnMgd2l0aCBub24temVybyBvcGVyYW5kcyBoYXZlIDY1NTM1IGFzIHRoZQotCQkgKiBvcGVyYW5kLCBhbmQgc28gdGhhdCwgaWYgd2UncmUgaW4gY29va2VkIG1vZGUsIGFsbAotCQkgKiBtZW1vcnktcmVmZXJlbmNlIGluc3RydWN0aW9ucyB1c2Ugc3BlY2lhbCBtYWdpYyBvZmZzZXRzCi0JCSAqIGluIHJlZmVyZW5jZXMgdG8gdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGFuZCBhc3N1bWUgdGhhdAotCQkgKiB0aGUgbGluay1sYXllciBwYXlsb2FkIGJlZ2lucyBhdCAwOyAiZml4X3Byb2dyYW0oKSIKLQkJICogd2lsbCBkbyB0aGF0LgorCQkgKiBvcGVyYW5kIGlmIHdlJ3JlIG5vdCBjYXB0dXJpbmcgaW4gbWVtb3J5LW1hcHBlZCBtb2RlZSwKKwkJICogYW5kIHNvIHRoYXQsIGlmIHdlJ3JlIGluIGNvb2tlZCBtb2RlLCBhbGwgbWVtb3J5LXJlZmVyZW5jZQorCQkgKiBpbnN0cnVjdGlvbnMgdXNlIHNwZWNpYWwgbWFnaWMgb2Zmc2V0cyBpbiByZWZlcmVuY2VzIHRvCisJCSAqIHRoZSBsaW5rLWxheWVyIGhlYWRlciBhbmQgYXNzdW1lIHRoYXQgdGhlIGxpbmstbGF5ZXIKKwkJICogcGF5bG9hZCBiZWdpbnMgYXQgMDsgImZpeF9wcm9ncmFtKCkiIHdpbGwgZG8gdGhhdC4KIAkJICovCi0JCXN3aXRjaCAoZml4X3Byb2dyYW0oaGFuZGxlLCAmZmNvZGUpKSB7CisJCXN3aXRjaCAoZml4X3Byb2dyYW0oaGFuZGxlLCAmZmNvZGUsIGlzX21tYXBwZWQpKSB7CiAKIAkJY2FzZSAtMToKIAkJZGVmYXVsdDoKQEAgLTEwMDksMTEgKzI0NDksMzggQEAKIAkJfQogCX0KIAorCS8qCisJICogTk9URTogYXQgdGhpcyBwb2ludCwgd2UndmUgc2V0IGJvdGggdGhlICJsZW4iIGFuZCAiZmlsdGVyIgorCSAqIGZpZWxkcyBvZiAiZmNvZGUiLiAgQXMgb2YgdGhlIDIuNi4zMi40IGtlcm5lbCwgYXQgbGVhc3QsCisJICogdGhvc2UgYXJlIHRoZSBvbmx5IG1lbWJlcnMgb2YgdGhlICJzb2NrX2Zwcm9nIiBzdHJ1Y3R1cmUsCisJICogc28gd2UgaW5pdGlhbGl6ZSBldmVyeSBtZW1iZXIgb2YgdGhhdCBzdHJ1Y3R1cmUuCisJICoKKwkgKiBJZiB0aGVyZSBpcyBhbnl0aGluZyBpbiAiZmNvZGUiIHRoYXQgaXMgbm90IGluaXRpYWxpemVkLAorCSAqIGl0IGlzIGVpdGhlciBhIGZpZWxkIGFkZGVkIGluIGEgbGF0ZXIga2VybmVsLCBvciBpdCdzCisJICogcGFkZGluZy4KKwkgKgorCSAqIElmIGEgbmV3IGZpZWxkIGlzIGFkZGVkLCB0aGlzIGNvZGUgbmVlZHMgdG8gYmUgdXBkYXRlZAorCSAqIHRvIHNldCBpdCBjb3JyZWN0bHkuCisJICoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgZmllbGRzLCB0aGVuOgorCSAqCisJICoJaWYgdGhlIExpbnV4IGtlcm5lbCBsb29rcyBhdCB0aGUgcGFkZGluZywgaXQncworCSAqCWJ1Z2d5OworCSAqCisJICoJaWYgdGhlIExpbnV4IGtlcm5lbCBkb2Vzbid0IGxvb2sgYXQgdGhlIHBhZGRpbmcsCisJICoJdGhlbiBpZiBzb21lIHRvb2wgY29tcGxhaW5zIHRoYXQgd2UncmUgcGFzc2luZworCSAqCXVuaW5pdGlhbGl6ZWQgZGF0YSB0byB0aGUga2VybmVsLCB0aGVuIHRoZSB0b29sCisJICoJaXMgYnVnZ3kgYW5kIG5lZWRzIHRvIHVuZGVyc3RhbmQgdGhhdCBpdCdzIGp1c3QKKwkgKglwYWRkaW5nLgorCSAqLwogCWlmIChjYW5fZmlsdGVyX2luX2tlcm5lbCkgewogCQlpZiAoKGVyciA9IHNldF9rZXJuZWxfZmlsdGVyKGhhbmRsZSwgJmZjb2RlKSkgPT0gMCkKIAkJewotCQkJLyogSW5zdGFsbGF0aW9uIHN1Y2NlZGVkIC0gdXNpbmcga2VybmVsIGZpbHRlci4gKi8KLQkJCWhhbmRsZS0+bWQudXNlX2JwZiA9IDE7CisJCQkvKgorCQkJICogSW5zdGFsbGF0aW9uIHN1Y2NlZGVkIC0gdXNpbmcga2VybmVsIGZpbHRlciwKKwkJCSAqIHNvIHVzZXJsYW5kIGZpbHRlcmluZyBub3QgbmVlZGVkLgorCQkJICovCisJCQloYW5kbGVwLT5maWx0ZXJfaW5fdXNlcmxhbmQgPSAwOwogCQl9CiAJCWVsc2UgaWYgKGVyciA9PSAtMSkJLyogTm9uLWZhdGFsIGVycm9yICovCiAJCXsKQEAgLTEwMzgsNyArMjUwNSw3IEBACiAJICogY2FsbGluZyAicGNhcF9zZXRmaWx0ZXIoKSIuICBPdGhlcndpc2UsIHRoZSBrZXJuZWwgZmlsdGVyIG1heQogCSAqIGZpbHRlciBvdXQgcGFja2V0cyB0aGF0IHdvdWxkIHBhc3MgdGhlIG5ldyB1c2VybGFuZCBmaWx0ZXIuCiAJICovCi0JaWYgKCFoYW5kbGUtPm1kLnVzZV9icGYpCisJaWYgKGhhbmRsZXAtPmZpbHRlcl9pbl91c2VybGFuZCkKIAkJcmVzZXRfa2VybmVsX2ZpbHRlcihoYW5kbGUpOwogCiAJLyoKQEAgLTEwNTUsNiArMjUyMiwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitwY2FwX3NldGZpbHRlcl9saW51eChwY2FwX3QgKmhhbmRsZSwgc3RydWN0IGJwZl9wcm9ncmFtICpmaWx0ZXIpCit7CisJcmV0dXJuIHBjYXBfc2V0ZmlsdGVyX2xpbnV4X2NvbW1vbihoYW5kbGUsIGZpbHRlciwgMCk7Cit9CisKKwogLyoKICAqIFNldCBkaXJlY3Rpb24gZmxhZzogV2hpY2ggcGFja2V0cyBkbyB3ZSBhY2NlcHQgb24gYSBmb3J3YXJkaW5nCiAgKiBzaW5nbGUgZGV2aWNlPyBJTiwgT1VUIG9yIGJvdGg/CkBAIC0xMDYzLDcgKzI1MzcsOSBAQAogcGNhcF9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICpoYW5kbGUsIHBjYXBfZGlyZWN0aW9uX3QgZCkKIHsKICNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCi0JaWYgKCFoYW5kbGUtPm1kLnNvY2tfcGFja2V0KSB7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisKKwlpZiAoIWhhbmRsZXAtPnNvY2tfcGFja2V0KSB7CiAJCWhhbmRsZS0+ZGlyZWN0aW9uID0gZDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTA3MiwxMSArMjU0OCw0NiBAQAogCSAqIFdlJ3JlIG5vdCB1c2luZyBQRl9QQUNLRVQgc29ja2V0cywgc28gd2UgY2FuJ3QgZGV0ZXJtaW5lCiAJICogdGhlIGRpcmVjdGlvbiBvZiB0aGUgcGFja2V0LgogCSAqLwotCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBzaXplb2YoaGFuZGxlLT5lcnJidWYpLAorCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCSAgICAiU2V0dGluZyBkaXJlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBTT0NLX1BBQ0tFVCBzb2NrZXRzIik7CiAJcmV0dXJuIC0xOwogfQogCisjaWZkZWYgSEFWRV9QRl9QQUNLRVRfU09DS0VUUworLyoKKyAqIE1hcCB0aGUgUEFDS0VUXyB2YWx1ZSB0byBhIExJTlVYX1NMTF8gdmFsdWU7IHdlCisgKiB3YW50IHRoZSBzYW1lIG51bWVyaWNhbCB2YWx1ZSB0byBiZSB1c2VkIGluCisgKiB0aGUgbGluay1sYXllciBoZWFkZXIgZXZlbiBpZiB0aGUgbnVtZXJpY2FsIHZhbHVlcworICogZm9yIHRoZSBQQUNLRVRfICNkZWZpbmVzIGNoYW5nZSwgc28gdGhhdCBwcm9ncmFtcworICogdGhhdCBsb29rIGF0IHRoZSBwYWNrZXQgdHlwZSBmaWVsZCB3aWxsIGFsd2F5cyBiZQorICogYWJsZSB0byBoYW5kbGUgRExUX0xJTlVYX1NMTCBjYXB0dXJlcy4KKyAqLworc3RhdGljIHNob3J0IGludAorbWFwX3BhY2tldF90eXBlX3RvX3NsbF90eXBlKHNob3J0IGludCBzbGxfcGt0dHlwZSkKK3sKKwlzd2l0Y2ggKHNsbF9wa3R0eXBlKSB7CisKKwljYXNlIFBBQ0tFVF9IT1NUOgorCQlyZXR1cm4gaHRvbnMoTElOVVhfU0xMX0hPU1QpOworCisJY2FzZSBQQUNLRVRfQlJPQURDQVNUOgorCQlyZXR1cm4gaHRvbnMoTElOVVhfU0xMX0JST0FEQ0FTVCk7CisKKwljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6CisJCXJldHVybiAgaHRvbnMoTElOVVhfU0xMX01VTFRJQ0FTVCk7CisKKwljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6CisJCXJldHVybiBodG9ucyhMSU5VWF9TTExfT1RIRVJIT1NUKTsKKworCWNhc2UgUEFDS0VUX09VVEdPSU5HOgorCQlyZXR1cm4gaHRvbnMoTElOVVhfU0xMX09VVEdPSU5HKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit9CisjZW5kaWYKKwogLyoKICAqICBMaW51eCB1c2VzIHRoZSBBUlAgaGFyZHdhcmUgdHlwZSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBhbgogICogIGludGVyZmFjZS4gcGNhcCB1c2VzIHRoZSBETFRfeHh4IGNvbnN0YW50cyBmb3IgdGhpcy4gVGhpcwpAQCAtMTExMyw3ICsyNjI0LDcgQEAKIAkJICogWFhYIC0gYXJlIHRoZXJlIGFueSBzb3J0cyBvZiAiZmFrZSBFdGhlcm5ldCIgdGhhdCBoYXZlCiAJCSAqIEFSUEhSRF9FVEhFUiBidXQgdGhhdCAqc2hvdWxkbid0IG9mZmVyIERMVF9ET0NTSVMgYXMKIAkJICogYSBDaXNjbyBDTVRTIHdvbid0IHB1dCB0cmFmZmljIG9udG8gaXQgb3IgZ2V0IHRyYWZmaWMKLQkJICogYnJpZGdlZCBvbnRvIGl0PyAgSVNETiBpcyBoYW5kbGVkIGluICJsaXZlX29wZW5fbmV3KCkiLAorCQkgKiBicmlkZ2VkIG9udG8gaXQ/ICBJU0ROIGlzIGhhbmRsZWQgaW4gImFjdGl2YXRlX25ldygpIiwKIAkJICogYXMgd2UgZmFsbCBiYWNrIG9uIGNvb2tlZCBtb2RlIHRoZXJlOyBhcmUgdGhlcmUgYW55CiAJCSAqIG90aGVycz8KIAkJICovCkBAIC0xMTM5LDcgKzI2NTAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQVJQSFJEX0FYMjU6Ci0JCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfQVgyNTsKKwkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9BWDI1X0tJU1M7CiAJCWJyZWFrOwogCiAJY2FzZSBBUlBIUkRfUFJPTkVUOgpAQCAtMTE0OSw2ICsyNjYwLDEyIEBACiAJY2FzZSBBUlBIUkRfQ0hBT1M6CiAJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfQ0hBT1M7CiAJCWJyZWFrOworI2lmbmRlZiBBUlBIUkRfQ0FOCisjZGVmaW5lIEFSUEhSRF9DQU4gMjgwCisjZW5kaWYKKwljYXNlIEFSUEhSRF9DQU46CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfQ0FOX1NPQ0tFVENBTjsKKwkJYnJlYWs7CiAKICNpZm5kZWYgQVJQSFJEX0lFRUU4MDJfVFIKICNkZWZpbmUgQVJQSFJEX0lFRUU4MDJfVFIgODAwCS8qIEZyb20gTGludXggMi40ICovCkBAIC0xMzI2LDYgKzI4NDMsMjUgQEAKIAkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MVEFMSzsKIAkJYnJlYWs7CiAKKwljYXNlIDE4OgorCQkvKgorCQkgKiBSRkMgNDMzOCBkZWZpbmVzIGFuIGVuY2Fwc3VsYXRpb24gZm9yIElQIGFuZCBBUlAKKwkJICogcGFja2V0cyB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIHRoZSBSRkMgMjYyNQorCQkgKiBlbmNhcHN1bGF0aW9uLCBidXQgdGhhdCB1c2VzIGEgZGlmZmVyZW50IEFSUAorCQkgKiBoYXJkd2FyZSB0eXBlIGFuZCBoYXJkd2FyZSBhZGRyZXNzZXMuICBUaGF0CisJCSAqIEFSUCBoYXJkd2FyZSB0eXBlIGlzIDE4OyBMaW51eCBkb2Vzbid0IGRlZmluZQorCQkgKiBhbnkgQVJQSFJEXyB2YWx1ZSBhcyAxOCwgYnV0IGlmIGl0IGV2ZXIgb2ZmaWNpYWxseQorCQkgKiBzdXBwb3J0cyBSRkMgNDMzOC1zdHlsZSBJUC1vdmVyLUZDLCBpdCBzaG91bGQgZGVmaW5lCisJCSAqIG9uZS4KKwkJICoKKwkJICogRm9yIG5vdywgd2UgbWFwIGl0IHRvIERMVF9JUF9PVkVSX0ZDLCBpbiB0aGUgaG9wZXMKKwkJICogdGhhdCB0aGlzIHdpbGwgZW5jb3VyYWdlIGl0cyB1c2UgaW4gdGhlIGZ1dHVyZSwKKwkJICogc2hvdWxkIExpbnV4IGV2ZXIgb2ZmaWNpYWxseSBzdXBwb3J0IFJGQyA0MzM4LXN0eWxlCisJCSAqIElQLW92ZXItRkMuCisJCSAqLworCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lQX09WRVJfRkM7CisJCWJyZWFrOworCiAjaWZuZGVmIEFSUEhSRF9GQ1BQCiAjZGVmaW5lIEFSUEhSRF9GQ1BQCTc4NAogI2VuZGlmCkBAIC0xMzQzLDExICsyODc5LDYyIEBACiAjZW5kaWYKIAljYXNlIEFSUEhSRF9GQ0ZBQlJJQzoKIAkJLyoKLQkJICogV2UgYXNzdW1lIHRoYXQgdGhvc2UgYWxsIG1lYW4gUkZDIDI2MjUgSVAtb3Zlci0KLQkJICogRmlicmUgQ2hhbm5lbCwgd2l0aCB0aGUgUkZDIDI2MjUgaGVhZGVyIGF0Ci0JCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldC4KKwkJICogQmFjayBpbiAyMDAyLCBEb25hbGQgTGVlIGF0IENyYXkgd2FudGVkIGEgRExUXyBmb3IKKwkJICogSVAtb3Zlci1GQzoKKwkJICoKKwkJICoJaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL3RjcGR1bXAtd29ya2Vyc0BzYW5kZWxtYW4ub3R0YXdhLm9uLmNhL21zZzAxMDQzLmh0bWwKKwkJICoKKwkJICogYW5kIG9uZSB3YXMgYXNzaWduZWQuCisJCSAqCisJCSAqIEluIGEgbGF0ZXIgcHJpdmF0ZSBkaXNjdXNzaW9uIChzcHVuIG9mZiBmcm9tIGEgbWVzc2FnZQorCQkgKiBvbiB0aGUgZXRoZXJlYWwtdXNlcnMgbGlzdCkgb24gaG93IHRvIGdldCB0aGF0IERMVF8KKwkJICogdmFsdWUgaW4gbGlicGNhcCBvbiBMaW51eCwgSSBlbmRlZCB1cCBkZWNpZGluZyB0aGF0CisJCSAqIHRoZSBiZXN0IHRoaW5nIHRvIGRvIHdvdWxkIGJlIHRvIGhhdmUgaGltIHR3ZWFrIHRoZQorCQkgKiBkcml2ZXIgdG8gc2V0IHRoZSBBUlBIUkRfIHZhbHVlIHRvIHNvbWUgQVJQSFJEX0ZDeHgKKwkJICogdHlwZSwgYW5kIG1hcCBhbGwgdGhvc2UgdHlwZXMgdG8gRExUX0lQX09WRVJfRkM6CisJCSAqCisJCSAqCUkndmUgY2hlY2tlZCBpbnRvIHRoZSBsaWJwY2FwIGFuZCB0Y3BkdW1wIENWUyB0cmVlCisJCSAqCXN1cHBvcnQgZm9yIERMVF9JUF9PVkVSX0ZDLiAgSW4gb3JkZXIgdG8gdXNlIHRoYXQsCisJCSAqCXlvdSdkIGhhdmUgdG8gbW9kaWZ5IHlvdXIgbW9kaWZpZWQgZHJpdmVyIHRvIHJldHVybgorCQkgKglvbmUgb2YgdGhlIEFSUEhSRF9GQ3h4eCB0eXBlcywgaW4gImZjTElOVVhmY3AuYyIgLQorCQkgKgljaGFuZ2UgaXQgdG8gc2V0ICJkZXYtPnR5cGUiIHRvIEFSUEhSRF9GQ0ZBQlJJQywgZm9yCisJCSAqCWV4YW1wbGUgKHRoZSBleGFjdCB2YWx1ZSBkb2Vzbid0IG1hdHRlciwgaXQgY2FuIGJlCisJCSAqCWFueSBvZiBBUlBIUkRfRkNQUCwgQVJQSFJEX0ZDQUwsIEFSUEhSRF9GQ1BMLCBvcgorCQkgKglBUlBIUkRfRkNGQUJSSUMpLgorCQkgKgorCQkgKiAxMSB5ZWFycyBsYXRlciwgQ2hyaXN0aWFuIFN2ZW5zc29uIHdhbnRlZCB0byBtYXAKKwkJICogdmFyaW91cyBBUlBIUkRfIHZhbHVlcyB0byBETFRfRkNfMiBhbmQKKwkJICogRExUX0ZDXzJfV0lUSF9GUkFNRV9ERUxJTVMgZm9yIHJhdyBGaWJyZSBDaGFubmVsCisJCSAqIGZyYW1lczoKKwkJICoKKwkJICoJaHR0cHM6Ly9naXRodWIuY29tL21jci9saWJwY2FwL3B1bGwvMjkKKwkJICoKKwkJICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBuZXR3b3JrIGRyaXZlcnMgdGhhdCB1c2VzCisJCSAqIGFueSBvZiB0aGUgQVJQSFJEX0ZDKiB2YWx1ZXMgZm9yIElQLW92ZXItRkMsIGFuZAorCQkgKiBpdCdzIG5vdCBleGFjdGx5IGNsZWFyIHdoYXQgdGhlICJEdW1teSB0eXBlcyBmb3Igbm9uCisJCSAqIEFSUCBoYXJkd2FyZSIgYXJlIHN1cHBvc2VkIHRvIG1lYW4gKGxpbmstbGF5ZXIKKwkJICogaGVhZGVyIHR5cGU/ICBQaHlzaWNhbCBuZXR3b3JrIHR5cGU/KSwgc28gaXQncworCQkgKiBub3QgZXhhY3RseSBjbGVhciB3aHkgdGhlIEFSUEhSRF9GQyogdHlwZXMgZXhpc3QKKwkJICogaW4gdGhlIGZpcnN0IHBsYWNlLgorCQkgKgorCQkgKiBGb3Igbm93LCB3ZSBtYXAgdGhlbSB0byBETFRfRkNfMiwgYW5kIHByb3ZpZGUgYW4KKwkJICogb3B0aW9uIG9mIERMVF9GQ18yX1dJVEhfRlJBTUVfREVMSU1TLCBhcyB3ZWxsIGFzCisJCSAqIERMVF9JUF9PVkVSX0ZDIGp1c3QgaW4gY2FzZSB0aGVyZSdzIHNvbWUgb2xkCisJCSAqIGRyaXZlciBvdXQgdGhlcmUgdGhhdCB1c2VzIG9uZSBvZiB0aG9zZSB0eXBlcyBmb3IKKwkJICogSVAtb3Zlci1GQyBvbiB3aGljaCBzb21lYm9keSB3YW50cyB0byBjYXB0dXJlCisJCSAqIHBhY2tldHMuCiAJCSAqLwotCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lQX09WRVJfRkM7CisJCWhhbmRsZS0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkJLyoKKwkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KKwkJICovCisJCWlmIChoYW5kbGUtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJCWhhbmRsZS0+ZGx0X2xpc3RbMF0gPSBETFRfRkNfMjsKKwkJCWhhbmRsZS0+ZGx0X2xpc3RbMV0gPSBETFRfRkNfMl9XSVRIX0ZSQU1FX0RFTElNUzsKKwkJCWhhbmRsZS0+ZGx0X2xpc3RbMl0gPSBETFRfSVBfT1ZFUl9GQzsKKwkJCWhhbmRsZS0+ZGx0X2NvdW50ID0gMzsKKwkJfQorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0ZDXzI7CiAJCWJyZWFrOwogCiAjaWZuZGVmIEFSUEhSRF9JUkRBCkBAIC0xMzU4LDcgKzI5NDUsNyBAQAogCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0xJTlVYX0lSREE7CiAJCS8qIFdlIG5lZWQgdG8gc2F2ZSBwYWNrZXQgZGlyZWN0aW9uIGZvciBJckRBIGRlY29kaW5nLAogCQkgKiBzbyBsZXQncyB1c2UgIkxpbnV4LWNvb2tlZCIgbW9kZS4gSmVhbiBJSSAqLwotCQkvL2hhbmRsZS0+bWQuY29va2VkID0gMTsKKwkJLy9oYW5kbGVwLT5jb29rZWQgPSAxOwogCQlicmVhazsKIAogCS8qIEFSUEhSRF9MQVBEIGlzIHVub2ZmaWNpYWwgYW5kIHJhbmRvbWx5IGFsbG9jYXRlZCwgaWYgcmVhbGxvY2F0aW9uCkBAIC0xMzcxLDYgKzI5NTgsMjQgQEAKIAkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MSU5VWF9MQVBEOwogCQlicmVhazsKIAorI2lmbmRlZiBBUlBIUkRfTk9ORQorI2RlZmluZSBBUlBIUkRfTk9ORQkweEZGRkUKKyNlbmRpZgorCWNhc2UgQVJQSFJEX05PTkU6CisJCS8qCisJCSAqIE5vIGxpbmstbGF5ZXIgaGVhZGVyOyBwYWNrZXRzIGFyZSBqdXN0IElQCisJCSAqIHBhY2tldHMsIHNvIHVzZSBETFRfUkFXLgorCQkgKi8KKwkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9SQVc7CisJCWJyZWFrOworCisjaWZuZGVmIEFSUEhSRF9JRUVFODAyMTU0CisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTU0ICAgICAgODA0CisjZW5kaWYKKyAgICAgICBjYXNlIEFSUEhSRF9JRUVFODAyMTU0OgorICAgICAgICAgICAgICAgaGFuZGxlLT5saW5rdHlwZSA9ICBETFRfSUVFRTgwMl8xNV80X05PRkNTOworICAgICAgICAgICAgICAgYnJlYWs7CisKIAlkZWZhdWx0OgogCQloYW5kbGUtPmxpbmt0eXBlID0gLTE7CiAJCWJyZWFrOwpAQCAtMTM4MCwyMjYgKzI5ODUsMTY2MCBAQAogLyogPT09PT0gRnVuY3Rpb25zIHRvIGludGVyZmFjZSB0byB0aGUgbmV3ZXIga2VybmVscyA9PT09PT09PT09PT09PT09PT0gKi8KIAogLyoKLSAqICBUcnkgdG8gb3BlbiBhIHBhY2tldCBzb2NrZXQgdXNpbmcgdGhlIG5ldyBrZXJuZWwgaW50ZXJmYWNlLgotICogIFJldHVybnMgMCBvbiBmYWlsdXJlLgotICogIEZJWE1FOiAwIHVzZXMgdG8gbWVhbiBzdWNjZXNzIChTZWJhc3RpYW4pCisgKiBUcnkgdG8gb3BlbiBhIHBhY2tldCBzb2NrZXQgdXNpbmcgdGhlIG5ldyBrZXJuZWwgUEZfUEFDS0VUIGludGVyZmFjZS4KKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGFuIGVycm9yIHRoYXQgbWVhbnMgdGhlIG5ldyBpbnRlcmZhY2UgaXNuJ3QKKyAqIHByZXNlbnQgKHNvIHRoZSBvbGQgU09DS19QQUNLRVQgaW50ZXJmYWNlIHNob3VsZCBiZSB0cmllZCksIGFuZCBhCisgKiBQQ0FQX0VSUk9SXyB2YWx1ZSBvbiBhbiBlcnJvciB0aGF0IG1lYW5zIHRoYXQgdGhlIG9sZCBtZWNoYW5pc20gd29uJ3QKKyAqIHdvcmsgZWl0aGVyIChzbyBpdCBzaG91bGRuJ3QgYmUgdHJpZWQpLgogICovCiBzdGF0aWMgaW50Ci1saXZlX29wZW5fbmV3KHBjYXBfdCAqaGFuZGxlLCBjb25zdCBjaGFyICpkZXZpY2UsIGludCBwcm9taXNjLAotCSAgICAgIGludCB0b19tcywgY2hhciAqZWJ1ZikKK2FjdGl2YXRlX25ldyhwY2FwX3QgKmhhbmRsZSkKIHsKICNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJY29uc3QgY2hhcgkJKmRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwlpbnQJCQlpc19hbnlfZGV2aWNlID0gKHN0cmNtcChkZXZpY2UsICJhbnkiKSA9PSAwKTsKIAlpbnQJCQlzb2NrX2ZkID0gLTEsIGFycHR5cGU7Ci0JaW50CQkJZXJyOwotCWludAkJCWZhdGFsX2VyciA9IDA7CisjaWZkZWYgSEFWRV9QQUNLRVRfQVVYREFUQQorCWludAkJCXZhbDsKKyNlbmRpZgorCWludAkJCWVyciA9IDA7CiAJc3RydWN0IHBhY2tldF9tcmVxCW1yOwogCi0JLyogT25lIHNob3QgbG9vcCB1c2VkIGZvciBlcnJvciBoYW5kbGluZyAtIGJhaWwgb3V0IHdpdGggYnJlYWsgKi8KKwkvKgorCSAqIE9wZW4gYSBzb2NrZXQgd2l0aCBwcm90b2NvbCBmYW1pbHkgcGFja2V0LiBJZiB0aGUKKwkgKiAiYW55IiBkZXZpY2Ugd2FzIHNwZWNpZmllZCwgd2Ugb3BlbiBhIFNPQ0tfREdSQU0KKwkgKiBzb2NrZXQgZm9yIHRoZSBjb29rZWQgaW50ZXJmYWNlLCBvdGhlcndpc2Ugd2UgZmlyc3QKKwkgKiB0cnkgYSBTT0NLX1JBVyBzb2NrZXQgZm9yIHRoZSByYXcgaW50ZXJmYWNlLgorCSAqLworCXNvY2tfZmQgPSBpc19hbnlfZGV2aWNlID8KKwkJc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgaHRvbnMoRVRIX1BfQUxMKSkgOgorCQlzb2NrZXQoUEZfUEFDS0VULCBTT0NLX1JBVywgaHRvbnMoRVRIX1BfQUxMKSk7CiAKLQlkbyB7Ci0JCS8qCi0JCSAqIE9wZW4gYSBzb2NrZXQgd2l0aCBwcm90b2NvbCBmYW1pbHkgcGFja2V0LiBJZiBhIGRldmljZSBpcwotCQkgKiBnaXZlbiB3ZSB0cnkgdG8gb3BlbiBpdCBpbiByYXcgbW9kZSBvdGhlcndpc2Ugd2UgdXNlCi0JCSAqIHRoZSBjb29rZWQgaW50ZXJmYWNlLgotCQkgKi8KLQkJc29ja19mZCA9IGRldmljZSA/Ci0JCQlzb2NrZXQoUEZfUEFDS0VULCBTT0NLX1JBVywgaHRvbnMoRVRIX1BfQUxMKSkKLQkJICAgICAgOiBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCBodG9ucyhFVEhfUF9BTEwpKTsKLQotCQlpZiAoc29ja19mZCA9PSAtMSkgewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNvY2tldDogJXMiLAotCQkJCSBwY2FwX3N0cmVycm9yKGVycm5vKSApOwotCQkJYnJlYWs7CisJaWYgKHNvY2tfZmQgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFQUZOT1NVUFBPUlQpIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBzdXBwb3J0IFBGX1BBQ0tFVC9TT0NLX3doYXRldmVyCisJCQkgKiBzb2NrZXRzOyB0cnkgdGhlIG9sZCBtZWNoYW5pc20uCisJCQkgKi8KKwkJCXJldHVybiAwOwogCQl9CiAKLQkJLyogSXQgc2VlbXMgdGhlIGtlcm5lbCBzdXBwb3J0cyB0aGUgbmV3IGludGVyZmFjZS4gKi8KLQkJaGFuZGxlLT5tZC5zb2NrX3BhY2tldCA9IDA7Ci0KLQkJLyoKLQkJICogR2V0IHRoZSBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGxvb3BiYWNrIGRldmljZS4KLQkJICogSWYgdGhlIGF0dGVtcHQgZmFpbHMsIGRvbid0IGZhaWwsIGp1c3Qgc2V0IHRoZQotCQkgKiAibWQubG9faWZpbmRleCIgdG8gLTEuCi0JCSAqCi0JCSAqIFhYWCAtIGNhbiB0aGVyZSBiZSBtb3JlIHRoYW4gb25lIGRldmljZSB0aGF0IGxvb3BzCi0JCSAqIHBhY2tldHMgYmFjaywgaS5lLiBkZXZpY2VzIG90aGVyIHRoYW4gImxvIj8gIElmIHNvLAotCQkgKiB3ZSdkIG5lZWQgdG8gZmluZCB0aGVtIGFsbCwgYW5kIGhhdmUgYW4gYXJyYXkgb2YKLQkJICogaW5kaWNlcyBmb3IgdGhlbSwgYW5kIGNoZWNrIGFsbCBvZiB0aGVtIGluCi0JCSAqICJwY2FwX3JlYWRfcGFja2V0KCkiLgotCQkgKi8KLQkJaGFuZGxlLT5tZC5sb19pZmluZGV4ID0gaWZhY2VfZ2V0X2lkKHNvY2tfZmQsICJsbyIsIGVidWYpOwotCi0JCS8qCi0JCSAqIERlZmF1bHQgdmFsdWUgZm9yIG9mZnNldCB0byBhbGlnbiBsaW5rLWxheWVyIHBheWxvYWQKLQkJICogb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0JCSAqLwotCQloYW5kbGUtPm9mZnNldAkgPSAwOwotCi0JCS8qCi0JCSAqIFdoYXQga2luZCBvZiBmcmFtZXMgZG8gd2UgaGF2ZSB0byBkZWFsIHdpdGg/IEZhbGwgYmFjawotCQkgKiB0byBjb29rZWQgbW9kZSBpZiB3ZSBoYXZlIGFuIHVua25vd24gaW50ZXJmYWNlIHR5cGUuCi0JCSAqLwotCi0JCWlmIChkZXZpY2UpIHsKLQkJCS8qIEFzc3VtZSBmb3Igbm93IHdlIGRvbid0IG5lZWQgY29va2VkIG1vZGUuICovCi0JCQloYW5kbGUtPm1kLmNvb2tlZCA9IDA7Ci0KLQkJCWFycHR5cGUJPSBpZmFjZV9nZXRfYXJwdHlwZShzb2NrX2ZkLCBkZXZpY2UsIGVidWYpOwotCQkJaWYgKGFycHR5cGUgPT0gLTEpIHsKLQkJCQlmYXRhbF9lcnIgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbWFwX2FycGhyZF90b19kbHQoaGFuZGxlLCBhcnB0eXBlLCAxKTsKLQkJCWlmIChoYW5kbGUtPmxpbmt0eXBlID09IC0xIHx8Ci0JCQkgICAgaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfTElOVVhfU0xMIHx8Ci0JCQkgICAgaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfTElOVVhfSVJEQSB8fAotCQkJICAgIGhhbmRsZS0+bGlua3R5cGUgPT0gRExUX0xJTlVYX0xBUEQgfHwKLQkJCSAgICAoaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfRU4xME1CICYmCi0JCQkgICAgIChzdHJuY21wKCJpc2RuIiwgZGV2aWNlLCA0KSA9PSAwIHx8Ci0JCQkgICAgICBzdHJuY21wKCJpc2RZIiwgZGV2aWNlLCA0KSA9PSAwKSkpIHsKLQkJCQkvKgotCQkJCSAqIFVua25vd24gaW50ZXJmYWNlIHR5cGUgKC0xKSwgb3IgYQotCQkJCSAqIGRldmljZSB3ZSBleHBsaWNpdGx5IGNob3NlIHRvIHJ1bgotCQkJCSAqIGluIGNvb2tlZCBtb2RlIChlLmcuLCBQUFAgZGV2aWNlcyksCi0JCQkJICogb3IgYW4gSVNETiBkZXZpY2UgKHdob3NlIGxpbmstbGF5ZXIKLQkJCQkgKiB0eXBlIHdlIGNhbiBvbmx5IGRldGVybWluZSBieSB1c2luZwotCQkJCSAqIEFQSXMgdGhhdCBtYXkgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudAotCQkJCSAqIGtlcm5lbHMpIC0gcmVvcGVuIGluIGNvb2tlZCBtb2RlLgotCQkJCSAqLwotCQkJCWlmIChjbG9zZShzb2NrX2ZkKSA9PSAtMSkgewotCQkJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCQkJICJjbG9zZTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzb2NrX2ZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwKLQkJCQkJCSBodG9ucyhFVEhfUF9BTEwpKTsKLQkJCQlpZiAoc29ja19mZCA9PSAtMSkgewotCQkJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCQkJICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaGFuZGxlLT5tZC5jb29rZWQgPSAxOwotCi0JCQkJLyoKLQkJCQkgKiBHZXQgcmlkIG9mIGFueSBsaW5rLWxheWVyIHR5cGUgbGlzdAotCQkJCSAqIHdlIGFsbG9jYXRlZCAtIHRoaXMgb25seSBzdXBwb3J0cyBjb29rZWQKLQkJCQkgKiBjYXB0dXJlLgotCQkJCSAqLwotCQkJCWlmIChoYW5kbGUtPmRsdF9saXN0ICE9IE5VTEwpIHsKLQkJCQkJZnJlZShoYW5kbGUtPmRsdF9saXN0KTsKLQkJCQkJaGFuZGxlLT5kbHRfbGlzdCA9IE5VTEw7Ci0JCQkJCWhhbmRsZS0+ZGx0X2NvdW50ID0gMDsKLQkJCQl9Ci0KLQkJCQlpZiAoaGFuZGxlLT5saW5rdHlwZSA9PSAtMSkgewotCQkJCQkvKgotCQkJCQkgKiBXYXJuIHRoYXQgd2UncmUgZmFsbGluZyBiYWNrIG9uCi0JCQkJCSAqIGNvb2tlZCBtb2RlOyB3ZSBtYXkgd2FudCB0bwotCQkJCQkgKiB1cGRhdGUgIm1hcF9hcnBocmRfdG9fZGx0KCkiCi0JCQkJCSAqIHRvIGhhbmRsZSB0aGUgbmV3IHR5cGUuCi0JCQkJCSAqLwotCQkJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCQkJImFycHR5cGUgJWQgbm90ICIKLQkJCQkJCSJzdXBwb3J0ZWQgYnkgbGlicGNhcCAtICIKLQkJCQkJCSJmYWxsaW5nIGJhY2sgdG8gY29va2VkICIKLQkJCQkJCSJzb2NrZXQiLAotCQkJCQkJYXJwdHlwZSk7Ci0JCQkJfQotCQkJCS8qIElyREEgY2FwdHVyZSBpcyBub3QgYSByZWFsICJjb29rZWQiIGNhcHR1cmUsCi0JCQkJICogaXQncyBJckxBUCBmcmFtZXMsIG5vdCBJUCBwYWNrZXRzLiAqLwotCQkJCWlmIChoYW5kbGUtPmxpbmt0eXBlICE9IERMVF9MSU5VWF9JUkRBICYmCi0JCQkgICAgCQloYW5kbGUtPmxpbmt0eXBlICE9IERMVF9MSU5VWF9MQVBEKQotCQkJCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0xJTlVYX1NMTDsKLQkJCX0KLQotCQkJaGFuZGxlLT5tZC5pZmluZGV4ID0gaWZhY2VfZ2V0X2lkKHNvY2tfZmQsIGRldmljZSwgZWJ1Zik7Ci0JCQlpZiAoaGFuZGxlLT5tZC5pZmluZGV4ID09IC0xKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoKGVyciA9IGlmYWNlX2JpbmQoc29ja19mZCwgaGFuZGxlLT5tZC5pZmluZGV4LAotCQkJICAgIGVidWYpKSA8IDApIHsKLQkJCQlpZiAoZXJyID09IC0yKQotCQkJCQlmYXRhbF9lcnIgPSAxOwotCQkJCWJyZWFrOwotCQkJfQorCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNvY2tldDogJXMiLAorCQkJIHBjYXBfc3RyZXJyb3IoZXJybm8pICk7CisJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpIHsKKwkJCS8qCisJCQkgKiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gdGhlCisJCQkgKiBzb2NrZXQuCisJCQkgKi8KKwkJCXJldHVybiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOwogCQl9IGVsc2UgewogCQkJLyoKLQkJCSAqIFRoaXMgaXMgY29va2VkIG1vZGUuCisJCQkgKiBPdGhlciBlcnJvci4KIAkJCSAqLwotCQkJaGFuZGxlLT5tZC5jb29rZWQgPSAxOwotCQkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MSU5VWF9TTEw7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCX0KKworCS8qIEl0IHNlZW1zIHRoZSBrZXJuZWwgc3VwcG9ydHMgdGhlIG5ldyBpbnRlcmZhY2UuICovCisJaGFuZGxlcC0+c29ja19wYWNrZXQgPSAwOworCisJLyoKKwkgKiBHZXQgdGhlIGludGVyZmFjZSBpbmRleCBvZiB0aGUgbG9vcGJhY2sgZGV2aWNlLgorCSAqIElmIHRoZSBhdHRlbXB0IGZhaWxzLCBkb24ndCBmYWlsLCBqdXN0IHNldCB0aGUKKwkgKiAiaGFuZGxlcC0+bG9faWZpbmRleCIgdG8gLTEuCisJICoKKwkgKiBYWFggLSBjYW4gdGhlcmUgYmUgbW9yZSB0aGFuIG9uZSBkZXZpY2UgdGhhdCBsb29wcworCSAqIHBhY2tldHMgYmFjaywgaS5lLiBkZXZpY2VzIG90aGVyIHRoYW4gImxvIj8gIElmIHNvLAorCSAqIHdlJ2QgbmVlZCB0byBmaW5kIHRoZW0gYWxsLCBhbmQgaGF2ZSBhbiBhcnJheSBvZgorCSAqIGluZGljZXMgZm9yIHRoZW0sIGFuZCBjaGVjayBhbGwgb2YgdGhlbSBpbgorCSAqICJwY2FwX3JlYWRfcGFja2V0KCkiLgorCSAqLworCWhhbmRsZXAtPmxvX2lmaW5kZXggPSBpZmFjZV9nZXRfaWQoc29ja19mZCwgImxvIiwgaGFuZGxlLT5lcnJidWYpOworCisJLyoKKwkgKiBEZWZhdWx0IHZhbHVlIGZvciBvZmZzZXQgdG8gYWxpZ24gbGluay1sYXllciBwYXlsb2FkCisJICogb24gYSA0LWJ5dGUgYm91bmRhcnkuCisJICovCisJaGFuZGxlLT5vZmZzZXQJID0gMDsKKworCS8qCisJICogV2hhdCBraW5kIG9mIGZyYW1lcyBkbyB3ZSBoYXZlIHRvIGRlYWwgd2l0aD8gRmFsbCBiYWNrCisJICogdG8gY29va2VkIG1vZGUgaWYgd2UgaGF2ZSBhbiB1bmtub3duIGludGVyZmFjZSB0eXBlCisJICogb3IgYSB0eXBlIHdlIGtub3cgZG9lc24ndCB3b3JrIHdlbGwgaW4gcmF3IG1vZGUuCisJICovCisJaWYgKCFpc19hbnlfZGV2aWNlKSB7CisJCS8qIEFzc3VtZSBmb3Igbm93IHdlIGRvbid0IG5lZWQgY29va2VkIG1vZGUuICovCisJCWhhbmRsZXAtPmNvb2tlZCA9IDA7CisKKwkJaWYgKGhhbmRsZS0+b3B0LnJmbW9uKSB7CisJCQkvKgorCQkJICogV2Ugd2VyZSBhc2tlZCB0byB0dXJuIG9uIG1vbml0b3IgbW9kZS4KKwkJCSAqIERvIHNvIGJlZm9yZSB3ZSBnZXQgdGhlIGxpbmstbGF5ZXIgdHlwZSwKKwkJCSAqIGJlY2F1c2UgZW50ZXJpbmcgbW9uaXRvciBtb2RlIGNvdWxkIGNoYW5nZQorCQkJICogdGhlIGxpbmstbGF5ZXIgdHlwZS4KKwkJCSAqLworCQkJZXJyID0gZW50ZXJfcmZtb25fbW9kZShoYW5kbGUsIHNvY2tfZmQsIGRldmljZSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCS8qIEhhcmQgZmFpbHVyZSAqLworCQkJCWNsb3NlKHNvY2tfZmQpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlpZiAoZXJyID09IDApIHsKKwkJCQkvKgorCQkJCSAqIE5vdGhpbmcgd29ya2VkIGZvciB0dXJuaW5nIG1vbml0b3IgbW9kZQorCQkJCSAqIG9uLgorCQkJCSAqLworCQkJCWNsb3NlKHNvY2tfZmQpOworCQkJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJCX0KIAogCQkJLyoKLQkJCSAqIFdlJ3JlIG5vdCBib3VuZCB0byBhIGRldmljZS4KLQkJCSAqIFhYWCAtIHRydWU/ICBPciB0cnVlIG9ubHkgaWYgd2UncmUgdXNpbmcKLQkJCSAqIHRoZSAiYW55IiBkZXZpY2U/Ci0JCQkgKiBGb3Igbm93LCB3ZSdyZSB1c2luZyB0aGlzIGFzIGFuIGluZGljYXRpb24KLQkJCSAqIHRoYXQgd2UgY2FuJ3QgdHJhbnNtaXQ7IHN0b3AgZG9pbmcgdGhhdCBvbmx5Ci0JCQkgKiBpZiB3ZSBmaWd1cmUgb3V0IGhvdyB0byB0cmFuc21pdCBpbiBjb29rZWQKLQkJCSAqIG1vZGUuCisJCQkgKiBFaXRoZXIgbW9uaXRvciBtb2RlIGhhcyBiZWVuIHR1cm5lZCBvbiBmb3IKKwkJCSAqIHRoZSBkZXZpY2UsIG9yIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBkaWZmZXJlbnQKKwkJCSAqIGRldmljZSB0byBvcGVuIGZvciBtb25pdG9yIG1vZGUuICBJZiB3ZSd2ZQorCQkJICogYmVlbiBnaXZlbiBhIGRpZmZlcmVudCBkZXZpY2UsIHVzZSBpdC4KIAkJCSAqLwotCQkJaGFuZGxlLT5tZC5pZmluZGV4ID0gLTE7CisJCQlpZiAoaGFuZGxlcC0+bW9uZGV2aWNlICE9IE5VTEwpCisJCQkJZGV2aWNlID0gaGFuZGxlcC0+bW9uZGV2aWNlOwogCQl9Ci0KLQkJLyoKLQkJICogU2VsZWN0IHByb21pc2N1b3VzIG1vZGUgb24gaWYgInByb21pc2MiIGlzIHNldC4KLQkJICoKLQkJICogRG8gbm90IHR1cm4gYWxsbXVsdGkgbW9kZSBvbiBpZiB3ZSBkb24ndCBzZWxlY3QKLQkJICogcHJvbWlzY3VvdXMgbW9kZSAtIG9uIHNvbWUgZGV2aWNlcyAoZS5nLiwgT3Jpbm9jbwotCQkgKiB3aXJlbGVzcyBpbnRlcmZhY2VzKSwgYWxsbXVsdGkgbW9kZSBpc24ndCBzdXBwb3J0ZWQKLQkJICogYW5kIHRoZSBkcml2ZXIgaW1wbGVtZW50cyBpdCBieSB0dXJuaW5nIHByb21pc2N1b3VzCi0JCSAqIG1vZGUgb24sIGFuZCB0aGF0IHNjcmV3cyB1cCB0aGUgb3BlcmF0aW9uIG9mIHRoZQotCQkgKiBjYXJkIGFzIGEgbm9ybWFsIG5ldHdvcmtpbmcgaW50ZXJmYWNlLCBhbmQgb24gbm8KLQkJICogb3RoZXIgcGxhdGZvcm0gSSBrbm93IG9mIGRvZXMgc3RhcnRpbmcgYSBub24tCi0JCSAqIHByb21pc2N1b3VzIGNhcHR1cmUgYWZmZWN0IHdoaWNoIG11bHRpY2FzdCBwYWNrZXRzCi0JCSAqIGFyZSByZWNlaXZlZCBieSB0aGUgaW50ZXJmYWNlLgotCQkgKi8KLQotCQkvKgotCQkgKiBIbW0sIGhvdyBjYW4gd2Ugc2V0IHByb21pc2N1b3VzIG1vZGUgb24gYWxsIGludGVyZmFjZXM/Ci0JCSAqIEkgYW0gbm90IHN1cmUgaWYgdGhhdCBpcyBwb3NzaWJsZSBhdCBhbGwuCi0JCSAqLwotCi0JCWlmIChkZXZpY2UgJiYgcHJvbWlzYykgewotCQkJbWVtc2V0KCZtciwgMCwgc2l6ZW9mKG1yKSk7Ci0JCQltci5tcl9pZmluZGV4ID0gaGFuZGxlLT5tZC5pZmluZGV4OwotCQkJbXIubXJfdHlwZSAgICA9IFBBQ0tFVF9NUl9QUk9NSVNDOwotCQkJaWYgKHNldHNvY2tvcHQoc29ja19mZCwgU09MX1BBQ0tFVCwKLQkJCQlQQUNLRVRfQUREX01FTUJFUlNISVAsICZtciwgc2l6ZW9mKG1yKSkgPT0gLTEpCi0JCQl7Ci0JCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkJInNldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJCWJyZWFrOworCQlhcnB0eXBlCT0gaWZhY2VfZ2V0X2FycHR5cGUoc29ja19mZCwgZGV2aWNlLCBoYW5kbGUtPmVycmJ1Zik7CisJCWlmIChhcnB0eXBlIDwgMCkgeworCQkJY2xvc2Uoc29ja19mZCk7CisJCQlyZXR1cm4gYXJwdHlwZTsKKwkJfQorCQltYXBfYXJwaHJkX3RvX2RsdChoYW5kbGUsIGFycHR5cGUsIDEpOworCQlpZiAoaGFuZGxlLT5saW5rdHlwZSA9PSAtMSB8fAorCQkgICAgaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfTElOVVhfU0xMIHx8CisJCSAgICBoYW5kbGUtPmxpbmt0eXBlID09IERMVF9MSU5VWF9JUkRBIHx8CisJCSAgICBoYW5kbGUtPmxpbmt0eXBlID09IERMVF9MSU5VWF9MQVBEIHx8CisJCSAgICAoaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfRU4xME1CICYmCisJCSAgICAgKHN0cm5jbXAoImlzZG4iLCBkZXZpY2UsIDQpID09IDAgfHwKKwkJICAgICAgc3RybmNtcCgiaXNkWSIsIGRldmljZSwgNCkgPT0gMCkpKSB7CisJCQkvKgorCQkJICogVW5rbm93biBpbnRlcmZhY2UgdHlwZSAoLTEpLCBvciBhCisJCQkgKiBkZXZpY2Ugd2UgZXhwbGljaXRseSBjaG9zZSB0byBydW4KKwkJCSAqIGluIGNvb2tlZCBtb2RlIChlLmcuLCBQUFAgZGV2aWNlcyksCisJCQkgKiBvciBhbiBJU0ROIGRldmljZSAod2hvc2UgbGluay1sYXllcgorCQkJICogdHlwZSB3ZSBjYW4gb25seSBkZXRlcm1pbmUgYnkgdXNpbmcKKwkJCSAqIEFQSXMgdGhhdCBtYXkgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudAorCQkJICoga2VybmVscykgLSByZW9wZW4gaW4gY29va2VkIG1vZGUuCisJCQkgKi8KKwkJCWlmIChjbG9zZShzb2NrX2ZkKSA9PSAtMSkgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgImNsb3NlOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJCX0KKwkJCXNvY2tfZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLAorCQkJICAgIGh0b25zKEVUSF9QX0FMTCkpOworCQkJaWYgKHNvY2tfZmQgPT0gLTEpIHsKKwkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykgeworCQkJCQkvKgorCQkJCQkgKiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvCisJCQkJCSAqIG9wZW4gdGhlIHNvY2tldC4KKwkJCQkJICovCisJCQkJCXJldHVybiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIE90aGVyIGVycm9yLgorCQkJCQkgKi8KKwkJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQkJfQorCQkJfQorCQkJaGFuZGxlcC0+Y29va2VkID0gMTsKKworCQkJLyoKKwkJCSAqIEdldCByaWQgb2YgYW55IGxpbmstbGF5ZXIgdHlwZSBsaXN0CisJCQkgKiB3ZSBhbGxvY2F0ZWQgLSB0aGlzIG9ubHkgc3VwcG9ydHMgY29va2VkCisJCQkgKiBjYXB0dXJlLgorCQkJICovCisJCQlpZiAoaGFuZGxlLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCQkJZnJlZShoYW5kbGUtPmRsdF9saXN0KTsKKwkJCQloYW5kbGUtPmRsdF9saXN0ID0gTlVMTDsKKwkJCQloYW5kbGUtPmRsdF9jb3VudCA9IDA7CisJCQl9CisKKwkJCWlmIChoYW5kbGUtPmxpbmt0eXBlID09IC0xKSB7CisJCQkJLyoKKwkJCQkgKiBXYXJuIHRoYXQgd2UncmUgZmFsbGluZyBiYWNrIG9uCisJCQkJICogY29va2VkIG1vZGU7IHdlIG1heSB3YW50IHRvCisJCQkJICogdXBkYXRlICJtYXBfYXJwaHJkX3RvX2RsdCgpIgorCQkJCSAqIHRvIGhhbmRsZSB0aGUgbmV3IHR5cGUuCisJCQkJICovCisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJhcnB0eXBlICVkIG5vdCAiCisJCQkJCSJzdXBwb3J0ZWQgYnkgbGlicGNhcCAtICIKKwkJCQkJImZhbGxpbmcgYmFjayB0byBjb29rZWQgIgorCQkJCQkic29ja2V0IiwKKwkJCQkJYXJwdHlwZSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJckRBIGNhcHR1cmUgaXMgbm90IGEgcmVhbCAiY29va2VkIiBjYXB0dXJlLAorCQkJICogaXQncyBJckxBUCBmcmFtZXMsIG5vdCBJUCBwYWNrZXRzLiAgVGhlCisJCQkgKiBzYW1lIGFwcGxpZXMgdG8gTEFQRCBjYXB0dXJlLgorCQkJICovCisJCQlpZiAoaGFuZGxlLT5saW5rdHlwZSAhPSBETFRfTElOVVhfSVJEQSAmJgorCQkJICAgIGhhbmRsZS0+bGlua3R5cGUgIT0gRExUX0xJTlVYX0xBUEQpCisJCQkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MSU5VWF9TTEw7CiAJCX0KIAotCQkvKiBTYXZlIHRoZSBzb2NrZXQgRkQgaW4gdGhlIHBjYXAgc3RydWN0dXJlICovCisJCWhhbmRsZXAtPmlmaW5kZXggPSBpZmFjZV9nZXRfaWQoc29ja19mZCwgZGV2aWNlLAorCQkgICAgaGFuZGxlLT5lcnJidWYpOworCQlpZiAoaGFuZGxlcC0+aWZpbmRleCA9PSAtMSkgeworCQkJY2xvc2Uoc29ja19mZCk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQogCi0JCWhhbmRsZS0+ZmQgCSA9IHNvY2tfZmQ7Ci0KLQkJcmV0dXJuIDE7Ci0KLQl9IHdoaWxlKDApOwotCi0JaWYgKHNvY2tfZmQgIT0gLTEpCi0JCWNsb3NlKHNvY2tfZmQpOwotCi0JaWYgKGZhdGFsX2VycikgeworCQlpZiAoKGVyciA9IGlmYWNlX2JpbmQoc29ja19mZCwgaGFuZGxlcC0+aWZpbmRleCwKKwkJICAgIGhhbmRsZS0+ZXJyYnVmKSkgIT0gMSkgeworCQkgICAgCWNsb3NlKHNvY2tfZmQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsJLyogdHJ5IG9sZCBtZWNoYW5pc20gKi8KKwkJfQorCX0gZWxzZSB7CiAJCS8qCi0JCSAqIEdldCByaWQgb2YgYW55IGxpbmstbGF5ZXIgdHlwZSBsaXN0IHdlIGFsbG9jYXRlZC4KKwkJICogVGhlICJhbnkiIGRldmljZS4KIAkJICovCi0JCWlmIChoYW5kbGUtPmRsdF9saXN0ICE9IE5VTEwpCi0JCQlmcmVlKGhhbmRsZS0+ZGx0X2xpc3QpOwotCQlyZXR1cm4gLTI7Ci0JfSBlbHNlCi0JCXJldHVybiAwOwotI2Vsc2UKKwkJaWYgKGhhbmRsZS0+b3B0LnJmbW9uKSB7CisJCQkvKgorCQkJICogSXQgZG9lc24ndCBzdXBwb3J0IG1vbml0b3IgbW9kZS4KKwkJCSAqLworCQkJcmV0dXJuIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCQl9CisKKwkJLyoKKwkJICogSXQgdXNlcyBjb29rZWQgbW9kZS4KKwkJICovCisJCWhhbmRsZXAtPmNvb2tlZCA9IDE7CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfTElOVVhfU0xMOworCisJCS8qCisJCSAqIFdlJ3JlIG5vdCBib3VuZCB0byBhIGRldmljZS4KKwkJICogRm9yIG5vdywgd2UncmUgdXNpbmcgdGhpcyBhcyBhbiBpbmRpY2F0aW9uCisJCSAqIHRoYXQgd2UgY2FuJ3QgdHJhbnNtaXQ7IHN0b3AgZG9pbmcgdGhhdCBvbmx5CisJCSAqIGlmIHdlIGZpZ3VyZSBvdXQgaG93IHRvIHRyYW5zbWl0IGluIGNvb2tlZAorCQkgKiBtb2RlLgorCQkgKi8KKwkJaGFuZGxlcC0+aWZpbmRleCA9IC0xOworCX0KKworCS8qCisJICogU2VsZWN0IHByb21pc2N1b3VzIG1vZGUgb24gaWYgInByb21pc2MiIGlzIHNldC4KKwkgKgorCSAqIERvIG5vdCB0dXJuIGFsbG11bHRpIG1vZGUgb24gaWYgd2UgZG9uJ3Qgc2VsZWN0CisJICogcHJvbWlzY3VvdXMgbW9kZSAtIG9uIHNvbWUgZGV2aWNlcyAoZS5nLiwgT3Jpbm9jbworCSAqIHdpcmVsZXNzIGludGVyZmFjZXMpLCBhbGxtdWx0aSBtb2RlIGlzbid0IHN1cHBvcnRlZAorCSAqIGFuZCB0aGUgZHJpdmVyIGltcGxlbWVudHMgaXQgYnkgdHVybmluZyBwcm9taXNjdW91cworCSAqIG1vZGUgb24sIGFuZCB0aGF0IHNjcmV3cyB1cCB0aGUgb3BlcmF0aW9uIG9mIHRoZQorCSAqIGNhcmQgYXMgYSBub3JtYWwgbmV0d29ya2luZyBpbnRlcmZhY2UsIGFuZCBvbiBubworCSAqIG90aGVyIHBsYXRmb3JtIEkga25vdyBvZiBkb2VzIHN0YXJ0aW5nIGEgbm9uLQorCSAqIHByb21pc2N1b3VzIGNhcHR1cmUgYWZmZWN0IHdoaWNoIG11bHRpY2FzdCBwYWNrZXRzCisJICogYXJlIHJlY2VpdmVkIGJ5IHRoZSBpbnRlcmZhY2UuCisJICovCisKKwkvKgorCSAqIEhtbSwgaG93IGNhbiB3ZSBzZXQgcHJvbWlzY3VvdXMgbW9kZSBvbiBhbGwgaW50ZXJmYWNlcz8KKwkgKiBJIGFtIG5vdCBzdXJlIGlmIHRoYXQgaXMgcG9zc2libGUgYXQgYWxsLiAgRm9yIG5vdywgd2UKKwkgKiBzaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gdHVybiBwcm9taXNjdW91cyBtb2RlIG9uCisJICogZm9yIHRoZSAiYW55IiBkZXZpY2UgKHNvIHlvdSBkb24ndCBoYXZlIHRvIGV4cGxpY2l0bHkKKwkgKiBkaXNhYmxlIGl0IGluIHByb2dyYW1zIHN1Y2ggYXMgdGNwZHVtcCkuCisJICovCisKKwlpZiAoIWlzX2FueV9kZXZpY2UgJiYgaGFuZGxlLT5vcHQucHJvbWlzYykgeworCQltZW1zZXQoJm1yLCAwLCBzaXplb2YobXIpKTsKKwkJbXIubXJfaWZpbmRleCA9IGhhbmRsZXAtPmlmaW5kZXg7CisJCW1yLm1yX3R5cGUgICAgPSBQQUNLRVRfTVJfUFJPTUlTQzsKKwkJaWYgKHNldHNvY2tvcHQoc29ja19mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX0FERF9NRU1CRVJTSElQLAorCQkgICAgJm1yLCBzaXplb2YobXIpKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJInNldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJY2xvc2Uoc29ja19mZCk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCX0KKworCS8qIEVuYWJsZSBhdXhpbGxhcnkgZGF0YSBpZiBzdXBwb3J0ZWQgYW5kIHJlc2VydmUgcm9vbSBmb3IKKwkgKiByZWNvbnN0cnVjdGluZyBWTEFOIGhlYWRlcnMuICovCisjaWZkZWYgSEFWRV9QQUNLRVRfQVVYREFUQQorCXZhbCA9IDE7CisJaWYgKHNldHNvY2tvcHQoc29ja19mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX0FVWERBVEEsICZ2YWwsCisJCSAgICAgICBzaXplb2YodmFsKSkgPT0gLTEgJiYgZXJybm8gIT0gRU5PUFJPVE9PUFQpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgInNldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQljbG9zZShzb2NrX2ZkKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWhhbmRsZS0+b2Zmc2V0ICs9IFZMQU5fVEFHX0xFTjsKKyNlbmRpZiAvKiBIQVZFX1BBQ0tFVF9BVVhEQVRBICovCisKKwkvKgorCSAqIFRoaXMgaXMgYSAyLjJbLnhdIG9yIGxhdGVyIGtlcm5lbCAod2Uga25vdyB0aGF0CisJICogYmVjYXVzZSB3ZSdyZSBub3QgdXNpbmcgYSBTT0NLX1BBQ0tFVCBzb2NrZXQgLQorCSAqIFBGX1BBQ0tFVCBpcyBzdXBwb3J0ZWQgb25seSBpbiAyLjIgYW5kIGxhdGVyCisJICoga2VybmVscykuCisJICoKKwkgKiBXZSBjYW4gc2FmZWx5IHBhc3MgInJlY3Zmcm9tKCkiIGEgYnl0ZSBjb3VudAorCSAqIGJhc2VkIG9uIHRoZSBzbmFwc2hvdCBsZW5ndGguCisJICoKKwkgKiBJZiB3ZSdyZSBpbiBjb29rZWQgbW9kZSwgbWFrZSB0aGUgc25hcHNob3QgbGVuZ3RoCisJICogbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSAiY29va2VkIG1vZGUiIGhlYWRlciBwbHVzCisJICogMSBieXRlIG9mIHBhY2tldCBkYXRhIChzbyB3ZSBkb24ndCBwYXNzIGEgYnl0ZQorCSAqIGNvdW50IG9mIDAgdG8gInJlY3Zmcm9tKCkiKS4KKwkgKi8KKwlpZiAoaGFuZGxlcC0+Y29va2VkKSB7CisJCWlmIChoYW5kbGUtPnNuYXBzaG90IDwgU0xMX0hEUl9MRU4gKyAxKQorCQkJaGFuZGxlLT5zbmFwc2hvdCA9IFNMTF9IRFJfTEVOICsgMTsKKwl9CisJaGFuZGxlLT5idWZzaXplID0gaGFuZGxlLT5zbmFwc2hvdDsKKworCS8qCisJICogU2V0IHRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gaW5zZXJ0IFZMQU4gdGFncy4KKwkgKi8KKwlzd2l0Y2ggKGhhbmRsZS0+bGlua3R5cGUpIHsKKworCWNhc2UgRExUX0VOMTBNQjoKKwkJaGFuZGxlcC0+dmxhbl9vZmZzZXQgPSAyICogRVRIX0FMRU47CisJCWJyZWFrOworCisJY2FzZSBETFRfTElOVVhfU0xMOgorCQloYW5kbGVwLT52bGFuX29mZnNldCA9IDE0OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhhbmRsZXAtPnZsYW5fb2Zmc2V0ID0gLTE7IC8qIHVua25vd24gKi8KKwkJYnJlYWs7CisJfQorCisJLyogU2F2ZSB0aGUgc29ja2V0IEZEIGluIHRoZSBwY2FwIHN0cnVjdHVyZSAqLworCWhhbmRsZS0+ZmQgPSBzb2NrX2ZkOworCisjaWYgZGVmaW5lZChTSU9DR1NUQU1QTlMpICYmIGRlZmluZWQoU09fVElNRVNUQU1QTlMpCisJaWYgKGhhbmRsZS0+b3B0LnRzdGFtcF9wcmVjaXNpb24gPT0gUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8pIHsKKwkJaW50IG5zZWNfdHN0YW1wcyA9IDE7CisKKwkJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1NPQ0tFVCwgU09fVElNRVNUQU1QTlMsICZuc2VjX3RzdGFtcHMsIHNpemVvZihuc2VjX3RzdGFtcHMpKSA8IDApIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2V0c29ja29wdDogdW5hYmxlIHRvIHNldCBTT19USU1FU1RBTVBOUyIpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwl9CisjZW5kaWYgLyogZGVmaW5lZChTSU9DR1NUQU1QTlMpICYmIGRlZmluZWQoU09fVElNRVNUQU1QTlMpICovCisKKwlyZXR1cm4gMTsKKyNlbHNlIC8qIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMgKi8KIAlzdHJuY3B5KGVidWYsCiAJCSJOZXcgcGFja2V0IGNhcHR1cmluZyBpbnRlcmZhY2Ugbm90IHN1cHBvcnRlZCBieSBidWlsZCAiCiAJCSJlbnZpcm9ubWVudCIsIFBDQVBfRVJSQlVGX1NJWkUpOwogCXJldHVybiAwOwotI2VuZGlmCisjZW5kaWYgLyogSEFWRV9QRl9QQUNLRVRfU09DS0VUUyAqLwogfQogCisjaWZkZWYgSEFWRV9QQUNLRVRfUklORworLyoKKyAqIEF0dGVtcHQgdG8gYWN0aXZhdGUgd2l0aCBtZW1vcnktbWFwcGVkIGFjY2Vzcy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIDEsIGFuZCBzZXRzICpzdGF0dXMgdG8gMCBpZiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKKyAqIG9yIHRvIGEgUENBUF9XQVJOSU5HXyBjb2RlIGlmIHRoZXJlIGlzIGEgd2FybmluZy4KKyAqCisgKiBPbiBmYWlsdXJlIGR1ZSB0byBsYWNrIG9mIHN1cHBvcnQgZm9yIG1lbW9yeS1tYXBwZWQgY2FwdHVyZSwgcmV0dXJucworICogMC4KKyAqCisgKiBPbiBlcnJvciwgcmV0dXJucyAtMSwgYW5kIHNldHMgKnN0YXR1cyB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZTsKKyAqIGlmIHRoYXQgaXMgUENBUF9FUlJPUiwgc2V0cyBoYW5kbGUtPmVycmJ1ZiB0byB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludCAKK2FjdGl2YXRlX21tYXAocGNhcF90ICpoYW5kbGUsIGludCAqc3RhdHVzKQoreworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWludCByZXQ7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gYWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgY29udGVudHMgb2Ygb25lCisJICogcGFja2V0LCBmb3IgdXNlIGJ5IHRoZSBvbmVzaG90IGNhbGxiYWNrLgorCSAqLworCWhhbmRsZXAtPm9uZXNob3RfYnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+c25hcHNob3QpOworCWlmIChoYW5kbGVwLT5vbmVzaG90X2J1ZmZlciA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJjYW4ndCBhbGxvY2F0ZSBvbmVzaG90IGJ1ZmZlcjogJXMiLAorCQkJIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUgPT0gMCkgeworCQkvKiBieSBkZWZhdWx0IHJlcXVlc3QgMk0gZm9yIHRoZSByaW5nIGJ1ZmZlciAqLworCQloYW5kbGUtPm9wdC5idWZmZXJfc2l6ZSA9IDIqMTAyNCoxMDI0OworCX0KKwlyZXQgPSBwcmVwYXJlX3RwYWNrZXRfc29ja2V0KGhhbmRsZSk7CisJaWYgKHJldCA9PSAtMSkgeworCQlmcmVlKGhhbmRsZXAtPm9uZXNob3RfYnVmZmVyKTsKKwkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGNyZWF0ZV9yaW5nKGhhbmRsZSwgc3RhdHVzKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc3VwcG9ydCBtZW1vcnktbWFwcGVkIGNhcHR1cmU7IG91ciBjYWxsZXIKKwkJICogd2lsbCBmYWxsIGJhY2sgb24gcmVhZGluZyBmcm9tIHRoZSBzb2NrZXQuCisJCSAqLworCQlmcmVlKGhhbmRsZXAtPm9uZXNob3RfYnVmZmVyKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZXQgPT0gLTEpIHsKKwkJLyoKKwkJICogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmFibGUgbWVtb3J5LW1hcHBlZCBjYXB0dXJlOworCQkgKiBmYWlsLiAgY3JlYXRlX3JpbmcoKSBoYXMgc2V0ICpzdGF0dXMuCisJCSAqLworCQlmcmVlKGhhbmRsZXAtPm9uZXNob3RfYnVmZmVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogU3VjY2Vzcy4gICpzdGF0dXMgaGFzIGJlZW4gc2V0IGVpdGhlciB0byAwIGlmIHRoZXJlIGFyZSBubworCSAqIHdhcm5pbmdzIG9yIHRvIGEgUENBUF9XQVJOSU5HXyB2YWx1ZSBpZiB0aGVyZSBpcyBhIHdhcm5pbmcuCisJICoKKwkgKiBPdmVycmlkZSBzb21lIGRlZmF1bHRzIGFuZCBpbmhlcml0IHRoZSBvdGhlciBmaWVsZHMgZnJvbQorCSAqIGFjdGl2YXRlX25ldy4KKwkgKiBoYW5kbGUtPm9mZnNldCBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbnRvIHRoZSByeCByaW5nLgorCSAqIGhhbmRsZS0+Y2MgaXMgdXNlZCB0byBzdG9yZSB0aGUgcmluZyBzaXplLgorCSAqLworCisJc3dpdGNoIChoYW5kbGVwLT50cF92ZXJzaW9uKSB7CisJY2FzZSBUUEFDS0VUX1YxOgorCQloYW5kbGUtPnJlYWRfb3AgPSBwY2FwX3JlYWRfbGludXhfbW1hcF92MTsKKwkJYnJlYWs7CisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCWNhc2UgVFBBQ0tFVF9WMjoKKwkJaGFuZGxlLT5yZWFkX29wID0gcGNhcF9yZWFkX2xpbnV4X21tYXBfdjI7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgSEFWRV9UUEFDS0VUMworCWNhc2UgVFBBQ0tFVF9WMzoKKwkJaGFuZGxlLT5yZWFkX29wID0gcGNhcF9yZWFkX2xpbnV4X21tYXBfdjM7CisJCWJyZWFrOworI2VuZGlmCisJfQorCWhhbmRsZS0+Y2xlYW51cF9vcCA9IHBjYXBfY2xlYW51cF9saW51eF9tbWFwOworCWhhbmRsZS0+c2V0ZmlsdGVyX29wID0gcGNhcF9zZXRmaWx0ZXJfbGludXhfbW1hcDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19tbWFwOworCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX21tYXA7CisJaGFuZGxlLT5vbmVzaG90X2NhbGxiYWNrID0gcGNhcF9vbmVzaG90X21tYXA7CisJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwlyZXR1cm4gMTsKK30KKyNlbHNlIC8qIEhBVkVfUEFDS0VUX1JJTkcgKi8KK3N0YXRpYyBpbnQgCithY3RpdmF0ZV9tbWFwKHBjYXBfdCAqaGFuZGxlIF9VXywgaW50ICpzdGF0dXMgX1VfKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIEhBVkVfUEFDS0VUX1JJTkcgKi8KKworI2lmZGVmIEhBVkVfUEFDS0VUX1JJTkcKKworI2lmIGRlZmluZWQoSEFWRV9UUEFDS0VUMikgfHwgZGVmaW5lZChIQVZFX1RQQUNLRVQzKQorLyoKKyAqIEF0dGVtcHQgdG8gc2V0IHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCB2ZXJzaW9uIG9mIHRoZSBtZW1vcnktbWFwcGVkCisgKiBoZWFkZXIuCisgKgorICogUmV0dXJuIDAgaWYgd2Ugc3VjY2VlZDsgcmV0dXJuIDEgaWYgd2UgZmFpbCBiZWNhdXNlIHRoYXQgdmVyc2lvbiBpc24ndAorICogc3VwcG9ydGVkOyByZXR1cm4gLTEgb24gYW55IG90aGVyIGVycm9yLCBhbmQgc2V0IGhhbmRsZS0+ZXJyYnVmLgorICovCitzdGF0aWMgaW50Citpbml0X3RwYWNrZXQocGNhcF90ICpoYW5kbGUsIGludCB2ZXJzaW9uLCBjb25zdCBjaGFyICp2ZXJzaW9uX3N0cikKK3sKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwlpbnQgdmFsID0gdmVyc2lvbjsKKwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHZhbCk7CisKKwkvKiBQcm9iZSB3aGV0aGVyIGtlcm5lbCBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIFRQQUNLRVQgdmVyc2lvbiAqLworCWlmIChnZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9IRFJMRU4sICZ2YWwsICZsZW4pIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU5PUFJPVE9PUFQgfHwgZXJybm8gPT0gRUlOVkFMKQorCQkJcmV0dXJuIDE7CS8qIG5vICovCisKKwkJLyogRmFpbGVkIHRvIGV2ZW4gZmluZCBvdXQ7IHRoaXMgaXMgYSBmYXRhbCBlcnJvci4gKi8KKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiY2FuJ3QgZ2V0ICVzIGhlYWRlciBsZW4gb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkJdmVyc2lvbl9zdHIsCisJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaGFuZGxlcC0+dHBfaGRybGVuID0gdmFsOworCisJdmFsID0gdmVyc2lvbjsKKwlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfVkVSU0lPTiwgJnZhbCwKKwkJCSAgIHNpemVvZih2YWwpKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiY2FuJ3QgYWN0aXZhdGUgJXMgb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkJdmVyc2lvbl9zdHIsCisJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJaGFuZGxlcC0+dHBfdmVyc2lvbiA9IHZlcnNpb247CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBWTEFOIHRhZyByZWNvbnN0cnVjdGlvbiAqLworCXZhbCA9IFZMQU5fVEFHX0xFTjsKKwlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUkVTRVJWRSwgJnZhbCwKKwkJCSAgIHNpemVvZih2YWwpKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiY2FuJ3Qgc2V0IHVwIHJlc2VydmUgb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZCBIQVZFX1RQQUNLRVQyIHx8IGRlZmluZWQgSEFWRV9UUEFDS0VUMyAqLworCisvKgorICogQXR0ZW1wdCB0byBzZXQgdGhlIHNvY2tldCB0byB2ZXJzaW9uIDMgb2YgdGhlIG1lbW9yeS1tYXBwZWQgaGVhZGVyIGFuZCwKKyAqIGlmIHRoYXQgZmFpbHMgYmVjYXVzZSB2ZXJzaW9uIDMgaXNuJ3Qgc3VwcG9ydGVkLCBhdHRlbXB0IHRvIGZhbGwKKyAqIGJhY2sgdG8gdmVyc2lvbiAyLiAgSWYgdmVyc2lvbiAyIGlzbid0IHN1cHBvcnRlZCwganVzdCBsZWF2ZSBpdCBhdAorICogdmVyc2lvbiAxLgorICoKKyAqIFJldHVybiAxIGlmIHdlIHN1Y2NlZWQgb3IgaWYgd2UgZmFpbCBiZWNhdXNlIG5laXRoZXIgdmVyc2lvbiAyIG5vciAzIGlzCisgKiBzdXBwb3J0ZWQ7IHJldHVybiAtMSBvbiBhbnkgb3RoZXIgZXJyb3IsIGFuZCBzZXQgaGFuZGxlLT5lcnJidWYuCisgKi8KK3N0YXRpYyBpbnQKK3ByZXBhcmVfdHBhY2tldF9zb2NrZXQocGNhcF90ICpoYW5kbGUpCit7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisjaWYgZGVmaW5lZChIQVZFX1RQQUNLRVQyKSB8fCBkZWZpbmVkKEhBVkVfVFBBQ0tFVDMpCisJaW50IHJldDsKKyNlbmRpZgorCisJaGFuZGxlcC0+dHBfdmVyc2lvbiA9IFRQQUNLRVRfVjE7CisJaGFuZGxlcC0+dHBfaGRybGVuID0gc2l6ZW9mKHN0cnVjdCB0cGFja2V0X2hkcik7CisKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJLyoKKwkgKiBUaGUgb25seSBtb2RlIGluIHdoaWNoIGJ1ZmZlcmluZyBpcyBkb25lIG9uIFBGX1BBQ0tFVAorCSAqIHNvY2tldHMsIHNvIHRoYXQgcGFja2V0cyBtaWdodCBub3QgYmUgZGVsaXZlcmVkCisJICogaW1tZWRpYXRlbHksIGlzIFRQQUNLRVRfVjMgbW9kZS4KKwkgKgorCSAqIFRoZSBidWZmZXJpbmcgY2Fubm90IGJlIGRpc2FibGVkIGluIHRoYXQgbW9kZSwgc28KKwkgKiBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGltbWVkaWF0ZSBtb2RlLCB3ZSBkb24ndAorCSAqIHVzZSBUUEFDS0VUX1YzLgorCSAqLworCWlmIChoYW5kbGUtPm9wdC5pbW1lZGlhdGUpCisJCXJldCA9IDE7IC8qIHByZXRlbmQgVFBBQ0tFVF9WMyBjb3VsZG4ndCBiZSBzZXQgKi8KKwllbHNlCisJCXJldCA9IGluaXRfdHBhY2tldChoYW5kbGUsIFRQQUNLRVRfVjMsICJUUEFDS0VUX1YzIik7CisJaWYgKC0xID09IHJldCkgeworCQkvKiBFcnJvciBkdXJpbmcgc2V0dGluZyB1cCBUUEFDS0VUX1YzLiAqLworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmICgxID09IHJldCkgeworCQkvKiBUUEFDS0VUX1YzIG5vdCBzdXBwb3J0ZWQgLSBmYWxsIGJhY2sgdG8gVFBBQ0tFVF9WMi4gKi8KKyNlbmRpZiAvKiBIQVZFX1RQQUNLRVQzICovCisKKyNpZmRlZiBIQVZFX1RQQUNLRVQyCisJCXJldCA9IGluaXRfdHBhY2tldChoYW5kbGUsIFRQQUNLRVRfVjIsICJUUEFDS0VUX1YyIik7CisJCWlmICgtMSA9PSByZXQpIHsKKwkJCS8qIEVycm9yIGR1cmluZyBzZXR0aW5nIHVwIFRQQUNLRVRfVjIuICovCisJCQlyZXR1cm4gLTE7CisJCX0KKyNlbmRpZiAvKiBIQVZFX1RQQUNLRVQyICovCisKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJfQorI2VuZGlmIC8qIEhBVkVfVFBBQ0tFVDMgKi8KKworCXJldHVybiAxOworfQorCisvKgorICogQXR0ZW1wdCB0byBzZXQgdXAgbWVtb3J5LW1hcHBlZCBhY2Nlc3MuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyAxLCBhbmQgc2V0cyAqc3RhdHVzIHRvIDAgaWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiBvciB0byBhIFBDQVBfV0FSTklOR18gY29kZSBpZiB0aGVyZSBpcyBhIHdhcm5pbmcuCisgKgorICogT24gZmFpbHVyZSBkdWUgdG8gbGFjayBvZiBzdXBwb3J0IGZvciBtZW1vcnktbWFwcGVkIGNhcHR1cmUsIHJldHVybnMKKyAqIDAuCisgKgorICogT24gZXJyb3IsIHJldHVybnMgLTEsIGFuZCBzZXRzICpzdGF0dXMgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGU7CisgKiBpZiB0aGF0IGlzIFBDQVBfRVJST1IsIHNldHMgaGFuZGxlLT5lcnJidWYgdG8gdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK2NyZWF0ZV9yaW5nKHBjYXBfdCAqaGFuZGxlLCBpbnQgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwl1bnNpZ25lZCBpLCBqLCBmcmFtZXNfcGVyX2Jsb2NrOworI2lmZGVmIEhBVkVfVFBBQ0tFVDMKKwkvKgorCSAqIEZvciBzb2NrZXRzIHVzaW5nIFRQQUNLRVRfVjEgb3IgVFBBQ0tFVF9WMiwgdGhlIGV4dHJhCisJICogc3R1ZmYgYXQgdGhlIGVuZCBvZiBhIHN0cnVjdCB0cGFja2V0X3JlcTMgd2lsbCBiZQorCSAqIGlnbm9yZWQsIHNvIHRoaXMgaXMgT0sgZXZlbiBmb3IgdGhvc2Ugc29ja2V0cy4KKwkgKi8KKwlzdHJ1Y3QgdHBhY2tldF9yZXEzIHJlcTsKKyNlbHNlCisJc3RydWN0IHRwYWNrZXRfcmVxIHJlcTsKKyNlbmRpZgorCXNvY2tsZW5fdCBsZW47CisJdW5zaWduZWQgaW50IHNrX3R5cGUsIHRwX3Jlc2VydmUsIG1hY2xlbiwgdHBfaGRybGVuLCBuZXRvZmYsIG1hY29mZjsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKworCS8qCisJICogU3RhcnQgb3V0IGFzc3VtaW5nIG5vIHdhcm5pbmdzIG9yIGVycm9ycy4KKwkgKi8KKwkqc3RhdHVzID0gMDsKKworCXN3aXRjaCAoaGFuZGxlcC0+dHBfdmVyc2lvbikgeworCisJY2FzZSBUUEFDS0VUX1YxOgorI2lmZGVmIEhBVkVfVFBBQ0tFVDIKKwljYXNlIFRQQUNLRVRfVjI6CisjZW5kaWYKKwkJLyogTm90ZSB0aGF0IHdpdGggbGFyZ2Ugc25hcHNob3QgbGVuZ3RoIChzYXkgNjRLLCB3aGljaCBpcworCQkgKiB0aGUgZGVmYXVsdCBmb3IgcmVjZW50IHZlcnNpb25zIG9mIHRjcGR1bXAsIHRoZSB2YWx1ZSB0aGF0CisJCSAqICItcyAwIiBoYXMgZ2l2ZW4gZm9yIGEgbG9uZyB0aW1lIHdpdGggdGNwZHVtcCwgYW5kIHRoZQorCQkgKiBkZWZhdWx0IGluIFdpcmVzaGFyay9UU2hhcmsvZHVtcGNhcCksIGlmIHdlIHVzZSB0aGUgc25hcHNob3QKKwkJICogbGVuZ3RoIHRvIGNhbGN1bGF0ZSB0aGUgZnJhbWUgbGVuZ3RoLCBvbmx5IGEgZmV3IGZyYW1lcworCQkgKiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgcmluZyBldmVuIHdpdGggcHJldHR5CisJCSAqIGxhcmdlIHJpbmcgc2l6ZSAoYW5kIGEgbG90IG9mIG1lbW9yeSB3aWxsIGJlIHVudXNlZCkuCisJCSAqCisJCSAqIElkZWFsbHksIHdlIHNob3VsZCBjaG9vc2UgYSBmcmFtZSBsZW5ndGggYmFzZWQgb24gdGhlCisJCSAqIG1pbmltdW0gb2YgdGhlIHNwZWNpZmllZCBzbmFwc2hvdCBsZW5ndGggYW5kIHRoZSBtYXhpbXVtCisJCSAqIHBhY2tldCBzaXplLiAgVGhhdCdzIG5vdCBhcyBlYXN5IGFzIGl0IHNvdW5kczsgY29uc2lkZXIsCisJCSAqIGZvciBleGFtcGxlLCBhbiA4MDIuMTEgaW50ZXJmYWNlIGluIG1vbml0b3IgbW9kZSwgd2hlcmUKKwkJICogdGhlIGZyYW1lIHdvdWxkIGluY2x1ZGUgYSByYWRpb3RhcCBoZWFkZXIsIHdoZXJlIHRoZQorCQkgKiBtYXhpbXVtIHJhZGlvdGFwIGhlYWRlciBsZW5ndGggaXMgZGV2aWNlLWRlcGVuZGVudC4KKwkJICoKKwkJICogU28sIGZvciBub3csIHdlIGp1c3QgZG8gdGhpcyBmb3IgRXRoZXJuZXQgZGV2aWNlcywgd2hlcmUKKwkJICogdGhlcmUncyBubyBtZXRhZGF0YSBoZWFkZXIsIGFuZCB0aGUgbGluay1sYXllciBoZWFkZXIgaXMKKwkJICogZml4ZWQgbGVuZ3RoLiAgV2UgY2FuIGdldCB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBieQorCQkgKiBhZGRpbmcgMTgsIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIHBsdXMgdGhlIENSQyBsZW5ndGgKKwkJICogKGp1c3QgaW4gY2FzZSB3ZSBoYXBwZW4gdG8gZ2V0IHRoZSBDUkMgaW4gdGhlIHBhY2tldCksIHRvCisJCSAqIHRoZSBNVFUgb2YgdGhlIGludGVyZmFjZTsgd2UgZmV0Y2ggdGhlIE1UVSBpbiB0aGUgaG9wZXMKKwkJICogdGhhdCBpdCByZWZsZWN0cyBzdXBwb3J0IGZvciBqdW1ibyBmcmFtZXMuICAoRXZlbiBpZiB0aGUKKwkJICogaW50ZXJmYWNlIGlzIGp1c3QgYmVpbmcgdXNlZCBmb3IgcGFzc2l2ZSBzbm9vcGluZywgdGhlCisJCSAqIGRyaXZlciBtaWdodCBzZXQgdGhlIHNpemUgb2YgYnVmZmVycyBpbiB0aGUgcmVjZWl2ZSByaW5nCisJCSAqIGJhc2VkIG9uIHRoZSBNVFUsIHNvIHRoYXQgdGhlIE1UVSBsaW1pdHMgdGhlIG1heGltdW0gc2l6ZQorCQkgKiBvZiBwYWNrZXRzIHRoYXQgd2UgY2FuIHJlY2VpdmUuKQorCQkgKgorCQkgKiBXZSBkb24ndCBkbyB0aGF0IGlmIHNlZ21lbnRhdGlvbi9mcmFnbWVudGF0aW9uIG9yIHJlY2VpdmUKKwkJICogb2ZmbG9hZCBhcmUgZW5hYmxlZCwgc28gd2UgZG9uJ3QgZ2V0IHJ1ZGVseSBzdXJwcmlzZWQgYnkKKwkJICogInBhY2tldHMiIGJpZ2dlciB0aGFuIHRoZSBNVFUuICovCisJCWZyYW1lX3NpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCQlpZiAoaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfRU4xME1CKSB7CisJCQlpbnQgbXR1OworCQkJaW50IG9mZmxvYWQ7CisKKwkJCW9mZmxvYWQgPSBpZmFjZV9nZXRfb2ZmbG9hZChoYW5kbGUpOworCQkJaWYgKG9mZmxvYWQgPT0gLTEpIHsKKwkJCQkqc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoIW9mZmxvYWQpIHsKKwkJCQltdHUgPSBpZmFjZV9nZXRfbXR1KGhhbmRsZS0+ZmQsIGhhbmRsZS0+b3B0LnNvdXJjZSwKKwkJCQkgICAgaGFuZGxlLT5lcnJidWYpOworCQkJCWlmIChtdHUgPT0gLTEpIHsKKwkJCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGZyYW1lX3NpemUgPiBtdHUgKyAxOCkKKwkJCQkJZnJhbWVfc2l6ZSA9IG10dSArIDE4OworCQkJfQorCQl9CisKKwkJLyogTk9URTogY2FsY3VsdXMgbWF0Y2hpbmcgdGhvc2UgaW4gdHBhY2tldF9yY3YoKQorCQkgKiBpbiBsaW51eC0yLjYvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworCQkgKi8KKwkJbGVuID0gc2l6ZW9mKHNrX3R5cGUpOworCQlpZiAoZ2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19UWVBFLCAmc2tfdHlwZSwKKwkJICAgICZsZW4pIDwgMCkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImdldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNpZmRlZiBQQUNLRVRfUkVTRVJWRQorCQlsZW4gPSBzaXplb2YodHBfcmVzZXJ2ZSk7CisJCWlmIChnZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9SRVNFUlZFLAorCQkgICAgJnRwX3Jlc2VydmUsICZsZW4pIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVOT1BST1RPT1BUKSB7CisJCQkJLyoKKwkJCQkgKiBFTk9QUk9UT09QVCBtZWFucyAia2VybmVsIGRvZXNuJ3Qgc3VwcG9ydAorCQkJCSAqIFBBQ0tFVF9SRVNFUlZFIiwgaW4gd2hpY2ggY2FzZSB3ZSBmYWxsIGJhY2sKKwkJCQkgKiBhcyBiZXN0IHdlIGNhbi4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgImdldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXRwX3Jlc2VydmUgPSAwOwkvKiBvbGRlciBrZXJuZWwsIHJlc2VydmUgbm90IHN1cHBvcnRlZCAqLworCQl9CisjZWxzZQorCQl0cF9yZXNlcnZlID0gMDsJLyogb2xkZXIga2VybmVsLCByZXNlcnZlIG5vdCBzdXBwb3J0ZWQgKi8KKyNlbmRpZgorCQltYWNsZW4gPSAoc2tfdHlwZSA9PSBTT0NLX0RHUkFNKSA/IDAgOiBNQVhfTElOS0hFQURFUl9TSVpFOworCQkJLyogWFhYOiBpbiB0aGUga2VybmVsIG1hY2xlbiBpcyBjYWxjdWxhdGVkIGZyb20KKwkJCSAqIExMX0FMTE9DQVRFRF9TUEFDRShkZXYpIGFuZCB2bmV0X2hkci5oZHJfbGVuCisJCQkgKiBpbjogIHBhY2tldF9zbmQoKSAgICAgICAgICAgaW4gbGludXgtMi42L25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKwkJCSAqIHRoZW4gcGFja2V0X2FsbG9jX3NrYigpICAgICBpbiBsaW51eC0yLjYvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworCQkJICogdGhlbiBzb2NrX2FsbG9jX3NlbmRfcHNrYigpIGluIGxpbnV4LTIuNi9uZXQvY29yZS9zb2NrLmMKKwkJCSAqIGJ1dCBJIHNlZSBubyB3YXkgdG8gZ2V0IHRob3NlIHNpemVzIGluIHVzZXJzcGFjZSwKKwkJCSAqIGxpa2UgZm9yIGluc3RhbmNlIHdpdGggYW4gaWZyZXEgaW9jdGwoKTsKKwkJCSAqIHRoZSBiZXN0IHRoaW5nIEkndmUgZm91bmQgc28gZmFyIGlzIE1BWF9IRUFERVIgaW4KKwkJCSAqIHRoZSBrZXJuZWwgcGFydCBvZiBsaW51eC0yLjYvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorCQkJICogd2hpY2ggZ29lcyB1cCB0byAxMjgrNDg9MTc2OyBzaW5jZSBwY2FwLWxpbnV4LmMKKwkJCSAqIGRlZmluZXMgYSBNQVhfTElOS0hFQURFUl9TSVpFIG9mIDI1NiB3aGljaCBpcworCQkJICogZ3JlYXRlciB0aGFuIHRoYXQsIGxldCdzIHVzZSBpdC4uIG1heWJlIGlzIGl0IGV2ZW4KKwkJCSAqIGxhcmdlIGVub3VnaCB0byBkaXJlY3RseSByZXBsYWNlIG1hY29mZi4uCisJCQkgKi8KKwkJdHBfaGRybGVuID0gVFBBQ0tFVF9BTElHTihoYW5kbGVwLT50cF9oZHJsZW4pICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCkgOworCQluZXRvZmYgPSBUUEFDS0VUX0FMSUdOKHRwX2hkcmxlbiArIChtYWNsZW4gPCAxNiA/IDE2IDogbWFjbGVuKSkgKyB0cF9yZXNlcnZlOworCQkJLyogTk9URTogQUZBSUNTIHRwX3Jlc2VydmUgbWF5IGJyZWFrIHRoZSBUUEFDS0VUX0FMSUdOCisJCQkgKiBvZiBuZXRvZmYsIHdoaWNoIGNvbnRyYWRpY3RzCisJCQkgKiBsaW51eC0yLjYvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dAorCQkJICogZG9jdW1lbnRpbmcgdGhhdDoKKwkJCSAqICItIEdhcCwgY2hvc2VuIHNvIHRoYXQgcGFja2V0IGRhdGEgKFN0YXJ0K3RwX25ldCkKKwkJCSAqIGFsaWducyB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNiIKKwkJCSAqLworCQkJLyogTk9URTogaW4gbGludXgtMi42L2luY2x1ZGUvbGludXgvc2tidWZmLmg6CisJCQkgKiAiQ1BVcyBvZnRlbiB0YWtlIGEgcGVyZm9ybWFuY2UgaGl0CisJCQkgKiAgd2hlbiBhY2Nlc3NpbmcgdW5hbGlnbmVkIG1lbW9yeSBsb2NhdGlvbnMiCisJCQkgKi8KKwkJbWFjb2ZmID0gbmV0b2ZmIC0gbWFjbGVuOworCQlyZXEudHBfZnJhbWVfc2l6ZSA9IFRQQUNLRVRfQUxJR04obWFjb2ZmICsgZnJhbWVfc2l6ZSk7CisJCXJlcS50cF9mcmFtZV9uciA9IGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplL3JlcS50cF9mcmFtZV9zaXplOworCQlicmVhazsKKworI2lmZGVmIEhBVkVfVFBBQ0tFVDMKKwljYXNlIFRQQUNLRVRfVjM6CisJCS8qIFRoZSAiZnJhbWVzIiBmb3IgdGhpcyBhcmUgYWN0dWFsbHkgYnVmZmVycyB0aGF0CisJCSAqIGNvbnRhaW4gbXVsdGlwbGUgdmFyaWFibGUtc2l6ZWQgZnJhbWVzLgorCQkgKgorCQkgKiBXZSBwaWNrIGEgImZyYW1lIiBzaXplIG9mIDEyOEsgdG8gbGVhdmUgZW5vdWdoCisJCSAqIHJvb20gZm9yIGF0IGxlYXN0IG9uZSByZWFzb25hYmx5LXNpemVkIHBhY2tldAorCQkgKiBpbiB0aGUgImZyYW1lIi4gKi8KKwkJcmVxLnRwX2ZyYW1lX3NpemUgPSAxMzEwNzI7CisJCXJlcS50cF9mcmFtZV9uciA9IGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplL3JlcS50cF9mcmFtZV9zaXplOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCS8qIGNvbXB1dGUgdGhlIG1pbnVtdW0gYmxvY2sgc2l6ZSB0aGF0IHdpbGwgaGFuZGxlIHRoaXMgZnJhbWUuIAorCSAqIFRoZSBibG9jayBoYXMgdG8gYmUgcGFnZSBzaXplIGFsaWduZWQuIAorCSAqIFRoZSBtYXggYmxvY2sgc2l6ZSBhbGxvd2VkIGJ5IHRoZSBrZXJuZWwgaXMgYXJjaC1kZXBlbmRlbnQgYW5kIAorCSAqIGl0J3Mgbm90IGV4cGxpY2l0bHkgY2hlY2tlZCBoZXJlLiAqLworCXJlcS50cF9ibG9ja19zaXplID0gZ2V0cGFnZXNpemUoKTsKKwl3aGlsZSAocmVxLnRwX2Jsb2NrX3NpemUgPCByZXEudHBfZnJhbWVfc2l6ZSkgCisJCXJlcS50cF9ibG9ja19zaXplIDw8PSAxOworCisJZnJhbWVzX3Blcl9ibG9jayA9IHJlcS50cF9ibG9ja19zaXplL3JlcS50cF9mcmFtZV9zaXplOworCisJLyoKKwkgKiBQQUNLRVRfVElNRVNUQU1QIHdhcyBhZGRlZCBhZnRlciBsaW51eC9uZXRfdHN0YW1wLmggd2FzLAorCSAqIHNvIHdlIGNoZWNrIGZvciBQQUNLRVRfVElNRVNUQU1QLiAgV2UgY2hlY2sgZm9yCisJICogbGludXgvbmV0X3RzdGFtcC5oIGp1c3QgaW4gY2FzZSBhIHN5c3RlbSBzb21laG93IGhhcworCSAqIFBBQ0tFVF9USU1FU1RBTVAgYnV0IG5vdCBsaW51eC9uZXRfdHN0YW1wLmg7IHRoYXQgbWlnaHQKKwkgKiBiZSB1bm5lY2Vzc2FyeS4KKwkgKgorCSAqIFNJT0NTSFdUU1RBTVAgd2FzIGludHJvZHVjZWQgaW4gdGhlIHBhdGNoIHRoYXQgaW50cm9kdWNlZAorCSAqIGxpbnV4L25ldF90c3RhbXAuaCwgc28gd2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIHdoZXRoZXIKKwkgKiBTSU9DU0hXVFNUQU1QIGlzIGRlZmluZWQgKGlmIHlvdXIgTGludXggc3lzdGVtIGhhcworCSAqIGxpbnV4L25ldF90c3RhbXAuaCBidXQgZG9lc24ndCBkZWZpbmUgU0lPQ1NIV1RTVEFNUCwgeW91cgorCSAqIExpbnV4IHN5c3RlbSBpcyBiYWRseSBicm9rZW4pLgorCSAqLworI2lmIGRlZmluZWQoSEFWRV9MSU5VWF9ORVRfVFNUQU1QX0gpICYmIGRlZmluZWQoUEFDS0VUX1RJTUVTVEFNUCkKKwkvKgorCSAqIElmIHdlIHdlcmUgdG9sZCB0byBkbyBzbywgYXNrIHRoZSBrZXJuZWwgYW5kIHRoZSBkcml2ZXIKKwkgKiB0byB1c2UgaGFyZHdhcmUgdGltZXN0YW1wcy4KKwkgKgorCSAqIEhhcmR3YXJlIHRpbWVzdGFtcHMgYXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggbW1hcHBlZAorCSAqIGNhcHR1cmVzLgorCSAqLworCWlmIChoYW5kbGUtPm9wdC50c3RhbXBfdHlwZSA9PSBQQ0FQX1RTVEFNUF9BREFQVEVSIHx8CisJICAgIGhhbmRsZS0+b3B0LnRzdGFtcF90eXBlID09IFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQpIHsKKwkJc3RydWN0IGh3dHN0YW1wX2NvbmZpZyBod2NvbmZpZzsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJaW50IHRpbWVzb3VyY2U7CisKKwkJLyoKKwkJICogQXNrIGZvciBoYXJkd2FyZSB0aW1lIHN0YW1wcyBvbiBhbGwgcGFja2V0cywKKwkJICogaW5jbHVkaW5nIHRyYW5zbWl0dGVkIHBhY2tldHMuCisJCSAqLworCQltZW1zZXQoJmh3Y29uZmlnLCAwLCBzaXplb2YoaHdjb25maWcpKTsKKwkJaHdjb25maWcudHhfdHlwZSA9IEhXVFNUQU1QX1RYX09OOworCQlod2NvbmZpZy5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfQUxMOworCisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCXN0cmNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCWlmci5pZnJfZGF0YSA9ICh2b2lkICopJmh3Y29uZmlnOworCisJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0hXVFNUQU1QLCAmaWZyKSA8IDApIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKworCQkJY2FzZSBFUEVSTToKKwkJCQkvKgorCQkJCSAqIFRyZWF0IHRoaXMgYXMgYW4gZXJyb3IsIGFzIHRoZQorCQkJCSAqIHVzZXIgc2hvdWxkIHRyeSB0byBydW4gdGhpcworCQkJCSAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZXMgLQorCQkJCSAqIGFuZCwgaWYgdGhleSBjYW4ndCwgc2hvdWxkbid0CisJCQkJICogdHJ5IHJlcXVlc3RpbmcgaGFyZHdhcmUgdGltZSBzdGFtcHMuCisJCQkJICovCisJCQkJKnN0YXR1cyA9IFBDQVBfRVJST1JfUEVSTV9ERU5JRUQ7CisJCQkJcmV0dXJuIC0xOworCisJCQljYXNlIEVPUE5PVFNVUFA6CisJCQkJLyoKKwkJCQkgKiBUcmVhdCB0aGlzIGFzIGEgd2FybmluZywgYXMgdGhlCisJCQkJICogb25seSB3YXkgdG8gZml4IHRoZSB3YXJuaW5nIGlzIHRvCisJCQkJICogZ2V0IGFuIGFkYXB0ZXIgdGhhdCBzdXBwb3J0cyBoYXJkd2FyZQorCQkJCSAqIHRpbWUgc3RhbXBzLiAgV2UnbGwganVzdCBmYWxsIGJhY2sKKwkJCQkgKiBvbiB0aGUgc3RhbmRhcmQgaG9zdCB0aW1lIHN0YW1wcy4KKwkJCQkgKi8KKwkJCQkqc3RhdHVzID0gUENBUF9XQVJOSU5HX1RTVEFNUF9UWVBFX05PVFNVUDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJIlNJT0NTSFdUU1RBTVAgZmFpbGVkOiAlcyIsCisJCQkJCXBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkqc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2VsbCwgdGhhdCB3b3JrZWQuICBOb3cgc3BlY2lmeSB0aGUgdHlwZSBvZgorCQkJICogaGFyZHdhcmUgdGltZSBzdGFtcCB3ZSB3YW50IGZvciB0aGlzCisJCQkgKiBzb2NrZXQuCisJCQkgKi8KKwkJCWlmIChoYW5kbGUtPm9wdC50c3RhbXBfdHlwZSA9PSBQQ0FQX1RTVEFNUF9BREFQVEVSKSB7CisJCQkJLyoKKwkJCQkgKiBIYXJkd2FyZSB0aW1lc3RhbXAsIHN5bmNocm9uaXplZAorCQkJCSAqIHdpdGggdGhlIHN5c3RlbSBjbG9jay4KKwkJCQkgKi8KKwkJCQl0aW1lc291cmNlID0gU09GX1RJTUVTVEFNUElOR19TWVNfSEFSRFdBUkU7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogUENBUF9UU1RBTVBfQURBUFRFUl9VTlNZTkNFRCAtIGhhcmR3YXJlCisJCQkJICogdGltZXN0YW1wLCBub3Qgc3luY2hyb25pemVkIHdpdGggdGhlCisJCQkJICogc3lzdGVtIGNsb2NrLgorCQkJCSAqLworCQkJCXRpbWVzb3VyY2UgPSBTT0ZfVElNRVNUQU1QSU5HX1JBV19IQVJEV0FSRTsKKwkJCX0KKwkJCWlmIChzZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9USU1FU1RBTVAsCisJCQkJKHZvaWQgKikmdGltZXNvdXJjZSwgc2l6ZW9mKHRpbWVzb3VyY2UpKSkgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAKKwkJCQkJImNhbid0IHNldCBQQUNLRVRfVElNRVNUQU1QOiAlcyIsIAorCQkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIEhBVkVfTElOVVhfTkVUX1RTVEFNUF9IICYmIFBBQ0tFVF9USU1FU1RBTVAgKi8KKworCS8qIGFzayB0aGUga2VybmVsIHRvIGNyZWF0ZSB0aGUgcmluZyAqLworcmV0cnk6CisJcmVxLnRwX2Jsb2NrX25yID0gcmVxLnRwX2ZyYW1lX25yIC8gZnJhbWVzX3Blcl9ibG9jazsKKworCS8qIHJlcS50cF9mcmFtZV9uciBpcyByZXF1ZXN0ZWQgdG8gbWF0Y2ggZnJhbWVzX3Blcl9ibG9jaypyZXEudHBfYmxvY2tfbnIgKi8KKwlyZXEudHBfZnJhbWVfbnIgPSByZXEudHBfYmxvY2tfbnIgKiBmcmFtZXNfcGVyX2Jsb2NrOworCQorI2lmZGVmIEhBVkVfVFBBQ0tFVDMKKwkvKiB0aW1lb3V0IHZhbHVlIHRvIHJldGlyZSBibG9jayAtIHVzZSB0aGUgY29uZmlndXJlZCBidWZmZXJpbmcgdGltZW91dCwgb3IgZGVmYXVsdCBpZiA8MC4gKi8KKwlyZXEudHBfcmV0aXJlX2Jsa190b3YgPSAoaGFuZGxlcC0+dGltZW91dD49MCk/aGFuZGxlcC0+dGltZW91dDowOworCS8qIHByaXZhdGUgZGF0YSBub3QgdXNlZCAqLworCXJlcS50cF9zaXplb2ZfcHJpdiA9IDA7CisJLyogUnggcmluZyAtIGZlYXR1cmUgcmVxdWVzdCBiaXRzIC0gbm9uZSAocnhoYXNoIHdpbGwgbm90IGJlIGZpbGxlZCkgKi8KKwlyZXEudHBfZmVhdHVyZV9yZXFfd29yZCA9IDA7CisjZW5kaWYKKworCWlmIChzZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9SWF9SSU5HLAorCQkJCQkodm9pZCAqKSAmcmVxLCBzaXplb2YocmVxKSkpIHsKKwkJaWYgKChlcnJubyA9PSBFTk9NRU0pICYmIChyZXEudHBfYmxvY2tfbnIgPiAxKSkgeworCQkJLyoKKwkJCSAqIE1lbW9yeSBmYWlsdXJlOyB0cnkgdG8gcmVkdWNlIHRoZSByZXF1ZXN0ZWQgcmluZworCQkJICogc2l6ZS4KKwkJCSAqCisJCQkgKiBXZSB1c2VkIHRvIHJlZHVjZSB0aGlzIGJ5IGhhbGYgLS0gZG8gNSUgaW5zdGVhZC4KKwkJCSAqIFRoYXQgbWF5IHJlc3VsdCBpbiBtb3JlIGl0ZXJhdGlvbnMgYW5kIGEgbG9uZ2VyCisJCQkgKiBzdGFydHVwLCBidXQgdGhlIHVzZXIgd2lsbCBiZSBtdWNoIGhhcHBpZXIgd2l0aAorCQkJICogdGhlIHJlc3VsdGluZyBidWZmZXIgc2l6ZS4KKwkJCSAqLworCQkJaWYgKHJlcS50cF9mcmFtZV9uciA8IDIwKQorCQkJCXJlcS50cF9mcmFtZV9uciAtPSAxOworCQkJZWxzZQorCQkJCXJlcS50cF9mcmFtZV9uciAtPSByZXEudHBfZnJhbWVfbnIvMjA7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCWlmIChlcnJubyA9PSBFTk9QUk9UT09QVCkgeworCQkJLyoKKwkJCSAqIFdlIGRvbid0IGhhdmUgcmluZyBidWZmZXIgc3VwcG9ydCBpbiB0aGlzIGtlcm5lbC4KKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiY2FuJ3QgY3JlYXRlIHJ4IHJpbmcgb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkqc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG1lbW9yeSBtYXAgdGhlIHJ4IHJpbmcgKi8KKwloYW5kbGVwLT5tbWFwYnVmbGVuID0gcmVxLnRwX2Jsb2NrX25yICogcmVxLnRwX2Jsb2NrX3NpemU7CisJaGFuZGxlcC0+bW1hcGJ1ZiA9IG1tYXAoMCwgaGFuZGxlcC0+bW1hcGJ1ZmxlbiwKKwkgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGhhbmRsZS0+ZmQsIDApOworCWlmIChoYW5kbGVwLT5tbWFwYnVmID09IE1BUF9GQUlMRUQpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiY2FuJ3QgbW1hcCByeCByaW5nOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKworCQkvKiBjbGVhciB0aGUgYWxsb2NhdGVkIHJpbmcgb24gZXJyb3IqLworCQlkZXN0cm95X3JpbmcoaGFuZGxlKTsKKwkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhIHJpbmcgZm9yIGVhY2ggZnJhbWUgaGVhZGVyIHBvaW50ZXIqLworCWhhbmRsZS0+Y2MgPSByZXEudHBfZnJhbWVfbnI7CisJaGFuZGxlLT5idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5jYyAqIHNpemVvZih1bmlvbiB0aGRyICopKTsKKwlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImNhbid0IGFsbG9jYXRlIHJpbmcgb2YgZnJhbWUgaGVhZGVyczogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCisJCWRlc3Ryb3lfcmluZyhoYW5kbGUpOworCQkqc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGZpbGwgdGhlIGhlYWRlciByaW5nIHdpdGggcHJvcGVyIGZyYW1lIHB0ciovCisJaGFuZGxlLT5vZmZzZXQgPSAwOworCWZvciAoaT0wOyBpPHJlcS50cF9ibG9ja19ucjsgKytpKSB7CisJCXZvaWQgKmJhc2UgPSAmaGFuZGxlcC0+bW1hcGJ1ZltpKnJlcS50cF9ibG9ja19zaXplXTsKKwkJZm9yIChqPTA7IGo8ZnJhbWVzX3Blcl9ibG9jazsgKytqLCArK2hhbmRsZS0+b2Zmc2V0KSB7CisJCQlSSU5HX0dFVF9GUkFNRShoYW5kbGUpID0gYmFzZTsKKwkJCWJhc2UgKz0gcmVxLnRwX2ZyYW1lX3NpemU7CisJCX0KKwl9CisKKwloYW5kbGUtPmJ1ZnNpemUgPSByZXEudHBfZnJhbWVfc2l6ZTsKKwloYW5kbGUtPm9mZnNldCA9IDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIGZyZWUgYWxsIHJpbmcgcmVsYXRlZCByZXNvdXJjZXMqLworc3RhdGljIHZvaWQKK2Rlc3Ryb3lfcmluZyhwY2FwX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKworCS8qIHRlbGwgdGhlIGtlcm5lbCB0byBkZXN0cm95IHRoZSByaW5nKi8KKwlzdHJ1Y3QgdHBhY2tldF9yZXEgcmVxOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUlhfUklORywKKwkJCQkodm9pZCAqKSAmcmVxLCBzaXplb2YocmVxKSk7CisKKwkvKiBpZiByaW5nIGlzIG1hcHBlZCwgdW5tYXAgaXQqLworCWlmIChoYW5kbGVwLT5tbWFwYnVmKSB7CisJCS8qIGRvIG5vdCB0ZXN0IGZvciBtbWFwIGZhaWx1cmUsIGFzIHdlIGNhbid0IHJlY292ZXIgZnJvbSBhbnkgZXJyb3IgKi8KKwkJbXVubWFwKGhhbmRsZXAtPm1tYXBidWYsIGhhbmRsZXAtPm1tYXBidWZsZW4pOworCQloYW5kbGVwLT5tbWFwYnVmID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBTcGVjaWFsIG9uZS1zaG90IGNhbGxiYWNrLCB1c2VkIGZvciBwY2FwX25leHQoKSBhbmQgcGNhcF9uZXh0X2V4KCksCisgKiBmb3IgTGludXggbW1hcHBlZCBjYXB0dXJlLgorICoKKyAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgcGNhcF9uZXh0KCkgYW5kIHBjYXBfbmV4dF9leCgpIGV4cGVjdCB0aGUgcGFja2V0CisgKiBkYXRhIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgdG8gYmUgdmFsaWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIHJldHVybnMsCisgKiBidXQgcGNhcF9yZWFkX2xpbnV4X21tYXAoKSBoYXMgdG8gcmVsZWFzZSB0aGF0IHBhY2tldCBhcyBzb29uIGFzCisgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyAob3RoZXJ3aXNlLCB0aGUga2VybmVsIHRoaW5rcyB0aGVyZSdzIHN0aWxsCisgKiBhdCBsZWFzdCBvbmUgdW5wcm9jZXNzZWQgcGFja2V0IGF2YWlsYWJsZSBpbiB0aGUgcmluZywgc28gYSBzZWxlY3QoKQorICogd2lsbCBpbW1lZGlhdGVseSByZXR1cm4gaW5kaWNhdGluZyB0aGF0IHRoZXJlJ3MgZGF0YSB0byBwcm9jZXNzKSwgc28sCisgKiBpbiB0aGUgY2FsbGJhY2ssIHdlIGhhdmUgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHBhY2tldC4KKyAqCisgKiBZZXMsIHRoaXMgbWVhbnMgdGhhdCwgaWYgdGhlIGNhcHR1cmUgaXMgdXNpbmcgdGhlIHJpbmcgYnVmZmVyLCB1c2luZworICogcGNhcF9uZXh0KCkgb3IgcGNhcF9uZXh0X2V4KCkgcmVxdWlyZXMgbW9yZSBjb3BpZXMgdGhhbiB1c2luZworICogcGNhcF9sb29wKCkgb3IgcGNhcF9kaXNwYXRjaCgpLiAgSWYgdGhhdCBib3RoZXJzIHlvdSwgZG9uJ3QgdXNlCisgKiBwY2FwX25leHQoKSBvciBwY2FwX25leHRfZXgoKS4KKyAqLworc3RhdGljIHZvaWQKK3BjYXBfb25lc2hvdF9tbWFwKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLAorICAgIGNvbnN0IHVfY2hhciAqYnl0ZXMpCit7CisJc3RydWN0IG9uZXNob3RfdXNlcmRhdGEgKnNwID0gKHN0cnVjdCBvbmVzaG90X3VzZXJkYXRhICopdXNlcjsKKwlwY2FwX3QgKmhhbmRsZSA9IHNwLT5wZDsKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKworCSpzcC0+aGRyID0gKmg7CisJbWVtY3B5KGhhbmRsZXAtPm9uZXNob3RfYnVmZmVyLCBieXRlcywgaC0+Y2FwbGVuKTsKKwkqc3AtPnBrdCA9IGhhbmRsZXAtPm9uZXNob3RfYnVmZmVyOworfQorICAgIAorc3RhdGljIHZvaWQKK3BjYXBfY2xlYW51cF9saW51eF9tbWFwKCBwY2FwX3QgKmhhbmRsZSApCit7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisKKwlkZXN0cm95X3JpbmcoaGFuZGxlKTsKKwlpZiAoaGFuZGxlcC0+b25lc2hvdF9idWZmZXIgIT0gTlVMTCkgeworCQlmcmVlKGhhbmRsZXAtPm9uZXNob3RfYnVmZmVyKTsKKwkJaGFuZGxlcC0+b25lc2hvdF9idWZmZXIgPSBOVUxMOworCX0KKwlwY2FwX2NsZWFudXBfbGludXgoaGFuZGxlKTsKK30KKworCitzdGF0aWMgaW50CitwY2FwX2dldG5vbmJsb2NrX21tYXAocGNhcF90ICpwLCBjaGFyICplcnJidWYpCit7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBwLT5wcml2OworCisJLyogdXNlIG5lZ2F0aXZlIHZhbHVlIG9mIHRpbWVvdXQgdG8gaW5kaWNhdGUgbm9uIGJsb2NraW5nIG9wcyAqLworCXJldHVybiAoaGFuZGxlcC0+dGltZW91dDwwKTsKK30KKworc3RhdGljIGludAorcGNhcF9zZXRub25ibG9ja19tbWFwKHBjYXBfdCAqcCwgaW50IG5vbmJsb2NrLCBjaGFyICplcnJidWYpCit7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBwLT5wcml2OworCisJLyoKKwkgKiBNYXAgZWFjaCB2YWx1ZSB0byB0aGVpciBjb3JyZXNwb25kaW5nIG5lZ2F0aW9uIHRvCisJICogcHJlc2VydmUgdGhlIHRpbWVvdXQgdmFsdWUgcHJvdmlkZWQgd2l0aCBwY2FwX3NldF90aW1lb3V0LgorCSAqLworCWlmIChub25ibG9jaykgeworCQlpZiAoaGFuZGxlcC0+dGltZW91dCA+PSAwKSB7CisJCQkvKgorCQkJICogSW5kaWNhdGUgdGhhdCB3ZSdyZSBzd2l0Y2hpbmcgdG8KKwkJCSAqIG5vbi1ibG9ja2luZyBtb2RlLgorCQkJICovCisJCQloYW5kbGVwLT50aW1lb3V0ID0gfmhhbmRsZXAtPnRpbWVvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaGFuZGxlcC0+dGltZW91dCA8IDApIHsKKwkJCWhhbmRsZXAtPnRpbWVvdXQgPSB+aGFuZGxlcC0+dGltZW91dDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bmlvbiB0aGRyICoKK3BjYXBfZ2V0X3JpbmdfZnJhbWUocGNhcF90ICpoYW5kbGUsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJdW5pb24gdGhkciBoOworCisJaC5yYXcgPSBSSU5HX0dFVF9GUkFNRShoYW5kbGUpOworCXN3aXRjaCAoaGFuZGxlcC0+dHBfdmVyc2lvbikgeworCWNhc2UgVFBBQ0tFVF9WMToKKwkJaWYgKHN0YXR1cyAhPSAoaC5oMS0+dHBfc3RhdHVzID8gVFBfU1RBVFVTX1VTRVIgOgorCQkJCQkJVFBfU1RBVFVTX0tFUk5FTCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJYnJlYWs7CisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCWNhc2UgVFBBQ0tFVF9WMjoKKwkJaWYgKHN0YXR1cyAhPSAoaC5oMi0+dHBfc3RhdHVzID8gVFBfU1RBVFVTX1VTRVIgOgorCQkJCQkJVFBfU1RBVFVTX0tFUk5FTCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJY2FzZSBUUEFDS0VUX1YzOgorCQlpZiAoc3RhdHVzICE9IChoLmgzLT5oZHIuYmgxLmJsb2NrX3N0YXR1cyA/IFRQX1NUQVRVU19VU0VSIDoKKwkJCQkJCVRQX1NUQVRVU19LRVJORUwpKQorCQkJcmV0dXJuIE5VTEw7CisJCWJyZWFrOworI2VuZGlmCisJfQorCXJldHVybiBoLnJhdzsKK30KKworI2lmbmRlZiBQT0xMUkRIVVAKKyNkZWZpbmUgUE9MTFJESFVQIDAKKyNlbmRpZgorCisvKiB3YWl0IGZvciBmcmFtZXMgYXZhaWxhYmlsaXR5LiovCitzdGF0aWMgaW50IHBjYXBfd2FpdF9mb3JfZnJhbWVzX21tYXAocGNhcF90ICpoYW5kbGUpCit7CisJaWYgKCFwY2FwX2dldF9yaW5nX2ZyYW1lKGhhbmRsZSwgVFBfU1RBVFVTX1VTRVIpKSB7CisJCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCQlpbnQgdGltZW91dDsKKwkJY2hhciBjOworCQlzdHJ1Y3QgcG9sbGZkIHBvbGxpbmZvOworCQlpbnQgcmV0OworCisJCXBvbGxpbmZvLmZkID0gaGFuZGxlLT5mZDsKKwkJcG9sbGluZm8uZXZlbnRzID0gUE9MTElOOworCisJCWlmIChoYW5kbGVwLT50aW1lb3V0ID09IDApIHsKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJCQkvKgorCQkJICogWFhYIC0gZHVlIHRvIGEgc2V0IG9mIChtaXMpZmVhdHVyZXMgaW4gdGhlCisJCQkgKiBUUEFDS0VUX1YzIGtlcm5lbCBjb2RlLCBibG9ja2luZyBmb3JldmVyIHdpdGgKKwkJCSAqIGEgVFBBQ0tFVF9WMyBzb2NrZXQgY2FuLCBpZiBmZXcgcGFja2V0cworCQkJICogYXJlIGFycml2aW5nIGFuZCBwYXNzaW5nIHRoZSBzb2NrZXQgZmlsdGVyLAorCQkJICogY2F1c2UgbW9zdCBwYWNrZXRzIHRvIGJlIGRyb3BwZWQuICBTZWUKKwkJCSAqIGxpYnBjYXAgaXNzdWUgIzMzNSBmb3IgdGhlIGZ1bGwgcGFpbmZ1bAorCQkJICogc3RvcnkuICBUaGUgd29ya2Fyb3VuZCBpcyB0byBoYXZlIHBvbGwoKQorCQkJICogdGltZSBvdXQgdmVyeSBxdWlja2x5LCBzbyB3ZSBncmFiIHRoZQorCQkJICogZnJhbWVzIGhhbmRlZCB0byB1cywgYW5kIHJldHVybiB0aGVtIHRvCisJCQkgKiB0aGUga2VybmVsLCBBU0FQLgorCQkJICoKKwkJCSAqIElmIHRob3NlIGlzc3VlcyBhcmUgZXZlciBmaXhlZCwgd2UgbWlnaHQKKwkJCSAqIHdhbnQgdG8gY2hlY2sgdGhlIGtlcm5lbCB2ZXJzaW9uIGFuZCBibG9jaworCQkJICogZm9yZXZlciB3aXRoIFRQQUNLRVRfVjMgaWYgd2UncmUgcnVubmluZworCQkJICogd2l0aCBhIGtlcm5lbCB0aGF0IGhhcyB0aGUgZml4LgorCQkJICovCisJCQlpZiAoaGFuZGxlcC0+dHBfdmVyc2lvbiA9PSBUUEFDS0VUX1YzKQorCQkJCXRpbWVvdXQgPSAxOwkvKiBkb24ndCBibG9jayBmb3IgdmVyeSBsb25nICovCisJCQllbHNlCisjZW5kaWYKKwkJCQl0aW1lb3V0ID0gLTE7CS8qIGJsb2NrIGZvcmV2ZXIgKi8KKwkJfSBlbHNlIGlmIChoYW5kbGVwLT50aW1lb3V0ID4gMCkKKwkJCXRpbWVvdXQgPSBoYW5kbGVwLT50aW1lb3V0OwkvKiBibG9jayBmb3IgdGhhdCBhbW91bnQgb2YgdGltZSAqLworCQllbHNlCisJCQl0aW1lb3V0ID0gMDsJLyogbm9uLWJsb2NraW5nIG1vZGUgLSBwb2xsIHRvIHBpY2sgdXAgZXJyb3JzICovCisJCWRvIHsKKwkJCXJldCA9IHBvbGwoJnBvbGxpbmZvLCAxLCB0aW1lb3V0KTsKKwkJCWlmIChyZXQgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJjYW4ndCBwb2xsIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKKwkJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJfSBlbHNlIGlmIChyZXQgPiAwICYmCisJCQkJKHBvbGxpbmZvLnJldmVudHMgJiAoUE9MTEhVUHxQT0xMUkRIVVB8UE9MTEVSUnxQT0xMTlZBTCkpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSdzIHNvbWUgaW5kaWNhdGlvbiBvdGhlciB0aGFuCisJCQkJICogInlvdSBjYW4gcmVhZCBvbiB0aGlzIGRlc2NyaXB0b3IiIG9uCisJCQkJICogdGhlIGRlc2NyaXB0b3IuCisJCQkJICovCisJCQkJaWYgKHBvbGxpbmZvLnJldmVudHMgJiAoUE9MTEhVUCB8IFBPTExSREhVUCkpIHsKKwkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsCisJCQkJCQlQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkJIkhhbmd1cCBvbiBwYWNrZXQgc29ja2V0Iik7CisJCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJCX0KKwkJCQlpZiAocG9sbGluZm8ucmV2ZW50cyAmIFBPTExFUlIpIHsKKwkJCQkJLyoKKwkJCQkJICogQSByZWN2KCkgd2lsbCBnaXZlIHVzIHRoZQorCQkJCQkgKiBhY3R1YWwgZXJyb3IgY29kZS4KKwkJCQkJICoKKwkJCQkJICogWFhYIC0gbWFrZSB0aGUgc29ja2V0IG5vbi1ibG9ja2luZz8KKwkJCQkJICovCisJCQkJCWlmIChyZWN2KGhhbmRsZS0+ZmQsICZjLCBzaXplb2YgYywKKwkJCQkJCU1TR19QRUVLKSAhPSAtMSkKKwkJCQkJCWNvbnRpbnVlOwkvKiB3aGF0LCBubyBlcnJvcj8gKi8KKwkJCQkJaWYgKGVycm5vID09IEVORVRET1dOKSB7CisJCQkJCQkvKgorCQkJCQkJICogVGhlIGRldmljZSBvbiB3aGljaCB3ZSdyZQorCQkJCQkJICogY2FwdHVyaW5nIHdlbnQgYXdheS4KKwkJCQkJCSAqCisJCQkJCQkgKiBYWFggLSB3ZSBzaG91bGQgcmVhbGx5IHJldHVybgorCQkJCQkJICogUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAsCisJCQkJCQkgKiBidXQgcGNhcF9kaXNwYXRjaCgpIGV0Yy4KKwkJCQkJCSAqIGFyZW4ndCBkZWZpbmVkIHRvIHJldHVybgorCQkJCQkJICogdGhhdC4KKwkJCQkJCSAqLworCQkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsCisJCQkJCQkJUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJCQkiVGhlIGludGVyZmFjZSB3ZW50IGRvd24iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLAorCQkJCQkJCVBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkJIkVycm9yIGNvbmRpdGlvbiBvbiBwYWNrZXQgc29ja2V0OiAlcyIsCisJCQkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJCQl9CisJCQkJaWYgKHBvbGxpbmZvLnJldmVudHMgJiBQT0xMTlZBTCkgeworCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJCVBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkiSW52YWxpZCBwb2xsaW5nIHJlcXVlc3Qgb24gcGFja2V0IHNvY2tldCIpOworCQkJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJCQl9CisJCQl9CisJCQkvKiBjaGVjayBmb3IgYnJlYWsgbG9vcCBjb25kaXRpb24gb24gaW50ZXJydXB0ZWQgc3lzY2FsbCovCisJCQlpZiAoaGFuZGxlLT5icmVha19sb29wKSB7CisJCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUl9CUkVBSzsKKwkJCX0KKwkJfSB3aGlsZSAocmV0IDwgMCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBoYW5kbGUgYSBzaW5nbGUgbWVtb3J5IG1hcHBlZCBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgcGNhcF9oYW5kbGVfcGFja2V0X21tYXAoCisJCXBjYXBfdCAqaGFuZGxlLAorCQlwY2FwX2hhbmRsZXIgY2FsbGJhY2ssCisJCXVfY2hhciAqdXNlciwKKwkJdW5zaWduZWQgY2hhciAqZnJhbWUsCisJCXVuc2lnbmVkIGludCB0cF9sZW4sCisJCXVuc2lnbmVkIGludCB0cF9tYWMsCisJCXVuc2lnbmVkIGludCB0cF9zbmFwbGVuLAorCQl1bnNpZ25lZCBpbnQgdHBfc2VjLAorCQl1bnNpZ25lZCBpbnQgdHBfdXNlYywKKwkJaW50IHRwX3ZsYW5fdGNpX3ZhbGlkLAorCQlfX3UxNiB0cF92bGFuX3RjaSkKK3sKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwl1bnNpZ25lZCBjaGFyICpicDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgKnNsbDsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGNhcGhkcjsKKworCS8qIHBlcmZvcm0gc2FuaXR5IGNoZWNrIG9uIGludGVybmFsIG9mZnNldC4gKi8KKwlpZiAodHBfbWFjICsgdHBfc25hcGxlbiA+IGhhbmRsZS0+YnVmc2l6ZSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSJjb3JydXB0ZWQgZnJhbWUgb24ga2VybmVsIHJpbmcgbWFjICIKKwkJCSJvZmZzZXQgJWQgKyBjYXBsZW4gJWQgPiBmcmFtZSBsZW4gJWQiLAorCQkJdHBfbWFjLCB0cF9zbmFwbGVuLCBoYW5kbGUtPmJ1ZnNpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogcnVuIGZpbHRlciBvbiByZWNlaXZlZCBwYWNrZXQKKwkgKiBJZiB0aGUga2VybmVsIGZpbHRlcmluZyBpcyBlbmFibGVkIHdlIG5lZWQgdG8gcnVuIHRoZQorCSAqIGZpbHRlciB1bnRpbCBhbGwgdGhlIGZyYW1lcyBwcmVzZW50IGludG8gdGhlIHJpbmcKKwkgKiBhdCBmaWx0ZXIgY3JlYXRpb24gdGltZSBhcmUgcHJvY2Vzc2VkLgorCSAqIEluIHRoaXMgY2FzZSwgYmxvY2tzX3RvX2ZpbHRlcl9pbl91c2VybGFuZCBpcyB1c2VkCisJICogYXMgYSBjb3VudGVyIGZvciB0aGUgcGFja2V0IHdlIG5lZWQgdG8gZmlsdGVyLgorCSAqIE5vdGU6IGFsdGVybmF0aXZlbHkgaXQgY291bGQgYmUgcG9zc2libGUgdG8gc3RvcCBhcHBseWluZworCSAqIHRoZSBmaWx0ZXIgd2hlbiB0aGUgcmluZyBiZWNhbWUgZW1wdHksIGJ1dCBpdCBjYW4gcG9zc2libHkKKwkgKiBoYXBwZW4gYSBsb3QgbGF0ZXIuLi4gKi8KKwlicCA9IGZyYW1lICsgdHBfbWFjOworCWlmIChoYW5kbGVwLT5maWx0ZXJfaW5fdXNlcmxhbmQgJiYgaGFuZGxlLT5mY29kZS5iZl9pbnNucyAmJgorCQkJKGJwZl9maWx0ZXIoaGFuZGxlLT5mY29kZS5iZl9pbnNucywgYnAsCisJCQkJdHBfbGVuLCB0cF9zbmFwbGVuKSA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlzbGwgPSAodm9pZCAqKWZyYW1lICsgVFBBQ0tFVF9BTElHTihoYW5kbGVwLT50cF9oZHJsZW4pOworCWlmICghbGludXhfY2hlY2tfZGlyZWN0aW9uKGhhbmRsZSwgc2xsKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBnZXQgcmVxdWlyZWQgcGFja2V0IGluZm8gZnJvbSByaW5nIGhlYWRlciAqLworCXBjYXBoZHIudHMudHZfc2VjID0gdHBfc2VjOworCXBjYXBoZHIudHMudHZfdXNlYyA9IHRwX3VzZWM7CisJcGNhcGhkci5jYXBsZW4gPSB0cF9zbmFwbGVuOworCXBjYXBoZHIubGVuID0gdHBfbGVuOworCisJLyogaWYgcmVxdWlyZWQgYnVpbGQgaW4gcGxhY2UgdGhlIHNsbCBoZWFkZXIqLworCWlmIChoYW5kbGVwLT5jb29rZWQpIHsKKwkJc3RydWN0IHNsbF9oZWFkZXIgKmhkcnA7CisKKwkJLyoKKwkJICogVGhlIGtlcm5lbCBzaG91bGQgaGF2ZSBsZWZ0IHVzIHdpdGggZW5vdWdoCisJCSAqIHNwYWNlIGZvciBhbiBzbGwgaGVhZGVyOyBiYWNrIHVwIHRoZSBwYWNrZXQKKwkJICogZGF0YSBwb2ludGVyIGludG8gdGhhdCBzcGFjZSwgYXMgdGhhdCdsbCBiZQorCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgd2UgcGFzcyB0byB0aGUKKwkJICogY2FsbGJhY2suCisJCSAqLworCQlicCAtPSBTTExfSERSX0xFTjsKKworCQkvKi8qCisJCSAqIExldCdzIG1ha2Ugc3VyZSB0aGF0J3MgcGFzdCB0aGUgZW5kIG9mCisJCSAqIHRoZSB0cGFja2V0IGhlYWRlciwgaS5lLiA+PQorCQkgKiAoKHVfY2hhciAqKXRoZHIgKyBUUEFDS0VUX0hEUkxFTiksIHNvIHdlCisJCSAqIGRvbid0IHN0ZXAgb24gdGhlIGhlYWRlciB3aGVuIHdlIGNvbnN0cnVjdAorCQkgKiB0aGUgc2xsIGhlYWRlci4KKwkJICovCisJCWlmIChicCA8ICh1X2NoYXIgKilmcmFtZSArCisJCQkJICAgVFBBQ0tFVF9BTElHTihoYW5kbGVwLT50cF9oZHJsZW4pICsKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJImNvb2tlZC1tb2RlIGZyYW1lIGRvZXNuJ3QgaGF2ZSByb29tIGZvciBzbGwgaGVhZGVyIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBPSywgdGhhdCB3b3JrZWQ7IGNvbnN0cnVjdCB0aGUgc2xsIGhlYWRlci4KKwkJICovCisJCWhkcnAgPSAoc3RydWN0IHNsbF9oZWFkZXIgKilicDsKKwkJaGRycC0+c2xsX3BrdHR5cGUgPSBtYXBfcGFja2V0X3R5cGVfdG9fc2xsX3R5cGUoCisJCQkJCQlzbGwtPnNsbF9wa3R0eXBlKTsKKwkJaGRycC0+c2xsX2hhdHlwZSA9IGh0b25zKHNsbC0+c2xsX2hhdHlwZSk7CisJCWhkcnAtPnNsbF9oYWxlbiA9IGh0b25zKHNsbC0+c2xsX2hhbGVuKTsKKwkJbWVtY3B5KGhkcnAtPnNsbF9hZGRyLCBzbGwtPnNsbF9hZGRyLCBTTExfQUREUkxFTik7CisJCWhkcnAtPnNsbF9wcm90b2NvbCA9IHNsbC0+c2xsX3Byb3RvY29sOworCisJCS8qIHVwZGF0ZSBwYWNrZXQgbGVuICovCisJCXBjYXBoZHIuY2FwbGVuICs9IFNMTF9IRFJfTEVOOworCQlwY2FwaGRyLmxlbiArPSBTTExfSERSX0xFTjsKKwl9CisKKyNpZiBkZWZpbmVkKEhBVkVfVFBBQ0tFVDIpIHx8IGRlZmluZWQoSEFWRV9UUEFDS0VUMykKKwlpZiAodHBfdmxhbl90Y2lfdmFsaWQgJiYKKwkJaGFuZGxlcC0+dmxhbl9vZmZzZXQgIT0gLTEgJiYKKwkJdHBfc25hcGxlbiA+PSAodW5zaWduZWQgaW50KSBoYW5kbGVwLT52bGFuX29mZnNldCkKKwl7CisJCXN0cnVjdCB2bGFuX3RhZyAqdGFnOworCisJCWJwIC09IFZMQU5fVEFHX0xFTjsKKwkJbWVtbW92ZShicCwgYnAgKyBWTEFOX1RBR19MRU4sIGhhbmRsZXAtPnZsYW5fb2Zmc2V0KTsKKworCQl0YWcgPSAoc3RydWN0IHZsYW5fdGFnICopKGJwICsgaGFuZGxlcC0+dmxhbl9vZmZzZXQpOworCQl0YWctPnZsYW5fdHBpZCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKKwkJdGFnLT52bGFuX3RjaSA9IGh0b25zKHRwX3ZsYW5fdGNpKTsKKworCQlwY2FwaGRyLmNhcGxlbiArPSBWTEFOX1RBR19MRU47CisJCXBjYXBoZHIubGVuICs9IFZMQU5fVEFHX0xFTjsKKwl9CisjZW5kaWYKKworCS8qCisJICogVGhlIG9ubHkgd2F5IHRvIHRlbGwgdGhlIGtlcm5lbCB0byBjdXQgb2ZmIHRoZQorCSAqIHBhY2tldCBhdCBhIHNuYXBzaG90IGxlbmd0aCBpcyB3aXRoIGEgZmlsdGVyIHByb2dyYW07CisJICogaWYgdGhlcmUncyBubyBmaWx0ZXIgcHJvZ3JhbSwgdGhlIGtlcm5lbCB3b24ndCBjdXQKKwkgKiB0aGUgcGFja2V0IG9mZi4KKwkgKgorCSAqIFRyaW0gdGhlIHNuYXBzaG90IGxlbmd0aCB0byBiZSBubyBsb25nZXIgdGhhbiB0aGUKKwkgKiBzcGVjaWZpZWQgc25hcHNob3QgbGVuZ3RoLgorCSAqLworCWlmIChwY2FwaGRyLmNhcGxlbiA+IGhhbmRsZS0+c25hcHNob3QpCisJCXBjYXBoZHIuY2FwbGVuID0gaGFuZGxlLT5zbmFwc2hvdDsKKworCS8qIHBhc3MgdGhlIHBhY2tldCB0byB0aGUgdXNlciAqLworCWNhbGxiYWNrKHVzZXIsICZwY2FwaGRyLCBicCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcGNhcF9yZWFkX2xpbnV4X21tYXBfdjEocGNhcF90ICpoYW5kbGUsIGludCBtYXhfcGFja2V0cywgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLAorCQl1X2NoYXIgKnVzZXIpCit7CisJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJaW50IHBrdHMgPSAwOworCWludCByZXQ7CisKKwkvKiB3YWl0IGZvciBmcmFtZXMgYXZhaWxhYmlsaXR5LiovCisJcmV0ID0gcGNhcF93YWl0X2Zvcl9mcmFtZXNfbW1hcChoYW5kbGUpOworCWlmIChyZXQpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBub24tcG9zaXRpdmUgdmFsdWVzIG9mIG1heF9wYWNrZXRzIGFyZSB1c2VkIHRvIHJlcXVpcmUgYWxsCisJICogcGFja2V0cyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSByaW5nICovCisJd2hpbGUgKChwa3RzIDwgbWF4X3BhY2tldHMpIHx8IFBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQobWF4X3BhY2tldHMpKSB7CisJCXVuaW9uIHRoZHIgaDsKKworCQloLnJhdyA9IHBjYXBfZ2V0X3JpbmdfZnJhbWUoaGFuZGxlLCBUUF9TVEFUVVNfVVNFUik7CisJCWlmICghaC5yYXcpCisJCQlicmVhazsKKworCQlyZXQgPSBwY2FwX2hhbmRsZV9wYWNrZXRfbW1hcCgKKwkJCQloYW5kbGUsCisJCQkJY2FsbGJhY2ssCisJCQkJdXNlciwKKwkJCQloLnJhdywKKwkJCQloLmgxLT50cF9sZW4sCisJCQkJaC5oMS0+dHBfbWFjLAorCQkJCWguaDEtPnRwX3NuYXBsZW4sCisJCQkJaC5oMS0+dHBfc2VjLAorCQkJCWguaDEtPnRwX3VzZWMsCisJCQkJMCwKKwkJCQkwKTsKKwkJaWYgKHJldCA9PSAxKSB7CisJCQlwa3RzKys7CisJCQloYW5kbGVwLT5wYWNrZXRzX3JlYWQrKzsKKwkJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyoKKwkJICogSGFuZCB0aGlzIGJsb2NrIGJhY2sgdG8gdGhlIGtlcm5lbCwgYW5kLCBpZiB3ZSdyZQorCQkgKiBjb3VudGluZyBibG9ja3MgdGhhdCBuZWVkIHRvIGJlIGZpbHRlcmVkIGluIHVzZXJsYW5kCisJCSAqIGFmdGVyIGhhdmluZyBiZWVuIGZpbHRlcmVkIGJ5IHRoZSBrZXJuZWwsIGNvdW50CisJCSAqIHRoZSBvbmUgd2UndmUganVzdCBwcm9jZXNzZWQuCisJCSAqLworCQloLmgxLT50cF9zdGF0dXMgPSBUUF9TVEFUVVNfS0VSTkVMOworCQlpZiAoaGFuZGxlcC0+YmxvY2tzX3RvX2ZpbHRlcl9pbl91c2VybGFuZCA+IDApIHsKKwkJCWhhbmRsZXAtPmJsb2Nrc190b19maWx0ZXJfaW5fdXNlcmxhbmQtLTsKKwkJCWlmIChoYW5kbGVwLT5ibG9ja3NfdG9fZmlsdGVyX2luX3VzZXJsYW5kID09IDApIHsKKwkJCQkvKgorCQkJCSAqIE5vIG1vcmUgYmxvY2tzIG5lZWQgdG8gYmUgZmlsdGVyZWQKKwkJCQkgKiBpbiB1c2VybGFuZC4KKwkJCQkgKi8KKwkJCQloYW5kbGVwLT5maWx0ZXJfaW5fdXNlcmxhbmQgPSAwOworCQkJfQorCQl9CisKKwkJLyogbmV4dCBibG9jayAqLworCQlpZiAoKytoYW5kbGUtPm9mZnNldCA+PSBoYW5kbGUtPmNjKQorCQkJaGFuZGxlLT5vZmZzZXQgPSAwOworCisJCS8qIGNoZWNrIGZvciBicmVhayBsb29wIGNvbmRpdGlvbiovCisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApIHsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gUENBUF9FUlJPUl9CUkVBSzsKKwkJfQorCX0KKwlyZXR1cm4gcGt0czsKK30KKworI2lmZGVmIEhBVkVfVFBBQ0tFVDIKK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9saW51eF9tbWFwX3YyKHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywKKwkJdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWludCBwa3RzID0gMDsKKwlpbnQgcmV0OworCisJLyogd2FpdCBmb3IgZnJhbWVzIGF2YWlsYWJpbGl0eS4qLworCXJldCA9IHBjYXBfd2FpdF9mb3JfZnJhbWVzX21tYXAoaGFuZGxlKTsKKwlpZiAocmV0KSB7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbm9uLXBvc2l0aXZlIHZhbHVlcyBvZiBtYXhfcGFja2V0cyBhcmUgdXNlZCB0byByZXF1aXJlIGFsbAorCSAqIHBhY2tldHMgY3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgcmluZyAqLworCXdoaWxlICgocGt0cyA8IG1heF9wYWNrZXRzKSB8fCBQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKG1heF9wYWNrZXRzKSkgeworCQl1bmlvbiB0aGRyIGg7CisKKwkJaC5yYXcgPSBwY2FwX2dldF9yaW5nX2ZyYW1lKGhhbmRsZSwgVFBfU1RBVFVTX1VTRVIpOworCQlpZiAoIWgucmF3KQorCQkJYnJlYWs7CisKKwkJcmV0ID0gcGNhcF9oYW5kbGVfcGFja2V0X21tYXAoCisJCQkJaGFuZGxlLAorCQkJCWNhbGxiYWNrLAorCQkJCXVzZXIsCisJCQkJaC5yYXcsCisJCQkJaC5oMi0+dHBfbGVuLAorCQkJCWguaDItPnRwX21hYywKKwkJCQloLmgyLT50cF9zbmFwbGVuLAorCQkJCWguaDItPnRwX3NlYywKKwkJCQloYW5kbGUtPm9wdC50c3RhbXBfcHJlY2lzaW9uID09IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5PID8gaC5oMi0+dHBfbnNlYyA6IGguaDItPnRwX25zZWMgLyAxMDAwLAorI2lmIGRlZmluZWQoVFBfU1RBVFVTX1ZMQU5fVkFMSUQpCisJCQkJKGguaDItPnRwX3ZsYW5fdGNpIHx8IChoLmgyLT50cF9zdGF0dXMgJiBUUF9TVEFUVVNfVkxBTl9WQUxJRCkpLAorI2Vsc2UKKwkJCQloLmgyLT50cF92bGFuX3RjaSAhPSAwLAorI2VuZGlmCisJCQkJaC5oMi0+dHBfdmxhbl90Y2kpOworCQlpZiAocmV0ID09IDEpIHsKKwkJCXBrdHMrKzsKKwkJCWhhbmRsZXAtPnBhY2tldHNfcmVhZCsrOworCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKgorCQkgKiBIYW5kIHRoaXMgYmxvY2sgYmFjayB0byB0aGUga2VybmVsLCBhbmQsIGlmIHdlJ3JlCisJCSAqIGNvdW50aW5nIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUgZmlsdGVyZWQgaW4gdXNlcmxhbmQKKwkJICogYWZ0ZXIgaGF2aW5nIGJlZW4gZmlsdGVyZWQgYnkgdGhlIGtlcm5lbCwgY291bnQKKwkJICogdGhlIG9uZSB3ZSd2ZSBqdXN0IHByb2Nlc3NlZC4KKwkJICovCisJCWguaDItPnRwX3N0YXR1cyA9IFRQX1NUQVRVU19LRVJORUw7CisJCWlmIChoYW5kbGVwLT5ibG9ja3NfdG9fZmlsdGVyX2luX3VzZXJsYW5kID4gMCkgeworCQkJaGFuZGxlcC0+YmxvY2tzX3RvX2ZpbHRlcl9pbl91c2VybGFuZC0tOworCQkJaWYgKGhhbmRsZXAtPmJsb2Nrc190b19maWx0ZXJfaW5fdXNlcmxhbmQgPT0gMCkgeworCQkJCS8qCisJCQkJICogTm8gbW9yZSBibG9ja3MgbmVlZCB0byBiZSBmaWx0ZXJlZAorCQkJCSAqIGluIHVzZXJsYW5kLgorCQkJCSAqLworCQkJCWhhbmRsZXAtPmZpbHRlcl9pbl91c2VybGFuZCA9IDA7CisJCQl9CisJCX0KKworCQkvKiBuZXh0IGJsb2NrICovCisJCWlmICgrK2hhbmRsZS0+b2Zmc2V0ID49IGhhbmRsZS0+Y2MpCisJCQloYW5kbGUtPm9mZnNldCA9IDA7CisKKwkJLyogY2hlY2sgZm9yIGJyZWFrIGxvb3AgY29uZGl0aW9uKi8KKwkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkgeworCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCXJldHVybiBQQ0FQX0VSUk9SX0JSRUFLOworCQl9CisJfQorCXJldHVybiBwa3RzOworfQorI2VuZGlmIC8qIEhBVkVfVFBBQ0tFVDIgKi8KKworI2lmZGVmIEhBVkVfVFBBQ0tFVDMKK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9saW51eF9tbWFwX3YzKHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywKKwkJdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCXVuaW9uIHRoZHIgaDsKKwlpbnQgcGt0cyA9IDA7CisJaW50IHJldDsKKworCWlmIChoYW5kbGVwLT5jdXJyZW50X3BhY2tldCA9PSBOVUxMKSB7CisJCS8qIHdhaXQgZm9yIGZyYW1lcyBhdmFpbGFiaWxpdHkuKi8KKwkJcmV0ID0gcGNhcF93YWl0X2Zvcl9mcmFtZXNfbW1hcChoYW5kbGUpOworCQlpZiAocmV0KSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWgucmF3ID0gcGNhcF9nZXRfcmluZ19mcmFtZShoYW5kbGUsIFRQX1NUQVRVU19VU0VSKTsKKwlpZiAoIWgucmF3KQorCQlyZXR1cm4gcGt0czsKKworCS8qIG5vbi1wb3NpdGl2ZSB2YWx1ZXMgb2YgbWF4X3BhY2tldHMgYXJlIHVzZWQgdG8gcmVxdWlyZSBhbGwKKwkgKiBwYWNrZXRzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIHJpbmcgKi8KKwl3aGlsZSAoKHBrdHMgPCBtYXhfcGFja2V0cykgfHwgUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChtYXhfcGFja2V0cykpIHsKKwkJaWYgKGhhbmRsZXAtPmN1cnJlbnRfcGFja2V0ID09IE5VTEwpIHsKKwkJCWgucmF3ID0gcGNhcF9nZXRfcmluZ19mcmFtZShoYW5kbGUsIFRQX1NUQVRVU19VU0VSKTsKKwkJCWlmICghaC5yYXcpCisJCQkJYnJlYWs7CisKKwkJCWhhbmRsZXAtPmN1cnJlbnRfcGFja2V0ID0gaC5yYXcgKyBoLmgzLT5oZHIuYmgxLm9mZnNldF90b19maXJzdF9wa3Q7CisJCQloYW5kbGVwLT5wYWNrZXRzX2xlZnQgPSBoLmgzLT5oZHIuYmgxLm51bV9wa3RzOworCQl9CisJCWludCBwYWNrZXRzX3RvX3JlYWQgPSBoYW5kbGVwLT5wYWNrZXRzX2xlZnQ7CisKKwkJaWYgKCFQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKG1heF9wYWNrZXRzKSAmJiBwYWNrZXRzX3RvX3JlYWQgPiBtYXhfcGFja2V0cykgeworCQkJcGFja2V0c190b19yZWFkID0gbWF4X3BhY2tldHM7CisJCX0KKworCQl3aGlsZShwYWNrZXRzX3RvX3JlYWQtLSkgeworCQkJc3RydWN0IHRwYWNrZXQzX2hkciogdHAzX2hkciA9IChzdHJ1Y3QgdHBhY2tldDNfaGRyKikgaGFuZGxlcC0+Y3VycmVudF9wYWNrZXQ7CisJCQlyZXQgPSBwY2FwX2hhbmRsZV9wYWNrZXRfbW1hcCgKKwkJCQkJaGFuZGxlLAorCQkJCQljYWxsYmFjaywKKwkJCQkJdXNlciwKKwkJCQkJaGFuZGxlcC0+Y3VycmVudF9wYWNrZXQsCisJCQkJCXRwM19oZHItPnRwX2xlbiwKKwkJCQkJdHAzX2hkci0+dHBfbWFjLAorCQkJCQl0cDNfaGRyLT50cF9zbmFwbGVuLAorCQkJCQl0cDNfaGRyLT50cF9zZWMsCisJCQkJCWhhbmRsZS0+b3B0LnRzdGFtcF9wcmVjaXNpb24gPT0gUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8gPyB0cDNfaGRyLT50cF9uc2VjIDogdHAzX2hkci0+dHBfbnNlYyAvIDEwMDAsCisjaWYgZGVmaW5lZChUUF9TVEFUVVNfVkxBTl9WQUxJRCkKKwkJCQkJKHRwM19oZHItPmh2MS50cF92bGFuX3RjaSB8fCAodHAzX2hkci0+dHBfc3RhdHVzICYgVFBfU1RBVFVTX1ZMQU5fVkFMSUQpKSwKKyNlbHNlCisJCQkJCXRwM19oZHItPmh2MS50cF92bGFuX3RjaSAhPSAwLAorI2VuZGlmCisJCQkJCXRwM19oZHItPmh2MS50cF92bGFuX3RjaSk7CisJCQlpZiAocmV0ID09IDEpIHsKKwkJCQlwa3RzKys7CisJCQkJaGFuZGxlcC0+cGFja2V0c19yZWFkKys7CisJCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKKwkJCQloYW5kbGVwLT5jdXJyZW50X3BhY2tldCA9IE5VTEw7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWhhbmRsZXAtPmN1cnJlbnRfcGFja2V0ICs9IHRwM19oZHItPnRwX25leHRfb2Zmc2V0OworCQkJaGFuZGxlcC0+cGFja2V0c19sZWZ0LS07CisJCX0KKworCQlpZiAoaGFuZGxlcC0+cGFja2V0c19sZWZ0IDw9IDApIHsKKwkJCS8qCisJCQkgKiBIYW5kIHRoaXMgYmxvY2sgYmFjayB0byB0aGUga2VybmVsLCBhbmQsIGlmCisJCQkgKiB3ZSdyZSBjb3VudGluZyBibG9ja3MgdGhhdCBuZWVkIHRvIGJlCisJCQkgKiBmaWx0ZXJlZCBpbiB1c2VybGFuZCBhZnRlciBoYXZpbmcgYmVlbgorCQkJICogZmlsdGVyZWQgYnkgdGhlIGtlcm5lbCwgY291bnQgdGhlIG9uZSB3ZSd2ZQorCQkJICoganVzdCBwcm9jZXNzZWQuCisJCQkgKi8KKwkJCWguaDMtPmhkci5iaDEuYmxvY2tfc3RhdHVzID0gVFBfU1RBVFVTX0tFUk5FTDsKKwkJCWlmIChoYW5kbGVwLT5ibG9ja3NfdG9fZmlsdGVyX2luX3VzZXJsYW5kID4gMCkgeworCQkJCWhhbmRsZXAtPmJsb2Nrc190b19maWx0ZXJfaW5fdXNlcmxhbmQtLTsKKwkJCQlpZiAoaGFuZGxlcC0+YmxvY2tzX3RvX2ZpbHRlcl9pbl91c2VybGFuZCA9PSAwKSB7CisJCQkJCS8qCisJCQkJCSAqIE5vIG1vcmUgYmxvY2tzIG5lZWQgdG8gYmUgZmlsdGVyZWQKKwkJCQkJICogaW4gdXNlcmxhbmQuCisJCQkJCSAqLworCQkJCQloYW5kbGVwLT5maWx0ZXJfaW5fdXNlcmxhbmQgPSAwOworCQkJCX0KKwkJCX0KKworCQkJLyogbmV4dCBibG9jayAqLworCQkJaWYgKCsraGFuZGxlLT5vZmZzZXQgPj0gaGFuZGxlLT5jYykKKwkJCQloYW5kbGUtPm9mZnNldCA9IDA7CisKKwkJCWhhbmRsZXAtPmN1cnJlbnRfcGFja2V0ID0gTlVMTDsKKwkJfQorCisJCS8qIGNoZWNrIGZvciBicmVhayBsb29wIGNvbmRpdGlvbiovCisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApIHsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gUENBUF9FUlJPUl9CUkVBSzsKKwkJfQorCX0KKwlyZXR1cm4gcGt0czsKK30KKyNlbmRpZiAvKiBIQVZFX1RQQUNLRVQzICovCisKK3N0YXRpYyBpbnQgCitwY2FwX3NldGZpbHRlcl9saW51eF9tbWFwKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZpbHRlcikKK3sKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwlpbnQgbiwgb2Zmc2V0OworCWludCByZXQ7CisKKwkvKgorCSAqIERvbid0IHJld3JpdGUgInJldCIgaW5zdHJ1Y3Rpb25zOyB3ZSBkb24ndCBuZWVkIHRvLCBhcworCSAqIHdlJ3JlIG5vdCByZWFkaW5nIHBhY2tldHMgd2l0aCByZWN2bXNnKCksIGFuZCB3ZSBkb24ndAorCSAqIHdhbnQgdG8sIGFzLCBieSBub3QgcmV3cml0aW5nIHRoZW0sIHRoZSBrZXJuZWwgY2FuIGF2b2lkCisJICogY29weWluZyBleHRyYSBkYXRhLgorCSAqLworCXJldCA9IHBjYXBfc2V0ZmlsdGVyX2xpbnV4X2NvbW1vbihoYW5kbGUsIGZpbHRlciwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIElmIHdlJ3JlIGZpbHRlcmluZyBpbiB1c2VybGFuZCwgdGhlcmUncyBub3RoaW5nIHRvIGRvOworCSAqIHRoZSBuZXcgZmlsdGVyIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5leHQgcGFja2V0LgorCSAqLworCWlmIChoYW5kbGVwLT5maWx0ZXJfaW5fdXNlcmxhbmQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFdlJ3JlIGZpbHRlcmluZyBpbiB0aGUga2VybmVsOyB0aGUgcGFja2V0cyBwcmVzZW50IGluCisJICogYWxsIGJsb2NrcyBjdXJyZW50bHkgaW4gdGhlIHJpbmcgd2VyZSBhbHJlYWR5IGZpbHRlcmVkCisJICogYnkgdGhlIG9sZCBmaWx0ZXIsIGFuZCBzbyB3aWxsIG5lZWQgdG8gYmUgZmlsdGVyZWQgaW4KKwkgKiB1c2VybGFuZCBieSB0aGUgbmV3IGZpbHRlci4KKwkgKgorCSAqIEdldCBhbiB1cHBlciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBzdWNoIGJsb2NrczsgZmlyc3QsCisJICogd2FsayB0aGUgcmluZyBiYWNrd2FyZCBhbmQgY291bnQgdGhlIGZyZWUgYmxvY2tzLgorCSAqLworCW9mZnNldCA9IGhhbmRsZS0+b2Zmc2V0OworCWlmICgtLWhhbmRsZS0+b2Zmc2V0IDwgMCkKKwkJaGFuZGxlLT5vZmZzZXQgPSBoYW5kbGUtPmNjIC0gMTsKKwlmb3IgKG49MDsgbiA8IGhhbmRsZS0+Y2M7ICsrbikgeworCQlpZiAoLS1oYW5kbGUtPm9mZnNldCA8IDApCisJCQloYW5kbGUtPm9mZnNldCA9IGhhbmRsZS0+Y2MgLSAxOworCQlpZiAoIXBjYXBfZ2V0X3JpbmdfZnJhbWUoaGFuZGxlLCBUUF9TVEFUVVNfS0VSTkVMKSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgd2UgZm91bmQgZnJlZSBibG9ja3MsIGRlY3JlbWVudCB0aGUgY291bnQgb2YgZnJlZQorCSAqIGJsb2NrcyBieSAxLCBqdXN0IGluIGNhc2Ugd2UgbG9zdCBhIHJhY2Ugd2l0aCBhbm90aGVyCisJICogdGhyZWFkIG9mIGNvbnRyb2wgdGhhdCB3YXMgYWRkaW5nIGEgcGFja2V0IHdoaWxlCisJICogd2Ugd2VyZSBjb3VudGluZyBhbmQgdGhhdCBoYWQgcnVuIHRoZSBmaWx0ZXIgYmVmb3JlCisJICogd2UgY2hhbmdlZCBpdC4KKwkgKgorCSAqIFhYWCAtIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhhbiBvbmUgYmxvY2sgYWRkZWQgaW4KKwkgKiB0aGlzIGZhc2hpb24/CisJICoKKwkgKiBYWFggLSBpcyB0aGVyZSBhIHdheSB0byBhdm9pZCB0aGF0IHJhY2UsIGUuZy4gc29tZWhvdworCSAqIHdhaXQgZm9yIGFsbCBwYWNrZXRzIHRoYXQgcGFzc2VkIHRoZSBvbGQgZmlsdGVyIHRvCisJICogYmUgYWRkZWQgdG8gdGhlIHJpbmc/CisJICovCisJaWYgKG4gIT0gMCkKKwkJbi0tOworCisJLyogYmUgY2FyZWZ1bCB0byBub3QgY2hhbmdlIGN1cnJlbnQgcmluZyBwb3NpdGlvbiAqLworCWhhbmRsZS0+b2Zmc2V0ID0gb2Zmc2V0OworCisJLyoKKwkgKiBTZXQgdGhlIGNvdW50IG9mIGJsb2NrcyB3b3J0aCBvZiBwYWNrZXRzIHRvIGZpbHRlcgorCSAqIGluIHVzZXJsYW5kIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGluIHRoZQorCSAqIHJpbmcgbWludXMgdGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyB3ZSBmb3VuZCwgYW5kCisJICogdHVybiBvbiB1c2VybGFuZCBmaWx0ZXJpbmcuICAoVGhlIGNvdW50IG9mIGJsb2NrcworCSAqIHdvcnRoIG9mIHBhY2tldHMgdG8gZmlsdGVyIGluIHVzZXJsYW5kIGlzIGd1YXJhbnRlZWQKKwkgKiBub3QgdG8gYmUgemVybyAtIG4sIGFib3ZlLCBjb3VsZG4ndCBiZSBzZXQgdG8gYQorCSAqIHZhbHVlID4gaGFuZGxlLT5jYywgYW5kIGlmIGl0IHdlcmUgZXF1YWwgdG8KKwkgKiBoYW5kbGUtPmNjLCBpdCB3b3VsZG4ndCBiZSB6ZXJvLCBhbmQgdGh1cyB3b3VsZAorCSAqIGJlIGRlY3JlbWVudGVkIHRvIGhhbmRsZS0+Y2MgLSAxLikKKwkgKi8KKwloYW5kbGVwLT5ibG9ja3NfdG9fZmlsdGVyX2luX3VzZXJsYW5kID0gaGFuZGxlLT5jYyAtIG47CisJaGFuZGxlcC0+ZmlsdGVyX2luX3VzZXJsYW5kID0gMTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogSEFWRV9QQUNLRVRfUklORyAqLworCisKICNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCiAvKgogICogIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGRldmljZSBuYW1lLiBGaWxsIGVidWYgYW5kIHJldHVybgpAQCAtMTYyNCw2ICs0NjYzLDggQEAKIAogLyoKICAqICBCaW5kIHRoZSBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIEZEIHRvIHRoZSBnaXZlbiBkZXZpY2UuCisgKiAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBpZiB3ZSBzaG91bGQgdHJ5IGEgU09DS19QQUNLRVQgc29ja2V0LAorICogIG9yIGEgUENBUF9FUlJPUl8gdmFsdWUgb24gYSBoYXJkIGVycm9yLgogICovCiBzdGF0aWMgaW50CiBpZmFjZV9iaW5kKGludCBmZCwgaW50IGlmaW5kZXgsIGNoYXIgKmVidWYpCkBAIC0xNjM4LDkgKzQ2NzksMjAgQEAKIAlzbGwuc2xsX3Byb3RvY29sCT0gaHRvbnMoRVRIX1BfQUxMKTsKIAogCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZzbGwsIHNpemVvZihzbGwpKSA9PSAtMSkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJICJiaW5kOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOworCQlpZiAoZXJybm8gPT0gRU5FVERPV04pIHsKKwkJCS8qCisJCQkgKiBSZXR1cm4gYSAibmV0d29yayBkb3duIiBpbmRpY2F0aW9uLCBzbyB0aGF0CisJCQkgKiB0aGUgYXBwbGljYXRpb24gY2FuIHJlcG9ydCB0aGF0IHJhdGhlciB0aGFuCisJCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkJICogc3VnZ2VzdCB0aGF0IHRoZXkgcmVwb3J0IGEgcHJvYmxlbSB0byB0aGUKKwkJCSAqIGxpYnBjYXAgZGV2ZWxvcGVycy4KKwkJCSAqLworCQkJcmV0dXJuIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQOworCQl9IGVsc2UgeworCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgImJpbmQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KIAl9CiAKIAkvKiBBbnkgcGVuZGluZyBlcnJvcnMsIGUuZy4sIG5ldHdvcmsgaXMgZG93bj8gKi8KQEAgLTE2NDgsMjUxICs0NzAwLDEwNDcgQEAKIAlpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnIsICZlcnJsZW4pID09IC0xKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkiZ2V0c29ja29wdDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMjsKKwkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGVyciA+IDApIHsKKwlpZiAoZXJyID09IEVORVRET1dOKSB7CisJCS8qCisJCSAqIFJldHVybiBhICJuZXR3b3JrIGRvd24iIGluZGljYXRpb24sIHNvIHRoYXQKKwkJICogdGhlIGFwcGxpY2F0aW9uIGNhbiByZXBvcnQgdGhhdCByYXRoZXIgdGhhbgorCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkgKiBzdWdnZXN0IHRoYXQgdGhleSByZXBvcnQgYSBwcm9ibGVtIHRvIHRoZQorCQkgKiBsaWJwY2FwIGRldmVsb3BlcnMuCisJCSAqLworCQlyZXR1cm4gUENBUF9FUlJPUl9JRkFDRV9OT1RfVVA7CisJfSBlbHNlIGlmIChlcnIgPiAwKSB7CiAJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkiYmluZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOwotCQlyZXR1cm4gLTI7CisJCXJldHVybiAwOwogCX0KIAorCXJldHVybiAxOworfQorCisjaWZkZWYgSVdfTU9ERV9NT05JVE9SCisvKgorICogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zLgorICogUmV0dXJucyAxIGlmIGl0IGRvZXMsIDAgaWYgaXQgZG9lc24ndCwgUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRQorICogaWYgdGhlIGRldmljZSBkb2Vzbid0IGV2ZW4gZXhpc3QuCisgKi8KK3N0YXRpYyBpbnQKK2hhc193ZXh0KGludCBzb2NrX2ZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJc3RydWN0IGl3cmVxIGlyZXE7CisKKwlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXTkFNRSwgJmlyZXEpID49IDApCisJCXJldHVybiAxOwkvKiB5ZXMgKi8KKwlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiJXM6IFNJT0NHSVdQUklWOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCWlmIChlcnJubyA9PSBFTk9ERVYpCisJCXJldHVybiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOwogCXJldHVybiAwOwogfQogCisvKgorICogUGVyIG1lIHNpIHZhIG5lIGxhIGNpdHRhIGRvbGVudGUsCisgKiBQZXIgbWUgc2kgdmEgbmUgbCdldHRlcm5vIGRvbG9yZSwKKyAqCS4uLgorICogTGFzY2lhdGUgb2duZSBzcGVyYW56YSwgdm9pIGNoJ2ludHJhdGUuCisgKgorICogWFhYIC0gYWlybW9uLW5nIGRvZXMgc3BlY2lhbCBzdHVmZiB3aXRoIHRoZSBPcmlub2NvIGRyaXZlciBhbmQgdGhlCisgKiB3bGFuLW5nIGRyaXZlci4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlNT05JVE9SX1dFWFQsCisJTU9OSVRPUl9IT1NUQVAsCisJTU9OSVRPUl9QUklTTSwKKwlNT05JVE9SX1BSSVNNNTQsCisJTU9OSVRPUl9BQ1gxMDAsCisJTU9OSVRPUl9SVDI1MDAsCisJTU9OSVRPUl9SVDI1NzAsCisJTU9OSVRPUl9SVDczLAorCU1PTklUT1JfUlRMOFhYWAorfSBtb25pdG9yX3R5cGU7CisKKy8qCisgKiBVc2UgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMsIGlmIHdlIGhhdmUgdGhlbSwgdG8gdHJ5IHRvIHR1cm4gbW9uaXRvciBtb2RlCisgKiBvbiBpZiBpdCdzIG5vdCBhbHJlYWR5IG9uLgorICoKKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIGlmIHdlIGRvbid0IHN1cHBvcnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMKKyAqIG9uIHRoaXMgZGV2aWNlLCBvciBhIFBDQVBfRVJST1JfIHZhbHVlIGlmIHdlIGRvIHN1cHBvcnQgdGhlbSBidXQKKyAqIHdlIHdlcmVuJ3QgYWJsZSB0byB0dXJuIG1vbml0b3IgbW9kZSBvbi4KKyAqLworc3RhdGljIGludAorZW50ZXJfcmZtb25fbW9kZV93ZXh0KHBjYXBfdCAqaGFuZGxlLCBpbnQgc29ja19mZCwgY29uc3QgY2hhciAqZGV2aWNlKQoreworCS8qCisJICogWFhYIC0gYXQgbGVhc3Qgc29tZSBhZGFwdGVycyByZXF1aXJlIG5vbi1XaXJlbGVzcyBFeHRlbnNpb25zCisJICogbWVjaGFuaXNtcyB0byB0dXJuIG1vbml0b3IgbW9kZSBvbi4KKwkgKgorCSAqIEF0aGVyb3MgY2FyZHMgbWlnaHQgcmVxdWlyZSB0aGF0IGEgc2VwYXJhdGUgIm1vbml0b3IgdmlydHVhbCBhY2Nlc3MKKwkgKiBwb2ludCIgYmUgY3JlYXRlZCwgd2l0aCBsYXRlciB2ZXJzaW9ucyBvZiB0aGUgbWFkd2lmaSBkcml2ZXIuCisJICogYWlybW9uLW5nIGRvZXMgIndsYW5jb25maWcgYXRoIGNyZWF0ZSB3bGFuZGV2IHtpZn0gd2xhbm1vZGUKKwkgKiBtb25pdG9yIC1ic3NpZCIsIHdoaWNoIGFwcGFyZW50bHkgc3BpdHMgb3V0IGEgbGluZSAiYXRoTiIKKwkgKiB3aGVyZSAiYXRoTiIgaXMgdGhlIG1vbml0b3IgbW9kZSBkZXZpY2UuICBUbyBsZWF2ZSBtb25pdG9yCisJICogbW9kZSwgaXQgZGVzdHJveXMgdGhlIG1vbml0b3IgbW9kZSBkZXZpY2UuCisJICoKKwkgKiBTb21lIEludGVsIENlbnRyaW5vIGFkYXB0ZXJzIG1pZ2h0IHJlcXVpcmUgcHJpdmF0ZSBpb2N0bHMgdG8gZ2V0CisJICogcmFkaW8gaGVhZGVyczsgdGhlIGlwdzIyMDAgYW5kIGlwdzM5NDUgZHJpdmVycyBhbGxvdyB5b3UgdG8KKwkgKiBjb25maWd1cmUgYSBzZXBhcmF0ZSAicnRhcE4iIGludGVyZmFjZSB0byBjYXB0dXJlIGluIG1vbml0b3IKKwkgKiBtb2RlIHdpdGhvdXQgcHJldmVudGluZyB0aGUgYWRhcHRlciBmcm9tIG9wZXJhdGluZyBub3JtYWxseS4KKwkgKiAoYWlybW9uLW5nIGRvZXNuJ3QgYXBwZWFyIHRvIHVzZSB0aGF0LCB0aG91Z2guKQorCSAqCisJICogSXQgd291bGQgYmUgVHJ1bHkgV29uZGVyZnVsIGlmIG1hYzgwMjExIGFuZCBubDgwMjExIGNsZWFuZWQgdGhpcworCSAqIHVwLCBhbmQgaWYgYWxsIGRyaXZlcnMgd2VyZSBjb252ZXJ0ZWQgdG8gbWFjODAyMTEgZHJpdmVycy4KKwkgKgorCSAqIElmIGludGVyZmFjZSB7aWZ9IGlzIGEgbWFjODAyMTEgZHJpdmVyLCB0aGUgZmlsZQorCSAqIC9zeXMvY2xhc3MvbmV0L3tpZn0vcGh5ODAyMTEgaXMgYSBzeW1saW5rIHRvCisJICogL3N5cy9jbGFzcy9pZWVlODAyMTEve3BoeWRldn0sIGZvciBzb21lIHtwaHlkZXZ9LgorCSAqCisJICogT24gRmVkb3JhIDksIHdpdGggYSAyLjYuMjYuMy0yOSBrZXJuZWwsIG15IFp5ZGFzIHN0aWNrLCBhdAorCSAqIGxlYXN0LCBoYXMgYSAid21hc3RlcjAiIGRldmljZSBhbmQgYSAid2xhbjAiIGRldmljZTsgdGhlCisJICogbGF0dGVyIGlzIHRoZSBvbmUgd2l0aCB0aGUgSVAgYWRkcmVzcy4gIEJvdGggc2hvdyB1cCBpbgorCSAqICJ0Y3BkdW1wIC1EIiBvdXRwdXQuICBDYXB0dXJpbmcgb24gdGhlIHdtYXN0ZXIwIGRldmljZQorCSAqIGNhcHR1cmVzIHdpdGggODAyLjExIGhlYWRlcnMuCisJICoKKwkgKiBhaXJtb24tbmcgc2VhcmNoZXMgdGhyb3VnaCAvc3lzL2NsYXNzL25ldCBmb3IgZGV2aWNlcyBuYW1lZAorCSAqIG1vbk4sIHN0YXJ0aW5nIHdpdGggbW9uMDsgYXMgc29vbiBhcyBvbmUgKmRvZXNuJ3QqIGV4aXN0LAorCSAqIGl0IGNob29zZXMgdGhhdCBhcyB0aGUgbW9uaXRvciBkZXZpY2UgbmFtZS4gIElmIHRoZSAiaXciCisJICogY29tbWFuZCBleGlzdHMsIGl0IGRvZXMgIml3IGRldiB7aWZ9IGludGVyZmFjZSBhZGQge21vbmlmfQorCSAqIHR5cGUgbW9uaXRvciIsIHdoZXJlIHttb25pZn0gaXMgdGhlIG1vbml0b3IgZGV2aWNlLiAgSXQKKwkgKiB0aGVuIChzaWdoKSBzbGVlcHMgLjEgc2Vjb25kLCBhbmQgdGhlbiBjb25maWd1cmVzIHRoZQorCSAqIGRldmljZSB1cC4gIE90aGVyd2lzZSwgaWYgL3N5cy9jbGFzcy9pZWVlODAyMTEve3BoeWRldn0vYWRkX2lmYWNlCisJICogaXMgYSBmaWxlLCBpdCB3cml0ZXMge21vbmRldn0sIHdpdGhvdXQgYSBuZXdsaW5lLCB0byB0aGF0IGZpbGUsCisJICogYW5kIGFnYWluIChzaWdoKSBzbGVlcHMgLjEgc2Vjb25kLCBhbmQgdGhlbiBpd2NvbmZpZydzIHRoYXQKKwkgKiBkZXZpY2UgaW50byBtb25pdG9yIG1vZGUgYW5kIGNvbmZpZ3VyZXMgaXQgdXAuICBPdGhlcndpc2UsCisJICogeW91IGNhbid0IGRvIG1vbml0b3IgbW9kZS4KKwkgKgorCSAqIEFsbCB0aGVzZSBkZXZpY2VzIGFyZSAiZ2x1ZWQiIHRvZ2V0aGVyIGJ5IGhhdmluZyB0aGUKKwkgKiAvc3lzL2NsYXNzL25ldC97ZGV2aWNlfS9waHk4MDIxMSBsaW5rcyBwb2ludGluZyB0byB0aGUgc2FtZQorCSAqIHBsYWNlLCBzbywgZ2l2ZW4gYSB3bWFzdGVyLCB3bGFuLCBvciBtb24gZGV2aWNlLCB5b3UgY2FuCisJICogZmluZCB0aGUgb3RoZXIgZGV2aWNlcyBieSBsb29raW5nIGZvciBkZXZpY2VzIHdpdGgKKwkgKiB0aGUgc2FtZSBwaHk4MDIxMSBsaW5rLgorCSAqCisJICogVG8gdHVybiBtb25pdG9yIG1vZGUgb2ZmLCBkZWxldGUgdGhlIG1vbml0b3IgaW50ZXJmYWNlLAorCSAqIGVpdGhlciB3aXRoICJpdyBkZXYge21vbmlmfSBpbnRlcmZhY2UgZGVsIiBvciBieSBzZW5kaW5nCisJICoge21vbmlmfSwgd2l0aCBubyBOTCwgZG93biAvc3lzL2NsYXNzL2llZWU4MDIxMS97cGh5ZGV2fS9yZW1vdmVfaWZhY2UKKwkgKgorCSAqIE5vdGU6IGlmIHlvdSB0cnkgdG8gY3JlYXRlIGEgbW9uaXRvciBkZXZpY2UgbmFtZWQgIm1vbk4iLCBhbmQKKwkgKiB0aGVyZSdzIGFscmVhZHkgYSAibW9uTiIgZGV2aWNlLCBpdCBmYWlscywgYXMgbGVhc3Qgd2l0aAorCSAqIHRoZSBuZXRsaW5rIGludGVyZmFjZSAod2hpY2ggaXMgd2hhdCBpdyB1c2VzKSwgd2l0aCBhIHJldHVybgorCSAqIHZhbHVlIG9mIC1FTkZJTEUuICAoUmV0dXJuIHZhbHVlcyBhcmUgbmVnYXRpdmUgZXJybm9zLikgIFdlCisJICogY291bGQgcHJvYmFibHkgdXNlIHRoYXQgdG8gZmluZCBhbiB1bnVzZWQgZGV2aWNlLgorCSAqLworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWludCBlcnI7CisJc3RydWN0IGl3cmVxIGlyZXE7CisJc3RydWN0IGl3X3ByaXZfYXJncyAqcHJpdjsKKwltb25pdG9yX3R5cGUgbW9udHlwZTsKKwlpbnQgaTsKKwlfX3UzMiBjbWQ7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgb2xkZmxhZ3M7CisJaW50IGFyZ3NbMl07CisJaW50IGNoYW5uZWw7CisKKwkvKgorCSAqIERvZXMgdGhpcyBkZXZpY2UgKnN1cHBvcnQqIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zPworCSAqLworCWVyciA9IGhhc193ZXh0KHNvY2tfZmQsIGRldmljZSwgaGFuZGxlLT5lcnJidWYpOworCWlmIChlcnIgPD0gMCkKKwkJcmV0dXJuIGVycjsJLyogZWl0aGVyIGl0IGRvZXNuJ3Qgb3IgdGhlIGRldmljZSBkb2Vzbid0IGV2ZW4gZXhpc3QgKi8KKwkvKgorCSAqIFN0YXJ0IG91dCBhc3N1bWluZyB3ZSBoYXZlIG5vIHByaXZhdGUgZXh0ZW5zaW9ucyB0byBjb250cm9sCisJICogcmFkaW8gbWV0YWRhdGEuCisJICovCisJbW9udHlwZSA9IE1PTklUT1JfV0VYVDsKKwljbWQgPSAwOworCisJLyoKKwkgKiBUcnkgdG8gZ2V0IGFsbCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyBwcml2YXRlIGlvY3RscworCSAqIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZS4KKwkgKgorCSAqIEZpcnN0LCBnZXQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSBuZWVkLCBieSBzdXBwbHlpbmcgbm8KKwkgKiBidWZmZXIgYW5kIGEgbGVuZ3RoIG9mIDAuICBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHByaXZhdGUKKwkgKiBpb2N0bHMsIGl0IHNob3VsZCByZXR1cm4gRTJCSUcsIHdpdGggaXJlcS51LmRhdGEubGVuZ3RoIHNldAorCSAqIHRvIHRoZSBsZW5ndGggd2UgbmVlZC4gIElmIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLCBpdCBzaG91bGQKKwkgKiByZXR1cm4gRU9QTk9UU1VQUC4KKwkgKi8KKwltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCWlyZXEudS5kYXRhLnBvaW50ZXIgPSAodm9pZCAqKWFyZ3M7CisJaXJlcS51LmRhdGEubGVuZ3RoID0gMDsKKwlpcmVxLnUuZGF0YS5mbGFncyA9IDA7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSVdQUklWLCAmaXJlcSkgIT0gLTEpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IFNJT0NHSVdQUklWIHdpdGggYSB6ZXJvLWxlbmd0aCBidWZmZXIgZGlkbid0IGZhaWwhIiwKKwkJICAgIGRldmljZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwlpZiAoZXJybm8gIT0gRU9QTk9UU1VQUCkgeworCQkvKgorCQkgKiBPSywgaXQncyBub3QgYXMgaWYgdGhlcmUgYXJlIG5vIHByaXZhdGUgaW9jdGxzLgorCQkgKi8KKwkJaWYgKGVycm5vICE9IEUyQklHKSB7CisJCQkvKgorCQkJICogRmFpbGVkLgorCQkJICovCisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiJXM6IFNJT0NHSVdQUklWOiAlcyIsIGRldmljZSwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCisJCS8qCisJCSAqIE9LLCB0cnkgdG8gZ2V0IHRoZSBsaXN0IG9mIHByaXZhdGUgaW9jdGxzLgorCQkgKi8KKwkJcHJpdiA9IG1hbGxvYyhpcmVxLnUuZGF0YS5sZW5ndGggKiBzaXplb2YgKHN0cnVjdCBpd19wcml2X2FyZ3MpKTsKKwkJaWYgKHByaXYgPT0gTlVMTCkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCQlpcmVxLnUuZGF0YS5wb2ludGVyID0gKHZvaWQgKilwcml2OworCQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJV1BSSVYsICZpcmVxKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBTSU9DR0lXUFJJVjogJXMiLCBkZXZpY2UsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZnJlZShwcml2KTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisKKwkJLyoKKwkJICogTG9vayBmb3IgcHJpdmF0ZSBpb2N0bHMgdG8gdHVybiBtb25pdG9yIG1vZGUgb24gb3IsIGlmCisJCSAqIG1vbml0b3IgbW9kZSBpcyBvbiwgdG8gc2V0IHRoZSBoZWFkZXIgdHlwZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBpcmVxLnUuZGF0YS5sZW5ndGg7IGkrKykgeworCQkJaWYgKHN0cmNtcChwcml2W2ldLm5hbWUsICJtb25pdG9yX3R5cGUiKSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBIb3N0YXAgZHJpdmVyLCB1c2UgdGhpcyBvbmUuCisJCQkJICogU2V0IG1vbml0b3IgbW9kZSBmaXJzdC4KKwkJCQkgKiBZb3UgY2FuIHNldCBpdCB0byAwIHRvIGdldCBETFRfSUVFRTgwMjExLAorCQkJCSAqIDEgdG8gZ2V0IERMVF9QUklTTSwgMiB0byBnZXQKKwkJCQkgKiBETFRfSUVFRTgwMjExX1JBRElPX0FWUywgYW5kLCB3aXRoIG1vcmUKKwkJCQkgKiByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIGRyaXZlciwgMyB0byBnZXQKKwkJCQkgKiBETFRfSUVFRTgwMjExX1JBRElPLgorCQkJCSAqLworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSAhPSBJV19QUklWX1RZUEVfSU5UKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX01BU0spICE9IDEpCisJCQkJCWJyZWFrOworCQkJCW1vbnR5cGUgPSBNT05JVE9SX0hPU1RBUDsKKwkJCQljbWQgPSBwcml2W2ldLmNtZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjbXAocHJpdltpXS5uYW1lLCAic2V0X3ByaXNtaGRyIikgPT0gMCkgeworCQkJCS8qCisJCQkJICogUHJpc201NCBkcml2ZXIsIHVzZSB0aGlzIG9uZS4KKwkJCQkgKiBTZXQgbW9uaXRvciBtb2RlIGZpcnN0LgorCQkJCSAqIFlvdSBjYW4gc2V0IGl0IHRvIDIgdG8gZ2V0IERMVF9JRUVFODAyMTEKKwkJCQkgKiBvciAzIG9yIGdldCBETFRfUFJJU00uCisJCQkJICovCisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9UWVBFX01BU0spICE9IElXX1BSSVZfVFlQRV9JTlQpCisJCQkJCWJyZWFrOworCQkJCWlmICghKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfTUFTSykgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJbW9udHlwZSA9IE1PTklUT1JfUFJJU001NDsKKwkJCQljbWQgPSBwcml2W2ldLmNtZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjbXAocHJpdltpXS5uYW1lLCAiZm9yY2VwcmlzbWhlYWRlciIpID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFJUMjU3MCBkcml2ZXIsIHVzZSB0aGlzIG9uZS4KKwkJCQkgKiBEbyB0aGlzIGFmdGVyIHR1cm5pbmcgbW9uaXRvciBtb2RlIG9uLgorCQkJCSAqIFlvdSBjYW4gc2V0IGl0IHRvIDEgdG8gZ2V0IERMVF9QUklTTSBvciAyCisJCQkJICogdG8gZ2V0IERMVF9JRUVFODAyMTEuCisJCQkJICovCisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9UWVBFX01BU0spICE9IElXX1BSSVZfVFlQRV9JTlQpCisJCQkJCWJyZWFrOworCQkJCWlmICghKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfTUFTSykgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJbW9udHlwZSA9IE1PTklUT1JfUlQyNTcwOworCQkJCWNtZCA9IHByaXZbaV0uY21kOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0cmNtcChwcml2W2ldLm5hbWUsICJmb3JjZXByaXNtIikgPT0gMCkgeworCQkJCS8qCisJCQkJICogUlQ3MyBkcml2ZXIsIHVzZSB0aGlzIG9uZS4KKwkJCQkgKiBEbyB0aGlzIGFmdGVyIHR1cm5pbmcgbW9uaXRvciBtb2RlIG9uLgorCQkJCSAqIEl0cyBhcmd1bWVudCBpcyBhICpzdHJpbmcqOyB5b3UgY2FuCisJCQkJICogc2V0IGl0IHRvICIxIiB0byBnZXQgRExUX1BSSVNNIG9yICIyIgorCQkJCSAqIHRvIGdldCBETFRfSUVFRTgwMjExLgorCQkJCSAqLworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSAhPSBJV19QUklWX1RZUEVfQ0hBUikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpCisJCQkJCWJyZWFrOworCQkJCW1vbnR5cGUgPSBNT05JVE9SX1JUNzM7CisJCQkJY21kID0gcHJpdltpXS5jbWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY21wKHByaXZbaV0ubmFtZSwgInByaXNtaGRyIikgPT0gMCkgeworCQkJCS8qCisJCQkJICogT25lIG9mIHRoZSBSVEw4eHh4IGRyaXZlcnMsIHVzZSB0aGlzIG9uZS4KKwkJCQkgKiBJdCBjYW4gb25seSBiZSBkb25lIGFmdGVyIG1vbml0b3IgbW9kZQorCQkJCSAqIGhhcyBiZWVuIHR1cm5lZCBvbi4gIFlvdSBjYW4gc2V0IGl0IHRvIDEKKwkJCQkgKiB0byBnZXQgRExUX1BSSVNNIG9yIDAgdG8gZ2V0IERMVF9JRUVFODAyMTEuCisJCQkJICovCisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9UWVBFX01BU0spICE9IElXX1BSSVZfVFlQRV9JTlQpCisJCQkJCWJyZWFrOworCQkJCWlmICghKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfTUFTSykgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJbW9udHlwZSA9IE1PTklUT1JfUlRMOFhYWDsKKwkJCQljbWQgPSBwcml2W2ldLmNtZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjbXAocHJpdltpXS5uYW1lLCAicmZtb250eCIpID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFJUMjUwMCBvciBSVDYxIGRyaXZlciwgdXNlIHRoaXMgb25lLgorCQkJCSAqIEl0IGhhcyBvbmUgb25lLWJ5dGUgcGFyYW1ldGVyOyBzZXQKKwkJCQkgKiB1LmRhdGEubGVuZ3RoIHRvIDEgYW5kIHUuZGF0YS5wb2ludGVyIHRvCisJCQkJICogcG9pbnQgdG8gdGhlIHBhcmFtZXRlci4KKwkJCQkgKiBJdCBkb2Vzbid0IGl0c2VsZiB0dXJuIG1vbml0b3IgbW9kZSBvbi4KKwkJCQkgKiBZb3UgY2FuIHNldCBpdCB0byAxIHRvIGFsbG93IHRyYW5zbWl0dGluZworCQkJCSAqIGluIG1vbml0b3IgbW9kZSg/KSBhbmQgZ2V0IERMVF9JRUVFODAyMTEsCisJCQkJICogb3Igc2V0IGl0IHRvIDAgdG8gZGlzYWxsb3cgdHJhbnNtaXR0aW5nIGluCisJCQkJICogbW9uaXRvciBtb2RlKD8pIGFuZCBnZXQgRExUX1BSSVNNLgorCQkJCSAqLworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSAhPSBJV19QUklWX1RZUEVfSU5UKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfTUFTSykgIT0gMikKKwkJCQkJYnJlYWs7CisJCQkJbW9udHlwZSA9IE1PTklUT1JfUlQyNTAwOworCQkJCWNtZCA9IHByaXZbaV0uY21kOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0cmNtcChwcml2W2ldLm5hbWUsICJtb25pdG9yIikgPT0gMCkgeworCQkJCS8qCisJCQkJICogRWl0aGVyIEFDWDEwMCBvciBob3N0YXAsIHVzZSB0aGlzIG9uZS4KKwkJCQkgKiBJdCB0dXJucyBtb25pdG9yIG1vZGUgb24uCisJCQkJICogSWYgaXQgdGFrZXMgdHdvIGFyZ3VtZW50cywgaXQncyBBQ1gxMDA7CisJCQkJICogdGhlIGZpcnN0IGFyZ3VtZW50IGlzIDEgZm9yIERMVF9QUklTTQorCQkJCSAqIG9yIDIgZm9yIERMVF9JRUVFODAyMTEsIGFuZCB0aGUgc2Vjb25kCisJCQkJICogYXJndW1lbnQgaXMgdGhlIGNoYW5uZWwgb24gd2hpY2ggdG8KKwkJCQkgKiBydW4uICBJZiBpdCB0YWtlcyBvbmUgYXJndW1lbnQsIGl0J3MKKwkJCQkgKiBIb3N0QVAsIGFuZCB0aGUgYXJndW1lbnQgaXMgMiBmb3IKKwkJCQkgKiBETFRfSUVFRTgwMjExIGFuZCAzIGZvciBETFRfUFJJU00uCisJCQkJICoKKwkJCQkgKiBJZiB3ZSBzZWUgdGhpcywgd2UgZG9uJ3QgcXVpdCwgYXMgdGhpcworCQkJCSAqIG1pZ2h0IGJlIGEgdmVyc2lvbiBvZiB0aGUgaG9zdGFwIGRyaXZlcgorCQkJCSAqIHRoYXQgYWxzbyBzdXBwb3J0cyAibW9uaXRvcl90eXBlIi4KKwkJCQkgKi8KKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1RZUEVfTUFTSykgIT0gSVdfUFJJVl9UWVBFX0lOVCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCEocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkpCisJCQkJCWJyZWFrOworCQkJCXN3aXRjaCAocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfU0laRV9NQVNLKSB7CisKKwkJCQljYXNlIDE6CisJCQkJCW1vbnR5cGUgPSBNT05JVE9SX1BSSVNNOworCQkJCQljbWQgPSBwcml2W2ldLmNtZDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDI6CisJCQkJCW1vbnR5cGUgPSBNT05JVE9SX0FDWDEwMDsKKwkJCQkJY21kID0gcHJpdltpXS5jbWQ7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWZyZWUocHJpdik7CisJfQorCisJLyoKKwkgKiBYWFggLSBpcHczOTQ1PyAgaXNsaXNtPworCSAqLworCisJLyoKKwkgKiBHZXQgdGhlIG9sZCBtb2RlLgorCSAqLworCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSVdNT0RFLCAmaXJlcSkgPT0gLTEpIHsKKwkJLyoKKwkJICogV2UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBzZXQgdGhlIG1vZGUsIGVpdGhlci4KKwkJICovCisJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwl9CisKKwkvKgorCSAqIElzIGl0IGN1cnJlbnRseSBpbiBtb25pdG9yIG1vZGU/CisJICovCisJaWYgKGlyZXEudS5tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQkvKgorCQkgKiBZZXMuICBKdXN0IGxlYXZlIHRoaW5ncyBhcyB0aGV5IGFyZS4KKwkJICogV2UgZG9uJ3Qgb2ZmZXIgbXVsdGlwbGUgbGluay1sYXllciB0eXBlcywgYXMKKwkJICogY2hhbmdpbmcgdGhlIGxpbmstbGF5ZXIgdHlwZSBvdXQgZnJvbSB1bmRlcgorCQkgKiBzb21lYm9keSBlbHNlIGNhcHR1cmluZyBpbiBtb25pdG9yIG1vZGUgd291bGQKKwkJICogYmUgY29uc2lkZXJlZCBydWRlLgorCQkgKi8KKwkJcmV0dXJuIDE7CisJfQorCS8qCisJICogTm8uICBXZSBoYXZlIHRvIHB1dCB0aGUgYWRhcHRlciBpbnRvIHJmbW9uIG1vZGUuCisJICovCisKKwkvKgorCSAqIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLCBhcnJhbmdlIHRvIGhhdmUKKwkgKiAicGNhcF9jbG9zZV9hbGwoKSIgY2FsbGVkIHdoZW4gd2UgZXhpdC4KKwkgKi8KKwlpZiAoIXBjYXBfZG9fYWRkZXhpdChoYW5kbGUpKSB7CisJCS8qCisJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBkb24ndCBwdXQgdGhlIGludGVyZmFjZQorCQkgKiBpbiByZm1vbiBtb2RlLCBqdXN0IGdpdmUgdXAuCisJCSAqLworCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBvbGQgbW9kZS4KKwkgKi8KKwloYW5kbGVwLT5vbGRtb2RlID0gaXJlcS51Lm1vZGU7CisKKwkvKgorCSAqIFB1dCB0aGUgYWRhcHRlciBpbiByZm1vbiBtb2RlLiAgSG93IHdlIGRvIHRoaXMgZGVwZW5kcworCSAqIG9uIHdoZXRoZXIgd2UgaGF2ZSBhIHNwZWNpYWwgcHJpdmF0ZSBpb2N0bCBvciBub3QuCisJICovCisJaWYgKG1vbnR5cGUgPT0gTU9OSVRPUl9QUklTTSkgeworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSAibW9uaXRvciIgcHJpdmF0ZSBpb2N0bCwgYnV0IG5vbmUgb2YKKwkJICogdGhlIG90aGVyIHByaXZhdGUgaW9jdGxzLiAgVXNlIHRoaXMsIGFuZCBzZWxlY3QKKwkJICogdGhlIFByaXNtIGhlYWRlci4KKwkJICoKKwkJICogSWYgaXQgZmFpbHMsIGp1c3QgZmFsbCBiYWNrIG9uIFNJT0NTSVdNT0RFLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJaXJlcS51LmRhdGEubGVuZ3RoID0gMTsJLyogMSBhcmd1bWVudCAqLworCQlhcmdzWzBdID0gMzsJLyogcmVxdWVzdCBQcmlzbSBoZWFkZXIgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBzaXplb2YgKGludCkpOworCQlpZiAoaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSkgIT0gLTEpIHsKKwkJCS8qCisJCQkgKiBTdWNjZXNzLgorCQkJICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gcHV0IHRoZSBvbGQgbW9kZSBiYWNrCisJCQkgKiB3aGVuIHdlIGNsb3NlIHRoZSBkZXZpY2UuCisJCQkgKi8KKwkJCWhhbmRsZXAtPm11c3RfZG9fb25fY2xvc2UgfD0gTVVTVF9DTEVBUl9SRk1PTjsKKworCQkJLyoKKwkJCSAqIEFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHBjYXBzIHRvIGNsb3NlCisJCQkgKiB3aGVuIHdlIGV4aXQuCisJCQkgKi8KKwkJCXBjYXBfYWRkX3RvX3BjYXBzX3RvX2Nsb3NlKGhhbmRsZSk7CisKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyoKKwkJICogRmFpbHVyZS4gIEZhbGwgYmFjayBvbiBTSU9DU0lXTU9ERS4KKwkJICovCisJfQorCisJLyoKKwkgKiBGaXJzdCwgdGFrZSB0aGUgaW50ZXJmYWNlIGRvd24gaWYgaXQncyB1cDsgb3RoZXJ3aXNlLCB3ZQorCSAqIG1pZ2h0IGdldCBFQlVTWS4KKwkgKi8KKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogQ2FuJ3QgZ2V0IGZsYWdzOiAlcyIsIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCW9sZGZsYWdzID0gMDsKKwlpZiAoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgeworCQlvbGRmbGFncyA9IGlmci5pZnJfZmxhZ3M7CisJCWlmci5pZnJfZmxhZ3MgJj0gfklGRl9VUDsKKwkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIlczogQ2FuJ3Qgc2V0IGZsYWdzOiAlcyIsIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJfQorCisJLyoKKwkgKiBUaGVuIHR1cm4gbW9uaXRvciBtb2RlIG9uLgorCSAqLworCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJaXJlcS51Lm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSVdNT0RFLCAmaXJlcSkgPT0gLTEpIHsKKwkJLyoKKwkJICogU2NpZW50aXN0LCB5b3UndmUgZmFpbGVkLgorCQkgKiBCcmluZyB0aGUgaW50ZXJmYWNlIGJhY2sgdXAgaWYgd2Ugc2h1dCBpdCBkb3duLgorCQkgKi8KKwkJaWZyLmlmcl9mbGFncyA9IG9sZGZsYWdzOworCQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBDYW4ndCBzZXQgZmxhZ3M6ICVzIiwgZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwkJcmV0dXJuIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCX0KKworCS8qCisJICogWFhYIC0gYWlybW9uLW5nIGRvZXMgIml3Y29uZmlnIHtpZn0ga2V5IG9mZiIgYWZ0ZXIgc2V0dGluZworCSAqIG1vbml0b3IgbW9kZSBhbmQgc2V0dGluZyB0aGUgY2hhbm5lbCwgYW5kIHRoZW4gZG9lcworCSAqICJpd2NvbmZpZyB1cCIuCisJICovCisKKwkvKgorCSAqIE5vdyBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHJhZGlvIGhlYWRlci4KKwkgKi8KKwlzd2l0Y2ggKG1vbnR5cGUpIHsKKworCWNhc2UgTU9OSVRPUl9XRVhUOgorCQkvKgorCQkgKiBXZSBkb24ndCBoYXZlIGFueSBwcml2YXRlIGlvY3RsIHRvIHNldCB0aGUgaGVhZGVyLgorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIE1PTklUT1JfSE9TVEFQOgorCQkvKgorCQkgKiBUcnkgdG8gc2VsZWN0IHRoZSByYWRpb3RhcCBoZWFkZXIuCisJCSAqLworCQltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCQlhcmdzWzBdID0gMzsJLyogcmVxdWVzdCByYWRpb3RhcCBoZWFkZXIgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBzaXplb2YgKGludCkpOworCQlpZiAoaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSkgIT0gLTEpCisJCQlicmVhazsJLyogc3VjY2VzcyAqLworCisJCS8qCisJCSAqIFRoYXQgZmFpbGVkLiAgVHJ5IHRvIHNlbGVjdCB0aGUgQVZTIGhlYWRlci4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWFyZ3NbMF0gPSAyOwkvKiByZXF1ZXN0IEFWUyBoZWFkZXIgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBzaXplb2YgKGludCkpOworCQlpZiAoaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSkgIT0gLTEpCisJCQlicmVhazsJLyogc3VjY2VzcyAqLworCisJCS8qCisJCSAqIFRoYXQgZmFpbGVkLiAgVHJ5IHRvIHNlbGVjdCB0aGUgUHJpc20gaGVhZGVyLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJYXJnc1swXSA9IDE7CS8qIHJlcXVlc3QgUHJpc20gaGVhZGVyICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgc2l6ZW9mIChpbnQpKTsKKwkJaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSk7CisJCWJyZWFrOworCisJY2FzZSBNT05JVE9SX1BSSVNNOgorCQkvKgorCQkgKiBUaGUgcHJpdmF0ZSBpb2N0bCBmYWlsZWQuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgTU9OSVRPUl9QUklTTTU0OgorCQkvKgorCQkgKiBTZWxlY3QgdGhlIFByaXNtIGhlYWRlci4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWFyZ3NbMF0gPSAzOwkvKiByZXF1ZXN0IFByaXNtIGhlYWRlciAqLworCQltZW1jcHkoaXJlcS51Lm5hbWUsIGFyZ3MsIHNpemVvZiAoaW50KSk7CisJCWlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpOworCQlicmVhazsKKworCWNhc2UgTU9OSVRPUl9BQ1gxMDA6CisJCS8qCisJCSAqIEdldCB0aGUgY3VycmVudCBjaGFubmVsLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSVdGUkVRLCAmaXJlcSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIlczogU0lPQ0dJV0ZSRVE6ICVzIiwgZGV2aWNlLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJCWNoYW5uZWwgPSBpcmVxLnUuZnJlcS5tOworCisJCS8qCisJCSAqIFNlbGVjdCB0aGUgUHJpc20gaGVhZGVyLCBhbmQgc2V0IHRoZSBjaGFubmVsIHRvIHRoZQorCQkgKiBjdXJyZW50IHZhbHVlLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJYXJnc1swXSA9IDE7CQkvKiByZXF1ZXN0IFByaXNtIGhlYWRlciAqLworCQlhcmdzWzFdID0gY2hhbm5lbDsJLyogc2V0IGNoYW5uZWwgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCAyKnNpemVvZiAoaW50KSk7CisJCWlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpOworCQlicmVhazsKKworCWNhc2UgTU9OSVRPUl9SVDI1MDA6CisJCS8qCisJCSAqIERpc2FsbG93IHRyYW5zbWlzc2lvbiAtIHRoYXQgdHVybnMgb24gdGhlCisJCSAqIFByaXNtIGhlYWRlci4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWFyZ3NbMF0gPSAwOwkvKiBkaXNhbGxvdyB0cmFuc21pdHRpbmcgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBzaXplb2YgKGludCkpOworCQlpb2N0bChzb2NrX2ZkLCBjbWQsICZpcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIE1PTklUT1JfUlQyNTcwOgorCQkvKgorCQkgKiBGb3JjZSB0aGUgUHJpc20gaGVhZGVyLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJYXJnc1swXSA9IDE7CS8qIHJlcXVlc3QgUHJpc20gaGVhZGVyICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgc2l6ZW9mIChpbnQpKTsKKwkJaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSk7CisJCWJyZWFrOworCisJY2FzZSBNT05JVE9SX1JUNzM6CisJCS8qCisJCSAqIEZvcmNlIHRoZSBQcmlzbSBoZWFkZXIuCisJCSAqLworCQltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCQlpcmVxLnUuZGF0YS5sZW5ndGggPSAxOwkvKiAxIGFyZ3VtZW50ICovCisJCWlyZXEudS5kYXRhLnBvaW50ZXIgPSAiMSI7CisJCWlyZXEudS5kYXRhLmZsYWdzID0gMDsKKwkJaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSk7CisJCWJyZWFrOworCisJY2FzZSBNT05JVE9SX1JUTDhYWFg6CisJCS8qCisJCSAqIEZvcmNlIHRoZSBQcmlzbSBoZWFkZXIuCisJCSAqLworCQltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCQlhcmdzWzBdID0gMTsJLyogcmVxdWVzdCBQcmlzbSBoZWFkZXIgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBzaXplb2YgKGludCkpOworCQlpb2N0bChzb2NrX2ZkLCBjbWQsICZpcmVxKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBOb3cgYnJpbmcgdGhlIGludGVyZmFjZSBiYWNrIHVwIGlmIHdlIGJyb3VnaHQgaXQgZG93bi4KKwkgKi8KKwlpZiAob2xkZmxhZ3MgIT0gMCkgeworCQlpZnIuaWZyX2ZsYWdzID0gb2xkZmxhZ3M7CisJCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiJXM6IENhbid0IHNldCBmbGFnczogJXMiLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJCS8qCisJCQkgKiBBdCBsZWFzdCB0cnkgdG8gcmVzdG9yZSB0aGUgb2xkIG1vZGUgb24gdGhlCisJCQkgKiBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lXTU9ERSwgJmlyZXEpID09IC0xKSB7CisJCQkJLyoKKwkJCQkgKiBTY2llbnRpc3QsIHlvdSd2ZSBmYWlsZWQuCisJCQkJICovCisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSB3aXJlbGVzcyBtb2RlIChTSU9DU0lXTU9ERSBmYWlsZWQ6ICVzKS5cbiIKKwkJCQkgICAgIlBsZWFzZSBhZGp1c3QgbWFudWFsbHkuXG4iLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHB1dCB0aGUgb2xkIG1vZGUgYmFjayB3aGVuIHdlCisJICogY2xvc2UgdGhlIGRldmljZS4KKwkgKi8KKwloYW5kbGVwLT5tdXN0X2RvX29uX2Nsb3NlIHw9IE1VU1RfQ0xFQVJfUkZNT047CisKKwkvKgorCSAqIEFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHBjYXBzIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KKwkgKi8KKwlwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShoYW5kbGUpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSVdfTU9ERV9NT05JVE9SICovCisKKy8qCisgKiBUcnkgdmFyaW91cyBtZWNoYW5pc21zIHRvIGVudGVyIG1vbml0b3IgbW9kZS4KKyAqLworc3RhdGljIGludAorZW50ZXJfcmZtb25fbW9kZShwY2FwX3QgKmhhbmRsZSwgaW50IHNvY2tfZmQsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfTElCTkwpIHx8IGRlZmluZWQoSVdfTU9ERV9NT05JVE9SKQorCWludCByZXQ7CiAjZW5kaWYKIAorI2lmZGVmIEhBVkVfTElCTkwKKwlyZXQgPSBlbnRlcl9yZm1vbl9tb2RlX21hYzgwMjExKGhhbmRsZSwgc29ja19mZCwgZGV2aWNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsJLyogZXJyb3IgYXR0ZW1wdGluZyB0byBkbyBzbyAqLworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIDE7CS8qIHN1Y2Nlc3MgKi8KKyNlbmRpZiAvKiBIQVZFX0xJQk5MICovCisKKyNpZmRlZiBJV19NT0RFX01PTklUT1IKKwlyZXQgPSBlbnRlcl9yZm1vbl9tb2RlX3dleHQoaGFuZGxlLCBzb2NrX2ZkLCBkZXZpY2UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwkvKiBlcnJvciBhdHRlbXB0aW5nIHRvIGRvIHNvICovCisJaWYgKHJldCA9PSAxKQorCQlyZXR1cm4gMTsJLyogc3VjY2VzcyAqLworI2VuZGlmIC8qIElXX01PREVfTU9OSVRPUiAqLworCisJLyoKKwkgKiBFaXRoZXIgbm9uZSBvZiB0aGUgbWVjaGFuaXNtcyB3ZSBrbm93IGFib3V0IHdvcmsgb3Igbm9uZQorCSAqIG9mIHRob3NlIG1lY2hhbmlzbXMgYXJlIGF2YWlsYWJsZSwgc28gd2UgY2FuJ3QgZG8gbW9uaXRvcgorCSAqIG1vZGUuCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaW5kIG91dCBpZiB3ZSBoYXZlIGFueSBmb3JtIG9mIGZyYWdtZW50YXRpb24vcmVhc3NlbWJseSBvZmZsb2FkaW5nLgorICoKKyAqIFdlIGRvIHNvIHVzaW5nIFNJT0NFVEhUT09MIGNoZWNraW5nIGZvciB2YXJpb3VzIHR5cGVzIG9mIG9mZmxvYWRpbmc7CisgKiBpZiBTSU9DRVRIVE9PTCBpc24ndCBkZWZpbmVkLCBvciB3ZSBkb24ndCBoYXZlIGFueSAjZGVmaW5lcyBmb3IgYW55CisgKiBvZiB0aGUgdHlwZXMgb2Ygb2ZmbG9hZGluZywgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyB0byBjaGVjaywgc28KKyAqIHdlIGp1c3Qgc2F5ICJubywgd2UgZG9uJ3QiLgorICovCisjaWYgZGVmaW5lZChTSU9DRVRIVE9PTCkgJiYgKGRlZmluZWQoRVRIVE9PTF9HVFNPKSB8fCBkZWZpbmVkKEVUSFRPT0xfR1VGTykgfHwgZGVmaW5lZChFVEhUT09MX0dHU08pIHx8IGRlZmluZWQoRVRIVE9PTF9HRkxBR1MpIHx8IGRlZmluZWQoRVRIVE9PTF9HR1JPKSkKK3N0YXRpYyBpbnQKK2lmYWNlX2V0aHRvb2xfaW9jdGwocGNhcF90ICpoYW5kbGUsIGludCBjbWQsIGNvbnN0IGNoYXIgKmNtZG5hbWUpCit7CisJc3RydWN0IGlmcmVxCWlmcjsKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBldmFsOworCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaGFuZGxlLT5vcHQuc291cmNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJZXZhbC5jbWQgPSBjbWQ7CisJZXZhbC5kYXRhID0gMDsKKwlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkmZXZhbDsKKwlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ0VUSFRPT0wsICZpZnIpID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFT1BOT1RTVVBQIHx8IGVycm5vID09IEVJTlZBTCkgeworCQkJLyoKKwkJCSAqIE9LLCBsZXQncyBqdXN0IHJldHVybiAwLCB3aGljaCwgaW4gb3VyCisJCQkgKiBjYXNlLCBlaXRoZXIgbWVhbnMgIm5vLCB3aGF0IHdlJ3JlIGFza2luZworCQkJICogYWJvdXQgaXMgbm90IGVuYWJsZWQiIG9yICJhbGwgdGhlIGZsYWdzCisJCQkgKiBhcmUgY2xlYXIgKGkuZS4sIG5vdGhpbmcgaXMgZW5hYmxlZCkiLgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogU0lPRVRIVE9PTCglcykgaW9jdGwgZmFpbGVkOiAlcyIsIGhhbmRsZS0+b3B0LnNvdXJjZSwKKwkJICAgIGNtZG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGV2YWwuZGF0YTsJCit9CisKK3N0YXRpYyBpbnQKK2lmYWNlX2dldF9vZmZsb2FkKHBjYXBfdCAqaGFuZGxlKQoreworCWludCByZXQ7CisKKyNpZmRlZiBFVEhUT09MX0dUU08KKwlyZXQgPSBpZmFjZV9ldGh0b29sX2lvY3RsKGhhbmRsZSwgRVRIVE9PTF9HVFNPLCAiRVRIVE9PTF9HVFNPIik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXQpCisJCXJldHVybiAxOwkvKiBUQ1Agc2VnbWVudGF0aW9uIG9mZmxvYWRpbmcgb24gKi8KKyNlbmRpZgorCisjaWZkZWYgRVRIVE9PTF9HVUZPCisJcmV0ID0gaWZhY2VfZXRodG9vbF9pb2N0bChoYW5kbGUsIEVUSFRPT0xfR1VGTywgIkVUSFRPT0xfR1VGTyIpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMTsJLyogVURQIGZyYWdtZW50YXRpb24gb2ZmbG9hZGluZyBvbiAqLworI2VuZGlmCisKKyNpZmRlZiBFVEhUT09MX0dHU08KKwkvKgorCSAqIFhYWCAtIHdpbGwgdGhpcyBjYXVzZSBsYXJnZSB1bnNlZ21lbnRlZCBwYWNrZXRzIHRvIGJlCisJICogaGFuZGVkIHRvIFBGX1BBQ0tFVCBzb2NrZXRzIG9uIHRyYW5zbWlzc2lvbj8gIElmIG5vdCwKKwkgKiB0aGlzIG5lZWQgbm90IGJlIGNoZWNrZWQuCisJICovCisJcmV0ID0gaWZhY2VfZXRodG9vbF9pb2N0bChoYW5kbGUsIEVUSFRPT0xfR0dTTywgIkVUSFRPT0xfR0dTTyIpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMTsJLyogZ2VuZXJpYyBzZWdtZW50YXRpb24gb2ZmbG9hZGluZyBvbiAqLworI2VuZGlmCisKKyNpZmRlZiBFVEhUT09MX0dGTEFHUworCXJldCA9IGlmYWNlX2V0aHRvb2xfaW9jdGwoaGFuZGxlLCBFVEhUT09MX0dGTEFHUywgIkVUSFRPT0xfR0ZMQUdTIik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXQgJiBFVEhfRkxBR19MUk8pCisJCXJldHVybiAxOwkvKiBsYXJnZSByZWNlaXZlIG9mZmxvYWRpbmcgb24gKi8KKyNlbmRpZgorCisjaWZkZWYgRVRIVE9PTF9HR1JPCisJLyoKKwkgKiBYWFggLSB3aWxsIHRoaXMgY2F1c2UgbGFyZ2UgcmVhc3NlbWJsZWQgcGFja2V0cyB0byBiZQorCSAqIGhhbmRlZCB0byBQRl9QQUNLRVQgc29ja2V0cyBvbiByZWNlaXB0PyAgSWYgbm90LAorCSAqIHRoaXMgbmVlZCBub3QgYmUgY2hlY2tlZC4KKwkgKi8KKwlyZXQgPSBpZmFjZV9ldGh0b29sX2lvY3RsKGhhbmRsZSwgRVRIVE9PTF9HR1JPLCAiRVRIVE9PTF9HR1JPIik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXQpCisJCXJldHVybiAxOwkvKiBnZW5lcmljIChsYXJnZSkgcmVjZWl2ZSBvZmZsb2FkaW5nIG9uICovCisjZW5kaWYKKworCXJldHVybiAwOworfQorI2Vsc2UgLyogU0lPQ0VUSFRPT0wgKi8KK3N0YXRpYyBpbnQKK2lmYWNlX2dldF9vZmZsb2FkKHBjYXBfdCAqaGFuZGxlIF9VXykKK3sKKwkvKgorCSAqIFhYWCAtIGRvIHdlIG5lZWQgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gaWYgd2UgZG9uJ3QKKwkgKiBoYXZlIHRoZSBldGh0b29sIGlvY3Rscz8gIElmIHNvLCBob3cgZG8gd2UgZG8gdGhhdD8KKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBTSU9DRVRIVE9PTCAqLworCisjZW5kaWYgLyogSEFWRV9QRl9QQUNLRVRfU09DS0VUUyAqLwogCiAvKiA9PT09PSBGdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHRvIHRoZSBvbGRlciBrZXJuZWxzID09PT09PT09PT09PT09PT09PSAqLwogCiAvKgotICogV2l0aCBvbGRlciBrZXJuZWxzIHByb21pc2N1b3VzIG1vZGUgaXMga2luZCBvZiBpbnRlcmVzdGluZyBiZWNhdXNlIHdlCi0gKiBoYXZlIHRvIHJlc2V0IHRoZSBpbnRlcmZhY2UgYmVmb3JlIGV4aXRpbmcuIFRoZSBwcm9ibGVtIGNhbid0IHJlYWxseQotICogYmUgc29sdmVkIHdpdGhvdXQgc29tZSBkYWVtb24gdGFraW5nIGNhcmUgb2YgbWFuYWdpbmcgdXNhZ2UgY291bnRzLgotICogSWYgd2UgcHV0IHRoZSBpbnRlcmZhY2UgaW50byBwcm9taXNjdW91cyBtb2RlLCB3ZSBzZXQgYSBmbGFnIGluZGljYXRpbmcKLSAqIHRoYXQgd2UgbXVzdCB0YWtlIGl0IG91dCBvZiB0aGF0IG1vZGUgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGNsb3NlZCwKLSAqIGFuZCwgd2hlbiBjbG9zaW5nIHRoZSBpbnRlcmZhY2UsIGlmIHRoYXQgZmxhZyBpcyBzZXQgd2UgdGFrZSBpdCBvdXQKLSAqIG9mIHByb21pc2N1b3VzIG1vZGUuCisgKiBUcnkgdG8gb3BlbiBhIHBhY2tldCBzb2NrZXQgdXNpbmcgdGhlIG9sZCBrZXJuZWwgaW50ZXJmYWNlLgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MgYW5kIGEgUENBUF9FUlJPUl8gdmFsdWUgb24gYW4gZXJyb3IuCiAgKi8KLQotLyoKLSAqIExpc3Qgb2YgcGNhcHMgZm9yIHdoaWNoIHdlIHR1cm5lZCBwcm9taXNjdW91cyBtb2RlIG9uIGJ5IGhhbmQuCi0gKiBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggcGNhcHMsIHdlIGFycmFuZ2UgdG8gY2FsbCAicGNhcF9jbG9zZV9hbGwoKSIKLSAqIHdoZW4gd2UgZXhpdCwgYW5kIGhhdmUgaXQgY2xvc2UgYWxsIG9mIHRoZW0gdG8gdHVybiBwcm9taXNjdW91cyBtb2RlCi0gKiBvZmYuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNhcCAqcGNhcHNfdG9fY2xvc2U7Ci0KLS8qCi0gKiBUUlVFIGlmIHdlJ3ZlIGFscmVhZHkgY2FsbGVkICJhdGV4aXQoKSIgdG8gY2F1c2UgInBjYXBfY2xvc2VfYWxsKCkiIHRvCi0gKiBiZSBjYWxsZWQgb24gZXhpdC4KLSAqLwotc3RhdGljIGludCBkaWRfYXRleGl0OwotCi1zdGF0aWMgdm9pZAlwY2FwX2Nsb3NlX2FsbCh2b2lkKQorc3RhdGljIGludAorYWN0aXZhdGVfb2xkKHBjYXBfdCAqaGFuZGxlKQogewotCXN0cnVjdCBwY2FwICpoYW5kbGU7Ci0KLQl3aGlsZSAoKGhhbmRsZSA9IHBjYXBzX3RvX2Nsb3NlKSAhPSBOVUxMKQotCQlwY2FwX2Nsb3NlKGhhbmRsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCXBjYXBfY2xvc2VfbGludXgoIHBjYXBfdCAqaGFuZGxlICkKLXsKLQlzdHJ1Y3QgcGNhcAkqcCwgKnByZXZwOworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWludAkJYXJwdHlwZTsKIAlzdHJ1Y3QgaWZyZXEJaWZyOworCWNvbnN0IGNoYXIJKmRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwlzdHJ1Y3QgdXRzbmFtZQl1dHNuYW1lOworCWludAkJbXR1OwogCi0JaWYgKGhhbmRsZS0+bWQuY2xlYXJfcHJvbWlzYykgewotCQkvKgotCQkgKiBXZSBwdXQgdGhlIGludGVyZmFjZSBpbnRvIHByb21pc2N1b3VzIG1vZGU7IHRha2UKLQkJICogaXQgb3V0IG9mIHByb21pc2N1b3VzIG1vZGUuCi0JCSAqCi0JCSAqIFhYWCAtIGlmIHNvbWVib2R5IGVsc2Ugd2FudHMgaXQgaW4gcHJvbWlzY3VvdXMgbW9kZSwKLQkJICogdGhpcyBjb2RlIGNhbm5vdCBrbm93IHRoYXQsIHNvIGl0J2xsIHRha2UgaXQgb3V0Ci0JCSAqIG9mIHByb21pc2N1b3VzIG1vZGUuICBUaGF0J3Mgbm90IGZpeGFibGUgaW4gMi4wWy54XQotCQkgKiBrZXJuZWxzLgotCQkgKi8KLQkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKLQkJc3RybmNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+bWQuZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0JCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAiQ2FuJ3QgcmVzdG9yZSBpbnRlcmZhY2UgZmxhZ3MgKFNJT0NHSUZGTEFHUyBmYWlsZWQ6ICVzKS5cbiIKLQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIKLQkJCSAgICAiSGludDogVGhpcyBjYW4ndCBoYXBwZW4gd2l0aCBMaW51eCA+PSAyLjIuMC5cbiIsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkvKiBPcGVuIHRoZSBzb2NrZXQgKi8KKworCWhhbmRsZS0+ZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19QQUNLRVQsIGh0b25zKEVUSF9QX0FMTCkpOworCWlmIChoYW5kbGUtPmZkID09IC0xKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKSB7CisJCQkvKgorCQkJICogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZQorCQkJICogc29ja2V0LgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKIAkJfSBlbHNlIHsKLQkJCWlmIChpZnIuaWZyX2ZsYWdzICYgSUZGX1BST01JU0MpIHsKLQkJCQkvKgotCQkJCSAqIFByb21pc2N1b3VzIG1vZGUgaXMgY3VycmVudGx5IG9uOyB0dXJuIGl0Ci0JCQkJICogb2ZmLgotCQkJCSAqLwotCQkJCWlmci5pZnJfZmxhZ3MgJj0gfklGRl9QUk9NSVNDOwotCQkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkgICAgIkNhbid0IHJlc3RvcmUgaW50ZXJmYWNlIGZsYWdzIChTSU9DU0lGRkxBR1MgZmFpbGVkOiAlcykuXG4iCi0JCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIKLQkJCQkJICAgICJIaW50OiBUaGlzIGNhbid0IGhhcHBlbiB3aXRoIExpbnV4ID49IDIuMi4wLlxuIiwKLQkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogVGFrZSB0aGlzIHBjYXAgb3V0IG9mIHRoZSBsaXN0IG9mIHBjYXBzIGZvciB3aGljaCB3ZQotCQkgKiBoYXZlIHRvIHRha2UgdGhlIGludGVyZmFjZSBvdXQgb2YgcHJvbWlzY3VvdXMgbW9kZS4KLQkJICovCi0JCWZvciAocCA9IHBjYXBzX3RvX2Nsb3NlLCBwcmV2cCA9IE5VTEw7IHAgIT0gTlVMTDsKLQkJICAgIHByZXZwID0gcCwgcCA9IHAtPm1kLm5leHQpIHsKLQkJCWlmIChwID09IGhhbmRsZSkgewotCQkJCS8qCi0JCQkJICogRm91bmQgaXQuICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4KLQkJCQkgKi8KLQkJCQlpZiAocHJldnAgPT0gTlVMTCkgewotCQkJCQkvKgotCQkJCQkgKiBJdCB3YXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCi0JCQkJCSAqLwotCQkJCQlwY2Fwc190b19jbG9zZSA9IHAtPm1kLm5leHQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogSXQgd2FzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QuCi0JCQkJCSAqLwotCQkJCQlwcmV2cC0+bWQubmV4dCA9IHAtPm1kLm5leHQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQorCQkJLyoKKwkJCSAqIE90aGVyIGVycm9yLgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJfQogCX0KIAotCWlmIChoYW5kbGUtPm1kLmRldmljZSAhPSBOVUxMKQotCQlmcmVlKGhhbmRsZS0+bWQuZGV2aWNlKTsKLQloYW5kbGUtPm1kLmRldmljZSA9IE5VTEw7Ci0JcGNhcF9jbG9zZV9jb21tb24oaGFuZGxlKTsKLX0KKwkvKiBJdCB3b3JrZWQgLSB3ZSBhcmUgdXNpbmcgdGhlIG9sZCBpbnRlcmZhY2UgKi8KKwloYW5kbGVwLT5zb2NrX3BhY2tldCA9IDE7CiAKLS8qCi0gKiAgVHJ5IHRvIG9wZW4gYSBwYWNrZXQgc29ja2V0IHVzaW5nIHRoZSBvbGQga2VybmVsIGludGVyZmFjZS4KLSAqICBSZXR1cm5zIDAgb24gZmFpbHVyZS4KLSAqICBGSVhNRTogMCB1c2VzIHRvIG1lYW4gc3VjY2VzcyAoU2ViYXN0aWFuKQotICovCi1zdGF0aWMgaW50Ci1saXZlX29wZW5fb2xkKHBjYXBfdCAqaGFuZGxlLCBjb25zdCBjaGFyICpkZXZpY2UsIGludCBwcm9taXNjLAotCSAgICAgIGludCB0b19tcywgY2hhciAqZWJ1ZikKLXsKLQlpbnQJCWFycHR5cGU7Ci0Jc3RydWN0IGlmcmVxCWlmcjsKKwkvKiAuLi53aGljaCBtZWFucyB3ZSBnZXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLiAqLworCWhhbmRsZXAtPmNvb2tlZCA9IDA7CiAKLQlkbyB7Ci0JCS8qIE9wZW4gdGhlIHNvY2tldCAqLworCS8qIEJpbmQgdG8gdGhlIGdpdmVuIGRldmljZSAqLwogCi0JCWhhbmRsZS0+ZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19QQUNLRVQsIGh0b25zKEVUSF9QX0FMTCkpOwotCQlpZiAoaGFuZGxlLT5mZCA9PSAtMSkgewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlicmVhazsKKwlpZiAoc3RyY21wKGRldmljZSwgImFueSIpID09IDApIHsKKwkJc3RybmNweShoYW5kbGUtPmVycmJ1ZiwgInBjYXBfYWN0aXZhdGU6IFRoZSBcImFueVwiIGRldmljZSBpc24ndCBzdXBwb3J0ZWQgb24gMi4wWy54XS1rZXJuZWwgc3lzdGVtcyIsCisJCQlQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWlmIChpZmFjZV9iaW5kX29sZChoYW5kbGUtPmZkLCBkZXZpY2UsIGhhbmRsZS0+ZXJyYnVmKSA9PSAtMSkKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisKKwkvKgorCSAqIFRyeSB0byBnZXQgdGhlIGxpbmstbGF5ZXIgdHlwZS4KKwkgKi8KKwlhcnB0eXBlID0gaWZhY2VfZ2V0X2FycHR5cGUoaGFuZGxlLT5mZCwgZGV2aWNlLCBoYW5kbGUtPmVycmJ1Zik7CisJaWYgKGFycHR5cGUgPCAwKQorCQlyZXR1cm4gUENBUF9FUlJPUjsKKworCS8qCisJICogVHJ5IHRvIGZpbmQgdGhlIERMVF8gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQKKwkgKiBsaW5rLWxheWVyIHR5cGUuCisJICovCisJbWFwX2FycGhyZF90b19kbHQoaGFuZGxlLCBhcnB0eXBlLCAwKTsKKwlpZiAoaGFuZGxlLT5saW5rdHlwZSA9PSAtMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAidW5rbm93biBhcnB0eXBlICVkIiwgYXJwdHlwZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qIEdvIHRvIHByb21pc2MgbW9kZSBpZiByZXF1ZXN0ZWQgKi8KKworCWlmIChoYW5kbGUtPm9wdC5wcm9taXNjKSB7CisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAiU0lPQ0dJRkZMQUdTOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQl9CisJCWlmICgoaWZyLmlmcl9mbGFncyAmIElGRl9QUk9NSVNDKSA9PSAwKSB7CisJCQkvKgorCQkJICogUHJvbWlzY3VvdXMgbW9kZSBpc24ndCBjdXJyZW50bHkgb24sCisJCQkgKiBzbyB0dXJuIGl0IG9uLCBhbmQgcmVtZW1iZXIgdGhhdAorCQkJICogd2Ugc2hvdWxkIHR1cm4gaXQgb2ZmIHdoZW4gdGhlCisJCQkgKiBwY2FwX3QgaXMgY2xvc2VkLgorCQkJICovCiAKLQkJLyogSXQgd29ya2VkIC0gd2UgYXJlIHVzaW5nIHRoZSBvbGQgaW50ZXJmYWNlICovCi0JCWhhbmRsZS0+bWQuc29ja19wYWNrZXQgPSAxOwotCi0JCS8qIC4uLndoaWNoIG1lYW5zIHdlIGdldCB0aGUgbGluay1sYXllciBoZWFkZXIuICovCi0JCWhhbmRsZS0+bWQuY29va2VkID0gMDsKLQotCQkvKiBCaW5kIHRvIHRoZSBnaXZlbiBkZXZpY2UgKi8KLQotCQlpZiAoIWRldmljZSkgewotCQkgICAgICAgIHN0cm5jcHkoZWJ1ZiwgInBjYXBfb3Blbl9saXZlOiBUaGUgXCJhbnlcIiBkZXZpY2UgaXNuJ3Qgc3VwcG9ydGVkIG9uIDIuMFsueF0ta2VybmVsIHN5c3RlbXMiLAotCQkJCVBDQVBfRVJSQlVGX1NJWkUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGlmYWNlX2JpbmRfb2xkKGhhbmRsZS0+ZmQsIGRldmljZSwgZWJ1ZikgPT0gLTEpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBUcnkgdG8gZ2V0IHRoZSBsaW5rLWxheWVyIHR5cGUuCi0JCSAqLwotCQlhcnB0eXBlID0gaWZhY2VfZ2V0X2FycHR5cGUoaGFuZGxlLT5mZCwgZGV2aWNlLCBlYnVmKTsKLQkJaWYgKGFycHR5cGUgPT0gLTEpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBUcnkgdG8gZmluZCB0aGUgRExUXyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhhdAotCQkgKiBsaW5rLWxheWVyIHR5cGUuCi0JCSAqLwotCQltYXBfYXJwaHJkX3RvX2RsdChoYW5kbGUsIGFycHR5cGUsIDApOwotCQlpZiAoaGFuZGxlLT5saW5rdHlwZSA9PSAtMSkgewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkgInVua25vd24gYXJwdHlwZSAlZCIsIGFycHR5cGUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBHbyB0byBwcm9taXNjIG1vZGUgaWYgcmVxdWVzdGVkICovCi0KLQkJaWYgKHByb21pc2MpIHsKLQkJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0JCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0JCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkgewotCQkJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJCSAiU0lPQ0dJRkZMQUdTOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlicmVhazsKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgYXJyYW5nZQorCQkJICogdG8gaGF2ZSAicGNhcF9jbG9zZV9hbGwoKSIgY2FsbGVkIHdoZW4KKwkJCSAqIHdlIGV4aXQuCisJCQkgKi8KKwkJCWlmICghcGNhcF9kb19hZGRleGl0KGhhbmRsZSkpIHsKKwkJCQkvKgorCQkJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBkb24ndCBwdXQKKwkJCQkgKiB0aGUgaW50ZXJmYWNlIGluIHByb21pc2N1b3VzCisJCQkJICogbW9kZSwganVzdCBnaXZlIHVwLgorCQkJCSAqLworCQkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQkJfQotCQkJaWYgKChpZnIuaWZyX2ZsYWdzICYgSUZGX1BST01JU0MpID09IDApIHsKLQkJCQkvKgotCQkJCSAqIFByb21pc2N1b3VzIG1vZGUgaXNuJ3QgY3VycmVudGx5IG9uLAotCQkJCSAqIHNvIHR1cm4gaXQgb24sIGFuZCByZW1lbWJlciB0aGF0Ci0JCQkJICogd2Ugc2hvdWxkIHR1cm4gaXQgb2ZmIHdoZW4gdGhlCi0JCQkJICogcGNhcF90IGlzIGNsb3NlZC4KLQkJCQkgKi8KIAotCQkJCS8qCi0JCQkJICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIGFycmFuZ2UKLQkJCQkgKiB0byBoYXZlICJwY2FwX2Nsb3NlX2FsbCgpIiBjYWxsZWQgd2hlbgotCQkJCSAqIHdlIGV4aXQuCi0JCQkJICovCi0JCQkJaWYgKCFkaWRfYXRleGl0KSB7Ci0JCQkJCWlmIChhdGV4aXQocGNhcF9jbG9zZV9hbGwpID09IC0xKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogImF0ZXhpdCgpIiBmYWlsZWQ7IGRvbid0Ci0JCQkJCQkgKiBwdXQgdGhlIGludGVyZmFjZSBpbgotCQkJCQkJICogcHJvbWlzY3VvdXMgbW9kZSwganVzdAotCQkJCQkJICogZ2l2ZSB1cC4KLQkJCQkJCSAqLwotCQkJCQkJc3RybmNweShlYnVmLCAiYXRleGl0IGZhaWxlZCIsCi0JCQkJCQkJUENBUF9FUlJCVUZfU0laRSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlkaWRfYXRleGl0ID0gMTsKLQkJCQl9Ci0KLQkJCQlpZnIuaWZyX2ZsYWdzIHw9IElGRl9QUk9NSVNDOwotCQkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7Ci0JCQkJICAgICAgICBzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCQkJICJTSU9DU0lGRkxBR1M6ICVzIiwKLQkJCQkJCSBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQloYW5kbGUtPm1kLmNsZWFyX3Byb21pc2MgPSAxOwotCi0JCQkJLyoKLQkJCQkgKiBBZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBwY2FwcwotCQkJCSAqIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KLQkJCQkgKi8KLQkJCQloYW5kbGUtPm1kLm5leHQgPSBwY2Fwc190b19jbG9zZTsKLQkJCQlwY2Fwc190b19jbG9zZSA9IGhhbmRsZTsKKwkJCWlmci5pZnJfZmxhZ3MgfD0gSUZGX1BST01JU0M7CisJCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQkJICAgICAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJICJTSU9DU0lGRkxBR1M6ICVzIiwKKwkJCQkJIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJCX0KKwkJCWhhbmRsZXAtPm11c3RfZG9fb25fY2xvc2UgfD0gTVVTVF9DTEVBUl9QUk9NSVNDOworCisJCQkvKgorCQkJICogQWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YgcGNhcHMKKwkJCSAqIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KKwkJCSAqLworCQkJcGNhcF9hZGRfdG9fcGNhcHNfdG9fY2xvc2UoaGFuZGxlKTsKIAkJfQorCX0KIAorCS8qCisJICogQ29tcHV0ZSB0aGUgYnVmZmVyIHNpemUuCisJICoKKwkgKiBXZSdyZSB1c2luZyBTT0NLX1BBQ0tFVCwgc28gdGhpcyBtaWdodCBiZSBhIDIuMFsueF0KKwkgKiBrZXJuZWwsIGFuZCBtaWdodCByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgLSBjaGVjay4KKwkgKi8KKwlpZiAodW5hbWUoJnV0c25hbWUpIDwgMCB8fAorCSAgICBzdHJuY21wKHV0c25hbWUucmVsZWFzZSwgIjIuMCIsIDMpID09IDApIHsKIAkJLyoKLQkJICogRGVmYXVsdCB2YWx1ZSBmb3Igb2Zmc2V0IHRvIGFsaWduIGxpbmstbGF5ZXIgcGF5bG9hZAotCQkgKiBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKwkJICogRWl0aGVyIHdlIGNvdWxkbid0IGZpbmQgb3V0IHdoYXQga2VybmVsIHJlbGVhc2UKKwkJICogdGhpcyBpcywgb3IgaXQncyBhIDIuMFsueF0ga2VybmVsLgorCQkgKgorCQkgKiBJbiB0aGUgMi4wWy54XSBrZXJuZWwsIGEgInJlY3Zmcm9tKCkiIG9uCisJCSAqIGEgU09DS19QQUNLRVQgc29ja2V0LCB3aXRoIE1TR19UUlVOQyBzZXQsIHdpbGwKKwkJICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgc28gaWYgd2UgcGFzcworCQkgKiBhIGxlbmd0aCBiYXNlZCBvbiB0aGUgc25hcHNob3QgbGVuZ3RoLCBpdCdsbAorCQkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBwYWNrZXQKKwkJICogY29waWVkIHRvIHVzZXJsYW5kLCBub3QgdGhlIGFjdHVhbCBsZW5ndGgKKwkJICogb2YgdGhlIHBhY2tldC4KKwkJICoKKwkJICogVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgdGhlIElQIGRpc3NlY3RvcgorCQkgKiBpbiB0Y3BkdW1wIHdpbGwgZ2V0IGhhbmRlZCBhIHBhY2tldCBsZW5ndGggbGVzcworCQkgKiB0aGFuIHRoZSBsZW5ndGggaW4gdGhlIElQIGhlYWRlciwgYW5kIHdpbGwKKwkJICogY29tcGxhaW4gYWJvdXQgInRydW5jYXRlZC1pcCIuCisJCSAqCisJCSAqIFNvIHdlIGRvbid0IGJvdGhlciB0cnlpbmcgdG8gY29weSBmcm9tIHRoZQorCQkgKiBrZXJuZWwgb25seSB0aGUgYnl0ZXMgaW4gd2hpY2ggd2UncmUgaW50ZXJlc3RlZCwKKwkJICogYnV0IGluc3RlYWQgY29weSB0aGVtIGFsbCwganVzdCBhcyB0aGUgb2xkZXIKKwkJICogdmVyc2lvbnMgb2YgbGlicGNhcCBmb3IgTGludXggZGlkLgorCQkgKgorCQkgKiBUaGUgYnVmZmVyIHRoZXJlZm9yZSBuZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRvCisJCSAqIGhvbGQgdGhlIGxhcmdlc3QgcGFja2V0IHdlIGNhbiBnZXQgZnJvbSB0aGlzCisJCSAqIGRldmljZS4gIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IGdldCB0aGUgTVJVCisJCSAqIG9mIHRoZSBuZXR3b3JrOyB3ZSBjYW4gb25seSBnZXQgdGhlIE1UVS4gIFRoZQorCQkgKiBNVFUgbWF5IGJlIHRvbyBzbWFsbCwgaW4gd2hpY2ggY2FzZSBhIHBhY2tldCBsYXJnZXIKKwkJICogdGhhbiB0aGUgYnVmZmVyIHNpemUgd2lsbCBiZSB0cnVuY2F0ZWQgKmFuZCogd2UKKwkJICogd29uJ3QgZ2V0IHRoZSBhY3R1YWwgcGFja2V0IHNpemUuCisJCSAqCisJCSAqIEhvd2V2ZXIsIGlmIHRoZSBzbmFwc2hvdCBsZW5ndGggaXMgbGFyZ2VyIHRoYW4KKwkJICogdGhlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHRoZSBNVFUsIHdlIHVzZSB0aGUKKwkJICogc25hcHNob3QgbGVuZ3RoIGFzIHRoZSBidWZmZXIgc2l6ZSwgaW5zdGVhZDsKKwkJICogdGhpcyBtZWFucyB0aGF0IHdpdGggYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc25hcHNob3QKKwkJICogbGVuZ3RoIHdlIHdvbid0IGFydGlmaWNpYWxseSB0cnVuY2F0ZSBwYWNrZXRzCisJCSAqIHRvIHRoZSBNVFUtYmFzZWQgc2l6ZS4KKwkJICoKKwkJICogVGhpcyBtZXNzIGp1c3Qgb25lIG9mIG1hbnkgcHJvYmxlbXMgd2l0aCBwYWNrZXQKKwkJICogY2FwdHVyZSBvbiAyLjBbLnhdIGtlcm5lbHM7IHlvdSByZWFsbHkgd2FudCBhCisJCSAqIDIuMlsueF0gb3IgbGF0ZXIga2VybmVsIGlmIHlvdSB3YW50IHBhY2tldCBjYXB0dXJlCisJCSAqIHRvIHdvcmsgd2VsbC4KIAkJICovCi0JCWhhbmRsZS0+b2Zmc2V0CSA9IDA7CisJCW10dSA9IGlmYWNlX2dldF9tdHUoaGFuZGxlLT5mZCwgZGV2aWNlLCBoYW5kbGUtPmVycmJ1Zik7CisJCWlmIChtdHUgPT0gLTEpCisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJaGFuZGxlLT5idWZzaXplID0gTUFYX0xJTktIRUFERVJfU0laRSArIG10dTsKKwkJaWYgKGhhbmRsZS0+YnVmc2l6ZSA8IGhhbmRsZS0+c25hcHNob3QpCisJCQloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSAyLjJbLnhdIG9yIGxhdGVyIGtlcm5lbC4KKwkJICoKKwkJICogV2UgY2FuIHNhZmVseSBwYXNzICJyZWN2ZnJvbSgpIiBhIGJ5dGUgY291bnQKKwkJICogYmFzZWQgb24gdGhlIHNuYXBzaG90IGxlbmd0aC4KKwkJICovCisJCWhhbmRsZS0+YnVmc2l6ZSA9IGhhbmRsZS0+c25hcHNob3Q7CisJfQogCi0JCXJldHVybiAxOworCS8qCisJICogRGVmYXVsdCB2YWx1ZSBmb3Igb2Zmc2V0IHRvIGFsaWduIGxpbmstbGF5ZXIgcGF5bG9hZAorCSAqIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorCSAqLworCWhhbmRsZS0+b2Zmc2V0CSA9IDA7CiAKLQl9IHdoaWxlICgwKTsKKwkvKgorCSAqIFNPQ0tfUEFDS0VUIHNvY2tldHMgZG9uJ3Qgc3VwcGx5IGluZm9ybWF0aW9uIGZyb20KKwkgKiBzdHJpcHBlZCBWTEFOIHRhZ3MuCisJICovCisJaGFuZGxlcC0+dmxhbl9vZmZzZXQgPSAtMTsgLyogdW5rbm93biAqLwogCi0JcGNhcF9jbG9zZV9saW51eChoYW5kbGUpOwotCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiAvKgpAQCAtMTk3MSw3ICs1ODE5LDEzIEBACiAJaWYgKGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKSA9PSAtMSkgewogCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJTSU9DR0lGSFdBRERSOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOworCQlpZiAoZXJybm8gPT0gRU5PREVWKSB7CisJCQkvKgorCQkJICogTm8gc3VjaCBkZXZpY2UuCisJCQkgKi8KKwkJCXJldHVybiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCQl9CisJCXJldHVybiBQQ0FQX0VSUk9SOwogCX0KIAogCXJldHVybiBpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHk7CkBAIC0xOTc5LDggKzU4MzMsOSBAQAogCiAjaWZkZWYgU09fQVRUQUNIX0ZJTFRFUgogc3RhdGljIGludAotZml4X3Byb2dyYW0ocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBzb2NrX2Zwcm9nICpmY29kZSkKK2ZpeF9wcm9ncmFtKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3Qgc29ja19mcHJvZyAqZmNvZGUsIGludCBpc19tbWFwcGVkKQogeworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwogCXNpemVfdCBwcm9nX3NpemU7CiAJcmVnaXN0ZXIgaW50IGk7CiAJcmVnaXN0ZXIgc3RydWN0IGJwZl9pbnNuICpwOwpAQCAtMTk5NSw3ICs1ODUwLDcgQEAKIAlsZW4gPSBoYW5kbGUtPmZjb2RlLmJmX2xlbjsKIAlmID0gKHN0cnVjdCBicGZfaW5zbiAqKW1hbGxvYyhwcm9nX3NpemUpOwogCWlmIChmID09IE5VTEwpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIHNpemVvZihoYW5kbGUtPmVycmJ1ZiksCisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjAxMiwyNiArNTg2NywzMyBAQAogCiAJCWNhc2UgQlBGX1JFVDoKIAkJCS8qCi0JCQkgKiBJdCdzIGEgcmV0dXJuIGluc3RydWN0aW9uOyBpcyB0aGUgc25hcHNob3QKLQkJCSAqIGxlbmd0aCBhIGNvbnN0YW50LCByYXRoZXIgdGhhbiB0aGUgY29udGVudHMKLQkJCSAqIG9mIHRoZSBhY2N1bXVsYXRvcj8KKwkJCSAqIEl0J3MgYSByZXR1cm4gaW5zdHJ1Y3Rpb247IGFyZSB3ZSBjYXB0dXJpbmcKKwkJCSAqIGluIG1lbW9yeS1tYXBwZWQgbW9kZT8KIAkJCSAqLwotCQkJaWYgKEJQRl9NT0RFKHAtPmNvZGUpID09IEJQRl9LKSB7CisJCQlpZiAoIWlzX21tYXBwZWQpIHsKIAkJCQkvKgotCQkJCSAqIFllcyAtIGlmIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCwKLQkJCQkgKiBpLmUuIHRoZSBzbmFwc2hvdCBsZW5ndGgsIGlzIGFueXRoaW5nCi0JCQkJICogb3RoZXIgdGhhbiAwLCBtYWtlIGl0IDY1NTM1LCBzbyB0aGF0Ci0JCQkJICogdGhlIHBhY2tldCBpcyB0cnVuY2F0ZWQgYnkgInJlY3Zmcm9tKCkiLAotCQkJCSAqIG5vdCBieSB0aGUgZmlsdGVyLgotCQkJCSAqCi0JCQkJICogWFhYIC0gdGhlcmUncyBub3RoaW5nIHdlIGNhbiBlYXNpbHkgZG8KLQkJCQkgKiBpZiBpdCdzIGdldHRpbmcgdGhlIHZhbHVlIGZyb20gdGhlCi0JCQkJICogYWNjdW11bGF0b3I7IHdlJ2QgaGF2ZSB0byBpbnNlcnQKLQkJCQkgKiBjb2RlIHRvIGZvcmNlIG5vbi16ZXJvIHZhbHVlcyB0byBiZQotCQkJCSAqIDY1NTM1LgorCQkJCSAqIE5vOyBpcyB0aGUgc25hcHNob3QgbGVuZ3RoIGEgY29uc3RhbnQsCisJCQkJICogcmF0aGVyIHRoYW4gdGhlIGNvbnRlbnRzIG9mIHRoZQorCQkJCSAqIGFjY3VtdWxhdG9yPwogCQkJCSAqLwotCQkJCWlmIChwLT5rICE9IDApCi0JCQkJCXAtPmsgPSA2NTUzNTsKKwkJCQlpZiAoQlBGX01PREUocC0+Y29kZSkgPT0gQlBGX0spIHsKKwkJCQkJLyoKKwkJCQkJICogWWVzIC0gaWYgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkLAorCQkJCQkgKiBpLmUuIHRoZSBzbmFwc2hvdCBsZW5ndGgsIGlzCisJCQkJCSAqIGFueXRoaW5nIG90aGVyIHRoYW4gMCwgbWFrZSBpdAorCQkJCQkgKiA2NTUzNSwgc28gdGhhdCB0aGUgcGFja2V0IGlzCisJCQkJCSAqIHRydW5jYXRlZCBieSAicmVjdmZyb20oKSIsCisJCQkJCSAqIG5vdCBieSB0aGUgZmlsdGVyLgorCQkJCQkgKgorCQkJCQkgKiBYWFggLSB0aGVyZSdzIG5vdGhpbmcgd2UgY2FuCisJCQkJCSAqIGVhc2lseSBkbyBpZiBpdCdzIGdldHRpbmcgdGhlCisJCQkJCSAqIHZhbHVlIGZyb20gdGhlIGFjY3VtdWxhdG9yOyB3ZSdkCisJCQkJCSAqIGhhdmUgdG8gaW5zZXJ0IGNvZGUgdG8gZm9yY2UKKwkJCQkJICogbm9uLXplcm8gdmFsdWVzIHRvIGJlIDY1NTM1LgorCQkJCQkgKi8KKwkJCQkJaWYgKHAtPmsgIT0gMCkKKwkJCQkJCXAtPmsgPSA2NTUzNTsKKwkJCQl9CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMjA0OSw3ICs1OTExLDcgQEAKIAkJCQkvKgogCQkJCSAqIFllczsgYXJlIHdlIGluIGNvb2tlZCBtb2RlPwogCQkJCSAqLwotCQkJCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkgeworCQkJCWlmIChoYW5kbGVwLT5jb29rZWQpIHsKIAkJCQkJLyoKIAkJCQkJICogWWVzLCBzbyB3ZSBuZWVkIHRvIGZpeCB0aGlzCiAJCQkJCSAqIGluc3RydWN0aW9uLgpAQCAtMjA4NSwxMyArNTk0NywxOSBAQAogCQkgKiBoZWFkZXIuCiAJCSAqLwogCQlwLT5rIC09IFNMTF9IRFJfTEVOOworCX0gZWxzZSBpZiAocC0+ayA9PSAwKSB7CisJCS8qCisJCSAqIEl0J3MgdGhlIHBhY2tldCB0eXBlIGZpZWxkOyBtYXAgaXQgdG8gdGhlIHNwZWNpYWwgbWFnaWMKKwkJICoga2VybmVsIG9mZnNldCBmb3IgdGhhdCBmaWVsZC4KKwkJICovCisJCXAtPmsgPSBTS0ZfQURfT0ZGICsgU0tGX0FEX1BLVFRZUEU7CiAJfSBlbHNlIGlmIChwLT5rID09IDE0KSB7CiAJCS8qCiAJCSAqIEl0J3MgdGhlIHByb3RvY29sIGZpZWxkOyBtYXAgaXQgdG8gdGhlIHNwZWNpYWwgbWFnaWMKIAkJICoga2VybmVsIG9mZnNldCBmb3IgdGhhdCBmaWVsZC4KIAkJICovCiAJCXAtPmsgPSBTS0ZfQURfT0ZGICsgU0tGX0FEX1BST1RPQ09MOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmICgoYnBmX2ludDMyKShwLT5rKSA+IDApIHsKIAkJLyoKIAkJICogSXQncyB3aXRoaW4gdGhlIGhlYWRlciwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aG9zZQogCQkgKiBmaWVsZHM7IHdlIGNhbid0IGRvIHRoYXQgaW4gdGhlIGtlcm5lbCwgc28gcHVudApAQCAtMjE2Nyw3ICs2MDM1LDcgQEAKIAkJCWlmIChzYXZlX2Vycm5vICE9IEVBR0FJTikgewogCQkJCS8qIEZhdGFsIGVycm9yICovCiAJCQkJcmVzZXRfa2VybmVsX2ZpbHRlcihoYW5kbGUpOwotCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBzaXplb2YoaGFuZGxlLT5lcnJidWYpLAorCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAicmVjdjogJXMiLCBwY2FwX3N0cmVycm9yKHNhdmVfZXJybm8pKTsKIAkJCQlyZXR1cm4gLTI7CiAJCQl9CmRpZmYgLS1naXQgYS9wY2FwLW5hbWVkYi5oIGIvcGNhcC1uYW1lZGIuaAppbmRleCBhY2FhYmQ5Li5kMGIyMjMxIDEwMDY0NAotLS0gYS9wY2FwLW5hbWVkYi5oCisrKyBiL3BjYXAtbmFtZWRiLmgKQEAgLTMwLDYwICszMCwxMyBAQAogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLW5hbWVkYi5oLHYgMS4xMC4yLjEgMjAwNS8wNC8xOSAwNDoyNjowOCBndXkgRXhwICQgKExCTCkKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1uYW1lZGIuaCx2IDEuMTMgMjAwNi0xMC0wNCAxODoxMzozMiBndXkgRXhwICQgKExCTCkKICAqLwogCi0jaWZuZGVmIGxpYl9wY2FwX25hbWVkYl9oCi0jZGVmaW5lIGxpYl9wY2FwX25hbWVkYl9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQogLyoKLSAqIEFzIHJldHVybmVkIGJ5IHRoZSBwY2FwX25leHRfZXRoZXJlbnQoKQotICogWFhYIHRoaXMgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBpbnRlcmZhY2UsIGJ1dCB0aGlzCi0gKiBsaWJyYXJ5IGFscmVhZHkgbXVzdCBkbyBuYW1lIHRvIGFkZHJlc3MgdHJhbnNsYXRpb24sIHNvCi0gKiBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciAvZXRjL2V0aGVycywgd2UKLSAqIGV4cG9ydCB0aGVzZSBob29rcyBzaW5jZSB0aGV5J2xsCisgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKgorICogTm90ZSB0byBPUyB2ZW5kb3JzOiBkbyBOT1QgZ2V0IHJpZCBvZiB0aGlzIGZpbGUhICBTb21lIGFwcGxpY2F0aW9ucworICogbWlnaHQgZXhwZWN0IHRvIGJlIGFibGUgdG8gaW5jbHVkZSA8cGNhcC1uYW1lZGIuaD4uCiAgKi8KLXN0cnVjdCBwY2FwX2V0aGVyZW50IHsKLQl1X2NoYXIgYWRkcls2XTsKLQljaGFyIG5hbWVbMTIyXTsKLX07Ci0jaWZuZGVmIFBDQVBfRVRIRVJTX0ZJTEUKLSNkZWZpbmUgUENBUF9FVEhFUlNfRklMRSAiL2V0Yy9ldGhlcnMiCi0jZW5kaWYKLXN0cnVjdAlwY2FwX2V0aGVyZW50ICpwY2FwX25leHRfZXRoZXJlbnQoRklMRSAqKTsKLXVfY2hhciAqcGNhcF9ldGhlcl9ob3N0dG9uKGNvbnN0IGNoYXIqKTsKLXVfY2hhciAqcGNhcF9ldGhlcl9hdG9uKGNvbnN0IGNoYXIgKik7Ci0KLWJwZl91X2ludDMyICoqcGNhcF9uYW1ldG9hZGRyKGNvbnN0IGNoYXIgKik7Ci0jaWZkZWYgSU5FVDYKLXN0cnVjdCBhZGRyaW5mbyAqcGNhcF9uYW1ldG9hZGRyaW5mbyhjb25zdCBjaGFyICopOwotI2VuZGlmCi1icGZfdV9pbnQzMiBwY2FwX25hbWV0b25ldGFkZHIoY29uc3QgY2hhciAqKTsKLQotaW50CXBjYXBfbmFtZXRvcG9ydChjb25zdCBjaGFyICosIGludCAqLCBpbnQgKik7Ci1pbnQJcGNhcF9uYW1ldG9wb3J0cmFuZ2UoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKLWludAlwY2FwX25hbWV0b3Byb3RvKGNvbnN0IGNoYXIgKik7Ci1pbnQJcGNhcF9uYW1ldG9lcHJvdG8oY29uc3QgY2hhciAqKTsKLWludAlwY2FwX25hbWV0b2xsYyhjb25zdCBjaGFyICopOwotLyoKLSAqIElmIGEgcHJvdG9jb2wgaXMgdW5rbm93biwgUFJPVE9fVU5ERUYgaXMgcmV0dXJuZWQuCi0gKiBBbHNvLCBwY2FwX25hbWV0b3BvcnQoKSByZXR1cm5zIHRoZSBwcm90b2NvbCBhbG9uZyB3aXRoIHRoZSBwb3J0IG51bWJlci4KLSAqIElmIHRoZXJlIGFyZSBhbWJpZ3VvdXMgZW50cmllZCBpbiAvZXRjL3NlcnZpY2VzIChpLmUuIGRvbWFpbgotICogY2FuIGJlIGVpdGhlciB0Y3Agb3IgdWRwKSBQUk9UT19VTkRFRiBpcyByZXR1cm5lZC4KLSAqLwotI2RlZmluZSBQUk9UT19VTkRFRgkJLTEKLQotLyogWFhYIG1vdmUgdGhlc2UgdG8gcGNhcC1pbnQuaD8gKi8KLWludCBfX3BjYXBfYXRvZG4oY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiAqKTsKLWludCBfX3BjYXBfYXRvaW4oY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiAqKTsKLXVfc2hvcnQJX19wY2FwX25hbWV0b2RuYWRkcihjb25zdCBjaGFyICopOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKKyNpbmNsdWRlIDxwY2FwL25hbWVkYi5oPgpkaWZmIC0tZ2l0IGEvcGNhcC1uZXRmaWx0ZXItbGludXguYyBiL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZWRiYgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKQEAgLTAsMCArMSw2NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmFrdWIgWmF3YWR6a2kKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpZmRlZiBORUVEX1NUUkVSUk9SX0gKKyNpbmNsdWRlICJzdHJlcnJvci5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaD4KKworLyogTk9URTogaWYgeW91ciBwcm9ncmFtIGRyb3BzIHByaXZpbGFnZXMgYWZ0ZXIgcGNhcF9hY3RpdmF0ZSgpIGl0IFdPTidUIHdvcmsgd2l0aCBuZnF1ZXVlLgorICogICAgICAgSXQgdG9vayBtZSBxdWl0ZSBzb21lIHRpbWUgdG8gZGVidWcgOy8gCisgKgorICogICAgICAgU2VuZGluZyBhbnkgZGF0YSB0byBuZm5ldGxpbmsgc29ja2V0IHJlcXVpcmVzIENBUF9ORVRfQURNSU4gcHJpdmlsYWdlcywKKyAqICAgICAgIGFuZCBpbiBuZnF1ZXVlIHdlIG5lZWQgdG8gc2VuZCB2ZXJkaWN0IHJlcGx5IGFmdGVyIHJlY3ZpbmcgcGFja2V0LgorICoKKyAqICAgICAgIEluIHRjcGR1bXAgeW91IGNhbiBkaXNhYmxlIGRyb3BwaW5nIHByaXZpbGFnZXMgd2l0aCAtWiByb290CisgKi8KKyAKKyNpbmNsdWRlICJwY2FwLW5ldGZpbHRlci1saW51eC5oIgorCisjZGVmaW5lIEhEUl9MRU5HVEggKE5MTVNHX0xFTkdUSChOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkpKQorCisjZGVmaW5lIE5GTE9HX0lGQUNFICJuZmxvZyIKKyNkZWZpbmUgTkZRVUVVRV9JRkFDRSAibmZxdWV1ZSIKKwordHlwZWRlZiBlbnVtIHsgT1RIRVIgPSAtMSwgTkZMT0csIE5GUVVFVUUgfSBuZnR5cGVfdDsKKworLyoKKyAqIFByaXZhdGUgZGF0YSBmb3IgY2FwdHVyaW5nIG9uIExpbnV4IG5ldGZpbHRlciBzb2NrZXRzLgorICovCitzdHJ1Y3QgcGNhcF9uZXRmaWx0ZXIgeworCXVfaW50CXBhY2tldHNfcmVhZDsJLyogY291bnQgb2YgcGFja2V0cyByZWFkIHdpdGggcmVjdmZyb20oKSAqLworfTsKKworc3RhdGljIGludCBuZnF1ZXVlX3NlbmRfdmVyZGljdChjb25zdCBwY2FwX3QgKmhhbmRsZSwgdV9pbnQxNl90IGdyb3VwX2lkLCB1X2ludDMyX3QgaWQsIHVfaW50MzJfdCB2ZXJkaWN0KTsKKworc3RhdGljIGludAorbmV0ZmlsdGVyX3JlYWRfbGludXgocGNhcF90ICpoYW5kbGUsIGludCBtYXhfcGFja2V0cywgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJc3RydWN0IHBjYXBfbmV0ZmlsdGVyICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgY291bnQgPSAwOworCWludCBsZW47CisKKwkvKiBpZ25vcmUgaW50ZXJydXB0IHN5c3RlbSBjYWxsIGVycm9yICovCisJZG8geworCQlsZW4gPSByZWN2KGhhbmRsZS0+ZmQsIGhhbmRsZS0+YnVmZmVyLCBoYW5kbGUtPmJ1ZnNpemUsIDApOworCQlpZiAoaGFuZGxlLT5icmVha19sb29wKSB7CisJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJcmV0dXJuIC0yOworCQl9CisJfSB3aGlsZSAoKGxlbiA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisKKwlpZiAobGVuIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHJlY2VpdmUgcGFja2V0ICVkOiVzIiwgZXJybm8sIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZiA9IGhhbmRsZS0+YnVmZmVyOworCXdoaWxlIChsZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKKwkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGggPSAoY29uc3Qgc3RydWN0IG5sbXNnaGRyICopIGJ1ZjsKKwkJdV9pbnQzMl90IG1zZ19sZW47CisJCW5mdHlwZV90IHR5cGUgPSBPVEhFUjsKKworCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSB8fCBsZW4gPCBubGgtPm5sbXNnX2xlbikgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJNZXNzYWdlIHRydW5jYXRlZDogKGdvdDogJWQpIChubG1zZ19sZW46ICV1KSIsIGxlbiwgbmxoLT5ubG1zZ19sZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKE5GTkxfU1VCU1lTX0lEKG5saC0+bmxtc2dfdHlwZSkgPT0gTkZOTF9TVUJTWVNfVUxPRyAmJiAKKwkJCU5GTkxfTVNHX1RZUEUobmxoLT5ubG1zZ190eXBlKSA9PSBORlVMTkxfTVNHX1BBQ0tFVCkgCisJCQkJdHlwZSA9IE5GTE9HOworCisJCWlmIChORk5MX1NVQlNZU19JRChubGgtPm5sbXNnX3R5cGUpID09IE5GTkxfU1VCU1lTX1FVRVVFICYmIAorCQkJTkZOTF9NU0dfVFlQRShubGgtPm5sbXNnX3R5cGUpID09IE5GUU5MX01TR19QQUNLRVQpCisJCQkJdHlwZSA9IE5GUVVFVUU7CisKKwkJaWYgKHR5cGUgIT0gT1RIRVIpIHsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBheWxvYWQgPSBOVUxMOworCQkJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisKKwkJCWNvbnN0IHN0cnVjdCBuZmdlbm1zZyAqbmZnOworCQkJaW50IGlkID0gMDsKKworCQkJaWYgKGhhbmRsZS0+bGlua3R5cGUgIT0gRExUX05GTE9HKSB7CisJCQkJY29uc3Qgc3RydWN0IG5mYXR0ciAqcGF5bG9hZF9hdHRyID0gTlVMTDsKKworCQkJCWlmIChubGgtPm5sbXNnX2xlbiA8IEhEUl9MRU5HVEgpIHsKKwkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJNYWxmb3JtZWQgbWVzc2FnZTogKG5sbXNnX2xlbjogJXUpIiwgbmxoLT5ubG1zZ19sZW4pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJbmZnID0gTkxNU0dfREFUQShubGgpOworCQkJCWlmIChubGgtPm5sbXNnX2xlbiA+IEhEUl9MRU5HVEgpIHsKKwkJCQkJc3RydWN0IG5mYXR0ciAqYXR0ciA9IE5GTV9ORkEobmZnKTsKKwkJCQkJaW50IGF0dHJfbGVuID0gbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19BTElHTihIRFJfTEVOR1RIKTsKKworCQkJCQl3aGlsZSAoTkZBX09LKGF0dHIsIGF0dHJfbGVuKSkgeworCQkJCQkJaWYgKHR5cGUgPT0gTkZRVUVVRSkgeworCQkJCQkJCXN3aXRjaCAoTkZBX1RZUEUoYXR0cikpIHsKKwkJCQkJCQkJY2FzZSBORlFBX1BBQ0tFVF9IRFI6CisJCQkJCQkJCQl7CisJCQkJCQkJCQkJY29uc3Qgc3RydWN0IG5mcW5sX21zZ19wYWNrZXRfaGRyICpwa3RfaGRyID0gKGNvbnN0IHN0cnVjdCBuZnFubF9tc2dfcGFja2V0X2hkciAqKSBORkFfREFUQShhdHRyKTsKKworCQkJCQkJCQkJCWlkID0gbnRvaGwocGt0X2hkci0+cGFja2V0X2lkKTsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJY2FzZSBORlFBX1BBWUxPQUQ6CisJCQkJCQkJCQlwYXlsb2FkX2F0dHIgPSBhdHRyOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gTkZMT0cpIHsKKwkJCQkJCQlzd2l0Y2ggKE5GQV9UWVBFKGF0dHIpKSB7CisJCQkJCQkJCWNhc2UgTkZVTEFfUEFZTE9BRDoKKwkJCQkJCQkJCXBheWxvYWRfYXR0ciA9IGF0dHI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlhdHRyID0gTkZBX05FWFQoYXR0ciwgYXR0cl9sZW4pOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHBheWxvYWRfYXR0cikgeworCQkJCQlwYXlsb2FkID0gTkZBX0RBVEEocGF5bG9hZF9hdHRyKTsKKwkJCQkJcGt0aC5sZW4gPSBwa3RoLmNhcGxlbiA9IE5GQV9QQVlMT0FEKHBheWxvYWRfYXR0cik7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCXBheWxvYWQgPSBOTE1TR19EQVRBKG5saCk7CisJCQkJcGt0aC5jYXBsZW4gPSBwa3RoLmxlbiA9IG5saC0+bmxtc2dfbGVuLU5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKTsKKwkJCX0KKworCQkJaWYgKHBheWxvYWQpIHsKKwkJCQkvKiBwa3RoLmNhcGxlbiA9IG1pbiAocGF5bG9hZF9sZW4sIGhhbmRsZS0+c25hcHNob3QpOyAqLworCisJCQkJZ2V0dGltZW9mZGF5KCZwa3RoLnRzLCBOVUxMKTsKKwkJCQlpZiAoaGFuZGxlLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMIHx8CisJCQkJCQlicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIHBheWxvYWQsIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIAorCQkJCXsKKwkJCQkJaGFuZGxlcC0+cGFja2V0c19yZWFkKys7CisJCQkJCWNhbGxiYWNrKHVzZXIsICZwa3RoLCBwYXlsb2FkKTsKKwkJCQkJY291bnQrKzsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh0eXBlID09IE5GUVVFVUUpIHsKKwkJCQkvKiBYWFgsIHBvc3NpYmxlIHJlc3BvbnNlczogTkZfRFJPUCwgTkZfQUNDRVBULCBORl9TVE9MRU4sIE5GX1FVRVVFLCBORl9SRVBFQVQsIE5GX1NUT1AgKi8KKwkJCQluZnF1ZXVlX3NlbmRfdmVyZGljdChoYW5kbGUsIG50b2hzKG5mZy0+cmVzX2lkKSwgaWQsIE5GX0FDQ0VQVCk7CisJCQl9CisJCX0KKworCQltc2dfbGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOworCQlpZiAobXNnX2xlbiA+IGxlbikKKwkJCW1zZ19sZW4gPSBsZW47CisKKwkJbGVuIC09IG1zZ19sZW47CisJCWJ1ZiArPSBtc2dfbGVuOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK25ldGZpbHRlcl9zZXRfZGF0YWxpbmsocGNhcF90ICpoYW5kbGUsIGludCBkbHQpCit7CisJaGFuZGxlLT5saW5rdHlwZSA9IGRsdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmV0ZmlsdGVyX3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKK3sKKwlzdHJ1Y3QgcGNhcF9uZXRmaWx0ZXIgKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisKKwlzdGF0cy0+cHNfcmVjdiA9IGhhbmRsZXAtPnBhY2tldHNfcmVhZDsKKwlzdGF0cy0+cHNfZHJvcCA9IDA7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25ldGZpbHRlcl9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiBuZXRmaWx0ZXIgZGV2aWNlcyIpOworCXJldHVybiAoLTEpOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdHJ1Y3QgbXlfbmZhdHRyIHsKKwl1X2ludDE2X3QgbmZhX2xlbjsKKwl1X2ludDE2X3QgbmZhX3R5cGU7CisJdm9pZCAqZGF0YTsKK307CisKK3N0YXRpYyBpbnQKK25ldGZpbHRlcl9zZW5kX2NvbmZpZ19tc2coY29uc3QgcGNhcF90ICpoYW5kbGUsIHVfaW50MTZfdCBtc2dfdHlwZSwgaW50IGFjaywgdV9pbnQ4X3QgZmFtaWx5LCB1X2ludDE2X3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgbXlfbmZhdHRyICpteW5mYSkKK3sKKwljaGFyIGJ1ZlsxMDI0XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCkpOworCisJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopIGJ1ZjsKKwlzdHJ1Y3QgbmZnZW5tc2cgKm5mZyA9IChzdHJ1Y3QgbmZnZW5tc2cgKikgKGJ1ZiArIHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKTsKKworCXN0cnVjdCBzb2NrYWRkcl9ubCBzbmw7CisJc3RhdGljIHVuc2lnbmVkIGludCBzZXFfaWQ7CisJCisJaWYgKCFzZXFfaWQpCisJCXNlcV9pZCA9IHRpbWUoTlVMTCk7CisJKytzZXFfaWQ7CisKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7CisJbmxoLT5ubG1zZ190eXBlID0gbXNnX3R5cGU7CisJbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCAoYWNrID8gTkxNX0ZfQUNLIDogMCk7CisJbmxoLT5ubG1zZ19waWQgPSAwOwkvKiB0byBrZXJuZWwgKi8KKwlubGgtPm5sbXNnX3NlcSA9IHNlcV9pZDsKKworCW5mZy0+bmZnZW5fZmFtaWx5ID0gZmFtaWx5OworCW5mZy0+dmVyc2lvbiA9IE5GTkVUTElOS19WMDsKKwluZmctPnJlc19pZCA9IGh0b25zKHJlc19pZCk7CisKKwlpZiAobXluZmEpIHsKKwkJc3RydWN0IG5mYXR0ciAqbmZhID0gKHN0cnVjdCBuZmF0dHIgKikgKGJ1ZiArIE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKSk7CisKKwkJbmZhLT5uZmFfdHlwZSA9IG15bmZhLT5uZmFfdHlwZTsKKwkJbmZhLT5uZmFfbGVuID0gTkZBX0xFTkdUSChteW5mYS0+bmZhX2xlbik7CisJCW1lbWNweShORkFfREFUQShuZmEpLCBteW5mYS0+ZGF0YSwgbXluZmEtPm5mYV9sZW4pOworCQlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKSArIE5GQV9BTElHTihuZmEtPm5mYV9sZW4pOworCX0KKworCW1lbXNldCgmc25sLCAwLCBzaXplb2Yoc25sKSk7CisJc25sLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisKKwlpZiAoc2VuZHRvKGhhbmRsZS0+ZmQsIG5saCwgbmxoLT5ubG1zZ19sZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNubCwgc2l6ZW9mKHNubCkpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWFjaykKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0aW5nIGZvciByZXBseSBsb29wICovCisJZG8geworCQlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzbmwpOworCQlpbnQgbGVuOworCisJCS8qIGlnbm9yZSBpbnRlcnJ1cHQgc3lzdGVtIGNhbGwgZXJyb3IgKi8KKwkJZG8geworCQkJbGVuID0gcmVjdmZyb20oaGFuZGxlLT5mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc25sLCAmYWRkcmxlbik7CisJCX0gd2hpbGUgKChsZW4gPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCisJCWlmIChsZW4gPD0gMCkKKwkJCXJldHVybiBsZW47CisKKwkJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKHNubCkgfHwgc25sLm5sX2ZhbWlseSAhPSBBRl9ORVRMSU5LKSB7CisJCQllcnJubyA9IEVJTlZBTDsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKikgYnVmOworCQlpZiAoc25sLm5sX3BpZCAhPSAwIHx8IHNlcV9pZCAhPSBubGgtPm5sbXNnX3NlcSkJLyogaWYgbm90IGZyb20ga2VybmVsIG9yIHdyb25nIHNlcXVlbmNlIHNraXAgKi8KKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChsZW4gPj0gTkxNU0dfU1BBQ0UoMCkgJiYgTkxNU0dfT0sobmxoLCBsZW4pKSB7CisJCQlpZiAobmxoLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SIHx8IChubGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSAmJiBubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfTVVMVEkpKSB7CisJCQkJaWYgKG5saC0+bmxtc2dfbGVuIDwgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpKSB7CisJCQkJCWVycm5vID0gRUJBRE1TRzsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQllcnJubyA9IC0oKigoaW50ICopTkxNU0dfREFUQShubGgpKSk7CisJCQkJcmV0dXJuIChlcnJubyA9PSAwKSA/IDAgOiAtMTsKKwkJCX0KKwkJCW5saCA9IE5MTVNHX05FWFQobmxoLCBsZW4pOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gLTE7IC8qIG5ldmVyIGhlcmUgKi8KK30KKworc3RhdGljIGludAorbmZsb2dfc2VuZF9jb25maWdfbXNnKGNvbnN0IHBjYXBfdCAqaGFuZGxlLCB1X2ludDhfdCBmYW1pbHksIHVfaW50MTZfdCBncm91cF9pZCwgY29uc3Qgc3RydWN0IG15X25mYXR0ciAqbXluZmEpCit7CisJcmV0dXJuIG5ldGZpbHRlcl9zZW5kX2NvbmZpZ19tc2coaGFuZGxlLCAoTkZOTF9TVUJTWVNfVUxPRyA8PCA4KSB8IE5GVUxOTF9NU0dfQ09ORklHLCAxLCBmYW1pbHksIGdyb3VwX2lkLCBteW5mYSk7Cit9CisKK3N0YXRpYyBpbnQKK25mbG9nX3NlbmRfY29uZmlnX2NtZChjb25zdCBwY2FwX3QgKmhhbmRsZSwgdV9pbnQxNl90IGdyb3VwX2lkLCB1X2ludDhfdCBjbWQsIHVfaW50OF90IGZhbWlseSkKK3sKKwlzdHJ1Y3QgbmZ1bG5sX21zZ19jb25maWdfY21kIG1zZzsKKwlzdHJ1Y3QgbXlfbmZhdHRyIG5mYTsKKworCW1zZy5jb21tYW5kID0gY21kOworCisJbmZhLmRhdGEgPSAmbXNnOworCW5mYS5uZmFfdHlwZSA9IE5GVUxBX0NGR19DTUQ7CisJbmZhLm5mYV9sZW4gPSBzaXplb2YobXNnKTsKKworCXJldHVybiBuZmxvZ19zZW5kX2NvbmZpZ19tc2coaGFuZGxlLCBmYW1pbHksIGdyb3VwX2lkLCAmbmZhKTsKK30KKworc3RhdGljIGludCAKK25mbG9nX3NlbmRfY29uZmlnX21vZGUoY29uc3QgcGNhcF90ICpoYW5kbGUsIHVfaW50MTZfdCBncm91cF9pZCwgdV9pbnQ4X3QgY29weV9tb2RlLCB1X2ludDMyX3QgY29weV9yYW5nZSkKK3sKKwlzdHJ1Y3QgbmZ1bG5sX21zZ19jb25maWdfbW9kZSBtc2c7CisJc3RydWN0IG15X25mYXR0ciBuZmE7CisKKwltc2cuY29weV9yYW5nZSA9IGh0b25sKGNvcHlfcmFuZ2UpOworCW1zZy5jb3B5X21vZGUgPSBjb3B5X21vZGU7CisKKwluZmEuZGF0YSA9ICZtc2c7CisJbmZhLm5mYV90eXBlID0gTkZVTEFfQ0ZHX01PREU7CisJbmZhLm5mYV9sZW4gPSBzaXplb2YobXNnKTsKKworCXJldHVybiBuZmxvZ19zZW5kX2NvbmZpZ19tc2coaGFuZGxlLCBBRl9VTlNQRUMsIGdyb3VwX2lkLCAmbmZhKTsKK30KKworc3RhdGljIGludAorbmZxdWV1ZV9zZW5kX3ZlcmRpY3QoY29uc3QgcGNhcF90ICpoYW5kbGUsIHVfaW50MTZfdCBncm91cF9pZCwgdV9pbnQzMl90IGlkLCB1X2ludDMyX3QgdmVyZGljdCkKK3sKKwlzdHJ1Y3QgbmZxbmxfbXNnX3ZlcmRpY3RfaGRyIG1zZzsKKwlzdHJ1Y3QgbXlfbmZhdHRyIG5mYTsKKworCW1zZy5pZCA9IGh0b25sKGlkKTsKKwltc2cudmVyZGljdCA9IGh0b25sKHZlcmRpY3QpOworCisJbmZhLmRhdGEgPSAmbXNnOworCW5mYS5uZmFfdHlwZSA9IE5GUUFfVkVSRElDVF9IRFI7CisJbmZhLm5mYV9sZW4gPSBzaXplb2YobXNnKTsKKworCXJldHVybiBuZXRmaWx0ZXJfc2VuZF9jb25maWdfbXNnKGhhbmRsZSwgKE5GTkxfU1VCU1lTX1FVRVVFIDw8IDgpIHwgTkZRTkxfTVNHX1ZFUkRJQ1QsIDAsIEFGX1VOU1BFQywgZ3JvdXBfaWQsICZuZmEpOworfQorCitzdGF0aWMgaW50CituZnF1ZXVlX3NlbmRfY29uZmlnX21zZyhjb25zdCBwY2FwX3QgKmhhbmRsZSwgdV9pbnQ4X3QgZmFtaWx5LCB1X2ludDE2X3QgZ3JvdXBfaWQsIGNvbnN0IHN0cnVjdCBteV9uZmF0dHIgKm15bmZhKQoreworCXJldHVybiBuZXRmaWx0ZXJfc2VuZF9jb25maWdfbXNnKGhhbmRsZSwgKE5GTkxfU1VCU1lTX1FVRVVFIDw8IDgpIHwgTkZRTkxfTVNHX0NPTkZJRywgMSwgZmFtaWx5LCBncm91cF9pZCwgbXluZmEpOworfQorCitzdGF0aWMgaW50CituZnF1ZXVlX3NlbmRfY29uZmlnX2NtZChjb25zdCBwY2FwX3QgKmhhbmRsZSwgdV9pbnQxNl90IGdyb3VwX2lkLCB1X2ludDhfdCBjbWQsIHVfaW50MTZfdCBwZikKK3sKKwlzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19jbWQgbXNnOworCXN0cnVjdCBteV9uZmF0dHIgbmZhOworCisJbXNnLmNvbW1hbmQgPSBjbWQ7CisJbXNnLnBmID0gaHRvbnMocGYpOworCisJbmZhLmRhdGEgPSAmbXNnOworCW5mYS5uZmFfdHlwZSA9IE5GUUFfQ0ZHX0NNRDsKKwluZmEubmZhX2xlbiA9IHNpemVvZihtc2cpOworCisJcmV0dXJuIG5mcXVldWVfc2VuZF9jb25maWdfbXNnKGhhbmRsZSwgQUZfVU5TUEVDLCBncm91cF9pZCwgJm5mYSk7Cit9CisKK3N0YXRpYyBpbnQgCituZnF1ZXVlX3NlbmRfY29uZmlnX21vZGUoY29uc3QgcGNhcF90ICpoYW5kbGUsIHVfaW50MTZfdCBncm91cF9pZCwgdV9pbnQ4X3QgY29weV9tb2RlLCB1X2ludDMyX3QgY29weV9yYW5nZSkKK3sKKwlzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19wYXJhbXMgbXNnOworCXN0cnVjdCBteV9uZmF0dHIgbmZhOworCisJbXNnLmNvcHlfcmFuZ2UgPSBodG9ubChjb3B5X3JhbmdlKTsKKwltc2cuY29weV9tb2RlID0gY29weV9tb2RlOworCisJbmZhLmRhdGEgPSAmbXNnOworCW5mYS5uZmFfdHlwZSA9IE5GUUFfQ0ZHX1BBUkFNUzsKKwluZmEubmZhX2xlbiA9IHNpemVvZihtc2cpOworCisJcmV0dXJuIG5mcXVldWVfc2VuZF9jb25maWdfbXNnKGhhbmRsZSwgQUZfVU5TUEVDLCBncm91cF9pZCwgJm5mYSk7Cit9CisKK3N0YXRpYyBpbnQKK25ldGZpbHRlcl9hY3RpdmF0ZShwY2FwX3QqIGhhbmRsZSkKK3sKKwljb25zdCBjaGFyICpkZXYgPSBoYW5kbGUtPm9wdC5zb3VyY2U7CisJdW5zaWduZWQgc2hvcnQgZ3JvdXBzWzMyXTsKKwlpbnQgZ3JvdXBfY291bnQgPSAwOworCW5mdHlwZV90IHR5cGUgPSBPVEhFUjsKKwlpbnQgaTsKKworIAlpZiAoc3RybmNtcChkZXYsIE5GTE9HX0lGQUNFLCBzdHJsZW4oTkZMT0dfSUZBQ0UpKSA9PSAwKSB7CisgCQlkZXYgKz0gc3RybGVuKE5GTE9HX0lGQUNFKTsKKwkJdHlwZSA9IE5GTE9HOworCisJfSBlbHNlIGlmIChzdHJuY21wKGRldiwgTkZRVUVVRV9JRkFDRSwgc3RybGVuKE5GUVVFVUVfSUZBQ0UpKSA9PSAwKSB7CisJCWRldiArPSBzdHJsZW4oTkZRVUVVRV9JRkFDRSk7CisJCXR5cGUgPSBORlFVRVVFOworCX0KKyAKKwlpZiAodHlwZSAhPSBPVEhFUiAmJiAqZGV2ID09ICc6JykgeworCQlkZXYrKzsKKwkJd2hpbGUgKCpkZXYpIHsKKwkJCWxvbmcgaW50IGdyb3VwX2lkOworCQkJY2hhciAqZW5kX2RldjsKKworCQkJaWYgKGdyb3VwX2NvdW50ID09IDMyKSB7CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkiTWF4aW11bSAzMiBuZXRmaWx0ZXIgZ3JvdXBzISBkZXY6ICVzIiwgCisJCQkJCQloYW5kbGUtPm9wdC5zb3VyY2UpOworCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJfQorCisJCQlncm91cF9pZCA9IHN0cnRvbChkZXYsICZlbmRfZGV2LCAwKTsKKwkJCWlmIChlbmRfZGV2ICE9IGRldikgeworCQkJCWlmIChncm91cF9pZCA8IDAgfHwgZ3JvdXBfaWQgPiA2NTUzNSkgeworCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJCQkiTmV0ZmlsdGVyIGdyb3VwIHJhbmdlIGZyb20gMCB0byA2NTUzNSAoZ290ICVsZCkiLAorCQkJCQkJCWdyb3VwX2lkKTsKKwkJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQkJfQorCisJCQkJZ3JvdXBzW2dyb3VwX2NvdW50KytdID0gKHVuc2lnbmVkIHNob3J0KSBncm91cF9pZDsKKwkJCQlkZXYgPSBlbmRfZGV2OworCQkJfQorCQkJaWYgKCpkZXYgIT0gJywnKQorCQkJCWJyZWFrOworCQkJZGV2Kys7CisJCX0KKwl9CisKKwlpZiAodHlwZSA9PSBPVEhFUiB8fCAqZGV2KSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJDYW4ndCBnZXQgbmV0ZmlsdGVyIGdyb3VwKHMpIGluZGV4IGZyb20gJXMiLCAKKwkJCQloYW5kbGUtPm9wdC5zb3VyY2UpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwkvKiBpZiBubyBncm91cHMsIGFkZCBkZWZhdWx0OiAwICovCisJaWYgKCFncm91cF9jb3VudCkgeworCQlncm91cHNbMF0gPSAwOworCQlncm91cF9jb3VudCA9IDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzb21lIGNvbXBvbmVudHMgb2YgdGhlIHBjYXAgc3RydWN0dXJlLiAqLworCWhhbmRsZS0+YnVmc2l6ZSA9IDEyOCArIGhhbmRsZS0+c25hcHNob3Q7CisJaGFuZGxlLT5vZmZzZXQgPSAwOworCWhhbmRsZS0+cmVhZF9vcCA9IG5ldGZpbHRlcl9yZWFkX2xpbnV4OworCWhhbmRsZS0+aW5qZWN0X29wID0gbmV0ZmlsdGVyX2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07IC8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IE5VTEw7CisJaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBuZXRmaWx0ZXJfc2V0X2RhdGFsaW5rOworCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+c3RhdHNfb3AgPSBuZXRmaWx0ZXJfc3RhdHNfbGludXg7CisKKwkvKiBDcmVhdGUgbmV0bGluayBzb2NrZXQgKi8KKwloYW5kbGUtPmZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX05FVEZJTFRFUik7CisJaWYgKGhhbmRsZS0+ZmQgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQgJWQ6JXMiLCBlcnJubywgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwlpZiAodHlwZSA9PSBORkxPRykgeworCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX05GTE9HOworCQloYW5kbGUtPmRsdF9saXN0ID0gKHVfaW50ICopIG1hbGxvYyhzaXplb2YodV9pbnQpICogMik7CisJCWlmIChoYW5kbGUtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJCWhhbmRsZS0+ZGx0X2xpc3RbMF0gPSBETFRfTkZMT0c7CisJCQloYW5kbGUtPmRsdF9saXN0WzFdID0gRExUX0lQVjQ7CisJCQloYW5kbGUtPmRsdF9jb3VudCA9IDI7CisJCX0KKworCX0gZWxzZQorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lQVjQ7CisKKwloYW5kbGUtPmJ1ZmZlciA9IG1hbGxvYyhoYW5kbGUtPmJ1ZnNpemUpOworCWlmICghaGFuZGxlLT5idWZmZXIpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBkdW1wIGJ1ZmZlcjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gY2xvc2VfZmFpbDsKKwl9CisKKwlpZiAodHlwZSA9PSBORkxPRykgeworCQlpZiAobmZsb2dfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgMCwgTkZVTE5MX0NGR19DTURfUEZfVU5CSU5ELCBBRl9JTkVUKSA8IDApIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZVTE5MX0NGR19DTURfUEZfVU5CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gY2xvc2VfZmFpbDsKKwkJfQorCisJCWlmIChuZmxvZ19zZW5kX2NvbmZpZ19jbWQoaGFuZGxlLCAwLCBORlVMTkxfQ0ZHX0NNRF9QRl9CSU5ELCBBRl9JTkVUKSA8IDApIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZVTE5MX0NGR19DTURfUEZfQklORDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGNsb3NlX2ZhaWw7CisJCX0KKworCQkvKiBCaW5kIHNvY2tldCB0byB0aGUgbmZsb2cgZ3JvdXBzICovCisJCWZvciAoaSA9IDA7IGkgPCBncm91cF9jb3VudDsgaSsrKSB7CisJCQlpZiAobmZsb2dfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgZ3JvdXBzW2ldLCBORlVMTkxfQ0ZHX0NNRF9CSU5ELCBBRl9VTlNQRUMpIDwgMCkgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgbGlzdGVuIG9uIGdyb3VwIGdyb3VwIGluZGV4OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlnb3RvIGNsb3NlX2ZhaWw7CisJCQl9CisKKwkJCWlmIChuZmxvZ19zZW5kX2NvbmZpZ19tb2RlKGhhbmRsZSwgZ3JvdXBzW2ldLCBORlVMTkxfQ09QWV9QQUNLRVQsIGhhbmRsZS0+c25hcHNob3QpIDwgMCkgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZVTE5MX0NPUFlfUEFDS0VUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlnb3RvIGNsb3NlX2ZhaWw7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCWlmIChuZnF1ZXVlX3NlbmRfY29uZmlnX2NtZChoYW5kbGUsIDAsIE5GUU5MX0NGR19DTURfUEZfVU5CSU5ELCBBRl9JTkVUKSA8IDApIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZRTkxfQ0ZHX0NNRF9QRl9VTkJJTkQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBjbG9zZV9mYWlsOworCQl9CisKKwkJaWYgKG5mcXVldWVfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgMCwgTkZRTkxfQ0ZHX0NNRF9QRl9CSU5ELCBBRl9JTkVUKSA8IDApIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZRTkxfQ0ZHX0NNRF9QRl9CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gY2xvc2VfZmFpbDsKKwkJfQorCisJCS8qIEJpbmQgc29ja2V0IHRvIHRoZSBuZnF1ZXVlIGdyb3VwcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBfY291bnQ7IGkrKykgeworCQkJaWYgKG5mcXVldWVfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgZ3JvdXBzW2ldLCBORlFOTF9DRkdfQ01EX0JJTkQsIEFGX1VOU1BFQykgPCAwKSB7CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBsaXN0ZW4gb24gZ3JvdXAgZ3JvdXAgaW5kZXg6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCWdvdG8gY2xvc2VfZmFpbDsKKwkJCX0KKworCQkJaWYgKG5mcXVldWVfc2VuZF9jb25maWdfbW9kZShoYW5kbGUsIGdyb3Vwc1tpXSwgTkZRTkxfQ09QWV9QQUNLRVQsIGhhbmRsZS0+c25hcHNob3QpIDwgMCkgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZRTkxfQ09QWV9QQUNLRVQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCWdvdG8gY2xvc2VfZmFpbDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChoYW5kbGUtPm9wdC5yZm1vbikgeworCQkvKgorCQkgKiBNb25pdG9yIG1vZGUgZG9lc24ndCBhcHBseSB0byBuZXRmaWx0ZXIgZGV2aWNlcy4KKwkJICovCisJCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihoYW5kbGUpOworCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJfQorCisJaWYgKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplICE9IDApIHsKKwkJLyoKKwkJICogU2V0IHRoZSBzb2NrZXQgYnVmZmVyIHNpemUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKwkJICovCisJCWlmIChzZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJmhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplLCBzaXplb2YoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUpKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTT19SQ1ZCVUY6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBjbG9zZV9mYWlsOworCQl9CisJfQorCisJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwlyZXR1cm4gMDsKKworY2xvc2VfZmFpbDoKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwlyZXR1cm4gUENBUF9FUlJPUjsKK30KKworcGNhcF90ICoKK25ldGZpbHRlcl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpCit7CisJY29uc3QgY2hhciAqY3A7CisJcGNhcF90ICpwOworCisJLyogRG9lcyB0aGlzIGxvb2sgbGlrZSBhbiBuZXRmaWx0ZXIgZGV2aWNlPyAqLworCWNwID0gc3RycmNocihkZXZpY2UsICcvJyk7CisJaWYgKGNwID09IE5VTEwpCisJCWNwID0gZGV2aWNlOworCisJLyogRG9lcyBpdCBiZWdpbiB3aXRoIE5GTE9HX0lGQUNFIG9yIE5GUVVFVUVfSUZBQ0U/ICovCisJaWYgKHN0cm5jbXAoY3AsIE5GTE9HX0lGQUNFLCBzaXplb2YgTkZMT0dfSUZBQ0UgLSAxKSA9PSAwKQorCQljcCArPSBzaXplb2YgTkZMT0dfSUZBQ0UgLSAxOworCWVsc2UgaWYgKHN0cm5jbXAoY3AsIE5GUVVFVUVfSUZBQ0UsIHNpemVvZiBORlFVRVVFX0lGQUNFIC0gMSkgPT0gMCkgCisJCWNwICs9IHNpemVvZiBORlFVRVVFX0lGQUNFIC0gMTsKKwllbHNlIHsKKwkJLyogTm9wZSwgZG9lc24ndCBiZWdpbiB3aXRoIE5GTE9HX0lGQUNFIG5vciBORlFVRVVFX0lGQUNFICovCisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBZZXMgLSBpcyB0aGF0IGVpdGhlciB0aGUgZW5kIG9mIHRoZSBuYW1lLCBvciBpcyBpdCBmb2xsb3dlZAorCSAqIGJ5IGEgY29sb24/CisJICovCisJaWYgKCpjcCAhPSAnOicgJiYgKmNwICE9ICdcMCcpIHsKKwkJLyogTm9wZSAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9LLCBpdCdzIHByb2JhYmx5IG91cnMuICovCisJKmlzX291cnMgPSAxOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfbmV0ZmlsdGVyKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gbmV0ZmlsdGVyX2FjdGl2YXRlOworCXJldHVybiAocCk7Cit9CisKK2ludCAKK25ldGZpbHRlcl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyX3N0cikKK3sKKwlpbnQgc29jazsKKwkKKwlzb2NrID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX05FVEZJTFRFUik7CisJaWYgKHNvY2sgPCAwKSB7CisJCS8qIGlmIG5ldGxpbmsgaXMgbm90IHN1cHBvcnRlZCB0aGlzIGlzIG5vdCBmYXRhbCAqLworCQlpZiAoZXJybm8gPT0gRUFGTk9TVVBQT1JUIHx8IGVycm5vID09IEVQUk9UT05PU1VQUE9SVCkKKwkJCXJldHVybiAwOworCQlzbnByaW50ZihlcnJfc3RyLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3Qgb3BlbiBuZXRsaW5rIHNvY2tldCAlZDolcyIsCisJCQllcnJubywgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKHNvY2spOworCisJaWYgKHBjYXBfYWRkX2lmKGFsbGRldnNwLCBORkxPR19JRkFDRSwgMCwgIkxpbnV4IG5ldGZpbHRlciBsb2cgKE5GTE9HKSBpbnRlcmZhY2UiLCBlcnJfc3RyKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAocGNhcF9hZGRfaWYoYWxsZGV2c3AsIE5GUVVFVUVfSUZBQ0UsIDAsICJMaW51eCBuZXRmaWx0ZXIgcXVldWUgKE5GUVVFVUUpIGludGVyZmFjZSIsIGVycl9zdHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcGNhcC1uZXRmaWx0ZXItbGludXguaCBiL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyYTQwMgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKYWt1YiBaYXdhZHpraQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIG5ldGxpbmstcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworaW50IG5ldGZpbHRlcl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyX3N0cik7CitwY2FwX3QgKm5ldGZpbHRlcl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpOwpkaWZmIC0tZ2l0IGEvcGNhcC1uaXQuYyBiL3BjYXAtbml0LmMKaW5kZXggOTRjNDUyOC4uNDBlNjQwYyAxMDA2NDQKLS0tIGEvcGNhcC1uaXQuYworKysgYi9wY2FwLW5pdC5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbml0LmMsdiAxLjU3LjIuMSAyMDA1LzA1LzAzIDE4OjU0OjM3IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1uaXQuYyx2IDEuNjIgMjAwOC0wNC0xNCAyMDo0MDo1OCBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC03MSw5ICs3MSwxNyBAQAogLyogRm9yd2FyZHMgKi8KIHN0YXRpYyBpbnQgbml0X3NldGZsYWdzKGludCwgaW50LCBpbnQsIGNoYXIgKik7CiAKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBOSVQgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfbml0IHsKKwlzdHJ1Y3QgcGNhcF9zdGF0IHN0YXQ7Cit9OworCiBzdGF0aWMgaW50CiBwY2FwX3N0YXRzX25pdChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQogeworCXN0cnVjdCBwY2FwX25pdCAqcG4gPSBwLT5wcml2OwogCiAJLyoKIAkgKiAicHNfcmVjdiIgY291bnRzIHBhY2tldHMgaGFuZGVkIHRvIHRoZSBmaWx0ZXIsIG5vdCBwYWNrZXRzCkBAIC05MSwxNSArOTksMTUgQEAKIAkgKiBrZXJuZWwgYnkgbGlicGNhcCBvciBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tIGxpYnBjYXAgYnkgdGhlCiAJICogYXBwbGljYXRpb24uCiAJICovCi0JKnBzID0gcC0+bWQuc3RhdDsKKwkqcHMgPSBwbi0+c3RhdDsKIAlyZXR1cm4gKDApOwogfQogCiBzdGF0aWMgaW50CiBwY2FwX3JlYWRfbml0KHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCiB7CisJc3RydWN0IHBjYXBfbml0ICpwbiA9IHAtPnByaXY7CiAJcmVnaXN0ZXIgaW50IGNjLCBuOwotCXJlZ2lzdGVyIHN0cnVjdCBicGZfaW5zbiAqZmNvZGUgPSBwLT5mY29kZS5iZl9pbnNuczsKIAlyZWdpc3RlciB1X2NoYXIgKmJwLCAqY3AsICplcDsKIAlyZWdpc3RlciBzdHJ1Y3Qgbml0X2hkciAqbmg7CiAJcmVnaXN0ZXIgaW50IGNhcGxlbjsKQEAgLTE1Nyw3ICsxNjUsNyBAQAogCQljYXNlIE5JVF9OT01CVUY6CiAJCWNhc2UgTklUX05PQ0xVU1RFUjoKIAkJY2FzZSBOSVRfTk9TUEFDRToKLQkJCXAtPm1kLnN0YXQucHNfZHJvcCA9IG5oLT5uaF9kcm9wcGVkOworCQkJcG4tPnN0YXQucHNfZHJvcCA9IG5oLT5uaF9kcm9wcGVkOwogCQkJY29udGludWU7CiAKIAkJY2FzZSBOSVRfU0VRTk86CkBAIC0xNjgsMjAgKzE3NiwyMCBAQAogCQkJICAgICJiYWQgbml0IHN0YXRlICVkIiwgbmgtPm5oX3N0YXRlKTsKIAkJCXJldHVybiAoLTEpOwogCQl9Ci0JCSsrcC0+bWQuc3RhdC5wc19yZWN2OworCQkrK3BuLT5zdGF0LnBzX3JlY3Y7CiAJCWJwICs9ICgoc2l6ZW9mKHN0cnVjdCBuaXRfaGRyKSArIG5oLT5uaF9kYXRhbGVuICsKIAkJICAgIHNpemVvZihpbnQpIC0gMSkgJiB+KHNpemVvZihpbnQpIC0gMSkpOwogCiAJCWNhcGxlbiA9IG5oLT5uaF93aXJlbGVuOwogCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCiAJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKLQkJaWYgKGJwZl9maWx0ZXIoZmNvZGUsIGNwLCBuaC0+bmhfd2lyZWxlbiwgY2FwbGVuKSkgeworCQlpZiAoYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgY3AsIG5oLT5uaF93aXJlbGVuLCBjYXBsZW4pKSB7CiAJCQlzdHJ1Y3QgcGNhcF9wa3RoZHIgaDsKIAkJCWgudHMgPSBuaC0+bmhfdGltZXN0YW1wOwogCQkJaC5sZW4gPSBuaC0+bmhfd2lyZWxlbjsKIAkJCWguY2FwbGVuID0gY2FwbGVuOwogCQkJKCpjYWxsYmFjaykodXNlciwgJmgsIGNwKTsKLQkJCWlmICgrK24gPj0gY250ICYmIGNudCA+PSAwKSB7CisJCQlpZiAoKytuID49IGNudCAmJiAhUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChjbnQpKSB7CiAJCQkJcC0+Y2MgPSBlcCAtIGJwOwogCQkJCXAtPmJwID0gYnA7CiAJCQkJcmV0dXJuIChuKTsKQEAgLTIxMCw3OSArMjE4LDg2IEBACiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIHN0YXRpYyBpbnQKLW5pdF9zZXRmbGFncyhpbnQgZmQsIGludCBwcm9taXNjLCBpbnQgdG9fbXMsIGNoYXIgKmVidWYpCituaXRfc2V0ZmxhZ3MocGNhcF90ICpwKQogewogCXN0cnVjdCBuaXRfaW9jIG5pb2M7CiAKIAltZW1zZXQoJm5pb2MsIDAsIHNpemVvZihuaW9jKSk7Ci0JbmlvYy5uaW9jX2J1ZnNwYWNlID0gQlVGU1BBQ0U7Ci0JbmlvYy5uaW9jX2NodW5rc2l6ZSA9IENIVU5LU0laRTsKIAluaW9jLm5pb2NfdHlwZXRvbWF0Y2ggPSBOVF9BTExUWVBFUzsKIAluaW9jLm5pb2Nfc25hcGxlbiA9IHAtPnNuYXBzaG90OwogCW5pb2MubmlvY19idWZhbGlnbiA9IHNpemVvZihpbnQpOwogCW5pb2MubmlvY19idWZvZmZzZXQgPSAwOwogCi0JaWYgKHRvX21zICE9IDApIHsKLQkJbmlvYy5uaW9jX2ZsYWdzIHw9IE5GX1RJTUVPVVQ7Ci0JCW5pb2MubmlvY190aW1lb3V0LnR2X3NlYyA9IHRvX21zIC8gMTAwMDsKLQkJbmlvYy5uaW9jX3RpbWVvdXQudHZfdXNlYyA9ICh0b19tcyAqIDEwMDApICUgMTAwMDAwMDsKKwlpZiAocC0+b3B0LmJ1ZmZlcl9zaXplICE9IDApCisJCW5pb2MubmlvY19idWZzcGFjZSA9IHAtPm9wdC5idWZmZXJfc2l6ZTsKKwllbHNlIHsKKwkJLyogRGVmYXVsdCBidWZmZXIgc2l6ZSAqLworCQluaW9jLm5pb2NfYnVmc3BhY2UgPSBCVUZTUEFDRTsKIAl9Ci0JaWYgKHByb21pc2MpCisKKwlpZiAocC0+b3B0LmltbWVkaWF0ZSkgeworCQkvKgorCQkgKiBYWFggLSB3aWxsIHRoaXMgY2F1c2UgcGFja2V0cyB0byBiZSBkZWxpdmVyZWQgaW1tZWRpYXRlbHk/CisJCSAqIFhYWCAtIGdpdmVuIHRoYXQgdGhpcyBpcyBmb3IgU3VuT1MgcHJpb3IgdG8gNC4wLCBkbworCQkgKiB3ZSBjYXJlPworCQkgKi8KKwkJbmlvYy5uaW9jX2NodW5rc2l6ZSA9IDA7CisJfSBlbHNlCisJCW5pb2MubmlvY19jaHVua3NpemUgPSBDSFVOS1NJWkU7CisJaWYgKHAtPm9wdC50aW1lb3V0ICE9IDApIHsKKwkJbmlvYy5uaW9jX2ZsYWdzIHw9IE5GX1RJTUVPVVQ7CisJCW5pb2MubmlvY190aW1lb3V0LnR2X3NlYyA9IHAtPm9wdC50aW1lb3V0IC8gMTAwMDsKKwkJbmlvYy5uaW9jX3RpbWVvdXQudHZfdXNlYyA9IChwLT5vcHQudGltZW91dCAqIDEwMDApICUgMTAwMDAwMDsKKwl9CisJaWYgKHAtPm9wdC5wcm9taXNjKQogCQluaW9jLm5pb2NfZmxhZ3MgfD0gTkZfUFJPTUlTQzsKIAotCWlmIChpb2N0bChmZCwgU0lPQ1NOSVQsICZuaW9jKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NTTklUOiAlcyIsCisJaWYgKGlvY3RsKHAtPmZkLCBTSU9DU05JVCwgJm5pb2MpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DU05JVDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAJcmV0dXJuICgwKTsKIH0KIAotc3RhdGljIHZvaWQKLXBjYXBfY2xvc2Vfbml0KHBjYXBfdCAqcCkKLXsKLQlwY2FwX2Nsb3NlX2NvbW1vbihwKTsKLQlpZiAocC0+ZGV2aWNlICE9IE5VTEwpCi0JCWZyZWUocC0+ZGV2aWNlKTsKLX0KLQotcGNhcF90ICoKLXBjYXBfb3Blbl9saXZlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHNuYXBsZW4sIGludCBwcm9taXNjLCBpbnQgdG9fbXMsCi0gICAgY2hhciAqZWJ1ZikKK3N0YXRpYyBpbnQKK3BjYXBfYWN0aXZhdGVfbml0KHBjYXBfdCAqcCkKIHsKIAlpbnQgZmQ7CiAJc3RydWN0IHNvY2thZGRyX25pdCBzbml0OwotCXJlZ2lzdGVyIHBjYXBfdCAqcDsKIAotCXAgPSAocGNhcF90ICopbWFsbG9jKHNpemVvZigqcCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJc3RybGNweShlYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7Ci0JCXJldHVybiAoTlVMTCk7CisJaWYgKHAtPm9wdC5yZm1vbikgeworCQkvKgorCQkgKiBObyBtb25pdG9yIG1vZGUgb24gU3VuT1MgMy54IG9yIGVhcmxpZXIgKG5vCisJCSAqIFdpLUZpICpkZXZpY2VzKiBmb3IgdGhlIGhhcmR3YXJlIHRoYXQgc3VwcG9ydGVkCisJCSAqIHRoZW0hKS4KKwkJICovCisJCXJldHVybiAoUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApOwogCX0KIAotCWlmIChzbmFwbGVuIDwgOTYpCisJaWYgKHAtPnNuYXBzaG90IDwgOTYpCiAJCS8qCiAJCSAqIE5JVCByZXF1aXJlcyBhIHNuYXBzaG90IGxlbmd0aCBvZiBhdCBsZWFzdCA5Ni4KIAkJICovCi0JCXNuYXBsZW4gPSA5NjsKKwkJcC0+c25hcHNob3QgPSA5NjsKIAogCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAlwLT5mZCA9IGZkID0gc29ja2V0KEFGX05JVCwgU09DS19SQVcsIE5JVFBST1RPX1JBVyk7CiAJaWYgKGZkIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCXNuaXQuc25pdF9mYW1pbHkgPSBBRl9OSVQ7Ci0JKHZvaWQpc3RybmNweShzbml0LnNuaXRfaWZuYW1lLCBkZXZpY2UsIE5JVElGU0laKTsKKwkodm9pZClzdHJuY3B5KHNuaXQuc25pdF9pZm5hbWUsIHAtPm9wdC5zb3VyY2UsIE5JVElGU0laKTsKIAogCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNuaXQsIHNpemVvZihzbml0KSkpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImJpbmQ6ICVzOiAlcyIsIHNuaXQuc25pdF9pZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQotCXAtPnNuYXBzaG90ID0gc25hcGxlbjsKLQluaXRfc2V0ZmxhZ3MocC0+ZmQsIHByb21pc2MsIHRvX21zLCBlYnVmKTsKKwlpZiAobml0X3NldGZsYWdzKHApIDwgMCkKKwkJZ290byBiYWQ7CiAKIAkvKgogCSAqIE5JVCBzdXBwb3J0cyBvbmx5IGV0aGVybmV0cy4KQEAgLTI5MiwxNyArMzA3LDcgQEAKIAlwLT5idWZzaXplID0gQlVGU1BBQ0U7CiAJcC0+YnVmZmVyID0gKHVfY2hhciAqKW1hbGxvYyhwLT5idWZzaXplKTsKIAlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKLQkJc3RybGNweShlYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7Ci0JCWdvdG8gYmFkOwotCX0KLQotCS8qCi0JICogV2UgbmVlZCB0aGUgZGV2aWNlIG5hbWUgaW4gb3JkZXIgdG8gc2VuZCBwYWNrZXRzLgotCSAqLwotCXAtPmRldmljZSA9IHN0cmR1cChkZXZpY2UpOwotCWlmIChwLT5kZXZpY2UgPT0gTlVMTCkgewotCQlzdHJsY3B5KGVidWYsIHBjYXBfc3RyZXJyb3IoZXJybm8pLCBQQ0FQX0VSUkJVRl9TSVpFKTsKLQkJZnJlZShwLT5idWZmZXIpOworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTMzOSwxNCArMzQ0LDI0IEBACiAJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwogCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfbml0OwotCXAtPmNsb3NlX29wID0gcGNhcF9jbG9zZV9uaXQ7CiAKLQlyZXR1cm4gKHApOworCXJldHVybiAoMCk7CiAgYmFkOgotCWlmIChmZCA+PSAwKQotCQljbG9zZShmZCk7Ci0JZnJlZShwKTsKLQlyZXR1cm4gKE5VTEwpOworCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sKKwlwY2FwX3QgKnA7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uaXQpKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX25pdDsKKwlyZXR1cm4gKHApOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL3BjYXAtbml0LmggYi9wY2FwLW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmY1ZmM0Li4wMDAwMDAwCi0tLSBhL3BjYXAtbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTk0Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQotICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLSAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKLSAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKLSAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnksCi0gKiBCZXJrZWxleSwgQ0EuICBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8KLSAqIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbml0LmgsdiAxLjIuMS4xIDE5OTkvMTAvMDcgMjM6NDY6NDAgbWNyIEV4cCAkIChMQkwpCi0gKi8KZGlmZiAtLWdpdCBhL3BjYXAtbnVsbC5jIGIvcGNhcC1udWxsLmMKaW5kZXggMDZlM2FiMy4uNjczNzM4NiAxMDA2NDQKLS0tIGEvcGNhcC1udWxsLmMKKysrIGIvcGNhcC1udWxsLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqLwogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1udWxsLmMsdiAxLjIxIDIwMDMvMTEvMTUgMjM6MjQ6MDMgZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLW51bGwuYyx2IDEuMjIgMjAwOC0wNC0wNCAxOTozNzo0NSBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC00MCw4ICs0MCw3IEBACiBzdGF0aWMgY2hhciBub3N1cFtdID0gImxpdmUgcGFja2V0IGNhcHR1cmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSI7CiAKIHBjYXBfdCAqCi1wY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICpkZXZpY2UsIGludCBzbmFwbGVuLCBpbnQgcHJvbWlzYywgaW50IHRvX21zLAotICAgIGNoYXIgKmVidWYpCitwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQogewogCSh2b2lkKXN0cmxjcHkoZWJ1Ziwgbm9zdXAsIFBDQVBfRVJSQlVGX1NJWkUpOwogCXJldHVybiAoTlVMTCk7CmRpZmYgLS1naXQgYS9wY2FwLXBmLmMgYi9wY2FwLXBmLmMKaW5kZXggZTczMzU0MC4uOGRlNmU1OCAxMDA2NDQKLS0tIGEvcGNhcC1wZi5jCisrKyBiL3BjYXAtcGYuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXBmLmMsdiAxLjkxLjIuMiAyMDA1LzA1LzAzIDE4OjU0OjM3IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1wZi5jLHYgMS45NyAyMDA4LTA0LTE0IDIwOjQwOjU4IGd1eSBFeHAgJCAoTEJMKSI7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKQEAgLTYyLDcgKzYyLDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogLyoKLSAqIE1ha2UgInBjYXAuaCIgbm90IGluY2x1ZGUgInBjYXAtYnBmLmgiOyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZSB0aGUKKyAqIE1ha2UgInBjYXAuaCIgbm90IGluY2x1ZGUgInBjYXAvYnBmLmgiOyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZSB0aGUKICAqIG5hdGl2ZSBPUyB2ZXJzaW9uLCBhcyB3ZSBuZWVkIHZhcmlvdXMgQlBGIGlvY3RscyBmcm9tIGl0LgogICovCiAjZGVmaW5lIFBDQVBfRE9OVF9JTkNMVURFX1BDQVBfQlBGX0gKQEAgLTc0LDYgKzc0LDI0IEBACiAjaW5jbHVkZSAib3MtcHJvdG8uaCIKICNlbmRpZgogCisvKgorICogRkRESSBwYWNrZXRzIGFyZSBwYWRkZWQgdG8gbWFrZSBldmVyeXRoaW5nIGxpbmUgdXAgb24gYSBuaWNlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lICAgICAgIFBDQVBfRkRESVBBRCAzCisKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBVbHRyaXggYW5kIERFQyBPU0YvMV5XRGlnaXRhbCBVTklYXldeVworICogVHJ1NjQgVU5JWCBwYWNrZXRmaWx0ZXIgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfcGYgeworCWludAlmaWx0ZXJpbmdfaW5fa2VybmVsOyAvKiB1c2luZyBrZXJuZWwgZmlsdGVyICovCisJdV9sb25nCVRvdFBrdHM7CS8qIGNhbid0IG9mbG93IGZvciA3OSBocnMgb24gZXRoZXIgKi8KKwl1X2xvbmcJVG90QWNjZXB0ZWQ7CS8qIGNvdW50IGFjY2VwdGVkIGJ5IGZpbHRlciAqLworCXVfbG9uZwlUb3REcm9wczsJLyogY291bnQgb2YgZHJvcHBlZCBwYWNrZXRzICovCisJbG9uZwlUb3RNaXNzZWQ7CS8qIG1pc3NlZCBieSBpL2YgZHVyaW5nIHRoaXMgcnVuICovCisJbG9uZwlPcmlnTWlzc2VkOwkvKiBtaXNzZWQgYnkgaS9mIGJlZm9yZSB0aGlzIHJ1biAqLworfTsKKwogc3RhdGljIGludCBwY2FwX3NldGZpbHRlcl9wZihwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOwogCiAvKgpAQCAtODcsMTggKzEwNSwxNSBAQAogc3RhdGljIGludAogcGNhcF9yZWFkX3BmKHBjYXBfdCAqcGMsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQogeworCXN0cnVjdCBwY2FwX3BmICpwZiA9IHBjLT5wcml2OwogCXJlZ2lzdGVyIHVfY2hhciAqcCwgKmJwOwotCXN0cnVjdCBicGZfaW5zbiAqZmNvZGU7CiAJcmVnaXN0ZXIgaW50IGNjLCBuLCBidWZsZW4sIGluYzsKIAlyZWdpc3RlciBzdHJ1Y3QgZW5zdGFtcCAqc3A7CiAjaWZkZWYgTEJMX0FMSUdOCiAJc3RydWN0IGVuc3RhbXAgc3RhbXA7CiAjZW5kaWYKLSNpZmRlZiBQQ0FQX0ZERElQQUQKIAlyZWdpc3RlciBpbnQgcGFkOwotI2VuZGlmCiAKLQlmY29kZSA9IHBjLT5tZC51c2VfYnBmID8gTlVMTCA6IHBjLT5mY29kZS5iZl9pbnNuczsKICBhZ2FpbjoKIAljYyA9IHBjLT5jYzsKIAlpZiAoY2MgPT0gMCkgewpAQCAtMTI4LDkgKzE0Myw3IEBACiAJICogTG9vcCB0aHJvdWdoIGVhY2ggcGFja2V0LgogCSAqLwogCW4gPSAwOwotI2lmZGVmIFBDQVBfRkRESVBBRAogCXBhZCA9IHBjLT5mZGRpcGFkOwotI2VuZGlmCiAJd2hpbGUgKGNjID4gMCkgewogCQkvKgogCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPwpAQCAtMTc5LDQxICsxOTIsMzQgQEAKIAkJaW5jID0gRU5BTElHTihidWZsZW4gKyBzcC0+ZW5zX3N0YW1wbGVuKTsKIAkJY2MgLT0gaW5jOwogCQlicCArPSBpbmM7Ci0JCXBjLT5tZC5Ub3RQa3RzKys7Ci0JCXBjLT5tZC5Ub3REcm9wcyArPSBzcC0+ZW5zX2Ryb3BwZWQ7Ci0JCXBjLT5tZC5Ub3RNaXNzZWQgPSBzcC0+ZW5zX2lmb3ZlcmZsb3dzOwotCQlpZiAocGMtPm1kLk9yaWdNaXNzZWQgPCAwKQotCQkJcGMtPm1kLk9yaWdNaXNzZWQgPSBwYy0+bWQuVG90TWlzc2VkOworCQlwZi0+VG90UGt0cysrOworCQlwZi0+VG90RHJvcHMgKz0gc3AtPmVuc19kcm9wcGVkOworCQlwZi0+VG90TWlzc2VkID0gc3AtPmVuc19pZm92ZXJmbG93czsKKwkJaWYgKHBmLT5PcmlnTWlzc2VkIDwgMCkKKwkJCXBmLT5PcmlnTWlzc2VkID0gcGYtPlRvdE1pc3NlZDsKIAogCQkvKgogCQkgKiBTaG9ydC1jaXJjdWl0IGV2YWx1YXRpb246IGlmIHVzaW5nIEJQRiBmaWx0ZXIKLQkJICogaW4ga2VybmVsLCBubyBuZWVkIHRvIGRvIGl0IG5vdy4KKwkJICogaW4ga2VybmVsLCBubyBuZWVkIHRvIGRvIGl0IG5vdyAtIHdlIGFscmVhZHkga25vdworCQkgKiB0aGUgcGFja2V0IHBhc3NlZCB0aGUgZmlsdGVyLgogCQkgKgotI2lmZGVmIFBDQVBfRkRESVBBRAogCQkgKiBOb3RlOiB0aGUgZmlsdGVyIGNvZGUgd2FzIGdlbmVyYXRlZCBhc3N1bWluZwogCQkgKiB0aGF0IHBjLT5mZGRpcGFkIHdhcyB0aGUgYW1vdW50IG9mIHBhZGRpbmcKIAkJICogYmVmb3JlIHRoZSBoZWFkZXIsIGFzIHRoYXQncyB3aGF0J3MgcmVxdWlyZWQKIAkJICogaW4gdGhlIGtlcm5lbCwgc28gd2UgcnVuIHRoZSBmaWx0ZXIgYmVmb3JlCiAJCSAqIHNraXBwaW5nIHRoYXQgcGFkZGluZy4KLSNlbmRpZgogCQkgKi8KLQkJaWYgKGZjb2RlID09IE5VTEwgfHwKLQkJICAgIGJwZl9maWx0ZXIoZmNvZGUsIHAsIHNwLT5lbnNfY291bnQsIGJ1ZmxlbikpIHsKKwkJaWYgKHBmLT5maWx0ZXJpbmdfaW5fa2VybmVsIHx8CisJCSAgICBicGZfZmlsdGVyKHBjLT5mY29kZS5iZl9pbnNucywgcCwgc3AtPmVuc19jb3VudCwgYnVmbGVuKSkgewogCQkJc3RydWN0IHBjYXBfcGt0aGRyIGg7Ci0JCQlwYy0+bWQuVG90QWNjZXB0ZWQrKzsKKwkJCXBmLT5Ub3RBY2NlcHRlZCsrOwogCQkJaC50cyA9IHNwLT5lbnNfdHN0YW1wOwotI2lmZGVmIFBDQVBfRkRESVBBRAogCQkJaC5sZW4gPSBzcC0+ZW5zX2NvdW50IC0gcGFkOwotI2Vsc2UKLQkJCWgubGVuID0gc3AtPmVuc19jb3VudDsKLSNlbmRpZgotI2lmZGVmIFBDQVBfRkRESVBBRAogCQkJcCArPSBwYWQ7CiAJCQlidWZsZW4gLT0gcGFkOwotI2VuZGlmCiAJCQloLmNhcGxlbiA9IGJ1ZmxlbjsKIAkJCSgqY2FsbGJhY2spKHVzZXIsICZoLCBwKTsKLQkJCWlmICgrK24gPj0gY250ICYmIGNudCA+IDApIHsKKwkJCWlmICgrK24gPj0gY250ICYmICFQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKGNudCkpIHsKIAkJCQlwYy0+Y2MgPSBjYzsKIAkJCQlwYy0+YnAgPSBicDsKIAkJCQlyZXR1cm4gKG4pOwpAQCAtMjQxLDYgKzI0Nyw3IEBACiBzdGF0aWMgaW50CiBwY2FwX3N0YXRzX3BmKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCiB7CisJc3RydWN0IHBjYXBfcGYgKnBmID0gcC0+cHJpdjsKIAogCS8qCiAJICogSWYgcGFja2V0IGZpbHRlcmluZyBpcyBiZWluZyBkb25lIGluIHRoZSBrZXJuZWw6CkBAIC0yNzgsMzcgKzI4NSwyOSBAQAogCSAqIHRoZSBrZXJuZWwgYnkgbGlicGNhcCwgYnV0IHRoZXkgbWF5IGluY2x1ZGUgcGFja2V0cyBub3QKIAkgKiB5ZXQgcmVhZCBmcm9tIGxpYnBjYXAgYnkgdGhlIGFwcGxpY2F0aW9uLgogCSAqLwotCXBzLT5wc19yZWN2ID0gcC0+bWQuVG90QWNjZXB0ZWQ7Ci0JcHMtPnBzX2Ryb3AgPSBwLT5tZC5Ub3REcm9wczsKLQlwcy0+cHNfaWZkcm9wID0gcC0+bWQuVG90TWlzc2VkIC0gcC0+bWQuT3JpZ01pc3NlZDsKKwlwcy0+cHNfcmVjdiA9IHBmLT5Ub3RBY2NlcHRlZDsKKwlwcy0+cHNfZHJvcCA9IHBmLT5Ub3REcm9wczsKKwlwcy0+cHNfaWZkcm9wID0gcGYtPlRvdE1pc3NlZCAtIHBmLT5PcmlnTWlzc2VkOwogCXJldHVybiAoMCk7CiB9CiAKIC8qCi0gKiBXZSBpbmNsdWRlIHRoZSBPUydzIDxuZXQvYnBmLmg+LCBub3Qgb3VyICJwY2FwLWJwZi5oIiwgc28gd2UgcHJvYmFibHkKKyAqIFdlIGluY2x1ZGUgdGhlIE9TJ3MgPG5ldC9icGYuaD4sIG5vdCBvdXIgInBjYXAvYnBmLmgiLCBzbyB3ZSBwcm9iYWJseQogICogZG9uJ3QgZ2V0IERMVF9ET0NTSVMgZGVmaW5lZC4KICAqLwogI2lmbmRlZiBETFRfRE9DU0lTCiAjZGVmaW5lIERMVF9ET0NTSVMJMTQzCiAjZW5kaWYKIAotcGNhcF90ICoKLXBjYXBfb3Blbl9saXZlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHNuYXBsZW4sIGludCBwcm9taXNjLCBpbnQgdG9fbXMsCi0gICAgY2hhciAqZWJ1ZikKK3N0YXRpYyBpbnQKK3BjYXBfYWN0aXZhdGVfcGYocGNhcF90ICpwKQogewotCXBjYXBfdCAqcDsKKwlzdHJ1Y3QgcGNhcF9wZiAqcGYgPSBwLT5wcml2OwogCXNob3J0IGVubW9kZTsKIAlpbnQgYmFja2xvZyA9IC0xOwkvKiByZXF1ZXN0IHRoZSBtb3N0ICovCiAJc3RydWN0IGVuZmlsdGVyIEZpbHRlcjsKIAlzdHJ1Y3QgZW5kZXZwIGRldnBhcmFtczsKIAotCXAgPSAocGNhcF90ICopbWFsbG9jKHNpemVvZigqcCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJICAgICJwY2FwX29wZW5fbGl2ZTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAkvKgogCSAqIEluaXRpYWxseSB0cnkgYSByZWFkL3dyaXRlIG9wZW4gKHRvIGFsbG93IHRoZSBpbmplY3QKIAkgKiBtZXRob2QgdG8gd29yaykuICBJZiB0aGF0IGZhaWxzIGR1ZSB0byBwZXJtaXNzaW9uCkBAIC0zMjgsMjEgKzMyNywyMyBAQAogCSAqICJjb25zdCBjaGFyICoiIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4gIFRoYXQgYXBwZWFycyB0byBiZQogCSAqIHRoZSBjYXNlLCBhdCBsZWFzdCBvbiBEaWdpdGFsIFVOSVggNC4wLgogCSAqLwotCXAtPmZkID0gcGZvcGVuKGRldmljZSwgT19SRFdSKTsKKwlwLT5mZCA9IHBmb3BlbihwLT5vcHQuc291cmNlLCBPX1JEV1IpOwogCWlmIChwLT5mZCA9PSAtMSAmJiBlcnJubyA9PSBFQUNDRVMpCi0JCXAtPmZkID0gcGZvcGVuKGRldmljZSwgT19SRE9OTFkpOworCQlwLT5mZCA9IHBmb3BlbihwLT5vcHQuc291cmNlLCBPX1JET05MWSk7CiAJaWYgKHAtPmZkIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicGYgb3BlbjogJXM6ICVzXG5cCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInBmIG9wZW46ICVzOiAlc1xuXAogeW91ciBzeXN0ZW0gbWF5IG5vdCBiZSBwcm9wZXJseSBjb25maWd1cmVkOyBzZWUgdGhlIHBhY2tldGZpbHRlcig0KSBtYW4gcGFnZVxuIiwKLQkJCWRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcC0+b3B0LnNvdXJjZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9Ci0JcC0+bWQuT3JpZ01pc3NlZCA9IC0xOwotCWVubW9kZSA9IEVOVFNUQU1QfEVOQkFUQ0h8RU5OT05FWENMOwotCWlmIChwcm9taXNjKQorCXBmLT5PcmlnTWlzc2VkID0gLTE7CisJZW5tb2RlID0gRU5UU1RBTVB8RU5OT05FWENMOworCWlmICghcC0+b3B0LmltbWVkaWF0ZSkKKwkJZW5tb2RlIHw9IEVOQkFUQ0g7CisJaWYgKHAtPm9wdC5wcm9taXNjKQogCQllbm1vZGUgfD0gRU5QUk9NSVNDOwogCWlmIChpb2N0bChwLT5mZCwgRUlPQ01CSVMsIChjYWRkcl90KSZlbm1vZGUpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ01CSVM6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ01CSVM6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMzUzLDEzICszNTQsMTMgQEAKICNlbmRpZgogCS8qIHNldCB0aGUgYmFja2xvZyAqLwogCWlmIChpb2N0bChwLT5mZCwgRUlPQ1NFVFcsIChjYWRkcl90KSZiYWNrbG9nKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NTRVRXOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NTRVRXOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAkvKiBkaXNjb3ZlciBpbnRlcmZhY2UgdHlwZSAqLwogCWlmIChpb2N0bChwLT5mZCwgRUlPQ0RFVlAsIChjYWRkcl90KSZkZXZwYXJhbXMpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ0RFVlA6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ0RFVlA6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtNDQxLDQyICs0NDIsMzkgQEAKIAkJICogZnJhbWluZyIsIHRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvLCBhcyB0aGF0CiAJCSAqIGRvZXNuJ3Qgc3BlY2lmeSBhIHBhcnRpY3VsYXIgdHlwZSBvZiBoZWFkZXIuCiAJCSAqLwotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAidW5rbm93biBkYXRhLWxpbmsgdHlwZSAldSIsCi0JCSAgICBkZXZwYXJhbXMuZW5kX2Rldl90eXBlKTsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgInVua25vd24gZGF0YS1saW5rIHR5cGUgJXUiLCBkZXZwYXJhbXMuZW5kX2Rldl90eXBlKTsKIAkJZ290byBiYWQ7CiAJfQogCS8qIHNldCB0cnVuY2F0aW9uICovCi0jaWZkZWYgUENBUF9GRERJUEFECiAJaWYgKHAtPmxpbmt0eXBlID09IERMVF9GRERJKSB7CiAJCXAtPmZkZGlwYWQgPSBQQ0FQX0ZERElQQUQ7CiAKIAkJLyogcGFja2V0ZmlsdGVyIGluY2x1ZGVzIHRoZSBwYWRkaW5nIGluIHRoZSBzbmFwc2hvdCAqLwotCQlzbmFwbGVuICs9IFBDQVBfRkRESVBBRDsKKwkJcC0+c25hcHNob3QgKz0gUENBUF9GRERJUEFEOwogCX0gZWxzZQogCQlwLT5mZGRpcGFkID0gMDsKLSNlbmRpZgotCWlmIChpb2N0bChwLT5mZCwgRUlPQ1RSVU5DQVRFLCAoY2FkZHJfdCkmc25hcGxlbikgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFSU9DVFJVTkNBVEU6ICVzIiwKKwlpZiAoaW9jdGwocC0+ZmQsIEVJT0NUUlVOQ0FURSwgKGNhZGRyX3QpJnAtPnNuYXBzaG90KSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1RSVU5DQVRFOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KLQlwLT5zbmFwc2hvdCA9IHNuYXBsZW47CiAJLyogYWNjZXB0IGFsbCBwYWNrZXRzICovCiAJbWVtc2V0KCZGaWx0ZXIsIDAsIHNpemVvZihGaWx0ZXIpKTsKIAlGaWx0ZXIuZW5mX1ByaW9yaXR5ID0gMzc7CS8qIGFueXRoaW5nID4gMiAqLwogCUZpbHRlci5lbmZfRmlsdGVyTGVuID0gMDsJLyogbWVhbnMgImFsd2F5cyB0cnVlIiAqLwogCWlmIChpb2N0bChwLT5mZCwgRUlPQ1NFVEYsIChjYWRkcl90KSZGaWx0ZXIpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1NFVEY6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1NFVEY6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCi0JaWYgKHRvX21zICE9IDApIHsKKwlpZiAocC0+b3B0LnRpbWVvdXQgIT0gMCkgewogCQlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OwotCQl0aW1lb3V0LnR2X3NlYyA9IHRvX21zIC8gMTAwMDsKLQkJdGltZW91dC50dl91c2VjID0gKHRvX21zICogMTAwMCkgJSAxMDAwMDAwOworCQl0aW1lb3V0LnR2X3NlYyA9IHAtPm9wdC50aW1lb3V0IC8gMTAwMDsKKwkJdGltZW91dC50dl91c2VjID0gKHAtPm9wdC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOwogCQlpZiAoaW9jdGwocC0+ZmQsIEVJT0NTUlRJTUVPVVQsIChjYWRkcl90KSZ0aW1lb3V0KSA8IDApIHsKLQkJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFSU9DU1JUSU1FT1VUOiAlcyIsCisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFSU9DU1JUSU1FT1VUOiAlcyIsCiAJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJZ290byBiYWQ7CiAJCX0KQEAgLTQ4NSw3ICs0ODMsNyBAQAogCXAtPmJ1ZnNpemUgPSBCVUZTUEFDRTsKIAlwLT5idWZmZXIgPSAodV9jaGFyKiltYWxsb2MocC0+YnVmc2l6ZSArIHAtPm9mZnNldCk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXN0cmxjcHkoZWJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTUwMiwxOSArNTAwLDI0IEBACiAJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwogCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfcGY7Ci0JcC0+Y2xvc2Vfb3AgPSBwY2FwX2Nsb3NlX2NvbW1vbjsKIAotCXJldHVybiAocCk7CisJcmV0dXJuICgwKTsKICBiYWQ6Ci0JaWYgKHAtPmZkID49IDApCi0JCWNsb3NlKHAtPmZkKTsKLQkvKgotCSAqIEdldCByaWQgb2YgYW55IGxpbmstbGF5ZXIgdHlwZSBsaXN0IHdlIGFsbG9jYXRlZC4KLQkgKi8KLQlpZiAocC0+ZGx0X2xpc3QgIT0gTlVMTCkKLQkJZnJlZShwLT5kbHRfbGlzdCk7Ci0JZnJlZShwKTsKLQlyZXR1cm4gKE5VTEwpOworCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sKKwlwY2FwX3QgKnA7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9wZikpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IHBjYXBfYWN0aXZhdGVfcGY7CisJcmV0dXJuIChwKTsKIH0KIAogaW50CkBAIC01MjYsNiArNTI5LDcgQEAKIHN0YXRpYyBpbnQKIHBjYXBfc2V0ZmlsdGVyX3BmKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkKIHsKKwlzdHJ1Y3QgcGNhcF9wZiAqcGYgPSBwLT5wcml2OwogCXN0cnVjdCBicGZfdmVyc2lvbiBidjsKIAogCS8qCkBAIC01NjcsNyArNTcxLDcgQEAKIAkJCSAqIGEgd2luZG93IHRvIGFubm95IHRoZSB1c2VyLgogCQkJICovCiAJCQlmcHJpbnRmKHN0ZGVyciwgInRjcGR1bXA6IFVzaW5nIGtlcm5lbCBCUEYgZmlsdGVyXG4iKTsKLQkJCXAtPm1kLnVzZV9icGYgPSAxOworCQkJcGYtPmZpbHRlcmluZ19pbl9rZXJuZWwgPSAxOwogCiAJCQkvKgogCQkJICogRGlzY2FyZCBhbnkgcHJldmlvdXNseS1yZWNlaXZlZCBwYWNrZXRzLApAQCAtNjA1LDYgKzYwOSw2IEBACiAJICogYSB3YXJuaW5nIG9mIHNvbWUgc29ydC4KIAkgKi8KIAlmcHJpbnRmKHN0ZGVyciwgInRjcGR1bXA6IEZpbHRlcmluZyBpbiB1c2VyIHByb2Nlc3NcbiIpOwotCXAtPm1kLnVzZV9icGYgPSAwOworCXBmLT5maWx0ZXJpbmdfaW5fa2VybmVsID0gMDsKIAlyZXR1cm4gKDApOwogfQpkaWZmIC0tZ2l0IGEvcGNhcC1wZi5oIGIvcGNhcC1wZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGJlYTgzLi4wMDAwMDAwCi0tLSBhL3BjYXAtcGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTQKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0gKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSwKLSAqIEJlcmtlbGV5LCBDQS4gIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0bwotICogZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1wZi5oLHYgMS4yLjEuMSAxOTk5LzEwLzA3IDIzOjQ2OjQwIG1jciBFeHAgJCAoTEJMKQotICovCmRpZmYgLS1naXQgYS9wY2FwLXNhdmVmaWxlLm1hbmZpbGUuaW4gYi9wY2FwLXNhdmVmaWxlLm1hbmZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwZTAwMwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbgpAQCAtMCwwICsxLDEzNiBAQAorJ1wiIHQKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbix2IDEuMiAyMDA4LTEwLTI0IDA3OjMzOjUwIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtU0FWRUZJTEUgQE1BTl9GSUxFX0ZPUk1BVFNAICIyMSBPY3RvYmVyIDIwMDgiCisuU0ggTkFNRQorcGNhcC1zYXZlZmlsZSBcLSBsaWJwY2FwIHNhdmVmaWxlIGZvcm1hdAorLlNIIERFU0NSSVBUSU9OCitOT1RFOiBhcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcyBzaG91bGQsIGlmIHBvc3NpYmxlLCB1c2UgbGlicGNhcCB0bworcmVhZCBzYXZlZmlsZXMsIHJhdGhlciB0aGFuIGhhdmluZyB0aGVpciBvd24gY29kZSB0byByZWFkIHNhdmVmaWxlcy4gCitJZiwgaW4gdGhlIGZ1dHVyZSwgYSBuZXcgZmlsZSBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IGxpYnBjYXAsCithcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcyB1c2luZyBsaWJwY2FwIHRvIHJlYWQgc2F2ZWZpbGVzIHdpbGwgYmUgYWJsZQordG8gcmVhZCB0aGUgbmV3IGZvcm1hdCBvZiBzYXZlZmlsZXMsIGJ1dCBhcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcwordXNpbmcgdGhlaXIgb3duIGNvZGUgdG8gcmVhZCBzYXZlZmlsZXMgd2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQgdG8KK3N1cHBvcnQgdGhlIG5ldyBmaWxlIGZvcm1hdC4KKy5QUAorYGBTYXZlZmlsZXMnJyByZWFkIGFuZCB3cml0dGVuIGJ5IGxpYnBjYXAgYW5kIGFwcGxpY2F0aW9ucyB1c2luZyBsaWJwY2FwCitzdGFydCB3aXRoIGEgcGVyLWZpbGUgaGVhZGVyLiAgVGhlIGZvcm1hdCBvZiB0aGUgcGVyLWZpbGUgaGVhZGVyIGlzOgorLlJTCisuVFMKK2JveDsKK2MgcworYyB8IGMKK2Mgcy4KK01hZ2ljIG51bWJlcgorXworTWFqb3IgdmVyc2lvbglNaW5vciB2ZXJzaW9uCitfCitUaW1lIHpvbmUgb2Zmc2V0CitfCitUaW1lIHN0YW1wIGFjY3VyYWN5CitfCitTbmFwc2hvdCBsZW5ndGgKK18KK0xpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKy5URQorLlJFCisuUFAKK0FsbCBmaWVsZHMgaW4gdGhlIHBlci1maWxlIGhlYWRlciBhcmUgaW4gdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QKK3dyaXRpbmcgdGhlIGZpbGUuICBOb3JtYWxseSwgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBwZXItZmlsZSBoZWFkZXIgaXMgYQorNC1ieXRlIG1hZ2ljIG51bWJlciwgd2l0aCB0aGUgdmFsdWUgMHhhMWIyYzNkNC4gIFRoZSBtYWdpYyBudW1iZXIsIHdoZW4KK3JlYWQgYnkgYSBob3N0IHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUgaG9zdCB0aGF0IHdyb3RlIHRoZSBmaWxlLAord2lsbCBoYXZlIHRoZSB2YWx1ZSAweGExYjJjM2Q0LCBhbmQsIHdoZW4gcmVhZCBieSBhIGhvc3Qgd2l0aCB0aGUKK29wcG9zaXRlIGJ5dGUgb3JkZXIgYXMgdGhlIGhvc3QgdGhhdCB3cm90ZSB0aGUgZmlsZSwgd2lsbCBoYXZlIHRoZSB2YWx1ZQorMHhkNGMzYjJhMS4gIFRoYXQgYWxsb3dzIHNvZnR3YXJlIHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKK3RoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0IHRoYXQgd3JvdGUgdGhlIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJ5dGUKK29yZGVyIG9mIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBmaWxlIGlzIGJlaW5nIHJlYWQsIGFuZCB0aHVzIHdoZXRoZXIgdGhlCit2YWx1ZXMgaW4gdGhlIHBlci1maWxlIGFuZCBwZXItcGFja2V0IGhlYWRlcnMgbmVlZCB0byBiZSBieXRlLXN3YXBwZWQuCisuUFAKK0lmIHRoZSBtYWdpYyBudW1iZXIgaGFzIHRoZSB2YWx1ZSAweGExYjIzYzRkICh3aXRoIHRoZSB0d28gbmliYmxlcyBvZgordGhlIHR3byBsb3dlci1vcmRlciBieXRlcyBvZiB0aGUgbWFnaWMgbnVtYmVyIHN3YXBwZWQpLCB3aGljaCB3b3VsZCBiZQorcmVhZCBhcyAweGExYjIzYzRkIGJ5IGEgaG9zdCB3aXRoIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYXMgdGhlIGhvc3QgdGhhdAord3JvdGUgdGhlIGZpbGUgYW5kIGFzIDB4NGQzY2IyYTEgYnkgYSBob3N0IHdpdGggdGhlIG9wcG9zaXRlIGJ5dGUgb3JkZXIKK2FzIHRoZSBob3N0IHRoYXQgd3JvdGUgdGhlIGZpbGUsIHRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyBmb3IKK3JlZ3VsYXIgZmlsZXMsIGV4Y2VwdCB0aGF0IHRoZSB0aW1lIHN0YW1wcyBmb3IgcGFja2V0cyBhcmUgZ2l2ZW4gaW4KK3NlY29uZHMgYW5kIG5hbm9zZWNvbmRzIHJhdGhlciB0aGFuIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcy4KKy5QUAorRm9sbG93aW5nIHRoaXMgYXJlOgorLklQCitBIDItYnl0ZSBmaWxlIGZvcm1hdCBtYWpvciB2ZXJzaW9uIG51bWJlcjsgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgaXMKKzIuCisuSVAKK0EgMi1ieXRlIGZpbGUgZm9ybWF0IG1pbm9yIHZlcnNpb24gbnVtYmVyOyB0aGUgY3VycmVudCB2ZXJzaW9uIG51bWJlciBpcworNC4KKy5JUAorQSA0LWJ5dGUgdGltZSB6b25lIG9mZnNldDsgdGhpcyBpcyBhbHdheXMgMC4KKy5JUAorQSA0LWJ5dGUgbnVtYmVyIGdpdmluZyB0aGUgYWNjdXJhY3kgb2YgdGltZSBzdGFtcHMgaW4gdGhlIGZpbGU7IHRoaXMgaXMKK2Fsd2F5cyAwLgorLklQCitBIDQtYnl0ZSBudW1iZXIgZ2l2aW5nIHRoZSAic25hcHNob3QgbGVuZ3RoIiBvZiB0aGUgY2FwdHVyZTsgcGFja2V0cworbG9uZ2VyIHRoYW4gdGhlIHNuYXBzaG90IGxlbmd0aCBhcmUgdHJ1bmNhdGVkIHRvIHRoZSBzbmFwc2hvdCBsZW5ndGgsIHNvCit0aGF0LCBpZiB0aGUgc25hcHNob3QgbGVuZ3RoIGlzCisuSVIgTiAsCitvbmx5IHRoZSBmaXJzdAorLkkgTgorYnl0ZXMgb2YgYSBwYWNrZXQgbG9uZ2VyIHRoYW4KKy5JIE4KK2J5dGVzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIGNhcHR1cmUuCisuSVAKK2EgNC1ieXRlIG51bWJlciBnaXZpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIHBhY2tldHMgaW4gdGhlCitjYXB0dXJlOyBzZWUKKy5CUiBwY2FwLWxpbmt0eXBlIChATUFOX01JU0NfSU5GT0ApCitmb3IgdGhlCisuQiBMSU5LVFlQRV8KK3ZhbHVlcyB0aGF0IGNhbiBhcHBlYXIgaW4gdGhpcyBmaWVsZC4KKy5QUAorRm9sbG93aW5nIHRoZSBwZXItZmlsZSBoZWFkZXIgYXJlIHplcm8gb3IgbW9yZSBwYWNrZXRzOyBlYWNoIHBhY2tldAorYmVnaW5zIHdpdGggYSBwZXItcGFja2V0IGhlYWRlciwgd2hpY2ggaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlCityYXcgcGFja2V0IGRhdGEuICBUaGUgZm9ybWF0IG9mIHRoZSBwZXItcGFja2V0IGhlYWRlciBpczoKKy5SUworLlRTCitib3g7CitjLgorVGltZSBzdGFtcCwgc2Vjb25kcyB2YWx1ZQorXworVGltZSBzdGFtcCwgbWljcm9zZWNvbmRzIG9yIG5hbm9zZWNvbmRzIHZhbHVlCitfCitMZW5ndGggb2YgY2FwdHVyZWQgcGFja2V0IGRhdGEKK18KK1VuLXRydW5jYXRlZCBsZW5ndGggb2YgdGhlIHBhY2tldCBkYXRhCisuVEUKKy5SRQorLlBQCitBbGwgZmllbGRzIGluIHRoZSBwZXItcGFja2V0IGhlYWRlciBhcmUgaW4gdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QKK3dyaXRpbmcgdGhlIGZpbGUuICBUaGUgcGVyLXBhY2tldCBoZWFkZXIgYmVnaW5zIHdpdGggYSB0aW1lIHN0YW1wIGdpdmluZwordGhlIGFwcHJveGltYXRlIHRpbWUgdGhlIHBhY2tldCB3YXMgY2FwdHVyZWQ7IHRoZSB0aW1lIHN0YW1wIGNvbnNpc3RzIG9mCithIDQtYnl0ZSB2YWx1ZSwgZ2l2aW5nIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLAorMDA6MDA6MDAgVVRDLCBmb2xsb3dlZCBieSBhIDQtYnl0ZSB2YWx1ZSwgZ2l2aW5nIHRoZSB0aW1lIGluCittaWNyb3NlY29uZHMgb3IgbmFub3NlY29uZHMgc2luY2UgdGhhdCBzZWNvbmQsIGRlcGVuZGluZyBvbiB0aGUgbWFnaWMKK251bWJlciBpbiB0aGUgZmlsZSBoZWFkZXIuICBGb2xsb3dpbmcgdGhhdCBhcmUgYSA0LWJ5dGUgdmFsdWUgZ2l2aW5nIHRoZQorbnVtYmVyIG9mIGJ5dGVzIG9mIGNhcHR1cmVkIGRhdGEgdGhhdCBmb2xsb3cgdGhlIHBlci1wYWNrZXQgaGVhZGVyIGFuZCBhCis0LWJ5dGUgdmFsdWUgZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcHJlc2VudCBoYWQKK3RoZSBwYWNrZXQgbm90IGJlZW4gdHJ1bmNhdGVkIGJ5IHRoZSBzbmFwc2hvdCBsZW5ndGguICBUaGUgdHdvIGxlbmd0aHMKK3dpbGwgYmUgZXF1YWwgaWYgdGhlIG51bWJlciBvZiBieXRlcyBvZiBwYWNrZXQgZGF0YSBhcmUgbGVzcyB0aGFuIG9yCitlcXVhbCB0byB0aGUgc25hcHNob3QgbGVuZ3RoLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcC1saW5rdHlwZShATUFOX01JU0NfSU5GT0ApCmRpZmYgLS1naXQgYS9wY2FwLXNlcHRlbC5jIGIvcGNhcC1zZXB0ZWwuYwppbmRleCA1MTY5ZWMwLi40Y2E3YTYwIDEwMDY0NAotLS0gYS9wY2FwLXNlcHRlbC5jCisrKyBiL3BjYXAtc2VwdGVsLmMKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zZXB0ZWwuYyx2IDEuMS4yLjIgMjAwNS8wNi8yMSAwMTowMzoyMyBndXkgRXhwICQiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc2VwdGVsLmMsdiAxLjQgMjAwOC0wNC0xNCAyMDo0MDo1OCBndXkgRXhwICQiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICkBAIC0zOCwzMyArMzgsMjUgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQogI2luY2x1ZGUgPG1zZy5oPgogI2luY2x1ZGUgPHNzN19pbmMuaD4KICNpbmNsdWRlIDxzeXNnY3QuaD4KICNpbmNsdWRlIDxwYWNrLmg+CiAjaW5jbHVkZSA8c3lzdGVtLmg+Ci0jZW5kaWYgLyogSEFWRV9TRVBURUxfQVBJICovCiAKLSNpZmRlZiBTRVBURUxfT05MWQotLyogVGhpcyBjb2RlIGlzIHJlcXVpcmVkIHdoZW4gY29tcGlsaW5nIGZvciBhIFNlcHRlbCBkZXZpY2Ugb25seS4gKi8KICNpbmNsdWRlICJwY2FwLXNlcHRlbC5oIgogCi0vKiBSZXBsYWNlIGRhZyBmdW5jdGlvbiBuYW1lcyB3aXRoIHBjYXAgZXF1aXZhbGVudC4gKi8KLSNkZWZpbmUgc2VwdGVsX29wZW5fbGl2ZSBwY2FwX29wZW5fbGl2ZQotI2RlZmluZSBzZXB0ZWxfcGxhdGZvcm1fZmluZGRldnMgcGNhcF9wbGF0Zm9ybV9maW5kZGV2cwotI2VuZGlmIC8qIFNFUFRFTF9PTkxZICovCi0KIHN0YXRpYyBpbnQgc2VwdGVsX3NldGZpbHRlcihwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApOwogc3RhdGljIGludCBzZXB0ZWxfc3RhdHMocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcyk7CiBzdGF0aWMgaW50IHNlcHRlbF9zZXRub25ibG9jayhwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKTsKIAotc3RhdGljIHZvaWQgc2VwdGVsX3BsYXRmb3JtX2Nsb3NlKHBjYXBfdCAqcCkgewotCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gU2VwdGVsIGRldmljZXMuCisgKi8KK3N0cnVjdCBwY2FwX3NlcHRlbCB7CisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OwogfQogCi0KLQogLyoKICAqICBSZWFkIGF0IG1vc3QgbWF4X3BhY2tldHMgZnJvbSB0aGUgY2FwdHVyZSBxdWV1ZSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sKICAqICBmb3IgZWFjaCBvZiB0aGVtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBoYW5kbGVkLCAtMSBpZiBhbgpAQCAtNzIsNiArNjQsNyBAQAogICovCiBzdGF0aWMgaW50IHNlcHRlbF9yZWFkKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpIHsKIAorICBzdHJ1Y3QgcGNhcF9zZXB0ZWwgKnBzID0gcC0+cHJpdjsKICAgSERSICpoOwogICBNU0cgKm07CiAgIGludCBwcm9jZXNzZWQgPSAwIDsKQEAgLTE2OSw3ICsxNjIsNyBAQAogICAgICAgICBwY2FwX2hlYWRlci5sZW4gPSBwYWNrZXRfbGVuOwogCiAgICAgICAgIC8qIENvdW50IHRoZSBwYWNrZXQuICovCi0gICAgICAgIHAtPm1kLnN0YXQucHNfcmVjdisrOworICAgICAgICBwcy0+c3RhdC5wc19yZWN2Kys7CiAKICAgICAgICAgLyogQ2FsbCB0aGUgdXNlciBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiAqLwogICAgICAgICBjYWxsYmFjayh1c2VyLCAmcGNhcF9oZWFkZXIsIGRwKTsKQEAgLTE5OSwyOCArMTkyLDE0IEBACiB9CiAKIC8qCi0gKiAgR2V0IGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSBmcm9tIHRoZSBnaXZlbiBTZXB0ZWwgZGV2aWNlLiAgQWx3YXlzIHBhc3MgYSBOVUxMIGRldmljZQorICogIEFjdGl2YXRlIGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSBmcm9tIHRoZSBnaXZlbiBTZXB0ZWwgZGV2aWNlLiAgQWx3YXlzIHBhc3MgYSBOVUxMIGRldmljZQogICogIFRoZSBwcm9taXNjIGZsYWcgaXMgaWdub3JlZCBiZWNhdXNlIFNlcHRlbCBjYXJkcyBoYXZlIGJ1aWx0LWluIHRyYWNpbmcuCi0gKiAgVGhlIHRvX21zIHBhcmFtZXRlciBpcyBhbHNvIGlnbm9yZWQgYXMgaXQgaXMKLSAqICBub3Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlLgorICogIFRoZSB0aW1lb3V0IGlzIGFsc28gaWdub3JlZCBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlLgogICoKICAqICBTZWUgYWxzbyBwY2FwKDMpLgogICovCi1wY2FwX3QgKnNlcHRlbF9vcGVuX2xpdmUoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZWJ1ZikgewotICBwY2FwX3QgKmhhbmRsZTsKLQotICBoYW5kbGUgPSBtYWxsb2Moc2l6ZW9mKCpoYW5kbGUpKTsKLSAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYyAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KLSAgCi0gIG1lbXNldChoYW5kbGUsIDAsIHNpemVvZigqaGFuZGxlKSk7Ci0gIAotICBoYW5kbGUtPnNuYXBzaG90ID0gc25hcGxlbjsKLQorc3RhdGljIHBjYXBfdCAqc2VwdGVsX2FjdGl2YXRlKHBjYXBfdCogaGFuZGxlKSB7CisgIC8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8gIAogICBoYW5kbGUtPmxpbmt0eXBlID0gRExUX01UUDI7CiAgIAogICBoYW5kbGUtPmJ1ZnNpemUgPSAwOwpAQCAtMjM3LDMwICsyMTYsNDggQEAKICAgaGFuZGxlLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CiAgIGhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBzZXB0ZWxfc2V0bm9uYmxvY2s7CiAgIGhhbmRsZS0+c3RhdHNfb3AgPSBzZXB0ZWxfc3RhdHM7Ci0gIGhhbmRsZS0+Y2xvc2Vfb3AgPSBzZXB0ZWxfcGxhdGZvcm1fY2xvc2U7CiAKLSAgcmV0dXJuIGhhbmRsZTsKKyAgcmV0dXJuIDA7Cit9CiAKLWZhaWw6Ci0gIGlmIChoYW5kbGUgIT0gTlVMTCkgewotICAgIGZyZWUoaGFuZGxlKTsKLSAgfQorcGNhcF90ICpzZXB0ZWxfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKSB7CisJY29uc3QgY2hhciAqY3A7CisJcGNhcF90ICpwOwogCi0gIHJldHVybiBOVUxMOworCS8qIERvZXMgdGhpcyBsb29rIGxpa2UgdGhlIFNlcHRlbCBkZXZpY2U/ICovCisJY3AgPSBzdHJyY2hyKGRldmljZSwgJy8nKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJY3AgPSBkZXZpY2U7CisJaWYgKHN0cmNtcChjcCwgInNlcHRlbCIpICE9IDApIHsKKwkJLyogTm9wZSwgaXQncyBub3QgInNlcHRlbCIgKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPSywgaXQncyBwcm9iYWJseSBvdXJzLiAqLworCSppc19vdXJzID0gMTsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3NlcHRlbCkpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcC0+YWN0aXZhdGVfb3AgPSBzZXB0ZWxfYWN0aXZhdGU7CisJcmV0dXJuIHA7CiB9CiAKIHN0YXRpYyBpbnQgc2VwdGVsX3N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpIHsKLSAgLypwLT5tZC5zdGF0LnBzX3JlY3YgPSAwOyovCi0gIC8qcC0+bWQuc3RhdC5wc19kcm9wID0gMDsqLworICBzdHJ1Y3QgcGNhcF9zZXB0ZWwgKmhhbmRsZXAgPSBwLT5wcml2OworICAvKmhhbmRsZXAtPnN0YXQucHNfcmVjdiA9IDA7Ki8KKyAgLypoYW5kbGVwLT5zdGF0LnBzX2Ryb3AgPSAwOyovCiAgIAotICAqcHMgPSBwLT5tZC5zdGF0OworICAqcHMgPSBoYW5kbGVwLT5zdGF0OwogIAogICByZXR1cm4gMDsKIH0KIAogCiBpbnQKLXNlcHRlbF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKQorc2VwdGVsX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmRldmxpc3RwLCBjaGFyICplcnJidWYpCiB7CiB1bnNpZ25lZCBjaGFyICpwOwogICBjb25zdCBjaGFyIGRlc2NyaXB0aW9uWzUxMl09ICJJbnRlbC9TZXB0ZWwgZGV2aWNlIjsKQEAgLTI5NCw4ICsyOTEsNiBAQAogICAgIHJldHVybiAtMTsKICAgfQogCi0gIHAtPm1kLnVzZV9icGYgPSAwOwotCiAgIHJldHVybiAoMCk7CiB9CiAKQEAgLTMwMyw1ICsyOTgsNiBAQAogc3RhdGljIGludAogc2VwdGVsX3NldG5vbmJsb2NrKHBjYXBfdCAqcCwgaW50IG5vbmJsb2NrLCBjaGFyICplcnJidWYpCiB7Ci0gIHJldHVybiAoMCk7CisgIGZwcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTm9uLWJsb2NraW5nIG1vZGUgbm90IHN1cHBvcnRlZCBvbiBTZXB0ZWwgZGV2aWNlcyIpOworICByZXR1cm4gKC0xKTsKIH0KZGlmZiAtLWdpdCBhL3BjYXAtc2VwdGVsLmggYi9wY2FwLXNlcHRlbC5oCmluZGV4IDFkZTYzNzcuLmI3MmYzNWIgMTAwNjQ0Ci0tLSBhL3BjYXAtc2VwdGVsLmgKKysrIGIvcGNhcC1zZXB0ZWwuaApAQCAtOCw4ICs4LDggQEAKICAqIEF1dGhvcnM6IEdpbGJlcnQgSE9ZRUsgKGdpbF9ob3lla0Bob3RtYWlsLmNvbSksIEVsaWFzIE0uIEtIT1VSWQogICogKCs5NjEgMyA0ODUzNDMpOwogICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zZXB0ZWwuaCx2IDEuMS4yLjEgMjAwNS8wNi8yMCAyMTozMDoxOSBndXkgRXhwICQKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zZXB0ZWwuaCx2IDEuMiAyMDA4LTA0LTA0IDE5OjM3OjQ1IGd1eSBFeHAgJAogICovCiAKLXBjYXBfdCAqc2VwdGVsX29wZW5fbGl2ZShjb25zdCBjaGFyICpkZXZpY2UsIGludCBzbmFwbGVuLCBpbnQgcHJvbWlzYywgaW50IHRvX21zLCBjaGFyICplYnVmKTsKLQorcGNhcF90ICpzZXB0ZWxfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKTsKK2ludCBzZXB0ZWxfZmluZGFsbGRldnMocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1Zik7CmRpZmYgLS1naXQgYS9wY2FwLXNpdGEuYyBiL3BjYXAtc2l0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjgwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLXNpdGEuYwpAQCAtMCwwICsxLDEwMjEgQEAKKy8qCisgKiAgcGNhcC1zaXRhLmM6IFBhY2tldCBjYXB0dXJlIGludGVyZmFjZSBhZGRpdGlvbnMgZm9yIFNJVEEgQUNOIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IEZ1bGtvIEhldywgU0lUQSBJTkMgQ2FuYWRhLCBJbmMgPGZ1bGtvLmhld0BzaXRhLmFlcm8+CisgKgorICogIExpY2Vuc2U6IEJTRAorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyAvKiAkSWQ6IHBjYXAtc2l0YS5jICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAicGNhcC1zaXRhLmgiCisKKwkvKiBub24tY29uZmlndXJlYWJsZSBtYW5pZmVzdHMgZm9sbG93ICovCisKKyNkZWZpbmUgSU9QX1NOSUZGRVJfUE9SVAk0OTE1MgkJCS8qIFRDUCBwb3J0IG9uIHRoZSBJT1AgdXNlZCBmb3IgJ2Rpc3RyaWJ1dGVkIHBjYXAnIHVzYWdlICovCisjZGVmaW5lIE1BWF9MSU5FX1NJWkUJCTI1NQkJCQkvKiBtYXggc2l6ZSBvZiBhIGJ1ZmZlci9saW5lIGluIC9ldGMvaG9zdHMgd2UgYWxsb3cgKi8KKyNkZWZpbmUgTUFYX0NIQVNTSVMJCQk4CQkJCS8qIG51bWJlciBvZiBjaGFzc2lzIGluIGFuIEFDTiBzaXRlICovCisjZGVmaW5lIE1BWF9HRU9TTE9UCQkJOAkJCQkvKiBtYXggbnVtYmVyIG9mIGFjY2VzcyB1bml0cyBpbiBhbiBBQ04gc2l0ZSAqLworCisjZGVmaW5lIEZJTkQJCQkwCisjZGVmaW5lIExJVkUJCQkxCisKK3R5cGVkZWYgc3RydWN0IGlmYWNlIHsKKwlzdHJ1Y3QgaWZhY2UJKm5leHQ7CQkvKiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgaW50ZXJmYWNlICovCisJY2hhcgkJKm5hbWU7CQkvKiB0aGlzIGludGVyZmFjZSdzIG5hbWUgKi8KKwljaGFyCQkqSU9QbmFtZTsJLyogdGhpcyBpbnRlcmZhY2UncyBuYW1lIG9uIGFuIElPUCAqLworCXVpbnQzMl90CWlmdHlwZTsJCS8qIHRoZSB0eXBlIG9mIGludGVyZmFjZSAoRExUIHZhbHVlcykgKi8KK30gaWZhY2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdW5pdCB7CisJY2hhcgkJCSppcDsJCS8qIHRoaXMgdW5pdCdzIElQIGFkZHJlc3MgKGFzIGV4dHJhY3RlZCBmcm9tIC9ldGMvaG9zdHMpICovCisJaW50CQkJZmQ7CQkvKiB0aGUgY29ubmVjdGlvbiB0byB0aGlzIHVuaXQgKGlmIGl0IGV4aXN0cykgKi8KKwlpbnQJCQlmaW5kX2ZkOwkvKiBhIGJpZyBrbHVkZ2UgdG8gYXZvaWQgbXkgcHJvZ3JhbW1pbmcgbGltaXRhdGlvbnMgc2luY2UgSSBjb3VsZCBoYXZlIHRoaXMgdW5pdCBvcGVuIGZvciBmaW5kYWxsZGV2cyBwdXJwb3NlcyAqLworCWludAkJCWZpcnN0X3RpbWU7CS8qIDAgPSBqdXN0IG9wZW5lZCB2aWEgYWNuX29wZW5fbGl2ZSgpLCAgaWUuIHRoZSBmaXJzdCB0aW1lLCBOWiA9IG50aCB0aW1lICovCisJc3RydWN0IHNvY2thZGRyX2luCSpzZXJ2X2FkZHI7CS8qIHRoZSBhZGRyZXNzIGNvbnRyb2wgYmxvY2sgZm9yIGNvbW1zIHRvIHRoaXMgdW5pdCAqLworCWludAkJCWNoYXNzaXM7CisJaW50CQkJZ2Vvc2xvdDsKKwlpZmFjZV90CQkJKmlmYWNlOwkJLyogYSBwb2ludGVyIHRvIGEgbGlua2VkIGxpc3Qgb2YgaW50ZXJmYWNlIHN0cnVjdHVyZXMgKi8KKwljaGFyCQkJKmltc2c7CQkvKiBhIHBvaW50ZXIgdG8gYW4gaW5ib3VuZCBtZXNzYWdlICovCisJaW50CQkJbGVuOwkJLyogdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgaW5ib3VuZCBtZXNzYWdlICovCit9IHVuaXRfdDsKKworc3RhdGljIHVuaXRfdAkJdW5pdHNbTUFYX0NIQVNTSVMrMV1bTUFYX0dFT1NMT1QrMV07CS8qIHdlIHVzZSBpbmRleGVzIG9mIDEgdGhyb3VnaCA4LCBidXQgd2UgcmVzZXJ2ZS93YXN0ZSBpbmRleCAwICovCitzdGF0aWMgZmRfc2V0CQlyZWFkZmRzOwkJCQkvKiBhIHBsYWNlIHRvIHN0b3JlIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgY29ubmVjdGlvbnMgdG8gdGhlIElPUHMgKi8KK3N0YXRpYyBpbnQJCW1heF9mczsKKworcGNhcF9pZl90CQkqYWNuX2lmX2xpc3Q7CQkvKiBwY2FwJ3MgbGlzdCBvZiBhdmFpbGFibGUgaW50ZXJmYWNlcyAqLworCitzdGF0aWMgdm9pZCBkdW1wX2ludGVyZmFjZV9saXN0KHZvaWQpIHsKKwlwY2FwX2lmX3QJCSppZmY7CisJcGNhcF9hZGRyX3QJCSphZGRyOworCWludAkJCWxvbmdlc3RfbmFtZV9sZW4gPSAwOworCWNoYXIJCQkqbiwgKmQsICpmOworCWludAkJCWlmX251bWJlciA9IDA7CisKKwlpZmYgPSBhY25faWZfbGlzdDsKKwl3aGlsZSAoaWZmKSB7CisJCWlmIChpZmYtPm5hbWUgJiYgKHN0cmxlbihpZmYtPm5hbWUpID4gbG9uZ2VzdF9uYW1lX2xlbikpIGxvbmdlc3RfbmFtZV9sZW4gPSBzdHJsZW4oaWZmLT5uYW1lKTsKKwkJaWZmID0gaWZmLT5uZXh0OworCX0KKwlpZmYgPSBhY25faWZfbGlzdDsKKwlwcmludGYoIkludGVyZmFjZSBMaXN0OlxuIik7CisJd2hpbGUgKGlmZikgeworCQluID0gKGlmZi0+bmFtZSkJCQkJCQkJPyBpZmYtPm5hbWUJCQk6ICIiOworCQlkID0gKGlmZi0+ZGVzY3JpcHRpb24pCQkJCQk/IGlmZi0+ZGVzY3JpcHRpb24JOiAiIjsKKwkJZiA9IChpZmYtPmZsYWdzID09IFBDQVBfSUZfTE9PUEJBQ0spCT8gIkwiCQkJCTogIiI7CisJCXByaW50ZigiJTNkOiAlKnMgJXMgJyVzJ1xuIiwgaWZfbnVtYmVyKyssIGxvbmdlc3RfbmFtZV9sZW4sIG4sIGYsIGQpOworCQlhZGRyID0gaWZmLT5hZGRyZXNzZXM7CisJCXdoaWxlIChhZGRyKSB7CisJCQlwcmludGYoIiUqcyAiLCAoNSArIGxvbmdlc3RfbmFtZV9sZW4pLCAiIik7CQkvKiBhZGQgc29tZSBpbmRlbnRhdGlvbiAqLworCQkJcHJpbnRmKCIlMTVzICAiLCAoYWRkci0+YWRkcikJCT8gaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkci0+YWRkciktPnNpbl9hZGRyKQkJOiAiIik7CisJCQlwcmludGYoIiUxNXMgICIsIChhZGRyLT5uZXRtYXNrKQk/IGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHItPm5ldG1hc2spLT5zaW5fYWRkcikJOiAiIik7CisJCQlwcmludGYoIiUxNXMgICIsIChhZGRyLT5icm9hZGFkZHIpCT8gaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkci0+YnJvYWRhZGRyKS0+c2luX2FkZHIpCTogIiIpOworCQkJcHJpbnRmKCIlMTVzICAiLCAoYWRkci0+ZHN0YWRkcikJPyBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyLT5kc3RhZGRyKS0+c2luX2FkZHIpCTogIiIpOworCQkJcHJpbnRmKCJcbiIpOworCQkJYWRkciA9IGFkZHItPm5leHQ7CisJCX0KKwkJaWZmID0gaWZmLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgZHVtcCh1bnNpZ25lZCBjaGFyICpwdHIsIGludCBpLCBpbnQgaW5kZW50KSB7CisJZnByaW50ZihzdGRlcnIsICIlKnMiLCBpbmRlbnQsICIgIik7CisJZm9yICg7IGkgPiAwOyBpLS0pIHsKKwkJZnByaW50ZihzdGRlcnIsICIlMi4yeCAiLCAqcHRyKyspOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW50ZXJmYWNlX2xpc3RfcCh2b2lkKSB7CisJcGNhcF9pZl90CQkqaWZmOworCXBjYXBfYWRkcl90CQkqYWRkcjsKKwlpbnQJCQkJaWZfbnVtYmVyID0gMDsKKworCWlmZiA9IGFjbl9pZl9saXN0OworCXByaW50ZigiSW50ZXJmYWNlIFBvaW50ZXIgQCAlcCBpcyAlcDpcbiIsICZhY25faWZfbGlzdCwgaWZmKTsKKwl3aGlsZSAoaWZmKSB7CisJCXByaW50ZigiJTNkOiAlcCAlcCBuZXh0OiAlcFxuIiwgaWZfbnVtYmVyKyssIGlmZi0+bmFtZSwgaWZmLT5kZXNjcmlwdGlvbiwgaWZmLT5uZXh0KTsKKwkJZHVtcCgodW5zaWduZWQgY2hhciAqKWlmZiwgc2l6ZW9mKHBjYXBfaWZfdCksIDUpOworCQlhZGRyID0gaWZmLT5hZGRyZXNzZXM7CisJCXdoaWxlIChhZGRyKSB7CisJCQlwcmludGYoIiAgICAgICAgICAlcCAlcCAlcCAlcCwgbmV4dDogJXBcbiIsIGFkZHItPmFkZHIsIGFkZHItPm5ldG1hc2ssIGFkZHItPmJyb2FkYWRkciwgYWRkci0+ZHN0YWRkciwgYWRkci0+bmV4dCk7CisJCQlkdW1wKCh1bnNpZ25lZCBjaGFyICopYWRkciwgc2l6ZW9mKHBjYXBfYWRkcl90KSwgMTApOworCQkJYWRkciA9IGFkZHItPm5leHQ7CisJCX0KKwkJaWZmID0gaWZmLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF91bml0X3RhYmxlKHZvaWQpIHsKKwlpbnQJCWNoYXNzaXMsIGdlb3Nsb3Q7CisJaWZhY2VfdAkqcDsKKworCXByaW50ZigiJWM6JWMgJXMgJXNcbiIsICdDJywgJ1MnLCAiZmQiLCAiSVAgQWRkcmVzcyIpOworCWZvciAoY2hhc3NpcyA9IDA7IGNoYXNzaXMgPD0gTUFYX0NIQVNTSVM7IGNoYXNzaXMrKykgeworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsKKwkJCWlmICh1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5pcCAhPSBOVUxMKQorCQkJCXByaW50ZigiJWQ6JWQgJTJkICVzXG4iLCBjaGFzc2lzLCBnZW9zbG90LCB1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5mZCwgdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF0uaXApOworCQkJcCA9IHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlmYWNlOworCQkJd2hpbGUgKHApIHsKKwkJCQljaGFyICpuID0gKHAtPm5hbWUpCQkJPyBwLT5uYW1lCQkJOiAiIjsKKwkJCQljaGFyICppID0gKHAtPklPUG5hbWUpCQk/IHAtPklPUG5hbWUJCTogIiI7CisJCQkJcCA9IHAtPm5leHQ7CisJCQkJcHJpbnRmKCIgICAlMTJzICAgIC0+ICUxMnNcbiIsIGksIG4pOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IGZpbmRfdW5pdF9ieV9mZChpbnQgZmQsIGludCAqY2hhc3NpcywgaW50ICpnZW9zbG90LCB1bml0X3QgKip1bml0X3B0cikgeworCWludAkJYywgczsKKworCWZvciAoYyA9IDA7IGMgPD0gTUFYX0NIQVNTSVM7IGMrKykgeworCQlmb3IgKHMgPSAwOyBzIDw9IE1BWF9HRU9TTE9UOyBzKyspIHsKKwkJCWlmICh1bml0c1tjXVtzXS5mZCA9PSBmZCB8fCB1bml0c1tjXVtzXS5maW5kX2ZkID09IGZkKSB7CisJCQkJaWYgKGNoYXNzaXMpCSpjaGFzc2lzID0gYzsKKwkJCQlpZiAoZ2Vvc2xvdCkJKmdlb3Nsb3QgPSBzOworCQkJCWlmICh1bml0X3B0cikJKnVuaXRfcHRyID0gJnVuaXRzW2NdW3NdOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY2xpZW50X25ieXRlcyhpbnQgZmQsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqYnVmKSB7CisJdW5pdF90CQkJKnU7CisJaW50CQkJCWNoYXNzaXMsIGdlb3Nsb3Q7CisJaW50CQkJCWxlbjsKKworCWZpbmRfdW5pdF9ieV9mZChmZCwgJmNoYXNzaXMsICZnZW9zbG90LCAmdSk7CisJd2hpbGUgKGNvdW50KSB7CisJCWlmICgobGVuID0gcmVjdihmZCwgYnVmLCBjb3VudCwgMCkpIDw9IDApCXJldHVybiAtMTsJLyogcmVhZCBpbiB3aGF0ZXZlciBkYXRhIHdhcyBzZW50IHRvIHVzICovCisJCWNvdW50IC09IGxlbjsJCisJCWJ1ZiArPSBsZW47CisJfQkJCQkJCQkJCQkJCQkJCS8qIHRpbGwgd2UgaGF2ZSBldmVyeXRoaW5nIHdlIGFyZSBsb29raW5nIGZvciAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbXB0eV91bml0X2lmYWNlKHVuaXRfdCAqdSkgeworCWlmYWNlX3QJKnAsICpjdXI7CisKKwljdXIgPSB1LT5pZmFjZTsKKwl3aGlsZSAoY3VyKSB7CQkJCQkJCQkJCQkvKiBsb29wIG92ZXIgYWxsIHRoZSBpbnRlcmZhY2UgZW50cmllcyAqLworCQlpZiAoY3VyLT5uYW1lKQkJCWZyZWUoY3VyLT5uYW1lKTsJCQkvKiB0aHJvd2luZyBhd2F5IHRoZSBjb250ZW50cyBpZiB0aGV5IGV4aXN0ICovCisJCWlmIChjdXItPklPUG5hbWUpCQlmcmVlKGN1ci0+SU9QbmFtZSk7CisJCXAgPSBjdXItPm5leHQ7CisJCWZyZWUoY3VyKTsJCQkJCQkJCQkJCS8qIHRoZW4gdGhyb3cgYXdheSB0aGUgc3RydWN0dXJlIGl0c2VsZiAqLworCQljdXIgPSBwOworCX0KKwl1LT5pZmFjZSA9IDA7CQkJCQkJCQkJCQkvKiBhbmQgZmluYWxseSByZW1lbWJlciB0aGF0IHRoZXJlIGFyZSBubyByZW1haW5pbmcgc3RydWN0dXJlICovCit9CisKK3N0YXRpYyB2b2lkIGVtcHR5X3VuaXQoaW50IGNoYXNzaXMsIGludCBnZW9zbG90KSB7CisJdW5pdF90CSp1ID0gJnVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdOworCisJZW1wdHlfdW5pdF9pZmFjZSh1KTsKKwlpZiAodS0+aW1zZykgewkJCQkJCQkJCQkJLyogdGhlbiBpZiBhbiBpbmJvdW5kIG1lc3NhZ2UgYnVmZmVyIGV4aXN0cyAqLworCQl1LT5pbXNnID0gKGNoYXIgKilyZWFsbG9jKHUtPmltc2csIDEpOwkJCQkvKiBhbmQgcmUtYWxsb2NhdGUgdGhlIG9sZCBsYXJnZSBidWZmZXIgaW50byBhIG5ldyBzbWFsbCBvbmUgKi8KKwkJaWYgKHUtPmltc2cgPT0gTlVMTCkgewkvKiBvb3BzLCByZWFsbG9jIGNhbGwgZmFpbGVkICovCisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmcuLi5jYWxsIHRvIHJlYWxsb2MoKSBmYWlsZWQsIHZhbHVlIG9mIGVycm5vIGlzICVkXG4iLCBlcnJubyk7CisJCQorCX0KK30KKworc3RhdGljIHZvaWQgZW1wdHlfdW5pdF90YWJsZSh2b2lkKSB7CisJaW50CQljaGFzc2lzLCBnZW9zbG90OworCisJZm9yIChjaGFzc2lzID0gMDsgY2hhc3NpcyA8PSBNQVhfQ0hBU1NJUzsgY2hhc3NpcysrKSB7CisJCWZvciAoZ2Vvc2xvdCA9IDA7IGdlb3Nsb3QgPD0gTUFYX0dFT1NMT1Q7IGdlb3Nsb3QrKykgeworCQkJaWYgKHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwICE9IE5VTEwpIHsKKwkJCQlmcmVlKHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwKTsJCQkvKiBnZXQgcmlkIG9mIHRoZSBtYWxsb2MnZWQgc3BhY2UgdGhhdCBob2xkcyB0aGUgSVAgYWRkcmVzcyAqLworCQkJCXVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwID0gMDsJCQkJLyogdGhlbiBzZXQgdGhlIHBvaW50ZXIgdG8gTlVMTCAqLworCQkJfQorCQkJZW1wdHlfdW5pdChjaGFzc2lzLCBnZW9zbG90KTsKKwkJfQorCX0KK30KKworc3RhdGljIGNoYXIgKmZpbmRfbnRoX2ludGVyZmFjZV9uYW1lKGludCBuKSB7CisJaW50CQljaGFzc2lzLCBnZW9zbG90OworCWlmYWNlX3QJKnA7CisJY2hhcgkqbGFzdF9uYW1lID0gMDsKKworCWlmIChuIDwgMCkgbiA9IDA7CQkJCQkJCQkJCQkJLyogZW5zdXJlIHdlIGFyZSB3b3JraW5nIHdpdGggYSB2YWxpZCBudW1iZXIgKi8KKwlmb3IgKGNoYXNzaXMgPSAwOyBjaGFzc2lzIDw9IE1BWF9DSEFTU0lTOyBjaGFzc2lzKyspIHsJCQkvKiBzY2FuIHRoZSB0YWJsZS4uLiAqLworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsKKwkJCWlmICh1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5pcCAhPSBOVUxMKSB7CisJCQkJcCA9IHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlmYWNlOworCQkJCXdoaWxlIChwKSB7CQkJCQkJCQkJCQkvKiBhbmQgYWxsIGludGVyZmFjZXMuLi4gKi8KKwkJCQkJaWYgKHAtPklPUG5hbWUpIGxhc3RfbmFtZSA9IHAtPm5hbWU7CQkJLyogcmVtZW1iZXJpbmcgdGhlIGxhc3QgbmFtZSBmb3VuZCAqLworCQkJCQlpZiAobi0tID09IDApIHJldHVybiBsYXN0X25hbWU7CQkJCQkvKiBhbmQgaWYgd2UgaGl0IHRoZSBpbnN0YW5jZSByZXF1ZXN0ZWQgKi8KKwkJCQkJcCA9IHAtPm5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkJCQkJCQkJCQkvKiBpZiB3ZSBjb3VsZG4ndCBmaW5lIHRoZSBzZWxlY3RlZCBlbnRyeSAqLworCWlmIChsYXN0X25hbWUpCXJldHVybiBsYXN0X25hbWU7CQkvKiAuLi4gYnV0IHdlIGRpZCBoYXZlIGF0IGxlYXN0IG9uZSBlbnRyeS4uLiByZXR1cm4gdGhlIGxhc3QgZW50cnkgZm91bmQgKi8KKwlyZXR1cm4gIiI7CQkJCQkJCQkvKiAuLi4gYnV0IGlmIHRoZXJlIHdhc24ndCBhbnkgZW50cnkuLi4gcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkICovCit9CisKK2ludCBhY25fcGFyc2VfaG9zdHNfZmlsZShjaGFyICplcnJidWYpIHsJCQkJLyogcmV0dXJuczogLTEgPSBlcnJvciwgMCA9IE9LICovCisJRklMRQkqZnA7CisJY2hhcglidWZbTUFYX0xJTkVfU0laRV07CisJY2hhcgkqcHRyLCAqcHRyMjsKKwlpbnQJCXBvczsKKwlpbnQJCWNoYXNzaXMsIGdlb3Nsb3Q7CisJdW5pdF90CSp1OworCisJZW1wdHlfdW5pdF90YWJsZSgpOworCWlmICgoZnAgPSBmb3BlbigiL2V0Yy9ob3N0cyIsICJyIikpID09IE5VTEwpIHsJCQkJCQkJCQkJLyogdHJ5IHRvIG9wZW4gdGhlIGhvc3RzIGZpbGUgYW5kIGlmIGl0IGZhaWxzICovCisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbm5vdCBvcGVuICcvZXRjL2hvc3RzJyBmb3IgcmVhZGluZy4iKTsJLyogcmV0dXJuIHRoZSBub2hvc3RzZmlsZSBlcnJvciByZXNwb25zZSAqLworCQlyZXR1cm4gLTE7CisJfQorCXdoaWxlIChmZ2V0cyhidWYsIE1BWF9MSU5FX1NJWkUtMSwgZnApKSB7CQkJLyogd2hpbGUgbG9vcGluZyBvdmVyIHRoZSBmaWxlICovCisKKwkJcG9zID0gc3RyY3NwbihidWYsICIjXG5cciIpOwkJCQkJLyogZmluZCB0aGUgZmlyc3QgY29tbWVudCBjaGFyYWN0ZXIgb3IgRU9MICovCisJCSooYnVmICsgcG9zKSA9ICdcMCc7CQkJCQkJCS8qIGFuZCBjbG9iYmVyIGl0IGFuZCBhbnl0aGluZyB0aGF0IGZvbGxvd3MgaXQgKi8KKworCQlwb3MgPSBzdHJzcG4oYnVmLCAiIFx0Iik7CQkJCQkJLyogdGhlbiBmaW5kIHRoZSBmaXJzdCBub24td2hpdGUgc3BhY2UgKi8KKwkJaWYgKHBvcyA9PSBzdHJsZW4oYnVmKSkJCQkJCQkJLyogaWYgdGhlcmUgaXMgbm90aGluZyBidXQgd2hpdGUgc3BhY2Ugb24gdGhlIGxpbmUgKi8KKwkJCWNvbnRpbnVlOwkJCQkJCQkJCS8qIGlnbm9yZSB0aGF0IGVtcHR5IGxpbmUgKi8KKwkJcHRyID0gYnVmICsgcG9zOwkJCQkJCQkJLyogYW5kIHNraXAgb3ZlciBhbnkgb2YgdGhhdCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKworCQlpZiAoKHB0cjIgPSBzdHJzdHIocHRyLCAiX0lfIikpID09IE5VTEwpCQkvKiBza2lwIGFueSBsaW5lcyB0aGF0IGRvbid0IGhhdmUgbmFtZXMgdGhhdCBsb29rIGxpa2UgdGhleSBiZWxvbmcgdG8gSU9QcyAqLworCQkJY29udGludWU7CisJCWlmICgqKHB0cjIgKyA0KSAhPSAnXycpCQkJCQkJCS8qIGFuZCBza2lwIG90aGVyIGxpbmVzIHRoYXQgaGF2ZSBuYW1lcyB0aGF0IGRvbid0IGxvb2sgbGlrZSBBQ04gY29tcG9uZW50cyAqLworCQkJY29udGludWU7CisJCSoocHRyICsgc3RyY3NwbihwdHIsICIgXHQiKSkgPSAnXDAnOwkJCS8qIG51bGwgdGVybWluYXRlIHRoZSBJUCBhZGRyZXNzIHNvIGl0cyBhIHN0YW5kYWxvbmUgc3RyaW5nICovCisKKwkJY2hhc3NpcyA9ICoocHRyMiArIDMpIC0gJzAnOwkJCQkJLyogZXh0cmFjdCB0aGUgY2hhc3NpcyBudW1iZXIgKi8KKwkJZ2Vvc2xvdCA9ICoocHRyMiArIDUpIC0gJzAnOwkJCQkJLyogYW5kIGdlby1zbG90IG51bWJlciAqLworCQlpZiAoY2hhc3NpcyA8IDEgfHwgY2hhc3NpcyA+IE1BWF9DSEFTU0lTIHx8CisJCQlnZW9zbG90IDwgMSB8fCBnZW9zbG90ID4gTUFYX0dFT1NMT1QpIHsJCS8qIGlmIHRoZSBjaGFzc2lzIGFuZC9vciBzbG90IG51bWJlcnMgYXBwZWFyIHRvIGJlIGJhZC4uLiAqLworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiSW52YWxpZCBBQ04gbmFtZSBpbiAnL2V0Yy9ob3N0cycuIik7CS8qIHdhcm4gdGhlIHVzZXIgKi8KKwkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQkJCQkJLyogYW5kIGlnbm9yZSB0aGUgZW50cnkgKi8KKwkJfQorCQlpZiAoKHB0cjIgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ocHRyKSArIDEpKSA9PSBOVUxMKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKwkJc3RyY3B5KHB0cjIsIHB0cik7CQkJCQkJCQkvKiBjb3B5IHRoZSBJUCBhZGRyZXNzIGludG8gb3VyIG1hbGxvYydlZCBtZW1vcnkgKi8KKwkJdSA9ICZ1bml0c1tjaGFzc2lzXVtnZW9zbG90XTsKKwkJdS0+aXAgPSBwdHIyOwkJCQkJCQkJCS8qIGFuZCByZW1lbWJlciB0aGUgd2hvbGUgc2hlYmFuZyAqLworCQl1LT5jaGFzc2lzID0gY2hhc3NpczsKKwkJdS0+Z2Vvc2xvdCA9IGdlb3Nsb3Q7CisJfQorCWZjbG9zZShmcCk7CisJaWYgKCplcnJidWYpCXJldHVybiAtMTsKKwllbHNlCQkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl93aXRoX0lPUCh1bml0X3QgICp1LCBpbnQgZmxhZykgeworCWludAkJCQkJc29ja2ZkOworCWNoYXIJCQkJKmlwOworCisJaWYgKHUtPnNlcnZfYWRkciA9PSBOVUxMKSB7CisJCXUtPnNlcnZfYWRkciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisKKwkJLyogc2luY2Ugd2UgY2FsbGVkIG1hbGxvYygpLCBsZXRzIGNoZWNrIHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBnb3QgdGhlIG1lbW9yeQkqLworCQlpZiAodS0+c2Vydl9hZGRyID09IE5VTEwpIHsJLyogb29wcywgd2UgZGlkbid0IGdldCB0aGUgbWVtb3J5IHJlcXVlc3RlZAkqLworCQkJZnByaW50ZihzdGRlcnIsICJtYWxsb2MoKSByZXF1ZXN0IGZvciB1LT5zZXJ2X2FkZHIgZmFpbGVkLCB2YWx1ZSBvZiBlcnJubyBpczogJWRcbiIsIGVycm5vKTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisJaXAgPSB1LT5pcDsKKwkvKiBiemVybygpIGlzIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIHdpdGggbWVtc2V0KCkJKi8KKwltZW1zZXQoKGNoYXIgKil1LT5zZXJ2X2FkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwl1LT5zZXJ2X2FkZHItPnNpbl9mYW1pbHkJCT0gQUZfSU5FVDsKKwl1LT5zZXJ2X2FkZHItPnNpbl9hZGRyLnNfYWRkcgk9IGluZXRfYWRkcihpcCk7CisJdS0+c2Vydl9hZGRyLT5zaW5fcG9ydAkJCT0gaHRvbnMoSU9QX1NOSUZGRVJfUE9SVCk7CisKKwlpZiAoKHNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBjYXAgY2FuJ3Qgb3BlbiBhIHNvY2tldCBmb3IgY29ubmVjdGluZyB0byBJT1AgYXQgJXNcbiIsIGlwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKXUtPnNlcnZfYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBjYXAgY2FuJ3QgY29ubmVjdCB0byBJT1AgYXQgJXNcbiIsIGlwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmbGFnID09IExJVkUpCXUtPmZkID0gc29ja2ZkOworCWVsc2UJCQkJdS0+ZmluZF9mZCA9IHNvY2tmZDsKKwl1LT5maXJzdF90aW1lID0gMDsKKwlyZXR1cm4gc29ja2ZkOwkJCS8qIHJldHVybiB0aGUgbm9uLXplcm8gZmlsZSBkZXNjcmlwdG9yIGFzIGEgJ3N1Y2Nlc3MnIGluZGljYXRvciAqLworfQorCitzdGF0aWMgdm9pZCBjbG9zZV93aXRoX0lPUChpbnQgY2hhc3NpcywgaW50IGdlb3Nsb3QsIGludCBmbGFnKSB7CisJaW50CQkqaWQ7CisKKwlpZiAoZmxhZyA9PSBMSVZFKQlpZCA9ICZ1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5mZDsKKwllbHNlCQkJCWlkID0gJnVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmZpbmRfZmQ7CisKKwlpZiAoKmlkKSB7CQkJCQkJCQkJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IHRpbWUsIHNvLi4uIGlmIHdlIGFyZSBjb25uZWN0ZWQuLi4gKi8KKwkJY2xvc2UoKmlkKTsJCQkJCQkJCQkvKiBkaXNjb25uZWN0IHVzICovCisJCSppZCA9IDA7CQkJCQkJCQkJLyogYW5kIGZvcmdldCB0aGF0IHRoZSBkZXNjcmlwdG9yIGV4aXN0cyBiZWNhdXNlIHdlIGFyZSBub3Qgb3BlbiAqLworCX0KK30KKworc3RhdGljIHZvaWQgcGNhcF9jbGVhbnVwX2FjbihwY2FwX3QgKmhhbmRsZSkgeworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJKnU7CisKKwlpZiAoZmluZF91bml0X2J5X2ZkKGhhbmRsZS0+ZmQsICZjaGFzc2lzLCAmZ2Vvc2xvdCwgJnUpID09IDApCisJCXJldHVybjsKKwljbG9zZV93aXRoX0lPUChjaGFzc2lzLCBnZW9zbG90LCBMSVZFKTsKKwlpZiAodSkKKwkJdS0+Zmlyc3RfdGltZSA9IDA7CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfdG9fZmQoaW50IGZkLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzdHIpIHsKKwlpbnQJCW53cml0dGVuOworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCWlmICgobndyaXR0ZW4gPSB3cml0ZShmZCwgc3RyLCBsZW4pKSA8PSAwKSB7CisJCQlmaW5kX3VuaXRfYnlfZmQoZmQsICZjaGFzc2lzLCAmZ2Vvc2xvdCwgTlVMTCk7CisJCQlpZiAodW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF0uZmQgPT0gZmQpCQkJY2xvc2Vfd2l0aF9JT1AoY2hhc3NpcywgZ2Vvc2xvdCwgTElWRSk7CisJCQllbHNlIGlmICh1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5maW5kX2ZkID09IGZkKQljbG9zZV93aXRoX0lPUChjaGFzc2lzLCBnZW9zbG90LCBGSU5EKTsKKwkJCWVtcHR5X3VuaXQoY2hhc3NpcywgZ2Vvc2xvdCk7CisJCQlyZXR1cm47CisJCX0KKwkJbGVuIC09IG53cml0dGVuOworCQlzdHIgKz0gbndyaXR0ZW47CisJfQorfQorCitzdGF0aWMgdm9pZCBhY25fZnJlZWFsbGRldnModm9pZCkgeworCisJcGNhcF9pZl90CSppZmYsICpuZXh0X2lmZjsKKwlwY2FwX2FkZHJfdAkqYWRkciwgKm5leHRfYWRkcjsKKworCWZvciAoaWZmID0gYWNuX2lmX2xpc3Q7IGlmZiAhPSBOVUxMOyBpZmYgPSBuZXh0X2lmZikgeworCQluZXh0X2lmZiA9IGlmZi0+bmV4dDsKKwkJZm9yIChhZGRyID0gaWZmLT5hZGRyZXNzZXM7IGFkZHIgIT0gTlVMTDsgYWRkciA9IG5leHRfYWRkcikgeworCQkJbmV4dF9hZGRyID0gYWRkci0+bmV4dDsKKwkJCWlmIChhZGRyLT5hZGRyKQkJCWZyZWUoYWRkci0+YWRkcik7CisJCQlpZiAoYWRkci0+bmV0bWFzaykJCWZyZWUoYWRkci0+bmV0bWFzayk7CisJCQlpZiAoYWRkci0+YnJvYWRhZGRyKQlmcmVlKGFkZHItPmJyb2FkYWRkcik7CisJCQlpZiAoYWRkci0+ZHN0YWRkcikJCWZyZWUoYWRkci0+ZHN0YWRkcik7CisJCQlmcmVlKGFkZHIpOworCQl9CisJCWlmIChpZmYtPm5hbWUpCQkJZnJlZShpZmYtPm5hbWUpOworCQlpZiAoaWZmLT5kZXNjcmlwdGlvbikJZnJlZShpZmYtPmRlc2NyaXB0aW9uKTsKKwkJZnJlZShpZmYpOworCX0KK30KKworc3RhdGljIHZvaWQgbm9uVW5pZmllZF9JT1BfcG9ydF9uYW1lKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIGNvbnN0IGNoYXIgKnByb3RvLCB1bml0X3QgKnUpIHsKKworCXNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgIiVzXyVkXyVkIiwgcHJvdG8sIHUtPmNoYXNzaXMsIHUtPmdlb3Nsb3QpOworfQorCitzdGF0aWMgdm9pZCB1bmlmaWVkX0lPUF9wb3J0X25hbWUoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgY29uc3QgY2hhciAqcHJvdG8sIHVuaXRfdCAqdSwgaW50IElPUHBvcnRudW0pIHsKKwlpbnQJCQlwb3J0bnVtOworCisJcG9ydG51bSA9ICgodS0+Y2hhc3NpcyAtIDEpICogNjQpICsgKCh1LT5nZW9zbG90IC0gMSkgKiA4KSArIElPUHBvcnRudW0gKyAxOworCXNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgIiVzXyVkIiwgcHJvdG8sIHBvcnRudW0pOworfQorCitzdGF0aWMgY2hhciAqdHJhbnNsYXRlX0lPUF90b19wY2FwX25hbWUodW5pdF90ICp1LCBjaGFyICpJT1BuYW1lLCBicGZfdV9pbnQzMiBpZnR5cGUpIHsKKwlpZmFjZV90CQkqaWZhY2VfcHRyLCAqaWZhY2U7CisJY2hhcgkJKm5hbWU7CisJY2hhcgkJYnVmWzMyXTsKKwljaGFyCQkqcHJvdG87CisJY2hhcgkJKnBvcnQ7CisJaW50CQkJSU9QcG9ydG51bSA9IDA7CisKKwlpZmFjZSA9IG1hbGxvYyhzaXplb2YoaWZhY2VfdCkpOwkJLyogZ2V0IG1lbW9yeSBmb3IgYSBzdHJ1Y3R1cmUgKi8KKwlpZiAoaWZhY2UgPT0gTlVMTCkgewkvKiBvb3BzLCB3ZSBkaWRuJ3QgZ2V0IHRoZSBtZW1vcnkgcmVxdWVzdGVkCSovCisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IuLi5jb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGludGVyZmFjZSBzdHJ1Y3R1cmUuLi52YWx1ZSBvZiBlcnJubyBpczogJWRcbiIsIGVycm5vKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCgoY2hhciAqKWlmYWNlLCAwLCBzaXplb2YoaWZhY2VfdCkpOwkvKiBiemVybyBpcyBkZXByZWNhdGVkKCksIHJlcGxhY2VkIHdpdGggbWVtc2V0KCkgKi8KKworCWlmYWNlLT5pZnR5cGUgPSBpZnR5cGU7CQkJCQkvKiByZW1lbWJlciB0aGUgaW50ZXJmYWNlIHR5cGUgb2YgdGhpcyBpbnRlcmZhY2UgKi8KKworCW5hbWUgPSBtYWxsb2Moc3RybGVuKElPUG5hbWUpICsgMSk7CQkvKiBnZXQgbWVtb3J5IGZvciB0aGUgSU9QJ3MgbmFtZSAqLworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7ICAgIC8qIG9vcHMsIHdlIGRpZG4ndCBnZXQgdGhlIG1lbW9yeSByZXF1ZXN0ZWQgICAgICovCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvci4uLmNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgSU9QbmFtZS4uLnZhbHVlIG9mIGVycm5vIGlzOiAlZFxuIiwgZXJybm8pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKwlzdHJjcHkobmFtZSwgSU9QbmFtZSk7CQkJCQkvKiBhbmQgY29weSBpdCBpbiAqLworCWlmYWNlLT5JT1BuYW1lID0gbmFtZTsJCQkJCS8qIGFuZCBzdGljayBpdCBpbnRvIHRoZSBzdHJ1Y3R1cmUgKi8KKworCWlmIChzdHJuY21wKElPUG5hbWUsICJsbyIsIDIpID09IDApIHsKKwkJSU9QcG9ydG51bSA9IGF0b2koJklPUG5hbWVbMl0pOworCQlzd2l0Y2ggKGlmdHlwZSkgeworCQkJY2FzZSBETFRfRU4xME1COgorCQkJCW5vblVuaWZpZWRfSU9QX3BvcnRfbmFtZShidWYsIHNpemVvZiBidWYsICJsbyIsIHUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1bmlmaWVkX0lPUF9wb3J0X25hbWUoYnVmLCBzaXplb2YgYnVmLCAiPz8/IiwgdSwgSU9QcG9ydG51bSk7CisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHN0cm5jbXAoSU9QbmFtZSwgImV0aCIsIDMpID09IDApIHsKKwkJSU9QcG9ydG51bSA9IGF0b2koJklPUG5hbWVbM10pOworCQlzd2l0Y2ggKGlmdHlwZSkgeworCQkJY2FzZSBETFRfRU4xME1COgorCQkJCW5vblVuaWZpZWRfSU9QX3BvcnRfbmFtZShidWYsIHNpemVvZiBidWYsICJldGgiLCB1KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdW5pZmllZF9JT1BfcG9ydF9uYW1lKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIj8/PyIsIHUsIElPUHBvcnRudW0pOworCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChzdHJuY21wKElPUG5hbWUsICJ3YW4iLCAzKSA9PSAwKSB7CisJCUlPUHBvcnRudW0gPSBhdG9pKCZJT1BuYW1lWzNdKTsKKwkJc3dpdGNoIChpZnR5cGUpIHsKKwkJCWNhc2UgRExUX1NJVEE6CisJCQkJdW5pZmllZF9JT1BfcG9ydF9uYW1lKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIndhbiIsIHUsIElPUHBvcnRudW0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1bmlmaWVkX0lPUF9wb3J0X25hbWUoYnVmLCBzaXplb2YgYnVmLCAiPz8/IiwgdSwgSU9QcG9ydG51bSk7CisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yLi4uIGludmFsaWQgSU9QIG5hbWUgJXNcbiIsIElPUG5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwluYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSk7CQkJLyogZ2V0IG1lbW9yeSBmb3IgdGhhdCBuYW1lICovCisgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsgICAgLyogb29wcywgd2UgZGlkbid0IGdldCB0aGUgbWVtb3J5IHJlcXVlc3RlZCAgICAgKi8KKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yLi4uY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBJT1AgcG9ydCBuYW1lLi4udmFsdWUgb2YgZXJybm8gaXM6ICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworCXN0cmNweShuYW1lLCBidWYpOwkJCQkJCS8qIGFuZCBjb3B5IGl0IGluICovCisJaWZhY2UtPm5hbWUgPSBuYW1lOwkJCQkJCS8qIGFuZCBzdGljayBpdCBpbnRvIHRoZSBzdHJ1Y3R1cmUgKi8KKworCWlmICh1LT5pZmFjZSA9PSAwKSB7CQkJCQkvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBuYW1lICovCisJCXUtPmlmYWNlID0gaWZhY2U7CQkJCQkvKiBzdGljayB0aGlzIGVudHJ5IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisJfSBlbHNlIHsKKwkJaWZhY2VfcHRyID0gdS0+aWZhY2U7CisJCXdoaWxlIChpZmFjZV9wdHItPm5leHQpIHsJCQkvKiBvdGhld2lzZSBzY2FuIHRoZSBsaXN0ICovCisJCQlpZmFjZV9wdHIgPSBpZmFjZV9wdHItPm5leHQ7CS8qIHRpbGwgd2UncmUgYXQgdGhlIGxhc3QgZW50cnkgKi8KKwkJfQorCQlpZmFjZV9wdHItPm5leHQgPSBpZmFjZTsJCQkvKiB0aGVuIHRhY2sgdGhpcyBlbnRyeSBvbiB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJfQorCXJldHVybiBpZmFjZS0+bmFtZTsKK30KKworc3RhdGljIGludCBpZl9zb3J0KGNoYXIgKnMxLCBjaGFyICpzMikgeworCWNoYXIJKnMxX3AyLCAqczJfcDI7CisJY2hhcglzdHIxW01BWF9MSU5FX1NJWkVdLCBzdHIyW01BWF9MSU5FX1NJWkVdOworCWludAkJczFfcDFfbGVuLCBzMl9wMV9sZW47CisJaW50CQlyZXR2YWw7CisKKwlpZiAoKHMxX3AyID0gc3RyY2hyKHMxLCAnXycpKSkgewkvKiBpZiBhbiB1bmRlcnNjb3JlIGlzIGZvdW5kLi4uICovCisJCXMxX3AxX2xlbiA9IHMxX3AyIC0gczE7CQkJLyogdGhlIHByZWZpeCBsZW5ndGggaXMgdGhlIGRpZmZlcmVuY2UgaW4gcG9pbnRlcnMgKi8KKwkJczFfcDIrKzsJCQkJCQkvKiB0aGUgc3VmZml4IGFjdHVhbGx5IHN0YXJ0cyBfYWZ0ZXJfIHRoZSB1bmRlcnNjb3JlICovCisJfSBlbHNlIHsJCQkJCQkJLyogb3RoZXJ3aXNlLi4uICovCisJCXMxX3AxX2xlbiA9IHN0cmxlbihzMSk7CQkJLyogdGhlIHByZWZpeCBsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGl0c2VsZiAqLworCQlzMV9wMiA9IDA7CQkJCQkJLyogYW5kIHRoZXJlIGlzIG5vIHN1ZmZpeCAqLworCX0KKwlpZiAoKHMyX3AyID0gc3RyY2hyKHMyLCAnXycpKSkgewkvKiBub3cgZG8gdGhlIHNhbWUgZm9yIHRoZSBzZWNvbmQgc3RyaW5nICovCisJCXMyX3AxX2xlbiA9IHMyX3AyIC0gczI7CisJCXMyX3AyKys7CisJfSBlbHNlIHsKKwkJczJfcDFfbGVuID0gc3RybGVuKHMyKTsKKwkJczJfcDIgPSAwOworCX0KKwlzdHJuY3B5KHN0cjEsIHMxLCAoczFfcDFfbGVuID4gc2l6ZW9mKHN0cjEpKSA/IHMxX3AxX2xlbiA6IHNpemVvZihzdHIxKSk7ICAgKihzdHIxICsgczFfcDFfbGVuKSA9IDA7CisJc3RybmNweShzdHIyLCBzMiwgKHMyX3AxX2xlbiA+IHNpemVvZihzdHIyKSkgPyBzMl9wMV9sZW4gOiBzaXplb2Yoc3RyMikpOyAgICooc3RyMiArIHMyX3AxX2xlbikgPSAwOworCXJldHZhbCA9IHN0cmNtcChzdHIxLCBzdHIyKTsKKwlpZiAocmV0dmFsICE9IDApIHJldHVybiByZXR2YWw7CQkvKiBpZiB0aGV5IGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIHdlIGNhbiBxdWl0IG5vdyBhbmQgcmV0dXJuIHRoZSBpbmRpY2F0aW9uICovCisJcmV0dXJuIHN0cmNtcChzMV9wMiwgczJfcDIpOwkJLyogb3RoZXJ3aXNlIHdlIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB0aGUgMm5kIGhhbGYgb2YgdGhlIHN0cmluZyAqLworfQorCitzdGF0aWMgdm9pZCBzb3J0X2lmX3RhYmxlKHZvaWQpIHsKKwlwY2FwX2lmX3QJKnAxLCAqcDIsICpwcmV2LCAqdGVtcDsKKwlpbnQJCQloYXNfc3dhcHBlZDsKKworCWlmICghYWNuX2lmX2xpc3QpIHJldHVybjsJCQkJLyogbm90aGluZyB0byBkbyBpZiB0aGUgbGlzdCBpcyBlbXB0eSAqLworCisJd2hpbGUgKDEpIHsKKwkJcDEgPSBhY25faWZfbGlzdDsJCQkJCS8qIHN0YXJ0IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisJCXByZXYgPSAwOworCQloYXNfc3dhcHBlZCA9IDA7CisJCXdoaWxlICgocDIgPSBwMS0+bmV4dCkpIHsKKwkJCWlmIChpZl9zb3J0KHAxLT5uYW1lLCBwMi0+bmFtZSkgPiAwKSB7CisJCQkJaWYgKHByZXYpIHsJCQkJCS8qIHdlIGFyZSBzd2FwcGluZyB0aGluZ3MgdGhhdCBhcmUgX25vdF8gYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwkJCQkJdGVtcCA9IHAyLT5uZXh0OworCQkJCQlwcmV2LT5uZXh0ID0gcDI7CisJCQkJCXAyLT5uZXh0ID0gcDE7CisJCQkJCXAxLT5uZXh0ID0gdGVtcDsKKwkJCQl9IGVsc2UgewkJCQkJLyogc3BlY2lhbCB0cmVhdG1lbnQgaWYgd2UgYXJlIHN3YXBwaW5nIHdpdGggdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwkJCQkJdGVtcCA9IHAyLT5uZXh0OworCQkJCQlhY25faWZfbGlzdD0gcDI7CisJCQkJCXAyLT5uZXh0ID0gcDE7CisJCQkJCXAxLT5uZXh0ID0gdGVtcDsKKwkJCQl9CisJCQkJcDEgPSBwMjsKKwkJCQlwcmV2ID0gcDE7CisJCQkJaGFzX3N3YXBwZWQgPSAxOworCQkJfQorCQkJcHJldiA9IHAxOworCQkJcDEgPSBwMS0+bmV4dDsKKwkJfQorCQlpZiAoaGFzX3N3YXBwZWQgPT0gMCkKKwkJCXJldHVybjsKKwl9CQorCXJldHVybjsKK30KKwkKK3N0YXRpYyBpbnQgcHJvY2Vzc19jbGllbnRfZGF0YSAoY2hhciAqZXJyYnVmKSB7CQkJCQkJCQkvKiByZXR1cm5zOiAtMSA9IGVycm9yLCAwID0gT0sgKi8KKwlpbnQJCQkJCWNoYXNzaXMsIGdlb3Nsb3Q7CisJdW5pdF90CQkJCSp1OworCXBjYXBfaWZfdAkJCSppZmYsICpwcmV2X2lmZjsKKwlwY2FwX2FkZHJfdAkJCSphZGRyLCAqcHJldl9hZGRyOworCWNoYXIJCQkJKnB0cjsKKwlpbnQJCQkJCWFkZHJlc3NfY291bnQ7CisJc3RydWN0IHNvY2thZGRyX2luCSpzOworCWNoYXIJCQkJKm5ld25hbWU7CisJYnBmX3VfaW50MzIJCQkJaW50ZXJmYWNlVHlwZTsKKwl1bnNpZ25lZCBjaGFyCQlmbGFnczsKKworCXByZXZfaWZmID0gMDsKKwlmb3IgKGNoYXNzaXMgPSAwOyBjaGFzc2lzIDw9IE1BWF9DSEFTU0lTOyBjaGFzc2lzKyspIHsKKwkJZm9yIChnZW9zbG90ID0gMDsgZ2Vvc2xvdCA8PSBNQVhfR0VPU0xPVDsgZ2Vvc2xvdCsrKSB7CQkJCS8qIG5vdyBsb29wIG92ZXIgYWxsIHRoZSBkZXZpY2VzICovCisJCQl1ID0gJnVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdOworCQkJZW1wdHlfdW5pdF9pZmFjZSh1KTsKKwkJCXB0ciA9IHUtPmltc2c7CQkJCQkJCQkJCQkJCS8qIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgbXNnIGZvciB0aGlzIElPUCAqLworCQkJd2hpbGUgKHB0ciA8ICh1LT5pbXNnICsgdS0+bGVuKSkgeworCQkJCWlmICgoaWZmID0gbWFsbG9jKHNpemVvZihwY2FwX2lmX3QpKSkgPT0gTlVMTCkgeworCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCW1lbXNldCgoY2hhciAqKWlmZiwgMCwgc2l6ZW9mKHBjYXBfaWZfdCkpOyAvKiBiemVybygpIGlzIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIHdpdGggbWVtc2V0KCkgKi8KKwkJCQlpZiAoYWNuX2lmX2xpc3QgPT0gMCkJYWNuX2lmX2xpc3QgPSBpZmY7CQkJCQkvKiByZW1lbWJlciB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQkJCWlmIChwcmV2X2lmZikJCQlwcmV2X2lmZi0+bmV4dCA9IGlmZjsJCQkJLyogaW5zZXJ0IGEgZm9yd2FyZCBsaW5rICovCisKKwkJCQlpZiAoKnB0cikgewkJCQkJCQkJCQkJCQkvKiBpZiB0aGVyZSBpcyBhIGNvdW50IGZvciB0aGUgbmFtZSAqLworCQkJCQlpZiAoKGlmZi0+bmFtZSA9IG1hbGxvYygqcHRyICsgMSkpID09IE5VTEwpIHsJCQkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KKwkJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQkJbWVtY3B5KGlmZi0+bmFtZSwgKHB0ciArIDEpLCAqcHRyKTsJCQkJCQkvKiBjb3B5IHRoZSBuYW1lIGludG8gdGhlIG1hbGxvYydlZCBzcGFjZSAqLworCQkJCQkqKGlmZi0+bmFtZSArICpwdHIpID0gMDsJCQkJCQkJCS8qIGFuZCBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJCXB0ciArPSAqcHRyOwkJCQkJCQkJCQkJLyogbm93IG1vdmUgdGhlIHBvaW50ZXIgZm9yd2FyZHMgYnkgdGhlIGxlbmd0aCBvZiB0aGUgY291bnQgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKi8KKwkJCQl9CisJCQkJcHRyKys7CisKKwkJCQlpZiAoKnB0cikgewkJCQkJCQkJCQkJCQkvKiBpZiB0aGVyZSBpcyBhIGNvdW50IGZvciB0aGUgZGVzY3JpcHRpb24gKi8KKwkJCQkJaWYgKChpZmYtPmRlc2NyaXB0aW9uID0gbWFsbG9jKCpwdHIgKyAxKSkgPT0gTlVMTCkgewkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KKwkJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQkJbWVtY3B5KGlmZi0+ZGVzY3JpcHRpb24sIChwdHIgKyAxKSwgKnB0cik7CQkJCS8qIGNvcHkgdGhlIG5hbWUgaW50byB0aGUgbWFsbG9jJ2VkIHNwYWNlICovCisJCQkJCSooaWZmLT5kZXNjcmlwdGlvbiArICpwdHIpID0gMDsJCQkJCQkJLyogYW5kIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJCQkJcHRyICs9ICpwdHI7CQkJCQkJCQkJCQkvKiBub3cgbW92ZSB0aGUgcG9pbnRlciBmb3J3YXJkcyBieSB0aGUgbGVuZ3RoIG9mIHRoZSBjb3VudCBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAqLworCQkJCX0KKwkJCQlwdHIrKzsKKworCQkJCWludGVyZmFjZVR5cGUgPSBudG9obCgqKGJwZl91X2ludDMyICopcHRyKTsKKwkJCQlwdHIgKz0gNDsJCQkJCQkJCQkJCQkJLyogc2tpcCBvdmVyIHRoZSBpbnRlcmZhY2UgdHlwZSAqLworCisJCQkJZmxhZ3MgPSAqcHRyKys7CisJCQkJaWYgKGZsYWdzKSBpZmYtPmZsYWdzID0gUENBUF9JRl9MT09QQkFDSzsJCQkJCS8qIGlmIHRoaXMgaXMgYSBsb29wYmFjayBzdHlsZSBpbnRlcmZhY2UsIGxldHMgbWFyayBpdCBhcyBzdWNoICovCisKKwkJCQlhZGRyZXNzX2NvdW50ID0gKnB0cisrOworCisJCQkJcHJldl9hZGRyID0gMDsKKwkJCQl3aGlsZSAoYWRkcmVzc19jb3VudC0tKSB7CisJCQkJCWlmICgoYWRkciA9IG1hbGxvYyhzaXplb2YocGNhcF9hZGRyX3QpKSkgPT0gTlVMTCkgeworCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorKwkJCQkJbWVtc2V0KChjaGFyICopYWRkciwgMCwgc2l6ZW9mKHBjYXBfYWRkcl90KSk7IC8qIGJ6ZXJvKCkgaXMgZGVwcmVjYXRlZCwgcmVwbGFjZWQgd2l0aCBtZW1zZXQoKSAqLworCQkJCQlpZiAoaWZmLT5hZGRyZXNzZXMgPT0gMCkgaWZmLT5hZGRyZXNzZXMgPSBhZGRyOworCQkJCQlpZiAocHJldl9hZGRyKSBwcmV2X2FkZHItPm5leHQgPSBhZGRyOwkJCQkJCQkvKiBpbnNlcnQgYSBmb3J3YXJkIGxpbmsgKi8KKwkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkJCS8qIGlmIHRoZXJlIGlzIGEgY291bnQgZm9yIHRoZSBhZGRyZXNzICovCisJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7CQkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KKwkJCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCX0KKwkJCQkJCW1lbXNldCgoY2hhciAqKXMsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsgLyogYnplcm8oKSBpcyBkZXByZWNhdGVkLCByZXBsYWNlZCB3aXRoIG1lbXNldCgpICovCisJCQkJCQlhZGRyLT5hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKXM7CisJCQkJCQlzLT5zaW5fZmFtaWx5CQk9IEFGX0lORVQ7CisJCQkJCQlzLT5zaW5fYWRkci5zX2FkZHIJPSAqKGJwZl91X2ludDMyICopKHB0ciArIDEpOwkJCS8qIGNvcHkgdGhlIGFkZHJlc3MgaW4gKi8KKwkJCQkJCXB0ciArPSAqcHRyOwkJCQkJCQkJCQkvKiBub3cgbW92ZSB0aGUgcG9pbnRlciBmb3J3YXJkcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGggb2YgdGhlIGFkZHJlc3MgKi8KKwkJCQkJfQorCQkJCQlwdHIrKzsJCQkJCQkJCQkJCQkJLyogdGhlbiBmb3J3YXJkcyBvbmUgbW9yZSBmb3IgdGhlICdsZW5ndGggb2YgdGhlIGFkZHJlc3MnIGZpZWxkICovCisJCQkJCWlmICgqcHRyKSB7CQkJCQkJCQkJCQkJLyogcHJvY2VzcyBhbnkgbmV0bWFzayAqLworCQkJCQkJaWYgKChzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSkgPT0gTlVMTCkgeworCQkJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCQkJcmV0dXJuIC0xOworCQkJCQkJfQorCQkJCQkJLyogYnplcm8oKSBpcyBkZXByZWNhdGVkLCByZXBsYWNlZCB3aXRoIG1lbXNldCgpICovCisJCQkJCQltZW1zZXQoKGNoYXIgKilzLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisKKwkJCQkJCWFkZHItPm5ldG1hc2sgPSAoc3RydWN0IHNvY2thZGRyICopczsKKwkJCQkJCXMtPnNpbl9mYW1pbHkJCT0gQUZfSU5FVDsKKwkJCQkJCXMtPnNpbl9hZGRyLnNfYWRkcgk9ICooYnBmX3VfaW50MzIqKShwdHIgKyAxKTsKKwkJCQkJCXB0ciArPSAqcHRyOworCQkJCQl9CisJCQkJCXB0cisrOworCQkJCQlpZiAoKnB0cikgewkJCQkJCQkJCQkJCS8qIHByb2Nlc3MgYW55IGJyb2FkY2FzdCBhZGRyZXNzICovCisJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7CisJCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCQlyZXR1cm4gLTE7CisJCQkJCQl9CisJCQkJCQkvKiBiemVybygpIGlzIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIHdpdGggbWVtc2V0KCkgKi8KKwkJCQkJCW1lbXNldCgoY2hhciAqKXMsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworCQkJCQkJYWRkci0+YnJvYWRhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKXM7CisJCQkJCQlzLT5zaW5fZmFtaWx5CQk9IEFGX0lORVQ7CisJCQkJCQlzLT5zaW5fYWRkci5zX2FkZHIJPSAqKGJwZl91X2ludDMyKikocHRyICsgMSk7CisJCQkJCQlwdHIgKz0gKnB0cjsKKwkJCQkJfQorCQkJCQlwdHIrKzsKKwkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkvKiBwcm9jZXNzIGFueSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7CisJCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCQlyZXR1cm4gLTE7CisJCQkJCQl9CisJCQkJCQkvKiBiemVybygpIGlzIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIHdpdGggbWVtc2V0KCkgKi8KKwkJCQkJCW1lbXNldCgoY2hhciAqKXMsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworCQkJCQkJYWRkci0+ZHN0YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilzOworCQkJCQkJcy0+c2luX2ZhbWlseQkJPSBBRl9JTkVUOworCQkJCQkJcy0+c2luX2FkZHIuc19hZGRyCT0gKihicGZfdV9pbnQzMiopKHB0ciArIDEpOworCQkJCQkJcHRyICs9ICpwdHI7CisJCQkJCX0KKwkJCQkJcHRyKys7CisJCQkJCXByZXZfYWRkciA9IGFkZHI7CisJCQkJfQorCQkJCXByZXZfaWZmID0gaWZmOworCisJCQkJbmV3bmFtZSA9IHRyYW5zbGF0ZV9JT1BfdG9fcGNhcF9uYW1lKHUsIGlmZi0+bmFtZSwgaW50ZXJmYWNlVHlwZSk7CQkvKiBhZGQgYSB0cmFuc2xhdGlvbiBlbnRyeSBhbmQgZ2V0IGEgcG9pbnQgdG8gdGhlIG1hbmdsZWQgbmFtZSAqLworCQkJCWlmICgoaWZmLT5uYW1lID0gcmVhbGxvYyhpZmYtPm5hbWUsIHN0cmxlbihuZXduYW1lKSArIDEpKSA9PSBOVUxMKSB7CS8qIHdlIG5vdyByZS13cml0ZSB0aGUgbmFtZSBzdG9yZWQgaW4gdGhlIGludGVyZmFjZSBsaXN0ICovCisJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXN0cmNweShpZmYtPm5hbWUsIG5ld25hbWUpOwkJCQkJCQkJCQkJCS8qIHRvIHRoaXMgbmV3IG5hbWUgKi8KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2NsaWVudF9kYXRhIChpbnQgZmQpIHsKKwl1bnNpZ25lZCBjaGFyCWJ1ZlsyNTZdOworCWludAkJCQljaGFzc2lzLCBnZW9zbG90OworCXVuaXRfdAkJCSp1OworCWludAkJCQlsZW47CisKKwlmaW5kX3VuaXRfYnlfZmQoZmQsICZjaGFzc2lzLCAmZ2Vvc2xvdCwgJnUpOworCisJaWYgKChsZW4gPSByZWN2KGZkLCBidWYsIHNpemVvZihidWYpLCAwKSkgPD0gMCkJcmV0dXJuIDA7CS8qIHJlYWQgaW4gd2hhdGV2ZXIgZGF0YSB3YXMgc2VudCB0byB1cyAqLworCisJaWYgKCh1LT5pbXNnID0gcmVhbGxvYyh1LT5pbXNnLCAodS0+bGVuICsgbGVuKSkpID09IE5VTEwpCS8qIGV4dGVuZCB0aGUgYnVmZmVyIGZvciB0aGUgbmV3IGRhdGEgKi8KKwkJcmV0dXJuIDA7CisJbWVtY3B5KCh1LT5pbXNnICsgdS0+bGVuKSwgYnVmLCBsZW4pOwkJCQkJCS8qIGFwcGVuZCB0aGUgbmV3IGRhdGEgKi8KKwl1LT5sZW4gKz0gbGVuOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxfYW5zd2Vycyh2b2lkKSB7CisJaW50CQlyZXR2YWw7CisJc3RydWN0CXRpbWV2YWwgdHY7CisJaW50CQlmZDsKKwlpbnQJCWNoYXNzaXMsIGdlb3Nsb3Q7CisKKwl0di50dl9zZWMgPSAyOworCXR2LnR2X3VzZWMgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGZsYWcgPSAwOworCQlmZF9zZXQgd29ya2luZ19zZXQ7CisKKwkJZm9yIChmZCA9IDA7IGZkIDw9IG1heF9mczsgZmQrKykgewkJCQkJCQkJLyogc2NhbiB0aGUgbGlzdCBvZiBkZXNjcmlwdG9ycyB3ZSBtYXkgYmUgbGlzdGVuaW5nIHRvICovCisJCQlpZiAoRkRfSVNTRVQoZmQsICZyZWFkZmRzKSkgZmxhZyA9IDE7CQkJCQkJLyogYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IHN0aWxsIHNldCAqLworCQl9CisJCWlmIChmbGFnID09IDApIHJldHVybjsJCQkJCQkJCQkJCS8qIHdlIGFyZSBkb25lLCB3aGVuIHRoZXkgYXJlIGFsbCBnb25lICovCisKKwkJbWVtY3B5KCZ3b3JraW5nX3NldCwgJnJlYWRmZHMsIHNpemVvZihyZWFkZmRzKSk7CQkJCS8qIG90aGVyd2lzZSwgd2Ugc3RpbGwgaGF2ZSB0byBsaXN0ZW4gZm9yIG1vcmUgc3R1ZmYsIHRpbGwgd2UgdGltZW91dCAqLworCQlyZXR2YWwgPSBzZWxlY3QobWF4X2ZzICsgMSwgJndvcmtpbmdfc2V0LCBOVUxMLCBOVUxMLCAmdHYpOworCQlpZiAocmV0dmFsID09IC0xKSB7CQkJCQkJCQkJCQkJLyogYW4gZXJyb3Igb2NjdXJlZCAhISEhISAqLworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKHJldHZhbCA9PSAwKSB7CQkJCQkJCQkJCS8qIHRpbWVvdXQgb2NjdXJlZCwgc28gcHJvY2VzcyB3aGF0IHdlJ3ZlIGdvdCBzb2ZhciBhbmQgcmV0dXJuICovCisJCQlwcmludGYoInRpbWVvdXRcbiIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJZm9yIChmZCA9IDA7IGZkIDw9IG1heF9mczsgZmQrKykgewkJCQkJCQkvKiBzY2FuIHRoZSBsaXN0IG9mIHRoaW5ncyB0byBkbywgYW5kIGRvIHRoZW0gKi8KKwkJCQlpZiAoRkRfSVNTRVQoZmQsICZ3b3JraW5nX3NldCkpIHsKKwkJCQkJaWYgKHJlYWRfY2xpZW50X2RhdGEoZmQpID09IDApIHsJCQkJCS8qIGlmIHRoZSBzb2NrZXQgaGFzIGNsb3NlZCAqLworCQkJCQkJRkRfQ0xSKGZkLCAmcmVhZGZkcyk7CQkJCQkJCS8qIGFuZCBkZXNjcmlwdG9ycyB3ZSBsaXN0ZW4gdG8gZm9yIGVycm9ycyAqLworCQkJCQkJZmluZF91bml0X2J5X2ZkKGZkLCAmY2hhc3NpcywgJmdlb3Nsb3QsIE5VTEwpOworCQkJCQkJY2xvc2Vfd2l0aF9JT1AoY2hhc3NpcywgZ2Vvc2xvdCwgRklORCk7CQkJLyogYW5kIGNsb3NlIG91dCBjb25uZWN0aW9uIHRvIGhpbSAqLworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqZ2V0X2Vycm9yX3Jlc3BvbnNlKGludCBmZCwgY2hhciAqZXJyYnVmKSB7CQkvKiByZXR1cm4gYSBwb2ludGVyIG9uIGVycm9yLCBOVUxMIG9uIG5vIGVycm9yICovCisJY2hhcglieXRlOworCWludAkJbGVuID0gMDsKKworCXdoaWxlICgxKSB7CisJCXJlY3YoZmQsICZieXRlLCAxLCAwKTsJCQkJCQkJLyogcmVhZCBhbm90aGVyIGJ5dGUgaW4gKi8KKwkJaWYgKGVycmJ1ZiAmJiAobGVuKysgPCBQQ0FQX0VSUkJVRl9TSVpFKSkgewkJLyogYW5kIGlmIHRoZXJlIGlzIHN0aWxsIHJvb20gaW4gdGhlIGJ1ZmZlciAqLworCQkJKmVycmJ1ZisrID0gYnl0ZTsJCQkJCQkJLyogc3RpY2sgaXQgaW4gKi8KKwkJCSplcnJidWYgPSAnXDAnOwkJCQkJCQkJLyogZW5zdXJlIHRoZSBzdHJpbmcgaXMgbnVsbCB0ZXJtaW5hdGVkIGp1c3QgaW4gY2FzZSB3ZSBtaWdodCBleGNlZWQgdGhlIGJ1ZmZlcidzIHNpemUgKi8KKwkJfQorCQlpZiAoYnl0ZSA9PSAnXDAnKSB7CisJCQlpZiAobGVuID4gMSkJeyByZXR1cm4gZXJyYnVmOwl9CisJCQllbHNlCQkJeyByZXR1cm4gTlVMTDsJCX0KKwkJfQorCX0KK30KKworaW50IGFjbl9maW5kYWxsZGV2cyhjaGFyICplcnJidWYpIHsJCQkJCQkJCS8qIHJldHVybnM6IC0xID0gZXJyb3IsIDAgPSBPSyAqLworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJKnU7CisKKwlGRF9aRVJPKCZyZWFkZmRzKTsKKwltYXhfZnMgPSAwOworCWZvciAoY2hhc3NpcyA9IDA7IGNoYXNzaXMgPD0gTUFYX0NIQVNTSVM7IGNoYXNzaXMrKykgeworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsKKwkJCXUgPSAmdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF07CisJCQlpZiAodS0+aXAgJiYgKG9wZW5fd2l0aF9JT1AodSwgRklORCkpKSB7CQkJLyogY29ubmVjdCB0byB0aGUgcmVtb3RlIElPUCAqLworCQkJCXNlbmRfdG9fZmQodS0+ZmluZF9mZCwgMSwgKHVuc2lnbmVkIGNoYXIgKikiXDAiKTsKKwkJCQlpZiAoZ2V0X2Vycm9yX3Jlc3BvbnNlKHUtPmZpbmRfZmQsIGVycmJ1ZikpCisJCQkJCWNsb3NlX3dpdGhfSU9QKGNoYXNzaXMsIGdlb3Nsb3QsIEZJTkQpOworCQkJCWVsc2UgeworCQkJCQlpZiAodS0+ZmluZF9mZCA+IG1heF9mcykKKwkJCQkJCW1heF9mcyA9IHUtPmZpbmRfZmQ7CQkJCQkJCQkvKiByZW1lbWJlciB0aGUgaGlnaGVzdCBudW1iZXIgY3VycmVudGx5IGluIHVzZSAqLworCQkJCQlGRF9TRVQodS0+ZmluZF9mZCwgJnJlYWRmZHMpOwkJCQkJCS8qIHdlIGFyZSBnb2luZyB0byB3YW50IHRvIHJlYWQgdGhpcyBndXkncyByZXNwb25zZSB0byAqLworCQkJCQl1LT5sZW4gPSAwOworCQkJCQlzZW5kX3RvX2ZkKHUtPmZpbmRfZmQsIDEsICh1bnNpZ25lZCBjaGFyICopIlEiKTsJCS8qIHRoaXMgaW50ZXJmYWNlIHF1ZXJ5IHJlcXVlc3QgKi8KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJd2FpdF9mb3JfYWxsX2Fuc3dlcnMoKTsKKwlpZiAocHJvY2Vzc19jbGllbnRfZGF0YShlcnJidWYpKQorCQlyZXR1cm4gLTE7CisJc29ydF9pZl90YWJsZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjYXBfc3RhdHNfYWNuKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykgeworCXVuc2lnbmVkIGNoYXIJYnVmWzEyXTsKKworCXNlbmRfdG9fZmQoaGFuZGxlLT5mZCwgMSwgKHVuc2lnbmVkIGNoYXIgKikiUyIpOwkJCQkJCS8qIHNlbmQgdGhlIGdldF9zdGF0cyBjb21tYW5kIHRvIHRoZSBJT1AgKi8KKworCWlmIChyZWFkX2NsaWVudF9uYnl0ZXMoaGFuZGxlLT5mZCwgc2l6ZW9mKGJ1ZiksIGJ1ZikgPT0gLTEpIHJldHVybiAtMTsJLyogdHJ5IHJlYWRpbmcgdGhlIHJlcXVpcmVkIGJ5dGVzICovCisKKwlwcy0+cHNfcmVjdgkJPSBudG9obCgqKHVpbnQzMl90ICopJmJ1ZlswXSk7CQkJCQkJCS8qIGJyZWFrIHRoZSBidWZmZXIgaW50byBpdHMgdGhyZWUgMzIgYml0IGNvbXBvbmVudHMgKi8KKwlwcy0+cHNfZHJvcAkJPSBudG9obCgqKHVpbnQzMl90ICopJmJ1Zls0XSk7CisJcHMtPnBzX2lmZHJvcAk9IG50b2hsKCoodWludDMyX3QgKikmYnVmWzhdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjbl9vcGVuX2xpdmUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZXJyYnVmLCBpbnQgKmxpbmt0eXBlKSB7CQkvKiByZXR1cm5zIDAgb24gZXJyb3IsIGVsc2UgcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yICovCisJaW50CQkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJCSp1OworCWlmYWNlX3QJCSpwOworCXBjYXBfaWZfdAkqYWxsZGV2c3A7CisKKwlwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoJmFsbGRldnNwLCBlcnJidWYpOworCWZvciAoY2hhc3NpcyA9IDA7IGNoYXNzaXMgPD0gTUFYX0NIQVNTSVM7IGNoYXNzaXMrKykgewkJCQkJCQkJCQkvKiBzY2FuIHRoZSB0YWJsZS4uLiAqLworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsKKwkJCXUgPSAmdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF07CisJCQlpZiAodS0+aXAgIT0gTlVMTCkgeworCQkJCXAgPSB1LT5pZmFjZTsKKwkJCQl3aGlsZSAocCkgewkJCQkJCQkJCQkJCQkJCQkJCS8qIGFuZCBhbGwgaW50ZXJmYWNlcy4uLiAqLworCQkJCQlpZiAocC0+SU9QbmFtZSAmJiBwLT5uYW1lICYmIChzdHJjbXAocC0+bmFtZSwgbmFtZSkgPT0gMCkpIHsJCQkJLyogYW5kIGlmIHdlIGZvdW5kIHRoZSBpbnRlcmZhY2Ugd2Ugd2FudC4uLiAqLworCQkJCQkJKmxpbmt0eXBlID0gcC0+aWZ0eXBlOworCQkJCQkJb3Blbl93aXRoX0lPUCh1LCBMSVZFKTsJCQkJCQkJCQkJCQkJLyogc3RhcnQgYSBjb25uZWN0aW9uIHdpdGggdGhhdCBJT1AgKi8KKwkJCQkJCXNlbmRfdG9fZmQodS0+ZmQsIHN0cmxlbihwLT5JT1BuYW1lKSsxLCAodW5zaWduZWQgY2hhciAqKXAtPklPUG5hbWUpOwkvKiBzZW5kIHRoZSBJT1AncyBpbnRlcmZhY2UgbmFtZSwgYW5kIGEgdGVybWluYXRpbmcgbnVsbCAqLworCQkJCQkJaWYgKGdldF9lcnJvcl9yZXNwb25zZSh1LT5mZCwgZXJyYnVmKSkgeworCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiB1LT5mZDsJCQkJCQkJCQkJCQkJCQkvKiBhbmQgcmV0dXJuIHRoYXQgb3BlbiBkZXNjcmlwdG9yICovCisJCQkJCX0KKwkJCQkJcCA9IHAtPm5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAtMTsJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIGlmIHRoZSBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kLCByZXR1cm4gYW4gZXJyb3IgKi8KK30KKworc3RhdGljIHZvaWQgYWNuX3N0YXJ0X21vbml0b3IoaW50IGZkLCBpbnQgc25hcGxlbiwgaW50IHRpbWVvdXQsIGludCBwcm9taXNjdW91cywgaW50IGRpcmVjdGlvbikgeworCXVuc2lnbmVkIGNoYXIJYnVmWzhdOworCXVuaXRfdAkJCSp1OworCisJLy9wcmludGYoImFjbl9zdGFydF9tb25pdG9yKClcbiIpOwkJCQkvLyBmdWxrbworCWZpbmRfdW5pdF9ieV9mZChmZCwgTlVMTCwgTlVMTCwgJnUpOworCWlmICh1LT5maXJzdF90aW1lID09IDApIHsKKwkJYnVmWzBdCQkJCQk9ICdNJzsKKwkJKih1aW50MzJfdCAqKSZidWZbMV0JPSBodG9ubChzbmFwbGVuKTsKKwkJYnVmWzVdCQkJCQk9IHRpbWVvdXQ7CisJCWJ1Zls2XQkJCQkJPSBwcm9taXNjdW91czsKKwkJYnVmWzddCQkJCQk9IGRpcmVjdGlvbjsKKwkvL3ByaW50ZigiYWNuX3N0YXJ0X21vbml0b3IoKSBmaXJzdCB0aW1lXG4iKTsJCQkJLy8gZnVsa28KKwkJc2VuZF90b19mZChmZCwgOCwgYnVmKTsJCQkJCQkJCS8qIHNlbmQgdGhlIHN0YXJ0IG1vbml0b3IgY29tbWFuZCB3aXRoIGl0cyBwYXJhbWV0ZXJzIHRvIHRoZSBJT1AgKi8KKwkJdS0+Zmlyc3RfdGltZSA9IDE7CisJfQorCS8vcHJpbnRmKCJhY25fc3RhcnRfbW9uaXRvcigpIGNvbXBsZXRlXG4iKTsJCQkJLy8gZnVsa28KK30KKworc3RhdGljIGludCBwY2FwX2luamVjdF9hY24ocGNhcF90ICpwLCBjb25zdCB2b2lkICpidWYgX1VfLCBzaXplX3Qgc2l6ZSBfVV8pIHsKKwlzdHJsY3B5KHAtPmVycmJ1ZiwgIlNlbmRpbmcgcGFja2V0cyBpc24ndCBzdXBwb3J0ZWQgb24gQUNOIGFkYXB0ZXJzIiwKKwkgICAgUENBUF9FUlJCVUZfU0laRSk7CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfYWNuKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmJwZikgeworCWludAkJCQlmZCA9IGhhbmRsZS0+ZmQ7CisJaW50CQkJCWNvdW50OworCXN0cnVjdCBicGZfaW5zbgkqcDsKKwl1aW50MTZfdAkJc2hvcnRJbnQ7CisJdWludDMyX3QJCWxvbmdJbnQ7CisKKwlzZW5kX3RvX2ZkKGZkLCAxLCAodW5zaWduZWQgY2hhciAqKSJGIik7CQkJLyogQlBGIGZpbHRlciBmb2xsb3dzIGNvbW1hbmQgKi8KKwljb3VudCA9IGJwZi0+YmZfbGVuOworCWxvbmdJbnQgPSBodG9ubChjb3VudCk7CisJc2VuZF90b19mZChmZCwgNCwgKHVuc2lnbmVkIGNoYXIgKikmbG9uZ0ludCk7CQkvKiBzZW5kIHRoZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBjb3VudCAqLworCXAgPSBicGYtPmJmX2luc25zOworCXdoaWxlIChjb3VudC0tKSB7CQkJCQkJCQkJLyogZm9sbG93ZWQgYnkgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zICovCisJCXNob3J0SW50ID0gaHRvbnMocC0+Y29kZSk7CisJCWxvbmdJbnQgPSBodG9ubChwLT5rKTsKKwkJc2VuZF90b19mZChmZCwgMiwgKHVuc2lnbmVkIGNoYXIgKikmc2hvcnRJbnQpOworCQlzZW5kX3RvX2ZkKGZkLCAxLCAodW5zaWduZWQgY2hhciAqKSZwLT5qdCk7CisJCXNlbmRfdG9fZmQoZmQsIDEsICh1bnNpZ25lZCBjaGFyICopJnAtPmpmKTsKKwkJc2VuZF90b19mZChmZCwgNCwgKHVuc2lnbmVkIGNoYXIgKikmbG9uZ0ludCk7CisJCXArKzsKKwl9CisJaWYgKGdldF9lcnJvcl9yZXNwb25zZShmZCwgTlVMTCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2FwX3NldGRpcmVjdGlvbl9hY24ocGNhcF90ICpoYW5kbGUsIHBjYXBfZGlyZWN0aW9uX3QgZCkgeworCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBzaXplb2YoaGFuZGxlLT5lcnJidWYpLAorCSAgICAiU2V0dGluZyBkaXJlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBBQ04gYWRhcHRlcnMiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWNuX3JlYWRfbl9ieXRlc193aXRoX3RpbWVvdXQocGNhcF90ICpoYW5kbGUsIGludCBjb3VudCkgeworCXN0cnVjdAkJdGltZXZhbCB0djsKKwlpbnQJCQlyZXR2YWwsIGZkOworCWZkX3NldAkJcl9mZHM7CisJZmRfc2V0CQl3X2ZkczsKKwl1X2NoYXIJCSpicDsKKwlpbnQJCQlsZW4gPSAwOworCWludAkJCW9mZnNldCA9IDA7CisKKwl0di50dl9zZWMgPSA1OworCXR2LnR2X3VzZWMgPSAwOworCisJZmQgPSBoYW5kbGUtPmZkOworCUZEX1pFUk8oJnJfZmRzKTsKKwlGRF9TRVQoZmQsICZyX2Zkcyk7CisJbWVtY3B5KCZ3X2ZkcywgJnJfZmRzLCBzaXplb2Yocl9mZHMpKTsKKwlicCA9IGhhbmRsZS0+YnA7CisJd2hpbGUgKGNvdW50KSB7CisJCXJldHZhbCA9IHNlbGVjdChmZCArIDEsICZ3X2ZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwkJaWYgKHJldHZhbCA9PSAtMSkgewkJCQkJCQkJCQkJLyogYW4gZXJyb3Igb2NjdXJlZCAhISEhISAqLworLy8JCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIGR1cmluZyBwYWNrZXQgZGF0YSByZWFkXG4iKTsKKwkJCXJldHVybiAtMTsJCQkJCQkJCQkJCQkvKiBidXQgd2UgbmVlZCB0byByZXR1cm4gYSBnb29kIGluZGljYXRpb24gdG8gcHJldmVudCB1bm5lY2Nlc3NhcnkgcG9wdXBzICovCisJCX0gZWxzZSBpZiAocmV0dmFsID09IDApIHsJCQkJCQkJCQkvKiB0aW1lb3V0IG9jY3VyZWQsIHNvIHByb2Nlc3Mgd2hhdCB3ZSd2ZSBnb3Qgc29mYXIgYW5kIHJldHVybiAqLworLy8JCQlmcHJpbnRmKHN0ZGVyciwgInRpbWVvdXQgZHVyaW5nIHBhY2tldCBkYXRhIHJlYWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJaWYgKChsZW4gPSByZWN2KGZkLCAoYnAgKyBvZmZzZXQpLCBjb3VudCwgMCkpIDw9IDApIHsKKy8vCQkJCWZwcmludGYoc3RkZXJyLCAicHJlbWF0dXJlIGV4aXQgZHVyaW5nIHBhY2tldCBkYXRhIHJ4XG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb3VudCAtPSBsZW47CisJCQlvZmZzZXQgKz0gbGVuOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjYXBfcmVhZF9hY24ocGNhcF90ICpoYW5kbGUsIGludCBtYXhfcGFja2V0cywgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpIHsKKwkjZGVmaW5lIEhFQURFUl9TSVpFICg0ICogNCkKKwl1bnNpZ25lZCBjaGFyCQlwYWNrZXRfaGVhZGVyW0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIJcGNhcF9oZWFkZXI7CisKKwkvL3ByaW50ZigicGNhcF9yZWFkX2FjbigpXG4iKTsJCQkvLyBmdWxrbworCWFjbl9zdGFydF9tb25pdG9yKGhhbmRsZS0+ZmQsIGhhbmRsZS0+c25hcHNob3QsIGhhbmRsZS0+b3B0LnRpbWVvdXQsIGhhbmRsZS0+b3B0LnByb21pc2MsIGhhbmRsZS0+ZGlyZWN0aW9uKTsJLyogbWF5YmUgdGVsbCBoaW0gdG8gc3RhcnQgbW9uaXRvcmluZyAqLworCS8vcHJpbnRmKCJwY2FwX3JlYWRfYWNuKCkgYWZ0ZXIgc3RhcnQgbW9uaXRvclxuIik7CQkJLy8gZnVsa28KKworCWhhbmRsZS0+YnAgPSBwYWNrZXRfaGVhZGVyOworCWlmIChhY25fcmVhZF9uX2J5dGVzX3dpdGhfdGltZW91dChoYW5kbGUsIEhFQURFUl9TSVpFKSA9PSAtMSkgcmV0dXJuIDA7CQkJLyogdHJ5IHRvIHJlYWQgYSBwYWNrZXQgaGVhZGVyIGluIHNvIHdlIGNhbiBnZXQgdGhlIHNpemVvZiB0aGUgcGFja2V0IGRhdGEgKi8KKworCXBjYXBfaGVhZGVyLnRzLnR2X3NlYwk9IG50b2hsKCoodWludDMyX3QgKikmcGFja2V0X2hlYWRlclswXSk7CQkJCS8qIHR2X3NlYyAqLworCXBjYXBfaGVhZGVyLnRzLnR2X3VzZWMJPSBudG9obCgqKHVpbnQzMl90ICopJnBhY2tldF9oZWFkZXJbNF0pOwkJCQkvKiB0dl91c2VjICovCisJcGNhcF9oZWFkZXIuY2FwbGVuCQk9IG50b2hsKCoodWludDMyX3QgKikmcGFja2V0X2hlYWRlcls4XSk7CQkJCS8qIGNhcGxlbiAqLworCXBjYXBfaGVhZGVyLmxlbgkJCT0gbnRvaGwoKih1aW50MzJfdCAqKSZwYWNrZXRfaGVhZGVyWzEyXSk7CQkJCS8qIGxlbiAqLworCisJaGFuZGxlLT5icCA9IGhhbmRsZS0+YnVmZmVyICsgaGFuZGxlLT5vZmZzZXQ7CQkJCQkJCQkJLyogc3RhcnQgb2ZmIHRoZSByZWNlaXZlIHBvaW50ZXIgYXQgdGhlIHJpZ2h0IHNwb3QgKi8KKwlpZiAoYWNuX3JlYWRfbl9ieXRlc193aXRoX3RpbWVvdXQoaGFuZGxlLCBwY2FwX2hlYWRlci5jYXBsZW4pID09IC0xKSByZXR1cm4gMDsJLyogdGhlbiB0cnkgdG8gcmVhZCBpbiB0aGUgcmVzdCBvZiB0aGUgZGF0YSAqLworCisJY2FsbGJhY2sodXNlciwgJnBjYXBfaGVhZGVyLCBoYW5kbGUtPmJwKTsJCQkJCQkJCQkJLyogY2FsbCB0aGUgdXNlciBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBjYXBfYWN0aXZhdGVfc2l0YShwY2FwX3QgKmhhbmRsZSkgeworCWludAkJZmQ7CisKKwlpZiAoaGFuZGxlLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogTm8gbW9uaXRvciBtb2RlIG9uIFNJVEEgZGV2aWNlcyAodGhleSdyZSBub3QgV2ktRmkKKwkJICogZGV2aWNlcykuCisJCSAqLworCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzb21lIGNvbXBvbmVudHMgb2YgdGhlIHBjYXAgc3RydWN0dXJlLiAqLworCisJaGFuZGxlLT5pbmplY3Rfb3AgPSBwY2FwX2luamVjdF9hY247CisJaGFuZGxlLT5zZXRmaWx0ZXJfb3AgPSBwY2FwX3NldGZpbHRlcl9hY247CisJaGFuZGxlLT5zZXRkaXJlY3Rpb25fb3AgPSBwY2FwX3NldGRpcmVjdGlvbl9hY247CisJaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwloYW5kbGUtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfYWNuOworCWhhbmRsZS0+cmVhZF9vcCA9IHBjYXBfcmVhZF9hY247CisJaGFuZGxlLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfYWNuOworCisJZmQgPSBhY25fb3Blbl9saXZlKGhhbmRsZS0+b3B0LnNvdXJjZSwgaGFuZGxlLT5lcnJidWYsCisJICAgICZoYW5kbGUtPmxpbmt0eXBlKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiBQQ0FQX0VSUk9SOworCWhhbmRsZS0+ZmQgPSBmZDsKKwloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCisJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLworCisJaGFuZGxlLT5idWZmZXIJID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSArIGhhbmRsZS0+b2Zmc2V0KTsKKwlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7CisJICAgICAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9jbGVhbnVwX2FjbihoYW5kbGUpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwkvKgorCSAqICJoYW5kbGUtPmZkIiBpcyBhIHNvY2tldCwgc28gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIKKwkgKiBzaG91bGQgd29yayBvbiBpdC4KKwkgKi8KKwloYW5kbGUtPnNlbGVjdGFibGVfZmQgPSBoYW5kbGUtPmZkOworCisJcmV0dXJuIDA7Cit9CisKK3BjYXBfdCAqcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikgeworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCAwKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX3NpdGE7CisJcmV0dXJuIChwKTsKK30KZGlmZiAtLWdpdCBhL3BjYXAtc2l0YS5oIGIvcGNhcC1zaXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzMmVlMgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtc2l0YS5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBwY2FwLXNpdGEuaDogUGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlIGZvciBTSVRBIFdBTiBkZXZpY2VzCisgKgorICogQXV0aG9yczogRnVsa28gSGV3IChmdWxrby5oZXdAc2l0YS5hZXJvKSAoKzEgOTA1IDY4MTU1NzApOworICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zaXRhLmgKKyAqLworCitleHRlcm4gaW50IGFjbl9wYXJzZV9ob3N0c19maWxlKGNoYXIgKmVycmJ1Zik7CitleHRlcm4gaW50IGFjbl9maW5kYWxsZGV2cyhjaGFyICplcnJidWYpOwpkaWZmIC0tZ2l0IGEvcGNhcC1zaXRhLmh0bWwgYi9wY2FwLXNpdGEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQwOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1zaXRhLmh0bWwKQEAgLTAsMCArMSw5NDMgQEAKKzxIVE1MPjxIRUFEPgorPFNUWUxFIHR5cGU9InRleHQvY3NzIj4KKzwhLS0KK0EgeyB0ZXh0LWRlY29yYXRpb246bm9uZSB9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+Cis8Qk9EWT4KKworPFRBQkxFIFdJRFRIPTEwMCU+PFRSPgorCTxURCBBTElHTj1MRUZUIFZBTElHTj1UT1A+CisJCTxGT05UIFNJWkU9KzAgRkFDRT0iQ09VUklFUiI+PEI+QSAiRGlzdHJpYnV0ZWQgUGNhcCIgZm9yPEJSPlJlbW90ZSBNb25pdG9yaW5nIExBTnMgJiBXQU5zPC9CPjxCUj4KKwkJCQkJCQkJCQkoRGVzaWduIE5vdGVzIGZvciB0aGUgU0lUQSBBQ04gZGV2aWNlKTwvRk9OVD4KKwk8L1REPgorCTxURCBBTElHTj1SSUdIVCBWQUxJR049VE9QPgorCQlGdWxrbyBIZXc8QlI+U0lUQSBJTkMgQ2FuYWRhLCBJbmMuPEJSPlJldmlzZWQ6IE9jdG9iZXIgMiwgMjAwNworCTwvVEQ+Cis8L1RSPjwvVEFCTEU+CisKKworPEgzPlNVTU1BUlk8L0gzPgorPFVMPgorCTxTVFJPTkc+Tm90ZTo8L1NUUk9ORz4gVGhpcyBkb2N1bWVudCBpcyBwYXJ0IG9mIHRoZSBsaWJwY2FwIEdpdCBhbmQgd2FzIGRlcml2ZWQgZnJvbSAncGNhcC4zJyAoY2lyY2EgQXVnLzA3KS4KKwk8UD4KKwlUaGUgQUNOIHByb3ZpZGVzIGEgY3VzdG9taXplZC9kaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeSB0aGF0IGFsb3dzIFNNUHMgdG8KKwlpbnRlcmFjdCB3aXRoIHRoZSB2YXJpb3VzIElPUHMgd2l0aGluIHRoZSBzaXRlIHByb3ZpZGluZyBhIHN0YW5kYXJkIG1lY2hhbmlzbQorCXRvIGNhcHR1cmUgTEFOIGFuZCBXQU4gbWVzc2FnZSB0cmFmZmljLgorCTxQPgorCTxDRU5URVI+CisJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9NzUlPgorCQkJPFRSPgorCQkJCTxUSCBWQUxJR049VE9QPlNNUDwvVEg+CisJCQkJPFREIFZBTElHTj1UT1A+VGhlIFN1cGVydmlzb3J5IE1hbmFnZW1lbnQgUHJvY2Vzc29yIHdoZXJlIFdpcmVzaGFyayAob3IgZXF1aXZhbGVudCkKKwkJCQkJCQkJcnVucyBpbiBjb25qdWN0aW9uIHdpdGggYSBsaWJwY2FwIGZyb250LWVuZC48L1REPgorCQkJPC9UUj4KKwkJCTxUUj4KKwkJCQk8VEggVkFMSUdOPVRPUD5JT1A8L1RIPgorCQkJCTxURCBWQUxJR049VE9QPkkvTyBQcm9jZXNzb3JzIHdoZXJlIHRoZSBtb25pdG9yZWQgcG9ydHMgZXhpc3QgaW4gY29uanVuY3Rpb24KKwkJCQkJCQkJd2l0aCBhIGN1c3RvbSBkZXZpY2UgZHJpdmVyL2xpYnBjYXAgYmFjay1lbmQuPC9URD4KKwkJCTwvVFI+CisJCTwvVEFCTEU+CisJPC9DRU5URVI+CisJPFA+CisJRWFjaCBJT1Agd2lsbCBiZSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgbXVsdGlwbGUgY29ubmVjdGlvbnMgZnJvbSBhbiBTTVAKKwllbmFibGluZyBtb25pdG9yaW5nIG9mIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGF0IGEgdGltZSwgZWFjaCB0aHJvdWdoCisJaXRzIG93biBzZXBlcmF0ZSBjb25uZWN0aW9uLiAgVGhlIElPUCBpcyByZXNwb25zaWJsZSB0byBlbnN1cmUgYW5kIHJlcG9ydAorCWFuIGVycm9yIGlmIGFueSBhdHRlbXB0IGlzIG1hZGUgdG8gbW9uaXRvciB0aGUgc2FtZSBpbnRlcmZhY2UgbW9yZSB0aGFuIG9uY2UuCisJPFA+CisJVGhlcmUgYXJlIHRocmVlIGFwcGxpY2F0aW9ucyB0aGF0IHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBBQ04gdmVyc2lvbiBvZiBsaWJwY2FwLgorCVRoZXkgZWFjaCB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQgbW9kZSBmb3IgbG9vcGluZy9jYXB0dXJpbmcgYW5kIHRlcm1pbmF0aW9uCisJYXMgc3VtbWFyaXplZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCTxQPgorCTxDRU5URVI+CisJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKyAgICAJPFRSPjxUSD5BcHBsaWNhdGlvbjwvVEg+CTxUSD5DYXB0dXJlPC9USD4JPFRIPlRlcm1pbmF0aW9uPC9USD48L1RSPgorICAgIAk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPndpcmVzaGFyazwvVEg+CisJCQk8VEQgVkFMSUdOPVRPUD5wY2FwX2Rpc3BhdGNoKGFsbCBwYWNrZXRzIGluIG9uZSBidWZmZXIgb2YgY2FwdHVyZSBvbmx5KTwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5wY2FwX2JyZWFrbG9vcCgpPC9URD4KKwkJPC9UUj4KKyAgICAJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD50c2hhcms8L1RIPgorCQkJPFREIFZBTElHTj1UT1A+cGNhcF9kaXNwYXRjaChvbmUgYnVmZmVyIG9mIGNhcHR1cmUgb25seSk8L1REPgorCQkJPFREIFZBTElHTj1UT1A+U2luY2UgYSBDVFJMLUMgd2FzIHVzZWQgdG8gdGVybWluYXRlIHRoZSBhcHBsaWNhdGlvbiwgcGNhcF9icmVha2xvb3AoKSBpcyBuZXZlciBjYWxsZWQuPC9URD4KKwkJPC9UUj4KKyAgICAJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD50Y3BkdW1wPC9USD4KKwkJCTxURCBWQUxJR049VE9QPnBjYXBfbG9vcChhbGwgcGFja2V0cyBpbiB0aGUgbmV4dCBidWZmZXIsIGFuZCBsb29wIGZvcmV2ZXIpPC9URD4KKwkJCTxURCBWQUxJR049VE9QPnBjYXBfYnJlYWtsb29wKCk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisJPC9DRU5URVI+CisJPFA+CisJPEI+Tm90ZTogPC9CPkluIGFsbCBjYXNlcywgdGhlIHRlcm1pbmF0aW9uIG9mIGNhcHR1cmluZyBpcyBhbHdheXMgKGFwcGFyZW50bHkpIGZvbGxvd2VkIGJ5CisJcGNhcF9jbG9zZSgpLiAgUGNhcF9icmVha2xvb3AoKSBpcyBvbmx5IHVzZWQgdG8gc3RvcC9zdXNwZW5kIGxvb3BpbmcvcHJvY2Vzc2luZywKKwlhbmQgdXBvbiBjbG9zZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGl0IGlzIHBvc3NpYmxlIHRvIHJlc3VtZQorCWNhcHR1cmluZyBmb2xsb3dpbmcgYSBwY2FwX2JyZWFrbG9vcCgpIHdpdGhvdXQgYW55IHJlLWluaXRpYWxpemF0aW9uLgorCTxQPgorCTxIND5BQ04gTGltaXRhdGlvbnM8L0g0PgorCTxPTD4KKwkJPExJPk1vbml0b3Jpbmcgb2YgYmFja3VwIElPUHMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJCTxMST5FdGhlcm5ldCBpbnRlcmZhY2VzIGNhbm5vdCBiZSBtb25pdG9yZWQgaW4gcHJvbWlzY3VvdXMgbW9kZS4KKwk8L09MPgorCis8L1VMPgorCis8SDM+Uk9VVElORVM8L0gzPgorPFVMPgorCQlUaGUgZm9sbG93aW5nIGxpc3Qgb2YgZnVuY3Rpb25zIGlzIHRoZSBzdWItc2V0IG9mIFBjYXAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuCisJCWFsdGVyZWQvZW5oYW5jZWQgdG8gc3VwcG9ydCB0aGUgQUNOIHJlbW90ZSBtb25pdG9yaW5nIGZhY2lsaXR5LiAgVGhlIHJlbWFpbmRlciBvZiB0aGUgUGNhcAorCQlmdW5jdGlvbnMgY29udGludWUgdG8gcGVyZm9ybSB0aGVpciBkdXRpZXMgdW4tYWx0ZXJlZC4gIExpYnBjYXAgb25seSBzdXBwb3J0cyB0aGlzCisJCW1vZGUgb2Ygb3BlcmF0aW9uIGlmIGl0IGhhcyBiZWVuIGNvbmZpZ3VyZWQvY29tcGlsZWQgZm9yIFNJVEEvQUNOIHN1cHBvcnQuCisJCTxQPgorCQk8VUw+PEZPTlQgRkFDRT1DT1VSSUVSPgorCQkJcGNhcF9maW5kYWxsZGV2czxCUj4KKwkJCXBjYXBfZnJlZWFsbGRldnM8QlI+CisJCQlwY2FwX29wZW5fbGl2ZTxCUj4KKwkJCXBjYXBfY2xvc2U8QlI+CisJCQlwY2FwX3NldGZpbHRlcjxCUj4KKwkJCXBjYXBfZGlzcGF0Y2g8QlI+CisJCQlwY2FwX2xvb3A8QlI+CisJCQlwY2FwX25leHQ8QlI+CisJCQlwY2FwX25leHRfZXg8QlI+CisJCQlwY2FwX3N0YXRzPEJSPgorCQk8L0ZPTlQ+PC9VTD4KKworCVRoZXNlIHN1YnJvdXRpbmVzIGhhdmUgYmVlbiBtb2RpZmllZCBmb3IgdGhlIEFDTiBzcGVjaWZpYyBkaXN0cmlidXRlZCBhbmQgcmVtb3RlIG1vbml0b3JpbmcKKwlhYmlsaXR5IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBiYXNpYyBmdW5jdGlvbnMuICBNb3JlIGRldGFpbCBpcyBwcm92aWRlZCBpbiB0aGUKKwkiU01QL0lPUCBJbnRlci1Qcm9jZXNzIENvbW11bmljYXRpb24gUHJvdG9jb2wiIHNlY3Rpb24uCisJPFA+Cis8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfb3Blbl9saXZlKCk8L0I+PC9URD4KKwkJPFREIFZBTElHTj1UT1A+VXNlZCB0byBvYnRhaW4gYSBwYWNrZXQgY2FwdHVyZSBkZXNjcmlwdG9yIHRvIGxvb2sgYXQgcGFja2V0cyBvbiB0aGUgbmV0d29yay48L1REPgorCTwvVFI+CisJPFRSPjxURD48VEFCTEUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zIFdJRFRIPTEwMCU+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QIC0+IElPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHdpbGwgb3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlbGVjdGVkIElPUCBvbiBpdHMgJ3NuaWZmZXInIHBvcnQKKwkJCXRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUuICBJdCBzZW5kcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgaWRlbnRpZnlpbmcKKwkJCXRoZSBpbnRlcmZhY2UgdG8gYmUgbW9uaXRvcmVkLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1AgLT4gU01QPC9USD4KKwkJCTxURD4KKwkJCUFmdGVyIGFueSByZXF1aXJlZCBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLCB0aGUgSU9QIHdpbGwgcmV0dXJuIGEKKwkJCW51bGwgdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBhbiBlcnJvciBtZXNzYWdlIGlmIG9uZSBvY2N1cmVkLgorCQkJSWYgbm8gZXJyb3Igb2NjdXJlZCwgYSBlbXB0eSBzdHJpbmcgaXMgc3RpbGwgcmV0dXJuZWQuCisJCQlFcnJvcnMgYXJlOgorCQkJPFVMPgorCQkJPExJPiJJbnRlcmZhY2UgKHh4eCkgZG9lcyBub3QgZXhpc3QuIgorCQkJPExJPiJJbnRlcmZhY2UgKHh4eCkgbm90IGNvbmZpZ3VyZWQuIgorCQkJPExJPiJJbnRlcmZhY2UgKHh4eCkgYWxyZWFkeSBiZWluZyBtb25pdG9yZWQuIgorCQkJPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX2ZpbmRhbGxkZXZzKCk8L0I+PC9URD4KKwkJPFREIFZBTElHTj1UT1A+SXQgY29uc3RydWN0cyBhIGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCB3aXRoIHBjYXBfb3Blbl9saXZlKCkuPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUDwvVEg+CisJCQk8VEQ+CisJCQlJdCBvYnRhaW5zIGEgbGlzdCBvZiBJT1BzIGN1cnJlbnRseSBhdmFpbGFibGUgKHZpYSAvZXRjL2hvc3RzKS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QIC0+IElPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHdpbGwgc2VxdWVudGlhbGx5IG9wZW4gYSBjb25uZWN0aW9uIHRvIGVhY2ggSU9QIG9uIGl0cyAnc25pZmZlcicgcG9ydCB0byBlbnN1cmUKKwkJCXRoZSBJT1AgaXMgYXZhaWxhYmxlLgorCQkJSXQgc2VuZHMgYSBudWxsIHRlcm1pbmF0ZWQgZW1wdHkgaW50ZXJmYWNlIElEIGZvbGxvd2VkIGJ5IHRoZSBxdWVyeSByZXF1ZXN0IGNvbW1hbmQuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPlRoZSBJT1AgcmV0dXJucyBhbiBlcnJvciByZXNwb25zZSBhbmQgaXRzIGxpc3Qgb2YgZGV2aWNlcy4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QIC0+IElPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIGNsb3NlcyB0aGUgVENQIGNvbm5lY3Rpb24gd2l0aCBlYWNoIElPUC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgYWRkcyB0aGUgcmVjZWl2ZWQgaW5mb3JtYXRpb24gdG8gaXRzIGludGVybmFsIHN0cnVjdHVyZS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX2ZyZWVhbGxkZXZzKCk8L0I+PC9URD4KKwkJPFREIFZBTElHTj1UT1A+VXNlZCB0byBmcmVlIGEgbGlzdCBhbGxvY2F0ZWQgYnkgcGNhcF9maW5kYWxsZGV2cygpLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIFNNUCBmcmVlcyB0aGUgc3RydWN0dXJlIGl0IGJ1aWx0IGFzIGEgcmVzdWx0IG9mIHRoZSBwcmV2aW91cworCQkJaW52b2NhdGlvbiBvZiBwY2FwX2ZpbmRhbGxkZXZzKCkuCisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+PC9URD48L1RSPgorCisJPFRSPgorCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+PEI+cGNhcF9kaXNwYXRjaCgpPC9CPjwvVEQ+CisJCTxURCBWQUxJR049VE9QPlVzZWQgdG8gY29sbGVjdCBhbmQgcHJvY2VzcyBwYWNrZXRzLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCU9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHBjYXBfZGlzcGF0Y2goKSwgcGNhcF9sb29wKCksIG9yIHBjYXBfbmV4dCgpLCBvciBwY2FwX25leHRfZXgoKSBmb2xsb3dpbmcgYSBwY2FwX29wZW5fbGl2ZSgpLAorCQkJdGhlIFNNUCB3aWxsIHBhc3MgZG93biB0aGUgbW9uaXRvciBzdGFydCBjb21tYW5kIGFuZCB2YXJpb3VzIHBhcmFtZXRlcnMgdGhlIElPUCBzaG91bGQgdXNlLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1AgLT4gU01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBJT1Agbm93IHNlbmRzIGEgc3RyZWFtIG9mIGNhcHR1cmVkIGRhdGEuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHdpbGwgcmVhZCB0aGUgcmV2ZXJzZSBjaGFubmVsIG9mIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIFNNUCBhbmQgdGhlCisJCQlJT1AgdGhhdCBwcm92aWRlcyB0aGUgY2FwdHVyZWQgZGF0YSAodmlhICdwLT5yZWFkX29wJyB3aGljaCBpcyAncGNhcF9yZWFkX2xpbnV4KCknCisJCQl1bnRpbCB0aGUgc2VsZWN0KCkgY2FsbCByZXR1cm5zIGEgJ25vIG1vcmUgZGF0YScgaW5kaWNhdGlvbi4KKwkJCUl0IHdpbGwgdGhlIHByb2Nlc3MgKGF0IG1vc3QpIHRoZSBuZXh0ICdjbnQnIHBhY2tldHMgYW5kIGludm9rZSB0aGUgc3BlY2lmaWVkCisJCQljYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBwYWNrZXQgcHJvY2Vzc2VkLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1A8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBjb250aW51ZXMgdG8gbGlzdGVuIGZvciBhZGRpdGlvbmFsIGNvbW1hbmRzIGFzIHdlbGwgYXMgY2FwdHVyaW5nIGFuZCBmb3J3YXJkaW5nIGRhdGEgdG8gdGhlIFNNUC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX2xvb3AoKTwvQj48L1REPgorCQk8VEQgVkFMSUdOPVRPUD4KKwkJCQlJcyBzaW1pbGFyIHRvIHBjYXBfZGlzcGF0Y2goKSBleGNlcHQgaXQga2VlcHMgcmVhZGluZyBwYWNrZXRzIHVudGlsCisJCQkJdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgcGFja2V0cyBhcmUgcHJvY2Vzc2VkIG9yIGFuIGVycm9yIG9jY3Vycy4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUCAtPiBJT1A8L1RIPgorCQkJPFREPgorCQkJT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcGNhcF9kaXNwYXRjaCgpLCBwY2FwX2xvb3AoKSwgb3IgcGNhcF9uZXh0KCksIG9yIHBjYXBfbmV4dF9leCgpIGZvbGxvd2luZyBhIHBjYXBfb3Blbl9saXZlKCksCisJCQl0aGUgU01QIHdpbGwgcGFzcyBkb3duIHRoZSBtb25pdG9yIHN0YXJ0IGNvbW1hbmQgYW5kIHZhcmlvdXMgcGFyYW1ldGVycyB0aGUgSU9QIHNob3VsZCB1c2UuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBub3cgc2VuZHMgYSBzdHJlYW0gb2YgY2FwdHVyZWQgZGF0YS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgY29udGludW91c2x5IHJlYWRzIHRoZSBuZXh0IHBhY2tldCBmcm9tIHRoZSByZXZlcnNlIGNoYW5uZWwgb2YgdGhlIGNvbm5lY3Rpb24KKwkJCWJldHdlZW4gdGhlIFNNUCBhbmQgdGhlIElPUCB0aGF0IHByb3ZpZGVzIHRoZSBjYXB0dXJlZCBkYXRhICh2aWEgJ3AtPnJlYWRfb3AnCisJCQl3aGljaCBpcyAncGNhcF9yZWFkX2xpbnV4KCknIHVudGlsICdjbnQnIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgorCQkJVGhlIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgZm9yIGVhY2ggcGFja2V0IHJlY2VpdmVkLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1A8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBjb250aW51ZXMgdG8gbGlzdGVuIGZvciBhZGRpdGlvbmFsIGNvbW1hbmRzIGFzIHdlbGwgYXMgY2FwdHVyaW5nIGFuZCBmb3J3YXJkaW5nIGRhdGEgdG8gdGhlIFNNUC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX25leHQoKTwvQj48L1REPgorCQk8VEQgVkFMSUdOPVRPUD4KKwkJCUl0IHJlYWRzIHRoZSBuZXh0IHBhY2tldCAoYnkgY2FsbGluZyBwY2FwX2Rpc3BhdGNoKCkgd2l0aCBhIGNvdW50IG9mIDEpCisJCQlhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgaW4gdGhhdCBwYWNrZXQuCisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCU9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHBjYXBfZGlzcGF0Y2goKSwgcGNhcF9sb29wKCksIG9yIHBjYXBfbmV4dCgpLCBvciBwY2FwX25leHRfZXgoKSBmb2xsb3dpbmcgYSBwY2FwX29wZW5fbGl2ZSgpLAorCQkJdGhlIFNNUCB3aWxsIHBhc3MgZG93biB0aGUgbW9uaXRvciBzdGFydCBjb21tYW5kIGFuZCB2YXJpb3VzIHBhcmFtZXRlcnMgdGhlIElPUCBzaG91bGQgdXNlLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1AgLT4gU01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBJT1Agbm93IHNlbmRzIGEgc3RyZWFtIG9mIGNhcHR1cmVkIGRhdGEuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHJlYWRzIG9ubHkgdGhlIG5leHQgcGFja2V0IGZyb20gdGhlIHJldmVyc2UgY2hhbm5lbCBvZiB0aGUgY29ubmVjdGlvbgorCQkJYmV0d2VlbiB0aGUgU01QIGFuZCB0aGUgSU9QIHRoYXQgcHJvdmlkZXMgdGhlIGNhcHR1cmVkIGRhdGEgKHZpYSBjYWxsaW5nIHBjYXBfZGlzcGF0Y2goKQorCQkJd2l0aCBhIGNvdW50IG9mIDEpIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGF0IGRhdGEgYnkgaW52b2tpbmcgYW4gaW50ZXJuYWwgY2FsbGJhY2suCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgSU9QIGNvbnRpbnVlcyB0byBsaXN0ZW4gZm9yIGFkZGl0aW9uYWwgY29tbWFuZHMgYXMgd2VsbCBhcyBjYXB0dXJpbmcgYW5kIGZvcndhcmRpbmcgZGF0YSB0byB0aGUgU01QLgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKworCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfbmV4dF9leCgpPC9CPjwvVEQ+CisJCTxURCBWQUxJR049VE9QPlJlYWRzIHRoZSBuZXh0IHBhY2tldCBhbmQgcmV0dXJucyBhIHN1Y2Nlc3MvZmFpbHVyZSBpbmRpY2F0aW9uLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCU9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHBjYXBfZGlzcGF0Y2goKSwgcGNhcF9sb29wKCksIG9yIHBjYXBfbmV4dCgpLCBvciBwY2FwX25leHRfZXgoKSBmb2xsb3dpbmcgYSBwY2FwX29wZW5fbGl2ZSgpLAorCQkJdGhlIFNNUCB3aWxsIHBhc3MgZG93biB0aGUgbW9uaXRvciBzdGFydCBjb21tYW5kIGFuZCB2YXJpb3VzIHBhcmFtZXRlcnMgdGhlIElPUCBzaG91bGQgdXNlLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1AgLT4gU01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBJT1Agbm93IHNlbmRzIGEgc3RyZWFtIG9mIGNhcHR1cmVkIGRhdGEuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHJlYWRzIG9ubHkgdGhlIG5leHQgcGFja2V0IGZyb20gdGhlIHJldmVyc2UgY2hhbm5lbCBvZiB0aGUgY29ubmVjdGlvbgorCQkJYmV0d2VlbiB0aGUgU01QIGFuZCB0aGUgSU9QIHRoYXQgcHJvdmlkZXMgdGhlIGNhcHR1cmVkIGRhdGEgKHZpYSBjYWxsaW5nIHBjYXBfZGlzcGF0Y2goKQorCQkJd2l0aCBhIGNvdW50IG9mIDEpIGFuZCByZXR1cm5zIHNlcGVyYXRlIHBvaW50ZXJzIHRvIGJvdGggdGhlCisJCQlwYWNrZXQgaGVhZGVyIGFuZCBwYWNrZXQgZGF0YSBieSBpbnZva2luZyBhbiBpbnRlcm5hbCBjYWxsYmFjay4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBJT1AgY29udGludWVzIHRvIGxpc3RlbiBmb3IgYWRkaXRpb25hbCBjb21tYW5kcyBhcyB3ZWxsIGFzIGNhcHR1cmluZyBhbmQgZm9yd2FyZGluZyBkYXRhIHRvIHRoZSBTTVAuCisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+PC9URD48L1RSPgorCisJPFRSPgorCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+PEI+cGNhcF9zZXRmaWx0ZXIoKTwvQj48L1REPgorICAgICAgICA8VEQgVkFMSUdOPVRPUD5Vc2VkIHRvIHNwZWNpZnkgYSBmaWx0ZXIgcHJvZ3JhbS48L1REPgorCTwvVFI+CisJPFRSPjxURD48VEFCTEUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zIFdJRFRIPTEwMCU+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QIC0+IElPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHNlbmRzIGEgJ3NldCBmaWx0ZXInIGNvbW1hbmQgZm9sbG93ZWQgYnkgdGhlIEJQRiBjb21tYW5kcy4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QIC0+IFNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgSU9QIHJldHVybnMgYSBudWxsIHRlcm1pbmF0ZWQgZXJyb3Igc3RyaW5nIGlmIGl0IGZhaWxlZCB0byBhY2NlcHQgdGhlIGZpbHRlci4KKwkJCUlmIG5vIGVycm9yIG9jY3VyZWQsIHRoZW4gYSBOVUxMIHRlcm1pbmF0ZWQgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluc3RlYWQuCisJCQlFcnJvcnMgYXJlOgorCQkJPFVMPgorCQkJPExJPiJJbnZhbGlkIEJQRi4iCisJCQk8TEk+Ikluc3VmZmljaWVudCByZXNvdXJjZXMgZm9yIEJQRi4iCisJCQk8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKworCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfc3RhdHMoKTwvQj48L1REPgorICAgICAgICA8VEQgVkFMSUdOPVRPUD5GaWxscyBpbiBhIHBjYXBfc3RhdCBzdHJ1Y3Qgd2l0aCBwYWNrZXQgc3RhdGlzdGljcy48L1REPgorCTwvVFI+CisJPFRSPjxURD48VEFCTEUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zIFdJRFRIPTEwMCU+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QIC0+IElPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgSU9QIHJlcXVlc3RpbmcgaXRzIHN0YXRpc3RpY3MuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCByZXR1cm5zIHRoZSBzdGF0aXN0aWNzLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIFNNUCBmaWxscyBpbiB0aGUgc3RydWN0dXJlIHByb3ZpZGVkIHdpdGggdGhlIGluZm9ybWF0aW9uIHJldHJpZXZlZCBmcm9tIHRoZSBJT1AuCisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+PC9URD48L1RSPgorCisJPFRSPgorCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+PEI+cGNhcF9jbG9zZSgpPC9CPjwvVEQ+CisgICAgICAgIDxURCBWQUxJR049VE9QPkNsb3NlcyB0aGUgZmlsZSBhbmQgZGVhbGxvY2F0ZXMgcmVzb3VyY2VzLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFuZCBpZiB0aGUgZGVzY3JpcHRvciBpcyB0aGF0IG9mCisJCQl0aGUgY29tbWludWNhdGlvbiBzZXNzaW9uIHdpdGggYW4gSU9QLCBpdCB0b28gaXMgdGVybWluYXRlZC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QPC9USD4KKwkJCTxURD4KKwkJCUlmIHRoZSBJT1AgZGV0ZWN0cyB0aGF0IGl0cyBjb21tdW5pY2F0aW9uIHNlc3Npb24gd2l0aCBhbiBTTVAKKwkJCWhhcyBjbG9zZWQsIGl0IHdpbGwgdGVybWluYXRlIGFueSBtb25pdG9yaW5nIGluIHByb2dyZXNzLAorCQkJcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGFuZCBjbG9zZSBpdHMgZW5kIG9mIHRoZSBzZXNzaW9uLgorCQkJSXQgd2lsbCBub3QgbWFpbnRhaW4gcGVyc2lzdGFuY2Ugb2YgYW55IGluZm9ybWF0aW9uIG9yIHByaW9yIG1vZGUgb2Ygb3BlcmF0aW9uLgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKzwvVEFCTEU+Cis8L1VMPgorCis8UD4KKzxIMz5TTVAvSU9QIEludGVyLVByb2Nlc3MgQ29tbXVuaWNhdGlvbiBQcm90b2NvbDwvSDM+CisKKzxVTD4KKwk8TEk+PFA+Q29tbXVuaWNhdGlvbnMgYmV0d2VlbiBhbiBTTVAgYW5kIGFuIElPUCBjb25zaXN0cyBvZiBhIFRDUCBzZXNzaW9uCisJCQliZXR3ZWVuIGFuIGVwaGVtZXJhbCBwb3J0IG9uIHRoZSBTTVAgYW5kIHRoZSB3ZWxsIGtub3duIHBvcnQgb2YgNDkxNTIKKwkJCSh3aGljaCBpcyB0aGUgZmlyc3QgYXZhaWxhYmxlIHBvcnQgaW4gdGhlICdkeW5hbWljIGFuZC9vciBwcml2YXRlIHBvcnQnCisJCQlyYW5nZSkgb24gYW4gSU9QLgorCTxMST48UD5Gb2xsb3dpbmcgYSBUQ1Agb3BlbiBvcGVyYXRpb24gdGhlIElPUCByZWNlaXZlcyBhIG51bGwgdGVybWluYXRlZAorCQkJJ2ludGVyZmFjZSBJRCcgc3RyaW5nIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBmb2xsb3dzOgorCTxMST48UD5FdmVyeSBjb21tYW5kIHJlY2VpdmVkIGJ5IGFuIElPUCBpbXBsaWVzIGEgJ3N0b3AgdHJhY2Uvc3RvcCBmb3J3YXJkaW5nJyBvcGVyYXRpb24gbXVzdAorCQkJb2NjdXIgYmVmb3JlIGV4ZWN1dGluZyB0aGUgcmVjZWl2ZWQgY29tbWFuZC4KKwk8TEk+PFA+QSBzZXNzaW9uIGlzIGNsb3NlZCB3aGVuIHRoZSBTTVAgY2xvc2VzIHRoZSBUQ1Agc2Vzc2lvbiB3aXRoIHRoZSBJT1AuCisJCQlPYnZpb3VzbHkgbW9uaXRvcmluZyBhbmQgZm9yd2FyZGluZyBpcyBhbHNvIHN0b3BwZWQgYXQgdGhhdCB0aW1lLgorCisJPEI+Tm90ZTogPC9CPkFsbCBtdWx0aS1vY3RldCBlbnRpdGllcyBhcmUgc2VudCBpbiBuZXR3b3JrIG5ldXRyYWwgb3JkZXIuCisJPFA+CisKKwk8VEFCTEUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz01PgorCQk8VFI+PFRIIENPTFNQQU49Mz48SFIgV0lEVEg9MTAwJT48L1RIPjwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Nj5wY2FwX2ZpbmRhbGxkZXZzKCk8L1REPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TTVAgLT4gSU9QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPk9wZW4gc29ja2V0ICh0byBlYWNoIElPUCksIGFuZCBzZW5kczoKKwkJCQk8UD4KKwkJCQk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCQkJCQk8VFI+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5OYW1lLzxCUj5QdXJwb3NlPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TaXplPEJSPihpbiBieXRlcyk8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+RGVzY3JpcHRpb248L1RIPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5JbnRlcmZhY2UgSUQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+QSBOVUxMIHRvIGluZGljYXRlIGFuIGFuIGVtcHR5ICdpbnRlcmZhY2UgSUQnLjwvVEQ+CisJCQkJCTwvVFI+CisJCQkJPC9UQUJMRT4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+SU9QIC0+IFNNUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5TZW5kIGl0cyAocG9zc2libHkgZW1wdHkpIE5VTEwgdGVybWluYXRlZCBlcnJvciByZXNwb25zZSBzdHJpbmcuPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TTVAgLT4gSU9QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPlNlbmRzIHRoZSAnaW50ZXJmYWNlIHF1ZXJ5IHJlcXVlc3QnOgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPkludGVyZmFjZSBJRDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5BICdRJyAoaW5kaWNhdGluZyAnaW50ZXJmYWNlIHF1ZXJ5IHJlcXVlc3QnKS48L1REPgorCQkJCQk8L1RSPgorCQkJCTwvVEFCTEU+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPklPUCAtPiBTTVA8L1REPgorCQkJPFREIFZBTElHTj1UT1A+VGhlIElPUCByZXR1cm5zIGEgbGlzdCBvZiBzZXF1ZW5jZXMgb2YgaW5mb3JtYXRpb24gYXMKKwkJCQlkZWZpbmVkIGJ5IHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gY2FsbCAoYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZSkuCisJCQkJRWxlbWVudHMgYXJlIHNwZWNpZmllZCBieSBwcm92aWRpbmcgYW4gdW5zaWduZWQgYnl0ZSBwcmVjZWVkaW5nIHRoZSBhY3R1YWwgZGF0YSB0aGF0IGNvbnRhaW5zIGxlbmd0aCBpbmZvcm1hdGlvbi4KKwkJCQk8UD4KKwkJCQk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5vdGVzOjwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5OYW1lLzxCUj5QdXJwb3NlPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TaXplPEJSPihpbiBieXRlcyk8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+RGVzY3JpcHRpb248L1RIPgorCQkJCTwvVFI+CisJCQkJPFRSPgorCQkJCQk8VEQgUk9XU1BBTj03PiZuYnNwOzwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPVJJR0hUPmxlbmd0aDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIG5hbWUgZmllbGQgdGhhdCBmb2xsb3dzLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049TEVGVD5OYW1lPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjEtMjU1PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4gVGhlIGZvcm1hdCBvZiB0aGUgbmFtZSBpcyBhbiBhbHBoYWJldGljIHN0cmluZyAoaW5kaWNhdGluZworCQkJCQkJCQkJdGhlIHR5cGUgb2YgaW50ZXJmYWNlKSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBudW1lcmljIHN0cmluZyAoaW5kaWNhdGluZyB0aGUgaW50ZXJmYWNlJ3MKKwkJCQkJCQkJCXNlcXVlbmNlIG51bWJlcikuCisJCQkJCQkJCQlTZXF1ZW5jZSBudW1iZXJzIChpZiBuZWVkZWQpIHdpbGwgYmVnaW4gYXQgemVybyBhbmQgcHJvZ3Jlc3MgbW9ub3RvbmljYWxseSB1cHdhcmRzLgorCQkJCQkJCQkJKGkuZS4gJ2V0aDAnLCAnbG8nLCAnd2FuMCcsIGV0Yy4pCisJCQkJCQkJCQk8UD4KKwkJCQkJCQkJCUZvciBhbiBJT1AsIHRoZSBhbHBoYWJldGljIHN0cmluZyB3aWxsIGJlIG9uZSBvZjogJ2V0aCcsICd3YW4nLCBhbmQgJ2xvJworCQkJCQkJCQkJZm9yIEV0aGVybmV0LCBXQU4gcG9ydHMgYW5kIHRoZSBJUCBsb29wYmFjayBkZXZpY2UgcmVzcGVjdGl2ZWx5LgorCQkJCQkJCQkJQW4gSU9QIGN1cnJlbnRseSBzdXBwb3J0czogJ2V0aDAnLCAnZXRoMScsICdsbycsICd3YW4wJyAuLi4gJ3dhbjcnLgorCQkJCQkJCQkJPFA+CisJCQkJCQk8Qj5Ob3RlOjwvQj4gSU9QcyBhbmQgQUNOcyB3aWxsIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiAnYW55JyBpbnRlcmZhY2UuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1SSUdIVD5sZW5ndGg8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBpbnRlcmZhY2UgZGVzY3JpcHRpb24gZmllbGQgdGhhdCBmb2xsb3dzLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049TEVGVD5JbnRlcmZhY2UgRGVzY3JpcHRpb248L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MC0yNTU8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5BIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcmZhY2Ugb3IgaXQgbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4gKGkuZS4gJ0FMQycpPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1MRUZUPkludGVyZmFjZSBUeXBlPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjQ8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgdHlwZSBvZiBpbnRlcmZhY2UgYXMgZGVmaW5lZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHBjYXBfZGF0YWxpbmsoKSAoaW4gbmV0d29yayBuZXV0cmFsIG9yZGVyKS48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPUxFRlQ+TG9vcGJhY2sgRmxhZzwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+MSA9IGlmIHRoZSBpbnRlcmZhY2UgaXMgYSBsb29wYmFjayBpbnRlcmZhY2UsIHplcm8gPSBvdGhlcndpc2UuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1SSUdIVD5jb3VudDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+IyBvZiBhZGRyZXNzIGVudHJpZXMgdGhhdCBmb2xsb3cuCisJCQkJCQlFYWNoIGVudHJ5IGlzIGEgc2VyaWVzIG9mIGJ5dGVzIGluIG5ldHdvcmsgbmV1dHJhbCBvcmRlci4KKwkJCQkJCVNlZSB0aGUgcGFyYW1ldGVyIGRlZmluaXRpb24gYWJvdmUgZm9yIG1vcmUgZGV0YWlscy48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPgorCQkJCQk8VEQgQUxJR049Q0VOVEVSIFJPV1NQQU49OCBXSURUSD0xJT5SZXBlYXRlZCAnY291bnQnIG51bWJlciBvZiB0aW1lcy48L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1SSUdIVD5sZW5ndGg8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBhZGRyZXNzIGZpZWxkIHRoYXQgZm9sbG93cy48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPUxFRlQ+QWRkcmVzczwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xLTI1NTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSBhZGRyZXNzIG9mIHRoaXMgaW50ZXJmYWNlIChpbiBuZXR3b3JrIG5ldXRyYWwgb3JkZXIpLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049UklHSFQ+bGVuZ3RoPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgbnVtYmVyIG9mIG9jdGV0cyBpbiB0aGUgbmV0bWFzayBmaWVsZCB0aGF0IGZvbGxvd3MuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1MRUZUPk5ldHdvcmsgTWFzazwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4wLTI1NTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSBuZXR3b3JrIG1hc2sgdXNlZCBvbiB0aGlzIGludGVyZmFjZSAoaWYgYXBwbGljYWJsZSkgKGluIG5ldHdvcmsgbmV1dHJhbCBvcmRlcikuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1SSUdIVD5sZW5ndGg8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBmaWVsZCB0aGF0IGZvbGxvd3MuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1MRUZUPkJyb2FkY2FzdCBBZGRyZXNzPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjAtMjU1PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIGJyb2FkY2FzdCBhZGRyZXNzIG9mIHRoaXMgaW50ZXJmYWNlIChpZiBhcHBsaWNhYmxlKSAoaW4gbmV0d29yayBuZXV0cmFsIG9yZGVyKS48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPVJJR0hUPmxlbmd0aDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZmllbGQgdGhhdCBmb2xsb3dzLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049TEVGVD5EZXN0aW5hdGlvbiBBZGRyZXNzPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjAtMjU1PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhpcyBpbnRlcmZhY2UgKGlmIGFwcGxpY2FibGUpIChpbiBuZXR3b3JrIG5ldXRyYWwgb3JkZXIpLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8L1RBQkxFPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNNUCAtPiBJT1A8L1REPgorCQkJPFREIFZBTElHTj1UT1A+Q2xvc2UgdGhlIHNvY2tldC48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPklPUCAtPiBTTVA8L1REPgorCQkJPFREIFZBTElHTj1UT1A+Q2xvc2UgdGhlIHNvY2tldC48L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIENPTFNQQU49Mz48SFIgV0lEVEg9MTAwJT48L1RIPjwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj5wY2FwX29wZW5fbGl2ZSgpPC9URD4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U01QIC0+IElPUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5PcGVuIHNvY2tldCwgYW5kIHNlbmRzOgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPkludGVyZmFjZSBJRDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+J24nPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPiduJyBvY3RldHMgY29udGFpbmluZyBhIE5VTEwgdGVybWluYXRlZCBpbnRlcmZhY2UgbmFtZSBzdHJpbmcuPC9URD4KKwkJCQkJPC9UUj4KKwkJCQk8L1RBQkxFPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5JT1AgLT4gU01QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPlNlbmQgaXRzIE5VTEwgdGVybWluYXRlZCBlcnJvciByZXNwb25zZSBzdHJpbmcuPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBDT0xTUEFOPTM+PEhSIFdJRFRIPTEwMCU+PC9USD48L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBOT1dSQVAgUk9XU1BBTj0yPnBjYXBfZGlzcGF0Y2goKTxCUj5wY2FwX2xvb3AoKTxCUj5wY2FwX25leHQoKTxCUj5wY2FwX25leHRfZXgoKTwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNNUCAtPiBJT1A8L1REPgorCQkJPFREIFZBTElHTj1UT1A+T24gdGhlIGZpcnN0IGludm9jYXRpb24gZm9sbG93aW5nIGEgcGNhcF9vcGVuX2xpdmUoKSBvciBwY2FwX2JyZWFrbG9vcCgpIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgc2VudDoKKwkJCQk8UD4KKwkJCQk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCQkJCQk8VFI+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5OYW1lLzxCUj5QdXJwb3NlPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TaXplPEJSPihpbiBieXRlcyk8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+RGVzY3JpcHRpb248L1RIPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5jb21tYW5kPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPidNJyAoaW5kaWNhdGluZyAnbW9uaXRvciBzdGFydCcpPC9URD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+c25hcGxlbjwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+NDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5zbmFwbGVuPC9URD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+dGltZW91dDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD50aW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpPC9URD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+cHJvbWlzY3VvdXM8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+QSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgaW50ZXJmYWNlIGJlaW5nIG1vbml0b3JlZCBzaG93IG9wZXJhdGUKKwkJCQkJCQlpbiBwcm9taXNjdW91cyBtb2RlLiBbb2ZmKDApIC8gb24oTlopXTwvVEQ+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPmRpcmVjdGlvbjwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5BIGZsYWcgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uIG9mIHRyYWZmaWMgdGhhdCBzaG91bGQgYmUgY2FwdHV0ZWQgW2JvdGgoMCkgLyBpbigxKSAvIG91dCgyKV08L1REPgorCQkJCQk8L1RSPgorCQkJCTwvVEFCTEU+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPklPUCAtPiBTTVA8L1REPgorCQkJPFREIFZBTElHTj1UT1A+U2VuZHMgY2FwdHVyZWQgcGFja2V0cy48L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIENPTFNQQU49Mz48SFIgV0lEVEg9MTAwJT48L1RIPjwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj5wY2FwX3NldGZpbHRlcigpPC9URD4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U01QIC0+IElPUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5BdCBhbnkgdGltZSwgdGhlIFNNUCBjYW4gaXNzdWUgYSBzZXQgZmlsdGVyIGNvbW1hbmQgd2hpY2ggY29udGFpbnMKKwkJCQkJCQlhbiBpbmRpY2F0b3IsIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIGluIHRoZSBmaWx0ZXIsCisJCQkJCQkJZm9sbG93ZWQgYnkgdGhlIHNlcXVlbmNlIG9mIGZpbHRlciBjb21tYW5kcyByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlCisJCQkJCQkJb2YgQy1zdHlsZSBzdHJ1Y3R1cmVzLgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPmNvbW1hbmQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+J0YnIChpbmRpY2F0aW5nICdmaWx0ZXInKTwvVEQ+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPmNvdW50PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj40PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2YgY29tbWFuZCBpbiB0aGUgQmVya2VsZXkgUGFja2V0IEZpbHRlciB0aGF0IGZvbGxvdy48L1REPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5CUEYgcHJvZ3JhbTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+J24nPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPjggYnl0ZXMgb2YgZWFjaCBjb21tYW5kIChyZXBlYXRlZCAnbicgdGltZXMpLjxCUj4KKwkJCQkJCQkJIAlFYWNoIGNvbW1hbmQgY29uc2lzdHMgb2YgdGhhdCBDLXN0eWxlIHN0cnVjdHVyZSB3aGljaCBjb250YWluczoKKwkJCQkJCQk8UD4KKwkJCQkJCQk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCQkJCQkJCQk8VFI+CisJCQkJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5OYW1lLzxCUj5QdXJwb3NlPC9USD4KKwkJCQkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TaXplPEJSPihpbiBieXRlcyk8L1RIPgorCQkJCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+RGVzY3JpcHRpb248L1RIPgorCQkJCQkJCQk8L1RSPgorCQkJCQkJCQk8VFI+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD5vcGNvZGU8L1REPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjI8L1REPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1A+VGhlIGNvbW1hbmQncyBvcGNvZGUuPC9URD4KKwkJCQkJCQkJPC9UUj4KKwkJCQkJCQkJPFRSPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1A+J2p0JzwvVEQ+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgJ2p1bXAgaWYgdHJ1ZScgcHJvZ3JhbSBjb3VudGVyIG9mZnNldC48L1REPgorCQkJCQkJCQk8L1RSPgorCQkJCQkJCQk8VFI+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD4namYnPC9URD4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QPlRoZSAnanVtcCBpZiBmYWxzZScgcHJvZ3JhbSBjb3VudGVyIG9mZnNldC48L1REPgorCQkJCQkJCQk8L1RSPgorCQkJCQkJCQk8VFI+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD4nayc8L1REPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjQ8L1REPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1A+VGhlICdvdGhlcicgZGF0YSBmaWVsZC48L1REPgorCQkJCQkJCQk8L1RSPgorCQkJCQkJCTwvVEFCTEU+CisJCQkJCQkJPFA+CisJCQkJCQkJUmVmZXIgdG8gdGhlIGJwZig0KSBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorCQkJCQkJPC9URD4KKwkJCQkJPC9UUj4KKwkJCQk8L1RBQkxFPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5JT1AgLT4gU01QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPkluIHJldHVybiB0aGUgSU9QIHdpbGwgc2VuZCBpdHMgKHBvc3NpYmx5IGVtcHR5KSBOVUxMIHRlcm1pbmF0ZWQgZXJyb3IgcmVzcG9uc2Ugc3RyaW5nLjwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggQ09MU1BBTj0zPjxIUiBXSURUSD0xMDAlPjwvVEg+PC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPnBjYXBfc3RhdHMoKTwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNNUCAtPiBJT1A8L1REPgorCQkJPFREIFZBTElHTj1UT1A+QXQgYW55IHRpbWUsIHRoZSBTTVAgY2FuIGlzc3VlIGEgJ3JldHJpZXZlIHN0YXRpc3RpY3MnIGNvbW1hbmQgd2hpY2ggY29udGFpbnM6PEJSPgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPmNvbW1hbmQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+J1MnIChpbmRpY2F0aW5nICdyZXF1ZXN0IHN0YXRpc3RpY3MnKTwvVEQ+CisJCQkJCTwvVFI+CisJCQkJPC9UQUJMRT4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+SU9QIC0+IFNNUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5JbiByZXR1cm4gdGhlIElPUCB3aWxsIHNlbmQ6CisJCQkJPFA+CisJCQkJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwkJCQkJPFRSPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+TmFtZS88QlI+UHVycG9zZTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U2l6ZTxCUj4oaW4gYnl0ZXMpPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPkRlc2NyaXB0aW9uPC9USD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+cHNfcmVjdjwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+NDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlci48L1REPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5wc19kcm9wPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj40PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHdlcmUgZHJvcHBlZCBiZWNhdXNlIHRoZSBpbnB1dCBxdWV1ZSB3YXMgZnVsbCwKKwkJCQkJCQlyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBwYXNzZWQgdGhlIGZpbHRlci48L1REPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5wc19pZmRyb3A8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIG5ldHdvcmsgaW50ZWZhY2UKKwkJCQkJCQkocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgaGF2ZSBwYXNzZWQgdGhlIGlucHV0IGZpbHRlcikuPC9URD4KKwkJCQkJPC9UUj4KKwkJCQk8L1RBQkxFPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBDT0xTUEFOPTM+PEhSIFdJRFRIPTEwMCU+PC9USD48L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTE+cGNhcF9jbG9zZSgpPC9URD4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U01QIC0+IElPUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5BdCBhbnkgdGltZSwgdGhlIFNNUCBjYW4gY2xvc2UgdGhlIFRDUCBzZXNzaW9uIHdpdGggdGhlIElPUC48L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIENPTFNQQU49Mz48SFIgV0lEVEg9MTAwJT48L1RIPjwvVFI+CisJPC9UQUJMRT4KKzwvVUw+CisKKzxIMz5JbnRlcmZhY2UgSUQgTmFtaW5nIENvbnZlbnRpb248L0gzPgorPFVMPgorCUVhY2ggaW50ZXJmYWNlIHdpdGhpbiBhbiBJT1Agd2lsbCBiZSByZWZlcnJlZCB0byB1bmlxdWVseS4gIFNpbmNlIGFuIGN1cnJlbnRseSBjb250YWlucworCTggbW9uaXRvcmFibGUgV0FOIHBvcnRzIGFuZCBhIG1vbml0b3JhYmxlIEV0aGVybmV0IHBvcnQsIHRoZSBuYW1pbmcgY29udmVudGlvbiBpczoKKwk8UD4KKwk8Q0VOVEVSPgorCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCTxUUj48VEg+SW50ZXJmYWNlICM8L1RIPgkJPFRIPlR5cGU8L1RIPgkJCQkJPFRIPk5hbWU8L1RIPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjE8L1REPgkJPFREIEFMSUdOPUNFTlRFUj5XQU48L1REPgkJPFREIEFMSUdOPUNFTlRFUj53YW4wPC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj4yPC9URD4JCTxURCBBTElHTj1DRU5URVI+V0FOPC9URD4JCTxURCBBTElHTj1DRU5URVI+d2FuMTwvVEQ+PC9UUj4KKwkJPFRSPjxURCBBTElHTj1DRU5URVI+MzwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPldBTjwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPndhbjI8L1REPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjQ8L1REPgkJPFREIEFMSUdOPUNFTlRFUj5XQU48L1REPgkJPFREIEFMSUdOPUNFTlRFUj53YW4zPC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj41PC9URD4JCTxURCBBTElHTj1DRU5URVI+V0FOPC9URD4JCTxURCBBTElHTj1DRU5URVI+d2FuNDwvVEQ+PC9UUj4KKwkJPFRSPjxURCBBTElHTj1DRU5URVI+NjwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPldBTjwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPndhbjU8L1REPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjc8L1REPgkJPFREIEFMSUdOPUNFTlRFUj5XQU48L1REPgkJPFREIEFMSUdOPUNFTlRFUj53YW42PC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj44PC9URD4JCTxURCBBTElHTj1DRU5URVI+V0FOPC9URD4JCTxURCBBTElHTj1DRU5URVI+d2FuNzwvVEQ+PC9UUj4KKwkJPFRSPjxURCBBTElHTj1DRU5URVI+OTwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPkV0aGVybmV0PC9URD4JPFREIEFMSUdOPUNFTlRFUj5ldGgwPC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj4xMDwvVEQ+CTxURCBBTElHTj1DRU5URVI+RXRoZXJuZXQ8L1REPgk8VEQgQUxJR049Q0VOVEVSPmV0aDE8L1REPjwvVFI+CisJPC9UQUJMRT4KKwk8L0NFTlRFUj4KKzwvVUw+CisKKzxIMz5QYWNrZXQgVHJhY2UgRGF0YSBGb3JtYXQ8L0gzPgorPFVMPgorCVRoZSBmb3JtYXQgb2YgdGhlIHRyYWNlIGRhdGEgdGhhdCBpcyBzZW50IHRvIHRoZSBTTVAgZm9sbG93cyBhIHBvcnRpb24gb2YgdGhlIGxpYnBjYXAgZmlsZSBmb3JtYXQKKwlhbmQgaXMgc3VtbWFyaXplZCBoZXJlLiAgVGhpcyBmb3JtYXQgc3BlY2lmaWVzIHRoZSBnZW5lcmljIHJlcXVpcmVtZW50cyBuZWVkZWQgdG8KKwliZSBhYmxlIHRvIGRlY29kZSBwYWNrZXRzLCBidXQgZG9lcyBub3QgY292ZXIgQUNOIHNwZWNpZmljcyBzdWNoIGFzIGN1c3RvbSBNQUMgYWRkcmVzc2luZworCWFuZCBXQU4gcHJvdG9jb2wgc3VwcG9ydC4KKwk8UD4KKworCUFsdGhvdWdoIGEgbGlicGNhcCBmaWxlIGJlZ2lucyB3aXRoIGEgZ2xvYmFsIGhlYWRlciBmb2xsb3dlZCBieSB6ZXJvIG9yCisJbW9yZSByZWNvcmRzIGZvciBlYWNoIGNhcHR1cmVkIHBhY2tldCwgdHJhY2UgZGF0YSBzZW50IHRvIHRoZSBTTVAgZG9lcyBOT1QgYmVnaW4gd2l0aCBhIGdsb2JhbCBoZWFkZXIuCisJQSB0cmFjZSBzZXF1ZW5jZSBsb29rcyBsaWtlIHRoaXM6CisJPFA+CisJPFRBQkxFPgorCQk8VFI+CisgIAkJCTxURCBTVFlMRT0iYmFja2dyb3VuZC1jb2xvcjogI2MwRkZjMCI+Jm5ic3A7W1BhY2tldCBIZWFkZXJdJm5ic3A7PC9URD4KKyAgCQkJPFREIFNUWUxFPSJiYWNrZ3JvdW5kLWNvbG9yOiAjYzBGRmMwIj4mbmJzcDtbUGFja2V0IERhdGFdJm5ic3A7PC9URD4KKyAgCQkJPFREIFNUWUxFPSJiYWNrZ3JvdW5kLWNvbG9yOiAjYzBjMEZGIj4mbmJzcDtbUGFja2V0IEhlYWRlcl0mbmJzcDs8L1REPgorICAJCQk8VEQgU1RZTEU9ImJhY2tncm91bmQtY29sb3I6ICNjMGMwRkYiPiZuYnNwO1tQYWNrZXQgRGF0YV0mbmJzcDs8L1REPgorICAJCQk8VEQgU1RZTEU9ImJhY2tncm91bmQtY29sb3I6ICNlMGMwYzAiPiZuYnNwO1tQYWNrZXQgSGVhZGVyXSZuYnNwOzwvVEQ+CisgIAkJCTxURCBTVFlMRT0iYmFja2dyb3VuZC1jb2xvcjogI2UwYzBjMCI+Jm5ic3A7W1BhY2tldCBEYXRhXSZuYnNwOzwvVEQ+CisgIAkJCTxURD4uLi48L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKzxIND5QYWNrZXQgSGVhZGVyPC9IND4KKwk8VUw+CisJCUVhY2ggY2FwdHVyZWQgcGFja2V0IHN0YXJ0cyB3aXRoIGEgaGVhZGVyIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKwkJKGluIG5ldHdvcmsgbmV1dHJhbCBvcmRlcik6CisKKwkJPEZPTlQgU0laRT0tMT4KKwkJPFBSRT4KKyB1aW50MzIgdHZfc2VjOyAgLyogdGltZXN0YW1wIHNlY29uZHMgKi8KKyB1aW50MzIgdHZfdXNlYzsgLyogdGltZXN0YW1wIG1pY3Jvc2Vjb25kcyAqLworIHVpbnQzMiBjYXBsZW47ICAvKiBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBmb2xsb3dpbmcgcGFja2V0ICovCisgdWludDMyIGxlbjsgICAgIC8qIG9yaWdpbmFsIGxlbmd0aCBvZiBwYWNrZXQgb24gdGhlIHdpcmUgKi8KKwkJPC9QUkU+CisJCTwvRk9OVD4KKworCQk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCQkJPFRSPgorCQkJCTxURCBWQUxJR049VE9QPnR2X3NlYzwvVEQ+CisJCQkJPFREPlRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBwYWNrZXQgd2FzIGNhcHR1cmVkLgorCQkJCQlUaGlzIHZhbHVlIGlzIGluIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIDAwOjAwOjAwIEdNVDsKKwkJCQkJdGhpcyBpcyBhbHNvIGtub3duIGFzIGEgVU4qWCB0aW1lX3QuIFlvdSBjYW4gdXNlIHRoZSBBTlNJIEMKKwkJCQkJPGVtPnRpbWUoKTwvZW0+IGZ1bmN0aW9uIGZyb20gPGVtPnRpbWUuaDwvZW0+IHRvIGdldCB0aGlzIHZhbHVlLAorCQkJCQlidXQgeW91IG1pZ2h0IHVzZSBhIG1vcmUgb3B0aW1pemVkIHdheSB0byBnZXQgdGhpcyB0aW1lc3RhbXAgdmFsdWUuCisJCQkJCUlmIHRoaXMgdGltZXN0YW1wIGlzbid0IGJhc2VkIG9uIEdNVCAoVVRDKSwgdXNlIDxlbT50aGlzem9uZTwvZW0+CisJCQkJCWZyb20gdGhlIGdsb2JhbCBoZWFkZXIgZm9yIGFkanVzdG1lbnRzLjwvVEQ+CisJCQk8L1RSPgorCQkJPFRSPgorCQkJCTxURCBWQUxJR049VE9QPnR2X3VzZWM8L1REPgorCQkJCTxURD5UaGUgbWljcm9zZWNvbmRzIHdoZW4gdGhpcyBwYWNrZXQgd2FzIGNhcHR1cmVkLCBhcyBhbiBvZmZzZXQgdG8gPGVtPnRzX3NlYzwvZW0+LgorCQkJCQk8Qj5CZXdhcmU6IDwvQj50aGlzIHZhbHVlIG11c3QgbmV2ZXIgcmVhY2ggMSBzZWNvbmQgKDEsMDAwLDAwMCksCisJCQkJCWluIHRoaXMgY2FzZSA8ZW0+dHNfc2VjPC9lbT4gbXVzdCBiZSBpbmNyZWFzZWQgaW5zdGVhZCE8L1REPgorCQkJPC9UUj4KKwkJCTxUUj4KKwkJCQk8VEQgVkFMSUdOPVRPUD5jYXBsZW48L1REPgorCQkJCTxURD5UaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHByb3ZpZGVkIGluIHRoZSBjYXB0dXJlIHJlY29yZC4KKwkJCQkJVGhpcyB2YWx1ZSBzaG91bGQgbmV2ZXIgYmVjb21lIGxhcmdlciB0aGFuIDxlbT5sZW48L2VtPiBvciB0aGUKKwkJCQkJPGVtPnNuYXBsZW48L2VtPiB2YWx1ZSBzcGVjaWZpZWQgZHVyaW5nIHRoZSBjYXB0dXJlLjwvVEQ+CisJCQk8L1RSPgorCQkJPFRSPgorCQkJCTxURCBWQUxJR049VE9QPmxlbjwvVEQ+CisJCQkJPFREPlRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCAib24gdGhlIHdpcmUiIHdoZW4gaXQgd2FzIGNhcHR1cmVkLgorCQkJCQlJZiA8ZW0+Y2FwbGVuPC9lbT4gYW5kIDxlbT5sZW48L2VtPiBkaWZmZXIsIHRoZSBhY3R1YWxseQorCQkJCQlzYXZlZCBwYWNrZXQgc2l6ZSB3YXMgbGltaXRlZCBieSB0aGUgdmFsdWUgb2YgPGVtPnNuYXBsZW48L2VtPiBzcGVjaWZpZWQKKwkJCQkJZHVyaW5nIG9uZSBvZiB0aGUgY2FwdHVyZSBkaXJlY3RpdmVzIHN1Y2ggYXMgcGNhcF9kaXNwYXRjaCgpLjwvVEQ+CisJCQk8L1RSPgorCQk8L1RBQkxFPgorCTwvVUw+CisKKzxIND5QYWNrZXQgRGF0YTwvSDQ+CisJPFVMPgorCVRoZSBhY3R1YWwgcGFja2V0IGRhdGEgd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIHBhY2tldCBoZWFkZXIgYXMgYSBzZXF1ZW5jZSBvZiA8ZW0+Y2FwbGVuPC9lbT4gb2N0ZXRzLgorCURlcGVuZGluZyBvbiB0aGUgRExUIGVuY29kaW5nIG51bWJlciBhc3NpZ25lZCB0byB0aGUgaW50ZXJmYWNlLCB0aGUgcGFja2V0IGRhdGEgd2lsbCBjb250YWluIGFuIGFkZGl0aW9uYWwKKwljdXN0b20gaGVhZGVyIHVzZWQgdG8gY29udmV5IFdBTiBwb3J0IHJlbGF0ZWQgaW5mb3JtYXRpb24uCisJPC9VTD4KKworPEg0PkFDTiBDdXN0b20gUGFja2V0IEhlYWRlcjwvSDQ+CisJPFVMPgorCVBDQVAsIFdpcmVzaGFyayBhbmQgVGNwZHVtcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBBQ04gdG8gc3VwcG9ydAorCW1vbml0b3Jpbmcgb2YgaXRzIHBvcnRzLCBob3dldmVyIGVhY2ggb2YgdGhlc2UgZmFjaWxpdGllcyB3ZXJlIGZvY3VzZWQgb24gY2FwdHVyaW5nCisJYW5kIGRpc3BsYXlpbmcgdHJhZmZpYyBmcm9tIExBTiBpbnRlcmZhY2VzLiAgVGhlIFNJVEEgZXh0ZW50aW9ucyB0byB0aGVzZSBmYWNpbGl0aWVzCisJYXJlIHVzZWQgdG8gYWxzbyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIGNhcHR1cmUsIGZpbHRlciwgYW5kIGRpc3BsYXkgaW5mb3JtYXRpb24gZnJvbQorCWFuIEFDTidzIFdBTiBwb3J0cy4KKwk8UD4KKwlBbHRob3VnaCBlYWNoIHBhY2tldCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBsaWJwY2FwIGZvcm1hdCwgc2luY2UgdGhlcmUgYXJlCisJdHdvIHR5cGVzIG9mIGludGVyZmFjZXMgdGhhdCBjYW4gYmUgbW9uaXRvcmVkLCB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhCisJcGFja2V0IHZhcmllcyBzbGlnaHRseS4KKwk8UD4KKwk8VUwgVFlQRT1ESVNDPgorCQk8TEk+Rm9yIEV0aGVybmV0IChsaWtlKSBkZXZpY2VzLCB0aGUgcGFja2V0IGZvcm1hdCBpcyB1bmNoYW5nZWQgZnJvbSB0aGUgc3RhbmRhcmQgUGNhcCBmb3JtYXQuCisJCTxMST5Gb3IgV0FOIGRldmljZXMsIHRoZSBwYWNrZXQgY29udGFpbnMgYSA1IGJ5dGUgaGVhZGVyIHRoYXQgcHJlY2VlZHMgdGhlIGFjdHVhbCBjYXB0dXJlZCBkYXRhCisJCQlkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyB0YWJsZToKKwk8L1VMPgorCTxQPgorCTxDRU5URVI+CisJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwk8VFI+CTxUSD5PY3RldDwvVEg+CisJCQk8VEg+TmFtZTwvVEg+CisJCQk8VEg+TWFzay9WYWx1ZTwvVEg+CisJCQk8VEggQ09MU1BBTj0yPkRlZmluaXRpb248L1RIPgkJPC9UUj4KKworCTxUUj4JPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49Mz4wPC9USD4KKwkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBST1dTUEFOPTM+Q29udHJvbCAvIFN0YXR1czwvVEg+CisKKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eHh4MDwvRk9OVD48L1REPgorCQkJPFREPlRyYW5zbWl0dGVkIGJ5IGNhcHR1cmUgZGV2aWNlPC9URD4KKwkJCTxURCBST1dTUEFOPTIgQUxJR049Q0VOVEVSPihzZWUgJ0Vycm9ycycgb2N0ZXRzKTwvVEQ+CQkJCQkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHh4eDE8L0ZPTlQ+PC9URD4KKwkJCTxURD5SZWNlaXZlZCBieSBjYXB0dXJlIGRldmljZTwvVEQ+CQkJCQkJCQkJCQkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj4xeHh4eHh4eDwvRk9OVD48L1REPgorCQkJPFREIENPTFNQQU49Mj5ObyBidWZmZXIgd2FzIGF2YWlsYWJsZSBkdXJpbmcgY2FwdHVyZSBvZiBwcmV2aW91cyBwYWNrZXQuPC9URD4JPC9UUj4KKworCTxUUj4JPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49OD4xPC9USD4KKwkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBST1dTUEFOPTg+U2lnbmFsczwvVEg+CisKKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eHh4MTwvRk9OVD48L1REPgk8VEQgQ09MU1BBTj0yPkRTUiBhc3NlcnRlZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4eDF4PC9GT05UPjwvVEQ+CTxURCBDT0xTUEFOPTI+RFRSIGFzc2VydGVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHgxeHg8L0ZPTlQ+PC9URD4JPFREIENPTFNQQU49Mj5DVFMgYXNzZXJ0ZWQ8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4MXh4eDwvRk9OVD48L1REPgk8VEQgQ09MU1BBTj0yPlJUUyBhc3NlcnRlZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eDF4eHh4PC9GT05UPjwvVEQ+CTxURCBDT0xTUEFOPTI+RENEIGFzc2VydGVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHgxeHh4eHg8L0ZPTlQ+PC9URD4JPFREIENPTFNQQU49Mj5VbmRlZmluZWQ8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54MXh4eHh4eDwvRk9OVD48L1REPgk8VEQgQ09MU1BBTj0yPlVuZGVmaW5lZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPjF4eHh4eHh4PC9GT05UPjwvVEQ+CTxURCBDT0xTUEFOPTI+VW5kZWZpbmVkPC9URD4JCTwvVFI+CisKKwk8VFI+CTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBST1dTUEFOPTk+MjwvVEg+CisJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgUk9XU1BBTj05PkVycm9yczxCUj4ob2N0ZXQgMSk8L1RIPgorCisJCQk8VEg+Jm5ic3A7PC9USD4JCQkJCQkJCQkJCQkJCQk8VEg+VHg8L1RIPgkJCQkJCTxUSD5SeDwvVEg+CQkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHh4eDE8L0ZPTlQ+PC9URD4JPFREPlVuZGVycnVuPC9URD4JCQkJPFREPkZyYW1pbmc8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eHgxeDwvRk9OVD48L1REPgk8VEQ+Q1RTIExvc3Q8L1REPgkJCQk8VEQ+UGFyaXR5PC9URD4JCQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4MXh4PC9GT05UPjwvVEQ+CTxURD5VQVJUIEVycm9yPC9URD4JCQkJPFREPkNvbGxpc2lvbjwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHgxeHh4PC9GT05UPjwvVEQ+CTxURD5SZS1UeCBMaW1pdCBSZWFjaGVkPC9URD4JPFREPkxvbmcgRnJhbWU8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHgxeHh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JCQkJPFREPlNob3J0IEZyYW1lPC9URD4JPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eDF4eHh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JCQkJPFREPlVuZGVmaW5lZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPngxeHh4eHh4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgkJCQk8VEQ+VW5kZWZpbmVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+MXh4eHh4eHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CQkJCTxURD5VbmRlZmluZWQ8L1REPgkJPC9UUj4KKworCTxUUj4JPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49OT4zPC9USD4KKwkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBST1dTUEFOPTk+RXJyb3JzPEJSPihvY3RldCAyKTwvVEg+CisKKwkJCTxUSD4mbmJzcDs8L1RIPgkJCQkJCQkJCQkJCQkJCTxUSD5UeDwvVEg+CQkJPFRIPlJ4PC9USD4JCQkJCQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4eHgxPC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgk8VEQ+Tm9uLU9jdGV0IEFsaWduZWQ8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eHgxeDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JPFREPkFib3J0IFJlY2VpdmVkPC9URD4JCQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4MXh4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgk8VEQ+Q0QgTG9zdDwvVEQ+CQkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eDF4eHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CTxURD5EaWdpdGFsIFBMTCBFcnJvcjwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eDF4eHh4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgk8VEQ+T3ZlcnJ1bjwvVEQ+CQkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHgxeHh4eHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CTxURD5GcmFtZSBMZW5ndGggVmlvbGF0aW9uPC9URD4JPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54MXh4eHh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JPFREPkNSQyBFcnJvcjwvVEQ+CQkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+MXh4eHh4eHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CTxURD5CcmVhayBSZWNlaXZlZDwvVEQ+CQkJPC9UUj4KKworCTxUUj4JPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49MTI+NDwvVEg+CisJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+UHJvdG9jb2w8L1RIPgorCisJCQk8VEQgQ09MU1BBTj0zPgorCQkJCTxDRU5URVI+CisJCQkJPFRBQkxFIEJPUkRFUj0wIENFTExQQURESU5HPTAgQ0VMTFNQQUNJTkc9MD4KKwkJCQkJPFRSIFZBTElHTj1CT1RUT00+PFREIEFMSUdOPUNFTlRFUj4weDAxPC9URD4JPFREPi08L1REPgk8VEQ+TEFQQiAoQk9QKQkJCQk8U1VQPiZuYnNwOzwvU1VQPgk8L1REPgk8L1RSPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MDI8L1REPgk8VEQ+LTwvVEQ+CTxURD5FdGhlcm5ldAkJCQk8U1VQPjE8L1NVUD4JCTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwMzwvVEQ+CTxURD4tPC9URD4JPFREPkFzeW5jIChJbnRlcnJ1cHQgSU8pCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwNDwvVEQ+CTxURD4tPC9URD4JPFREPkFzeW5jIChCbG9jayBJTykJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwNTwvVEQ+CTxURD4tPC9URD4JPFREPklQQVJTCQkJCQk8U1VQPiZuYnNwOzwvU1VQPgk8L1REPgk8L1RSPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MDY8L1REPgk8VEQ+LTwvVEQ+CTxURD5VVFMJCQkJCQk8U1VQPiZuYnNwOzwvU1VQPgk8L1REPgk8L1RSPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MDc8L1REPgk8VEQ+LTwvVEQ+CTxURD5QUFAgKEhETEMpCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwODwvVEQ+CTxURD4tPC9URD4JPFREPlNETEMJCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwOTwvVEQ+CTxURD4tPC9URD4JPFREPlRva2VuIFJpbmcJCQkJPFNVUD4xPC9TVVA+CQk8L1REPgk8L1RSPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MTA8L1REPgk8VEQ+LTwvVEQ+CTxURD5JMkMJCQkJCQk8U1VQPiZuYnNwOzwvU1VQPgk8L1REPgk8L1RSPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MTE8L1REPgk8VEQ+LTwvVEQ+CTxURD5EUE0gTGluawkJCQk8U1VQPiZuYnNwOzwvU1VQPgk8L1REPgk8L1RSPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MTI8L1REPgk8VEQ+LTwvVEQ+CTxURD5GcmFtZSBSZWxheSAoQk9QKQkJPFNVUD4mbmJzcDs8L1NVUD4JPC9URD4JPC9UUj4KKwkJCQk8L1RBQkxFPgorCQkJCTwvQ0VOVEVSPgorCQkJCTxQPgorCQkJCTxTVFJPTkc+Tm90ZSAxOjwvU1RST05HPgorCQkJCUV0aGVybmV0IGFuZCBUb2tlbiBSaW5nIGZyYW1lcyB3aWxsIG5ldmVyIGJlIHNlbnQgYXMgRExUX1NJVEEgKHdpdGggdGhlIDUgb2N0ZXQgaGVhZGVyKSwKKwkJCQlidXQgd2lsbCBiZSBzZW50IGFzIHRoZWlyIGNvcnJlc3BvbmRpbmcgRExUIHR5cGVzIGluc3RlYWQuCisJCQk8L1REPgorCTwvVFI+CisJPC9UQUJMRT4KKwk8L0NFTlRFUj4KKzwvVUw+Cis8UD4KKzwvVUw+Cis8L1VMPgpkaWZmIC0tZ2l0IGEvcGNhcC1zbmYuYyBiL3BjYXAtc25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZmZhNAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtc25mLmMKQEAgLTAsMCArMSwzMzAgQEAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c25mLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgInBjYXAtc25mLmgiCisKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBTTkYgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfc25mIHsKKwlzbmZfaGFuZGxlX3Qgc25mX2hhbmRsZTsgLyogb3BhcXVlIGRldmljZSBoYW5kbGUgKi8KKwlzbmZfcmluZ190ICAgc25mX3Jpbmc7ICAgLyogb3BhcXVlIGRldmljZSByaW5nIGhhbmRsZSAqLworICAgICAgICBpbnQgICAgICAgICAgc25mX3RpbWVvdXQ7CisgICAgICAgIGludCAgICAgICAgICBzbmZfYm9hcmRudW07Cit9OworCitzdGF0aWMgaW50CitzbmZfc2V0X2RhdGFsaW5rKHBjYXBfdCAqcCwgaW50IGRsdCkKK3sKKwlwLT5saW5rdHlwZSA9IGRsdDsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzbmZfcGNhcF9zdGF0cyhwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCXN0cnVjdCBzbmZfcmluZ19zdGF0cyBzdGF0czsKKwlpbnQgcmM7CisKKwlpZiAoKHJjID0gc25mX3JpbmdfZ2V0c3RhdHMocHMtPnNuZl9yaW5nLCAmc3RhdHMpKSkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbmZfZ2V0X3N0YXRzOiAlcyIsCisJCQkgcGNhcF9zdHJlcnJvcihyYykpOworCQlyZXR1cm4gLTE7CisJfQorCXBzLT5wc19yZWN2ID0gc3RhdHMucmluZ19wa3RfcmVjdiArIHN0YXRzLnJpbmdfcGt0X292ZXJmbG93OworCXBzLT5wc19kcm9wID0gc3RhdHMucmluZ19wa3Rfb3ZlcmZsb3c7CisJcHMtPnBzX2lmZHJvcCA9IHN0YXRzLm5pY19wa3Rfb3ZlcmZsb3cgKyBzdGF0cy5uaWNfcGt0X2JhZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NuZl9wbGF0Zm9ybV9jbGVhbnVwKHBjYXBfdCAqcCkKK3sKKwlzdHJ1Y3QgcGNhcF9zbmYgKnBzID0gcC0+cHJpdjsKKworCWlmIChwID09IE5VTEwpCisJCXJldHVybjsKKworCXNuZl9yaW5nX2Nsb3NlKHBzLT5zbmZfcmluZyk7CisJc25mX2Nsb3NlKHBzLT5zbmZfaGFuZGxlKTsKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7Cit9CisKK3N0YXRpYyBpbnQKK3NuZl9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKK3sKKwlzdHJ1Y3QgcGNhcF9zbmYgKnBzID0gcC0+cHJpdjsKKworCXJldHVybiAocHMtPnNuZl90aW1lb3V0ID09IDApOworfQorCitzdGF0aWMgaW50CitzbmZfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKK3sKKwlzdHJ1Y3QgcGNhcF9zbmYgKnBzID0gcC0+cHJpdjsKKworCWlmIChub25ibG9jaykKKwkJcHMtPnNuZl90aW1lb3V0ID0gMDsKKwllbHNlIHsKKwkJaWYgKHAtPm9wdC50aW1lb3V0IDw9IDApCisJCQlwcy0+c25mX3RpbWVvdXQgPSAtMTsgLyogZm9yZXZlciAqLworCQllbHNlCisJCQlwcy0+c25mX3RpbWVvdXQgPSBwLT5vcHQudGltZW91dDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworI2RlZmluZSBfTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDAKKworc3RhdGljIGlubGluZQorc3RydWN0IHRpbWV2YWwKK3NuZl90aW1lc3RhbXBfdG9fdGltZXZhbChjb25zdCBpbnQ2NF90IHRzX25hbm9zZWMpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJaW50MzJfdCByZW07CisJaWYgKHRzX25hbm9zZWMgPT0gMCkKKwkJcmV0dXJuIChzdHJ1Y3QgdGltZXZhbCkgeyAwLCAwIH07CisJdHYudHZfc2VjID0gdHNfbmFub3NlYyAvIF9OU0VDX1BFUl9TRUM7CisJdHYudHZfdXNlYyA9ICh0c19uYW5vc2VjICUgX05TRUNfUEVSX1NFQykgLyAxMDAwOworCXJldHVybiB0djsKK30KKworc3RhdGljIGludAorc25mX3JlYWQocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlzdHJ1Y3QgcGNhcF9zbmYgKnBzID0gcC0+cHJpdjsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIgaGRyOworCWludCBpLCBmbGFncywgZXJyLCBjYXBsZW4sIG47CisJc3RydWN0IHNuZl9yZWN2X3JlcSByZXE7CisKKwlpZiAoIXAgfHwgY250ID09IDApCisJCXJldHVybiAtMTsKKworCW4gPSAwOworCXdoaWxlIChuIDwgY250IHx8IFBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQoY250KSkgeworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCWlmIChuID09IDApIHsKKwkJCQlwLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gKC0yKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIChuKTsKKwkJCX0KKwkJfQorCisJCWVyciA9IHNuZl9yaW5nX3JlY3YocHMtPnNuZl9yaW5nLCBwcy0+c25mX3RpbWVvdXQsICZyZXEpOworCisJCWlmIChlcnIpIHsKKwkJCWlmIChlcnIgPT0gRUJVU1kgfHwgZXJyID09IEVBR0FJTikKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKGVyciA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWlmIChlcnIgIT0gMCkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNuZl9yZWFkOiAlcyIsCisJCQkJIAkgcGNhcF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQljYXBsZW4gPSByZXEubGVuZ3RoOworCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCisJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKKworCQlpZiAoKHAtPmZjb2RlLmJmX2luc25zID09IE5VTEwpIHx8CisJCSAgICAgYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgcmVxLnBrdF9hZGRyLCByZXEubGVuZ3RoLCBjYXBsZW4pKSB7CisJCQloZHIudHMgPSBzbmZfdGltZXN0YW1wX3RvX3RpbWV2YWwocmVxLnRpbWVzdGFtcCk7CisJCQloZHIuY2FwbGVuID0gY2FwbGVuOworCQkJaGRyLmxlbiA9IHJlcS5sZW5ndGg7CisJCQljYWxsYmFjayh1c2VyLCAmaGRyLCByZXEucGt0X2FkZHIpOworCQl9CisJCW4rKzsKKwl9CisJcmV0dXJuIChuKTsKK30KKworc3RhdGljIGludAorc25mX3NldGZpbHRlcihwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApCit7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisJaWYgKCFmcCkgeworCQlzdHJuY3B5KHAtPmVycmJ1ZiwgInNldGZpbHRlcjogTm8gZmlsdGVyIHNwZWNpZmllZCIsCisJCQlzaXplb2YocC0+ZXJyYnVmKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBNYWtlIG91ciBwcml2YXRlIGNvcHkgb2YgdGhlIGZpbHRlciAqLworCisJaWYgKGluc3RhbGxfYnBmX3Byb2dyYW0ocCwgZnApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc25mX2luamVjdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1ZiBfVV8sIHNpemVfdCBzaXplIF9VXykKK3sKKwlzdHJsY3B5KHAtPmVycmJ1ZiwgIlNlbmRpbmcgcGFja2V0cyBpc24ndCBzdXBwb3J0ZWQgd2l0aCBzbmYiLAorCSAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorc25mX2FjdGl2YXRlKHBjYXBfdCogcCkKK3sKKwlzdHJ1Y3QgcGNhcF9zbmYgKnBzID0gcC0+cHJpdjsKKwljaGFyICpkZXZpY2UgPSBwLT5vcHQuc291cmNlOworCWNvbnN0IGNoYXIgKm5yID0gTlVMTDsKKwlpbnQgZXJyOworCWludCBmbGFncyA9IDA7CisKKwlpZiAoZGV2aWNlID09IE5VTEwpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJkZXZpY2UgaXMgTlVMTDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJbiBMaWJwY2FwLCB3ZSBzZXQgcHNoYXJlZCBieSBkZWZhdWx0IGlmIE5VTV9SSU5HUyBpcyBzZXQgdG8gPiAxLgorCSAqIFNpbmNlIGxpYnBjYXAgaXNuJ3QgdGhyZWFkLXNhZmUgKi8KKwlpZiAoKG5yID0gZ2V0ZW52KCJTTkZfTlVNX1JJTkdTIikpICYmICpuciAmJiBhdG9pKG5yKSA+IDEpCisJCWZsYWdzIHw9IFNORl9GX1BTSEFSRUQ7CisJZWxzZQorCQluciA9IE5VTEw7CisKKwllcnIgPSBzbmZfb3Blbihwcy0+c25mX2JvYXJkbnVtLAorCQkJMCwgLyogbGV0IFNORiBBUEkgcGFyc2UgU05GX05VTV9SSU5HUywgaWYgc2V0ICovCisJCQlOVUxMLCAvKiBkZWZhdWx0IFJTUywgb3IgdXNlIFNORl9SU1NfRkxBR1MgZW52ICovCisJCQkwLCAvKiBkZWZhdWx0IHRvIFNORl9EQVRBUklOR19TSVpFIGZyb20gZW52ICovCisJCQlmbGFncywgLyogbWF5IHdhbnQgcHNoYXJlZCAqLworCQkJJnBzLT5zbmZfaGFuZGxlKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJzbmZfb3BlbiBmYWlsZWQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVyciA9IHNuZl9yaW5nX29wZW4ocHMtPnNuZl9oYW5kbGUsICZwcy0+c25mX3JpbmcpOworCWlmIChlcnIgIT0gMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgInNuZl9yaW5nX29wZW4gZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocC0+b3B0LnRpbWVvdXQgPD0gMCkKKwkJcHMtPnNuZl90aW1lb3V0ID0gLTE7CisJZWxzZQorCQlwcy0+c25mX3RpbWVvdXQgPSBwLT5vcHQudGltZW91dDsKKworCWVyciA9IHNuZl9zdGFydChwcy0+c25mX2hhbmRsZSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAic25mX3N0YXJ0IGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiAic2VsZWN0KCkiIGFuZCAicG9sbCgpIiBkb24ndCB3b3JrIG9uIHNuZiBkZXNjcmlwdG9ycy4KKwkgKi8KKwlwLT5zZWxlY3RhYmxlX2ZkID0gLTE7CisJcC0+bGlua3R5cGUgPSBETFRfRU4xME1COworCXAtPnJlYWRfb3AgPSBzbmZfcmVhZDsKKwlwLT5pbmplY3Rfb3AgPSBzbmZfaW5qZWN0OworCXAtPnNldGZpbHRlcl9vcCA9IHNuZl9zZXRmaWx0ZXI7CisJcC0+c2V0ZGlyZWN0aW9uX29wID0gTlVMTDsgLyogTm90IGltcGxlbWVudGVkLiovCisJcC0+c2V0X2RhdGFsaW5rX29wID0gc25mX3NldF9kYXRhbGluazsKKwlwLT5nZXRub25ibG9ja19vcCA9IHNuZl9nZXRub25ibG9jazsKKwlwLT5zZXRub25ibG9ja19vcCA9IHNuZl9zZXRub25ibG9jazsKKwlwLT5zdGF0c19vcCA9IHNuZl9wY2FwX3N0YXRzOworCXAtPmNsZWFudXBfb3AgPSBzbmZfcGxhdGZvcm1fY2xlYW51cDsKKwlyZXR1cm4gMDsKK30KKworaW50CitzbmZfZmluZGFsbGRldnMocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1ZikKK3sKKwkvKgorCSAqIFRoZXJlIGFyZSBubyBwbGF0Zm9ybS1zcGVjaWZpYyBkZXZpY2VzIHNpbmNlIGVhY2ggZGV2aWNlCisJICogZXhpc3RzIGFzIGEgcmVndWxhciBFdGhlcm5ldCBkZXZpY2UuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3BjYXBfdCAqCitzbmZfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKQoreworCXBjYXBfdCAqcDsKKwlpbnQgYm9hcmRudW0gPSAtMTsKKwlzdHJ1Y3Qgc25mX2lmYWRkcnMgKmlmYWRkcnMsICppZmE7CisJc2l6ZV90IGRldmxlbjsKKwlzdHJ1Y3QgcGNhcF9zbmYgKnBzOworCisJaWYgKHNuZl9pbml0KFNORl9WRVJTSU9OX0FQSSkpIHsKKwkJLyogQ2FuJ3QgaW5pdGlhbGl6ZSB0aGUgQVBJLCBzbyBubyBTTkYgZGV2aWNlcyAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogTWF0Y2ggYSBnaXZlbiBpbnRlcmZhY2UgbmFtZSB0byBvdXIgbGlzdCBvZiBpbnRlcmZhY2UgbmFtZXMsIGZyb20KKwkgKiB3aGljaCB3ZSBjYW4gb2J0YWluIHRoZSBpbnRlbmRlZCBib2FyZCBudW1iZXIKKwkgKi8KKwlpZiAoc25mX2dldGlmYWRkcnMoJmlmYWRkcnMpIHx8IGlmYWRkcnMgPT0gTlVMTCkgeworCQkvKiBDYW4ndCBnZXQgU05GIGFkZHJlc3NlcyAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKwlkZXZsZW4gPSBzdHJsZW4oZGV2aWNlKSArIDE7CisJaWZhID0gaWZhZGRyczsKKwl3aGlsZSAoaWZhKSB7CisJCWlmICghc3RybmNtcChkZXZpY2UsIGlmYS0+c25mX2lmYV9uYW1lLCBkZXZsZW4pKSB7CisJCQlib2FyZG51bSA9IGlmYS0+c25mX2lmYV9ib2FyZG51bTsKKwkJCWJyZWFrOworCQl9CisJCWlmYSA9IGlmYS0+c25mX2lmYV9uZXh0OworCX0KKwlzbmZfZnJlZWlmYWRkcnMoaWZhZGRycyk7CisKKwlpZiAoaWZhID09IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgd2UgY2FuJ3QgZmluZCB0aGUgZGV2aWNlIGJ5IG5hbWUsIHN1cHBvcnQgdGhlIG5hbWUgInNuZlgiCisJCSAqIGFuZCAic25mMTBnWCIgd2hlcmUgWCBpcyB0aGUgYm9hcmQgbnVtYmVyLgorCQkgKi8KKwkJaWYgKHNzY2FuZihkZXZpY2UsICJzbmYxMGclZCIsICZib2FyZG51bSkgIT0gMSAmJgorCQkgICAgc3NjYW5mKGRldmljZSwgInNuZiVkIiwgJmJvYXJkbnVtKSAhPSAxKSB7CisJCQkvKiBOb3BlLCBub3QgYSBzdXBwb3J0ZWQgbmFtZSAqLworCQkJKmlzX291cnMgPSAwOworCQkJcmV0dXJuIE5VTEw7CisJCSAgICB9CisJfQorCisJLyogT0ssIGl0J3MgcHJvYmFibHkgb3Vycy4gKi8KKwkqaXNfb3VycyA9IDE7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9zbmYpKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwcyA9IHAtPnByaXY7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IHNuZl9hY3RpdmF0ZTsKKwlwcy0+c25mX2JvYXJkbnVtID0gYm9hcmRudW07CisJcmV0dXJuIHA7Cit9CmRpZmYgLS1naXQgYS9wY2FwLXNuZi5oIGIvcGNhcC1zbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQ3NzIyCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1zbmYuaApAQCAtMCwwICsxLDIgQEAKK3BjYXBfdCAqc25mX2NyZWF0ZShjb25zdCBjaGFyICosIGNoYXIgKiwgaW50ICopOworaW50IHNuZl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKZGlmZiAtLWdpdCBhL3BjYXAtc25pdC5jIGIvcGNhcC1zbml0LmMKaW5kZXggNjBhYmU2NC4uMTI2NTZiOCAxMDA2NDQKLS0tIGEvcGNhcC1zbml0LmMKKysrIGIvcGNhcC1zbml0LmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zbml0LmMsdiAxLjcyLjIuMSAyMDA1LzA1LzAzIDE4OjU0OjM4IGd1eSBFeHAgJCAoTEJMKSI7CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zbml0LmMsdiAxLjc3IDIwMDgtMDQtMTQgMjA6NDA6NTggZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtODQsOSArODQsMTcgQEAKIC8qIEZvcndhcmRzICovCiBzdGF0aWMgaW50IG5pdF9zZXRmbGFncyhpbnQsIGludCwgaW50LCBjaGFyICopOwogCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gU1RSRUFNUyBOSVQgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfc25pdCB7CisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OworfTsKKwogc3RhdGljIGludAogcGNhcF9zdGF0c19zbml0KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCiB7CisJc3RydWN0IHBjYXBfc25pdCAqcHNuID0gcC0+cHJpdjsKIAogCS8qCiAJICogInBzX3JlY3YiIGNvdW50cyBwYWNrZXRzIGhhbmRlZCB0byB0aGUgZmlsdGVyLCBub3QgcGFja2V0cwpAQCAtMTA1LDE1ICsxMTMsMTUgQEAKIAkgKiBrZXJuZWwgYnkgbGlicGNhcCBvciBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tIGxpYnBjYXAgYnkgdGhlCiAJICogYXBwbGljYXRpb24uCiAJICovCi0JKnBzID0gcC0+bWQuc3RhdDsKKwkqcHMgPSBwc24tPnN0YXQ7CiAJcmV0dXJuICgwKTsKIH0KIAogc3RhdGljIGludAogcGNhcF9yZWFkX3NuaXQocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKIHsKKwlzdHJ1Y3QgcGNhcF9zbml0ICpwc24gPSBwLT5wcml2OwogCXJlZ2lzdGVyIGludCBjYywgbjsKLQlyZWdpc3RlciBzdHJ1Y3QgYnBmX2luc24gKmZjb2RlID0gcC0+ZmNvZGUuYmZfaW5zbnM7CiAJcmVnaXN0ZXIgdV9jaGFyICpicCwgKmNwLCAqZXA7CiAJcmVnaXN0ZXIgc3RydWN0IG5pdF9idWZoZHIgKmhkcnA7CiAJcmVnaXN0ZXIgc3RydWN0IG5pdF9pZnRpbWUgKm50cDsKQEAgLTE2MSw3ICsxNjksNyBAQAogCQkJfQogCQl9CiAKLQkJKytwLT5tZC5zdGF0LnBzX3JlY3Y7CisJCSsrcHNuLT5zdGF0LnBzX3JlY3Y7CiAJCWNwID0gYnA7CiAKIAkJLyogZ2V0IHBhc3QgTklUIGJ1ZmZlciAgKi8KQEAgLTE3Myw3ICsxODEsNyBAQAogCQljcCArPSBzaXplb2YoKm50cCk7CiAKIAkJbmRwID0gKHN0cnVjdCBuaXRfaWZkcm9wcyAqKWNwOwotCQlwLT5tZC5zdGF0LnBzX2Ryb3AgPSBuZHAtPm5oX2Ryb3BzOworCQlwc24tPnN0YXQucHNfZHJvcCA9IG5kcC0+bmhfZHJvcHM7CiAJCWNwICs9IHNpemVvZiAqbmRwOwogCiAJCS8qIGdldCBwYXN0IHBhY2tldCBsZW4gICovCkBAIC0xODcsMTMgKzE5NSwxMyBAQAogCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCiAJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKIAotCQlpZiAoYnBmX2ZpbHRlcihmY29kZSwgY3AsIG5scC0+bmhfcGt0bGVuLCBjYXBsZW4pKSB7CisJCWlmIChicGZfZmlsdGVyKHAtPmZjb2RlLmJmX2luc25zLCBjcCwgbmxwLT5uaF9wa3RsZW4sIGNhcGxlbikpIHsKIAkJCXN0cnVjdCBwY2FwX3BrdGhkciBoOwogCQkJaC50cyA9IG50cC0+bmhfdGltZXN0YW1wOwogCQkJaC5sZW4gPSBubHAtPm5oX3BrdGxlbjsKIAkJCWguY2FwbGVuID0gY2FwbGVuOwogCQkJKCpjYWxsYmFjaykodXNlciwgJmgsIGNwKTsKLQkJCWlmICgrK24gPj0gY250ICYmIGNudCA+PSAwKSB7CisJCQlpZiAoKytuID49IGNudCAmJiAhUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChjbnQpKSB7CiAJCQkJcC0+Y2MgPSBlcCAtIGJwOwogCQkJCXAtPmJwID0gYnA7CiAJCQkJcmV0dXJuIChuKTsKQEAgLTIyOCw2MyArMjM2LDc3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5pdF9zZXRmbGFncyhpbnQgZmQsIGludCBwcm9taXNjLCBpbnQgdG9fbXMsIGNoYXIgKmVidWYpCituaXRfc2V0ZmxhZ3MocGNhcF90ICpwKQogewogCWJwZl91X2ludDMyIGZsYWdzOwogCXN0cnVjdCBzdHJpb2N0bCBzaTsKKwl1X2ludCB6ZXJvID0gMDsKIAlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OwogCisJaWYgKHAtPm9wdC5pbW1lZGlhdGUpIHsKKwkJLyoKKwkJICogU2V0IHRoZSBjaHVuayBzaXplIHRvIHplcm8sIHNvIHRoYXQgY2h1bmtzIGdldCBzZW50CisJCSAqIHVwIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJc2kuaWNfY21kID0gTklPQ1NDSFVOSzsKKwkJc2kuaWNfbGVuID0gc2l6ZW9mKHplcm8pOworCQlzaS5pY19kcCA9IChjaGFyICopJnplcm87CisJCWlmIChpb2N0bChwLT5mZCwgSV9TVFIsIChjaGFyICopJnNpKSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTQ0hVTks6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KIAlzaS5pY190aW1vdXQgPSBJTkZUSU07Ci0JaWYgKHRvX21zICE9IDApIHsKLQkJdGltZW91dC50dl9zZWMgPSB0b19tcyAvIDEwMDA7Ci0JCXRpbWVvdXQudHZfdXNlYyA9ICh0b19tcyAqIDEwMDApICUgMTAwMDAwMDsKKwlpZiAocC0+b3B0LnRpbWVvdXQgIT0gMCkgeworCQl0aW1lb3V0LnR2X3NlYyA9IHAtPm9wdC50aW1lb3V0IC8gMTAwMDsKKwkJdGltZW91dC50dl91c2VjID0gKHAtPm9wdC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOwogCQlzaS5pY19jbWQgPSBOSU9DU1RJTUU7CiAJCXNpLmljX2xlbiA9IHNpemVvZih0aW1lb3V0KTsKIAkJc2kuaWNfZHAgPSAoY2hhciAqKSZ0aW1lb3V0OwotCQlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ1NUSU1FOiAlcyIsCisJCWlmIChpb2N0bChwLT5mZCwgSV9TVFIsIChjaGFyICopJnNpKSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTVElNRTogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoLTEpOwogCQl9CiAJfQogCWZsYWdzID0gTklfVElNRVNUQU1QIHwgTklfTEVOIHwgTklfRFJPUFM7Ci0JaWYgKHByb21pc2MpCisJaWYgKHAtPm9wdC5wcm9taXNjKQogCQlmbGFncyB8PSBOSV9QUk9NSVNDOwogCXNpLmljX2NtZCA9IE5JT0NTRkxBR1M7CiAJc2kuaWNfbGVuID0gc2l6ZW9mKGZsYWdzKTsKIAlzaS5pY19kcCA9IChjaGFyICopJmZsYWdzOwotCWlmIChpb2N0bChmZCwgSV9TVFIsIChjaGFyICopJnNpKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTRkxBR1M6ICVzIiwKKwlpZiAoaW9jdGwocC0+ZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTRkxBR1M6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCXJldHVybiAoMCk7CiB9CiAKLXBjYXBfdCAqCi1wY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICpkZXZpY2UsIGludCBzbmFwbGVuLCBpbnQgcHJvbWlzYywgaW50IHRvX21zLAotICAgIGNoYXIgKmVidWYpCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX3NuaXQocGNhcF90ICpwKQogewogCXN0cnVjdCBzdHJpb2N0bCBzaTsJCS8qIHN0cnVjdCBmb3IgaW9jdGwoKSAqLwogCXN0cnVjdCBpZnJlcSBpZnI7CQkvKiBpbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3QgKi8KIAlpbnQgY2h1bmtzaXplID0gQ0hVTktTSVpFOwogCWludCBmZDsKIAlzdGF0aWMgY2hhciBkZXZbXSA9ICIvZGV2L25pdCI7Ci0JcmVnaXN0ZXIgcGNhcF90ICpwOwogCi0JcCA9IChwY2FwX3QgKiltYWxsb2Moc2l6ZW9mKCpwKSk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlzdHJsY3B5KGVidWYsIHBjYXBfc3RyZXJyb3IoZXJybm8pLCBQQ0FQX0VSUkJVRl9TSVpFKTsKLQkJcmV0dXJuIChOVUxMKTsKKwlpZiAocC0+b3B0LnJmbW9uKSB7CisJCS8qCisJCSAqIE5vIG1vbml0b3IgbW9kZSBvbiBTdW5PUyA0LnggKG5vIFdpLUZpIGRldmljZXMgb24KKwkJICogaGFyZHdhcmUgc3VwcG9ydGVkIGJ5IFN1bk9TIDQueCkuCisJCSAqLworCQlyZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKIAl9CiAKLQlpZiAoc25hcGxlbiA8IDk2KQorCWlmIChwLT5zbmFwc2hvdCA8IDk2KQogCQkvKgogCQkgKiBOSVQgcmVxdWlyZXMgYSBzbmFwc2hvdCBsZW5ndGggb2YgYXQgbGVhc3QgOTYuCiAJCSAqLwotCQlzbmFwbGVuID0gOTY7CisJCXAtPnNuYXBzaG90ID0gOTY7CiAKLQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CiAJLyoKIAkgKiBJbml0aWFsbHkgdHJ5IGEgcmVhZC93cml0ZSBvcGVuICh0byBhbGxvdyB0aGUgaW5qZWN0CiAJICogbWV0aG9kIHRvIHdvcmspLiAgSWYgdGhhdCBmYWlscyBkdWUgdG8gcGVybWlzc2lvbgpAQCAtMzAzLDE5ICszMjUsMTkgQEAKIAlpZiAoZmQgPCAwICYmIGVycm5vID09IEVBQ0NFUykKIAkJcC0+ZmQgPSBmZCA9IG9wZW4oZGV2LCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZGV2LAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBkZXYsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAogCS8qIGFycmFuZ2UgdG8gZ2V0IGRpc2NyZXRlIG1lc3NhZ2VzIGZyb20gdGhlIFNUUkVBTSBhbmQgdXNlIE5JVF9CVUYgKi8KIAlpZiAoaW9jdGwoZmQsIElfU1JET1BULCAoY2hhciAqKVJNU0dEKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIklfU1JET1BUOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIklfU1JET1BUOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAlpZiAoaW9jdGwoZmQsIElfUFVTSCwgIm5idWYiKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInB1c2ggbmJ1ZjogJXMiLAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJwdXNoIG5idWY6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMzI1LDM0ICszNDcsMzMgQEAKIAlzaS5pY19sZW4gPSBzaXplb2YoY2h1bmtzaXplKTsKIAlzaS5pY19kcCA9IChjaGFyICopJmNodW5rc2l6ZTsKIAlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU0NIVU5LOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTQ0hVTks6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCiAJLyogcmVxdWVzdCB0aGUgaW50ZXJmYWNlICovCi0Jc3RybmNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAJaWZyLmlmcl9uYW1lW3NpemVvZihpZnIuaWZyX25hbWUpIC0gMV0gPSAnXDAnOwogCXNpLmljX2NtZCA9IE5JT0NCSU5EOwogCXNpLmljX2xlbiA9IHNpemVvZihpZnIpOwogCXNpLmljX2RwID0gKGNoYXIgKikmaWZyOwogCWlmIChpb2N0bChmZCwgSV9TVFIsIChjaGFyICopJnNpKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NCSU5EOiAlczogJXMiLAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DQklORDogJXM6ICVzIiwKIAkJCWlmci5pZnJfbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CiAKIAkvKiBzZXQgdGhlIHNuYXBzaG90IGxlbmd0aCAqLwogCXNpLmljX2NtZCA9IE5JT0NTU05BUDsKLQlzaS5pY19sZW4gPSBzaXplb2Yoc25hcGxlbik7Ci0Jc2kuaWNfZHAgPSAoY2hhciAqKSZzbmFwbGVuOworCXNpLmljX2xlbiA9IHNpemVvZihwLT5zbmFwc2hvdCk7CisJc2kuaWNfZHAgPSAoY2hhciAqKSZwLT5zbmFwc2hvdDsKIAlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU1NOQVA6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ1NTTkFQOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KLQlwLT5zbmFwc2hvdCA9IHNuYXBsZW47Ci0JaWYgKG5pdF9zZXRmbGFncyhwLT5mZCwgcHJvbWlzYywgdG9fbXMsIGVidWYpIDwgMCkKKwlpZiAobml0X3NldGZsYWdzKHApIDwgMCkKIAkJZ290byBiYWQ7CiAKIAkodm9pZClpb2N0bChmZCwgSV9GTFVTSCwgKGNoYXIgKilGTFVTSFIpOwpAQCAtMzY0LDcgKzM4NSw3IEBACiAJcC0+YnVmc2l6ZSA9IEJVRlNQQUNFOwogCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXN0cmxjcHkoZWJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTQwMiwxNCArNDIzLDI0IEBACiAJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwogCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfc25pdDsKLQlwLT5jbG9zZV9vcCA9IHBjYXBfY2xvc2VfY29tbW9uOwogCi0JcmV0dXJuIChwKTsKKwlyZXR1cm4gKDApOwogIGJhZDoKLQlpZiAoZmQgPj0gMCkKLQkJY2xvc2UoZmQpOwotCWZyZWUocCk7Ci0JcmV0dXJuIChOVUxMKTsKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7CisJcmV0dXJuIChQQ0FQX0VSUk9SKTsKK30KKworcGNhcF90ICoKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfc25pdCkpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IHBjYXBfYWN0aXZhdGVfc25pdDsKKwlyZXR1cm4gKHApOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL3BjYXAtc25vb3AuYyBiL3BjYXAtc25vb3AuYwppbmRleCBmNjQyNWYxLi5hNDlkYjg3IDEwMDY0NAotLS0gYS9wY2FwLXNub29wLmMKKysrIGIvcGNhcC1zbm9vcC5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc25vb3AuYyx2IDEuNTQuMi4xIDIwMDUvMDUvMDMgMTg6NTQ6MzggZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXNub29wLmMsdiAxLjU5IDIwMDgtMTItMDIgMTY6MjU6MTQgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtNTgsOSArNTgsMTcgQEAKICNpbmNsdWRlICJvcy1wcm90by5oIgogI2VuZGlmCiAKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBzbm9vcCBkZXZpY2VzLgorICovCitzdHJ1Y3QgcGNhcF9zbm9vcCB7CisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OworfTsKKwogc3RhdGljIGludAogcGNhcF9yZWFkX3Nub29wKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCiB7CisJc3RydWN0IHBjYXBfc25vb3AgKnBzbiA9IHAtPnByaXY7CiAJaW50IGNjOwogCXJlZ2lzdGVyIHN0cnVjdCBzbm9vcGhlYWRlciAqc2g7CiAJcmVnaXN0ZXIgdV9pbnQgZGF0YWxlbjsKQEAgLTEyNCw3ICsxMzIsNyBAQAogCWlmIChwLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMIHx8CiAJICAgIGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIGNwLCBkYXRhbGVuLCBjYXBsZW4pKSB7CiAJCXN0cnVjdCBwY2FwX3BrdGhkciBoOwotCQkrK3AtPm1kLnN0YXQucHNfcmVjdjsKKwkJKytwc24tPnN0YXQucHNfcmVjdjsKIAkJaC50cy50dl9zZWMgPSBzaC0+c25vb3BfdGltZXN0YW1wLnR2X3NlYzsKIAkJaC50cy50dl91c2VjID0gc2gtPnNub29wX3RpbWVzdGFtcC50dl91c2VjOwogCQloLmxlbiA9IGRhdGFsZW47CkBAIC0xNTYsNiArMTY0LDcgQEAKIHN0YXRpYyBpbnQKIHBjYXBfc3RhdHNfc25vb3AocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykKIHsKKwlzdHJ1Y3QgcGNhcF9zbm9vcCAqcHNuID0gcC0+cHJpdjsKIAlyZWdpc3RlciBzdHJ1Y3QgcmF3c3RhdHMgKnJzOwogCXN0cnVjdCByYXdzdGF0cyByYXdzdGF0czsKIApAQCAtMTgwLDcgKzE4OSw3IEBACiAJICogcmF0aGVyIHRoYW4ganVzdCB0aGlzIHNvY2tldD8gIElmIG5vdCwgd2h5IGRvZXMgaXQgaGF2ZQogCSAqIGJvdGggU25vb3AgYW5kIERyYWluIHN0YXRpc3RpY3M/CiAJICovCi0JcC0+bWQuc3RhdC5wc19kcm9wID0KKwlwc24tPnN0YXQucHNfZHJvcCA9CiAJICAgIHJzLT5yc19zbm9vcC5zc19pZmRyb3BzICsgcnMtPnJzX3Nub29wLnNzX3NiZHJvcHMgKwogCSAgICBycy0+cnNfZHJhaW4uZHNfaWZkcm9wcyArIHJzLT5yc19kcmFpbi5kc19zYmRyb3BzOwogCkBAIC0xODksMTQgKzE5OCwxMyBAQAogCSAqIEFzIGZpbHRlcmluZyBpcyBkb25lIGluIHVzZXJsYW5kLCB0aGlzIGRvZXMgbm90IGluY2x1ZGUKIAkgKiBwYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGJ1ZmZlciBzcGFjZS4KIAkgKi8KLQkqcHMgPSBwLT5tZC5zdGF0OworCSpwcyA9IHBzbi0+c3RhdDsKIAlyZXR1cm4gKDApOwogfQogCiAvKiBYWFggY2FuJ3QgZGlzYWJsZSBwcm9taXNjdW91cyAqLwotcGNhcF90ICoKLXBjYXBfb3Blbl9saXZlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHNuYXBsZW4sIGludCBwcm9taXNjLCBpbnQgdG9fbXMsCi0gICAgY2hhciAqZWJ1ZikKK3N0YXRpYyBpbnQKK3BjYXBfYWN0aXZhdGVfc25vb3AocGNhcF90ICpwKQogewogCWludCBmZDsKIAlzdHJ1Y3Qgc29ja2FkZHJfcmF3IHNyOwpAQCAtMjA0LDU1ICsyMTIsNTAgQEAKIAl1X2ludCB2OwogCWludCBsbF9oZHJsZW47CiAJaW50IHNub29wbGVuOwotCXBjYXBfdCAqcDsKIAlzdHJ1Y3QgaWZyZXEgaWZyOwogCi0JcCA9IChwY2FwX3QgKiltYWxsb2Moc2l6ZW9mKCpwKSk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCi0JCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAlmZCA9IHNvY2tldChQRl9SQVcsIFNPQ0tfUkFXLCBSQVdQUk9UT19TTk9PUCk7CiAJaWYgKGZkIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic25vb3Agc29ja2V0OiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNub29wIHNvY2tldDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CiAJcC0+ZmQgPSBmZDsKIAltZW1zZXQoJnNyLCAwLCBzaXplb2Yoc3IpKTsKIAlzci5zcl9mYW1pbHkgPSBBRl9SQVc7Ci0JKHZvaWQpc3RybmNweShzci5zcl9pZm5hbWUsIGRldmljZSwgc2l6ZW9mKHNyLnNyX2lmbmFtZSkpOworCSh2b2lkKXN0cm5jcHkoc3Iuc3JfaWZuYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2Yoc3Iuc3JfaWZuYW1lKSk7CiAJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3IsIHNpemVvZihzcikpKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbm9vcCBiaW5kOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNub29wIGJpbmQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCW1lbXNldCgmc2YsIDAsIHNpemVvZihzZikpOwogCWlmIChpb2N0bChmZCwgU0lPQ0FERFNOT09QLCAmc2YpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ0FERFNOT09QOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NBRERTTk9PUDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9Ci0JdiA9IDY0ICogMTAyNDsKKwlpZiAocC0+b3B0LmJ1ZmZlcl9zaXplICE9IDApCisJCXYgPSBwLT5vcHQuYnVmZmVyX3NpemU7CisJZWxzZQorCQl2ID0gNjQgKiAxMDI0OwkvKiBkZWZhdWx0IHRvIDY0SyBidWZmZXIgc2l6ZSAqLwogCSh2b2lkKXNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIgKikmdiwgc2l6ZW9mKHYpKTsKIAkvKgogCSAqIFhYWCBoYWNrIC0gbWFwIGRldmljZSBuYW1lIHRvIGxpbmsgbGF5ZXIgdHlwZQogCSAqLwotCWlmIChzdHJuY21wKCJldCIsIGRldmljZSwgMikgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgMTAgTWJpdCAqLwotCSAgICBzdHJuY21wKCJlYyIsIGRldmljZSwgMikgPT0gMCB8fAkvKiBJbmRpZ28vSW5keSAxMCBNYml0LAotCQkJCQkJICAgTzIgMTAvMTAwICovCi0JICAgIHN0cm5jbXAoImVmIiwgZGV2aWNlLCAyKSA9PSAwIHx8CS8qIE8yMDAvMjAwMCAxMC8xMDAgTWJpdCAqLwotCSAgICBzdHJuY21wKCJlZyIsIGRldmljZSwgMikgPT0gMCB8fAkvKiBPY3RhbmUvTzJ4eHgvTzN4eHggR2lnYWJpdCAqLwotCSAgICBzdHJuY21wKCJnZmUiLCBkZXZpY2UsIDMpID09IDAgfHwJLyogR0lPIDEwMCBNYml0ICovCi0JICAgIHN0cm5jbXAoImZ4cCIsIGRldmljZSwgMykgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgVk1FIEVuZXQgKi8KLQkgICAgc3RybmNtcCgiZXAiLCBkZXZpY2UsIDIpID09IDAgfHwJLyogQ2hhbGxlbmdlIDh4MTAgTWJpdCBFUExFWCAqLwotCSAgICBzdHJuY21wKCJ2ZmUiLCBkZXZpY2UsIDMpID09IDAgfHwJLyogQ2hhbGxlbmdlIFZNRSAxMDBNYml0ICovCi0JICAgIHN0cm5jbXAoImZhIiwgZGV2aWNlLCAyKSA9PSAwIHx8Ci0JICAgIHN0cm5jbXAoInFhYSIsIGRldmljZSwgMykgPT0gMCB8fAotCSAgICBzdHJuY21wKCJjaXAiLCBkZXZpY2UsIDMpID09IDAgfHwKLQkgICAgc3RybmNtcCgiZWwiLCBkZXZpY2UsIDIpID09IDApIHsKKwlpZiAoc3RybmNtcCgiZXQiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwIHx8CS8qIENoYWxsZW5nZSAxMCBNYml0ICovCisJICAgIHN0cm5jbXAoImVjIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAkvKiBJbmRpZ28vSW5keSAxMCBNYml0LAorCQkJCQkJCSAgIE8yIDEwLzEwMCAqLworCSAgICBzdHJuY21wKCJlZiIsIHAtPm9wdC5zb3VyY2UsIDIpID09IDAgfHwJLyogTzIwMC8yMDAwIDEwLzEwMCBNYml0ICovCisJICAgIHN0cm5jbXAoImVnIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAkvKiBPY3RhbmUvTzJ4eHgvTzN4eHggR2lnYWJpdCAqLworCSAgICBzdHJuY21wKCJnZmUiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8CS8qIEdJTyAxMDAgTWJpdCAqLworCSAgICBzdHJuY21wKCJmeHAiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8CS8qIENoYWxsZW5nZSBWTUUgRW5ldCAqLworCSAgICBzdHJuY21wKCJlcCIsIHAtPm9wdC5zb3VyY2UsIDIpID09IDAgfHwJLyogQ2hhbGxlbmdlIDh4MTAgTWJpdCBFUExFWCAqLworCSAgICBzdHJuY21wKCJ2ZmUiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8CS8qIENoYWxsZW5nZSBWTUUgMTAwTWJpdCAqLworCSAgICBzdHJuY21wKCJmYSIsIHAtPm9wdC5zb3VyY2UsIDIpID09IDAgfHwKKwkgICAgc3RybmNtcCgicWFhIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAorCSAgICBzdHJuY21wKCJjaXAiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8CisJICAgIHN0cm5jbXAoImVsIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCkgewogCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CiAJCXAtPm9mZnNldCA9IFJBV19IRFJQQUQoc2l6ZW9mKHN0cnVjdCBldGhlcl9oZWFkZXIpKTsKIAkJbGxfaGRybGVuID0gc2l6ZW9mKHN0cnVjdCBldGhlcl9oZWFkZXIpOwpAQCAtMjg1LDI5ICsyODgsMzggQEAKIAkJCXAtPmRsdF9saXN0WzFdID0gRExUX0RPQ1NJUzsKIAkJCXAtPmRsdF9jb3VudCA9IDI7CiAJCX0KLQl9IGVsc2UgaWYgKHN0cm5jbXAoImlwZyIsIGRldmljZSwgMykgPT0gMCB8fAotCQkgICBzdHJuY21wKCJybnMiLCBkZXZpY2UsIDMpID09IDAgfHwJLyogTzIvMjAwLzIwMDAgRkRESSAqLwotCQkgICBzdHJuY21wKCJ4cGkiLCBkZXZpY2UsIDMpID09IDApIHsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoImlwZyIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwKKwkJICAgc3RybmNtcCgicm5zIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAkvKiBPMi8yMDAvMjAwMCBGRERJICovCisJCSAgIHN0cm5jbXAoInhwaSIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDApIHsKIAkJcC0+bGlua3R5cGUgPSBETFRfRkRESTsKIAkJcC0+b2Zmc2V0ID0gMzsJCQkJLyogWFhYIHllYWg/ICovCiAJCWxsX2hkcmxlbiA9IDEzOwotCX0gZWxzZSBpZiAoc3RybmNtcCgicHBwIiwgZGV2aWNlLCAzKSA9PSAwKSB7CisJfSBlbHNlIGlmIChzdHJuY21wKCJwcHAiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX1JBVzsKIAkJbGxfaGRybGVuID0gMDsJLyogRExUX1JBVyBtZWFuaW5nICJubyBQUFAgaGVhZGVyLCBqdXN0IHRoZSBJUCBwYWNrZXQiPyAqLwotCX0gZWxzZSBpZiAoc3RybmNtcCgicWZhIiwgZGV2aWNlLCAzKSA9PSAwKSB7CisJfSBlbHNlIGlmIChzdHJuY21wKCJxZmEiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX0lQX09WRVJfRkM7CiAJCWxsX2hkcmxlbiA9IDI0OwotCX0gZWxzZSBpZiAoc3RybmNtcCgicGwiLCBkZXZpY2UsIDIpID09IDApIHsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoInBsIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCkgewogCQlwLT5saW5rdHlwZSA9IERMVF9SQVc7CiAJCWxsX2hkcmxlbiA9IDA7CS8qIENyYXkgVU5JQ09TL21wIHBzZXVkbyBsaW5rICovCi0JfSBlbHNlIGlmIChzdHJuY21wKCJsbyIsIGRldmljZSwgMikgPT0gMCkgeworCX0gZWxzZSBpZiAoc3RybmNtcCgibG8iLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX05VTEw7CiAJCWxsX2hkcmxlbiA9IDQ7CiAJfSBlbHNlIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInNub29wOiB1bmtub3duIHBoeXNpY2FsIGxheWVyIHR5cGUiKTsKIAkJZ290byBiYWQ7CiAJfQorCisJaWYgKHAtPm9wdC5yZm1vbikgeworCQkvKgorCQkgKiBObyBtb25pdG9yIG1vZGUgb24gSXJpeCAobm8gV2ktRmkgZGV2aWNlcyBvbgorCQkgKiBoYXJkd2FyZSBzdXBwb3J0ZWQgYnkgSXJpeCkuCisJCSAqLworCQlyZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKKwl9CisKICNpZmRlZiBTSU9DR0lGTVRVCiAJLyoKIAkgKiBYWFggLSBJUklYIGFwcGVhcnMgdG8gZ2l2ZSB5b3UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBzZXQgdGhlCkBAIC0zMTUsOSArMzI3LDkgQEAKIAkgKiB0aGUgTVRVIGZpcnN0IGFuZCwgaWYgdGhhdCBzdWNjZWVkcywgdHJpbSB0aGUgc25hcCBsZW5ndGgKIAkgKiB0byBiZSBubyBncmVhdGVyIHRoYW4gdGhlIE1UVS4KIAkgKi8KLQkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKIAlpZiAoaW9jdGwoZmQsIFNJT0NHSUZNVFUsIChjaGFyICopJmlmcikgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DR0lGTVRVOiAlcyIsCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NHSUZNVFU6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMzM4LDggKzM1MCw4IEBACiAjaWZuZGVmIGlmcl9tdHUKICNkZWZpbmUgaWZyX210dQlpZnJfbWV0cmljCiAjZW5kaWYKLQlpZiAoc25hcGxlbiA+IGlmci5pZnJfbXR1ICsgbGxfaGRybGVuKQotCQlzbmFwbGVuID0gaWZyLmlmcl9tdHUgKyBsbF9oZHJsZW47CisJaWYgKHAtPnNuYXBzaG90ID4gaWZyLmlmcl9tdHUgKyBsbF9oZHJsZW4pCisJCXAtPnNuYXBzaG90ID0gaWZyLmlmcl9tdHUgKyBsbF9oZHJsZW47CiAjZW5kaWYKIAogCS8qCkBAIC0zNDcsMTggKzM1OSwxNyBAQAogCSAqIHBheWxvYWQgYnl0ZXMgdG8gY2FwdHVyZSAtIGl0IGRvZXNuJ3QgY291bnQgbGluay1sYXllcgogCSAqIGhlYWRlciBieXRlcy4KIAkgKi8KLQlzbm9vcGxlbiA9IHNuYXBsZW4gLSBsbF9oZHJsZW47CisJc25vb3BsZW4gPSBwLT5zbmFwc2hvdCAtIGxsX2hkcmxlbjsKIAlpZiAoc25vb3BsZW4gPCAwKQogCQlzbm9vcGxlbiA9IDA7CiAJaWYgKGlvY3RsKGZkLCBTSU9DU05PT1BMRU4sICZzbm9vcGxlbikgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DU05PT1BMRU46ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ1NOT09QTEVOOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KLQlwLT5zbmFwc2hvdCA9IHNuYXBsZW47CiAJdiA9IDE7CiAJaWYgKGlvY3RsKGZkLCBTSU9DU05PT1BJTkcsICZ2KSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NTTk9PUElORzogJXMiLAorCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DU05PT1BJTkc6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMzY2LDcgKzM3Nyw3IEBACiAJcC0+YnVmc2l6ZSA9IDQwOTY7CQkJCS8qIFhYWCAqLwogCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTM4NCwxOCArMzk1LDI0IEBACiAJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwogCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfc25vb3A7Ci0JcC0+Y2xvc2Vfb3AgPSBwY2FwX2Nsb3NlX2NvbW1vbjsKIAotCXJldHVybiAocCk7CisJcmV0dXJuICgwKTsKICBiYWQ6Ci0JKHZvaWQpY2xvc2UoZmQpOwotCS8qCi0JICogR2V0IHJpZCBvZiBhbnkgbGluay1sYXllciB0eXBlIGxpc3Qgd2UgYWxsb2NhdGVkLgotCSAqLwotCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKQotCQlmcmVlKHAtPmRsdF9saXN0KTsKLQlmcmVlKHApOwotCXJldHVybiAoTlVMTCk7CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworCXJldHVybiAoUENBUF9FUlJPUik7Cit9CisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3Nub29wKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV9zbm9vcDsKKwlyZXR1cm4gKHApOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL3BjYXAtc3RkaW5jLmggYi9wY2FwLXN0ZGluYy5oCmluZGV4IDEyODEwMjQuLmYxYzczNmUgMTAwNjQ0Ci0tLSBhL3BjYXAtc3RkaW5jLmgKKysrIGIvcGNhcC1zdGRpbmMuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgLSAyMDAzCi0gKiBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKKyAqIENvcHlyaWdodCAoYykgMjAwMiAtIDIwMDUgTmV0R3JvdXAsIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyAoSXRhbHkpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDA5IENBQ0UgVGVjaG5vbG9naWVzLCBJbmMuIERhdmlzIChDYWxpZm9ybmlhKQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI4LDE0ICsyOCwxMCBAQAogICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zdGRpbmMuaCx2IDEuMTAuMi4xIDIwMDgtMTAtMDYgMTU6Mzg6MzkgZ2lhbmx1Y2EgRXhwICQgKExCTCkKICAqLwotCi0jZGVmaW5lIFNJWkVPRl9DSEFSIDEKLSNkZWZpbmUgU0laRU9GX1NIT1JUIDIKLSNkZWZpbmUgU0laRU9GX0lOVCA0Ci0jaWZuZGVmIF9NU0NfRVhURU5TSU9OUwotI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HIDgKLSNlbmRpZgorI2lmbmRlZiBwY2FwX3N0ZGluY19oCisjZGVmaW5lIHBjYXBfc3RkaW5jX2gKIAogLyoKICAqIEF2b2lkcyBhIGNvbXBpbGVyIHdhcm5pbmcgaW4gY2FzZSB0aGlzIHdhcyBhbHJlYWR5IGRlZmluZWQgICAgICAKQEAgLTU5LDYgKzU1LDM1IEBACiAKICNkZWZpbmUgY2FkZHJfdCBjaGFyKgogCisjaWYgX01TQ19WRVIgPCAxNTAwCiAjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgogI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2RlZmluZSBzdHJkdXAgX3N0cmR1cAorI2VuZGlmCisKICNkZWZpbmUgaW5saW5lIF9faW5saW5lIAorCisjaWZkZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlIC8qX19NSU5HVzMyX18qLworLyogTVNWQyBjb21waWxlciAqLworI2lmbmRlZiBfVUlOVFBUUl9UX0RFRklORUQKKyNpZmRlZiAgX1dJTjY0Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdWludHB0cl90OworI2Vsc2UKK3R5cGVkZWYgX1c2NCB1bnNpZ25lZCBpbnQgICB1aW50cHRyX3Q7CisjZW5kaWYKKyNkZWZpbmUgX1VJTlRQVFJfVF9ERUZJTkVECisjZW5kaWYKKworI2lmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorI2lmZGVmICBfV0lONjQKK3R5cGVkZWYgX19pbnQ2NCAgICBpbnRwdHJfdDsKKyNlbHNlCit0eXBlZGVmIF9XNjQgaW50ICAgaW50cHRyX3Q7CisjZW5kaWYKKyNkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyNlbmRpZiAKKworI2VuZGlmIC8qX19NSU5HVzMyX18qLworI2VuZGlmIC8qIHBjYXBfc3RkaW5jX2ggKi8KZGlmZiAtLWdpdCBhL3BjYXAtdHN0YW1wLm1hbm1pc2MuaW4gYi9wY2FwLXRzdGFtcC5tYW5taXNjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLXRzdGFtcC5tYW5taXNjLmluCkBAIC0wLDAgKzEsMTMyIEBACisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQLVRTVEFNUCBATUFOX01JU0NfSU5GT0AgIjIyIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXAtdHN0YW1wIFwtIHBhY2tldCB0aW1lIHN0YW1wcyBpbiBsaWJwY2FwCisuU0ggREVTQ1JJUFRJT04KK1doZW4gY2FwdHVyaW5nIHRyYWZmaWMsIGVhY2ggcGFja2V0IGlzIGdpdmVuIGEgdGltZSBzdGFtcCByZXByZXNlbnRpbmcsCitmb3IgaW5jb21pbmcgcGFja2V0cywgdGhlIGFycml2YWwgdGltZSBvZiB0aGUgcGFja2V0IGFuZCwgZm9yIG91dGdvaW5nCitwYWNrZXRzLCB0aGUgdHJhbnNtaXNzaW9uIHRpbWUgb2YgdGhlIHBhY2tldC4gIFRoaXMgdGltZSBpcyBhbgorYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJyaXZhbCBvciB0cmFuc21pc3Npb24gdGltZS4gIElmIGl0IGlzIHN1cHBsaWVkIGJ5Cit0aGUgb3BlcmF0aW5nIHN5c3RlbSBydW5uaW5nIG9uIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nCitkb25lLCB0aGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdoeSBpdCBtaWdodCBub3QgcHJlY2lzZWx5IHJlcHJlc2VudCB0aGUKK2Fycml2YWwgb3IgdHJhbnNtaXNzaW9uIHRpbWU6CisuSVAKK2lmIHRoZSB0aW1lIHN0YW1wIGlzIGFwcGxpZWQgdG8gdGhlIHBhY2tldCB3aGVuIHRoZSBuZXR3b3JraW5nIHN0YWNrCityZWNlaXZlcyB0aGUgcGFja2V0LCB0aGUgbmV0d29ya2luZyBzdGFjayBtaWdodCBub3Qgc2VlIHRoZSBwYWNrZXQgdW50aWwKK2FuIGludGVycnVwdCBpcyBkZWxpdmVyZWQgZm9yIHRoZSBwYWNrZXQgb3IgYSB0aW1lciBldmVudCBjYXVzZXMgdGhlCituZXR3b3JraW5nIGRldmljZSBkcml2ZXIgdG8gcG9sbCBmb3IgcGFja2V0cywgYW5kIHRoZSB0aW1lIHN0YW1wIG1pZ2h0Citub3QgYmUgYXBwbGllZCB1bnRpbCB0aGUgcGFja2V0IGhhcyBoYWQgc29tZSBwcm9jZXNzaW5nIGRvbmUgYnkgb3RoZXIKK2NvZGUgaW4gdGhlIG5ldHdvcmtpbmcgc3RhY2ssIHNvIHRoZXJlIG1pZ2h0IGJlIGEgc2lnbmlmaWNhbnQgZGVsYXkKK2JldHdlZW4gdGhlIHRpbWUgd2hlbiB0aGUgbGFzdCBiaXQgb2YgdGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSB0aGUKK2NhcHR1cmUgZGV2aWNlIGFuZCB3aGVuIHRoZSBuZXR3b3JraW5nIHN0YWNrIHRpbWUtc3RhbXBzIHRoZSBwYWNrZXQ7CisuSVAKK3RoZSB0aW1lciB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0aW1lIHN0YW1wcyBtaWdodCBoYXZlIGxvdyByZXNvbHV0aW9uLAorZm9yIGV4YW1wbGUsIGl0IG1pZ2h0IGJlIGEgdGltZXIgdXBkYXRlZCBvbmNlIHBlciBob3N0IG9wZXJhdGluZyBzeXN0ZW0KK3RpbWVyIHRpY2ssIHdpdGggdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSB0aW1lciB0aWNraW5nIG9uY2UgZXZlcnkgZmV3CittaWxsaXNlY29uZHM7CisuSVAKK2EgaGlnaC1yZXNvbHV0aW9uIHRpbWVyIG1pZ2h0IHVzZSBhIGNvdW50ZXIgdGhhdCBydW5zIGF0IGEgcmF0ZQorZGVwZW5kZW50IG9uIHRoZSBwcm9jZXNzb3IgY2xvY2sgc3BlZWQsIGFuZCB0aGF0IGNsb2NrIHNwZWVkIG1pZ2h0IGJlCithZGp1c3RlZCB1cHdhcmRzIG9yIGRvd253YXJkcyBvdmVyIHRpbWUgYW5kIHRoZSB0aW1lciBtaWdodCBub3QgYmUgYWJsZQordG8gY29tcGVuc2F0ZSBmb3IgYWxsIHRob3NlIGFkanVzdG1lbnRzOworLklQCit0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgY2xvY2sgbWlnaHQgYmUgYWRqdXN0ZWQgb3ZlciB0aW1lIHRvIG1hdGNoIGEKK3RpbWUgc3RhbmRhcmQgdG8gd2hpY2ggdGhlIGhvc3QgaXMgYmVpbmcgc3luY2hyb25pemVkLCB3aGljaCBtaWdodCBiZQorZG9uZSBieSB0ZW1wb3JhcmlseSBzbG93aW5nIGRvd24gb3Igc3BlZWRpbmcgdXAgdGhlIGNsb2NrIG9yIGJ5IG1ha2luZyBhCitzaW5nbGUgYWRqdXN0bWVudDsKKy5JUAorZGlmZmVyZW50IENQVSBjb3JlcyBvbiBhIG11bHRpLWNvcmUgb3IgbXVsdGktcHJvY2Vzc29yIHN5c3RlbSBtaWdodCBiZQorcnVubmluZyBhdCBkaWZmZXJlbnQgc3BlZWRzLCBvciBtaWdodCBub3QgaGF2ZSB0aW1lIGNvdW50ZXJzIGFsbAorc3luY2hyb25pemVkLCBzbyBwYWNrZXRzIHRpbWUtc3RhbXBlZCBieSBkaWZmZXJlbnQgY29yZXMgbWlnaHQgbm90IGhhdmUKK2NvbnNpc3RlbnQgdGltZSBzdGFtcHMuCisuTFAKK0luIGFkZGl0aW9uLCBwYWNrZXRzIHRpbWUtc3RhbXBlZCBieSBkaWZmZXJlbnQgY29yZXMgbWlnaHQgYmUKK3RpbWUtc3RhbXBlZCBpbiBvbmUgb3JkZXIgYW5kIGFkZGVkIHRvIHRoZSBxdWV1ZSBvZiBwYWNrZXRzIGZvciBsaWJwY2FwCit0byByZWFkIGluIGFub3RoZXIgb3JkZXIsIHNvIHRpbWUgc3RhbXBzIG1pZ2h0IG5vdCBiZSBtb25vdG9uaWNhbGx5CitpbmNyZWFzaW5nLgorLkxQCitTb21lIGNhcHR1cmUgZGV2aWNlcyBvbiBzb21lIHBsYXRmb3JtcyBjYW4gcHJvdmlkZSB0aW1lIHN0YW1wcyBmb3IKK3BhY2tldHM7IHRob3NlIHRpbWUgc3RhbXBzIGFyZSB1c3VhbGx5IGhpZ2gtcmVzb2x1dGlvbiB0aW1lIHN0YW1wcywgYW5kCithcmUgdXN1YWxseSBhcHBsaWVkIHRvIHRoZSBwYWNrZXQgd2hlbiB0aGUgZmlyc3Qgb3IgbGFzdCBiaXQgb2YgdGhlCitwYWNrZXQgYXJyaXZlcywgYW5kIGFyZSB0aHVzIG1vcmUgYWNjdXJhdGUgdGhhbiB0aW1lIHN0YW1wcyBwcm92aWRlZCBieQordGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS4gIFRob3NlIHRpbWUgc3RhbXBzIG1pZ2h0IG5vdCwgaG93ZXZlciwgYmUKK3N5bmNocm9uaXplZCB3aXRoIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyBjbG9jaywgc28gdGhhdCwgZm9yCitleGFtcGxlLCB0aGUgdGltZSBzdGFtcCBvZiBhIHBhY2tldCBtaWdodCBub3QgY29ycmVzcG9uZCB0byB0aGUgdGltZQorc3RhbXAgb2YgYW4gZXZlbnQgb24gdGhlIGhvc3QgdHJpZ2dlcmVkIGJ5IHRoZSBhcnJpdmFsIG9mIHRoYXQgcGFja2V0LgorLkxQCitEZXBlbmRpbmcgb24gdGhlIGNhcHR1cmUgZGV2aWNlIGFuZCB0aGUgc29mdHdhcmUgb24gdGhlIGhvc3QsIGxpYnBjYXAKK21pZ2h0IGFsbG93IGRpZmZlcmVudCB0eXBlcyBvZiB0aW1lIHN0YW1wIHRvIGJlIHVzZWQuICBUaGUKKy5CUiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzICgzUENBUCkKK3JvdXRpbmUgcHJvdmlkZXMsIGZvciBhIHBhY2tldCBjYXB0dXJlIGhhbmRsZSBjcmVhdGVkIGJ5CisuQlIgcGNhcF9jcmVhdGUgKDNQQ0FQKQorYnV0IG5vdCB5ZXQgYWN0aXZhdGVkIGJ5CisuQlIgcGNhcF9hY3RpdmF0ZSAoM1BDQVApLAorYSBsaXN0IG9mIHRpbWUgc3RhbXAgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBjYXB0dXJlIGRldmljZSBmb3IgdGhhdAoraGFuZGxlLgorVGhlIGxpc3QgbWlnaHQgYmUgZW1wdHksIGluIHdoaWNoIGNhc2Ugbm8gY2hvaWNlIG9mIHRpbWUgc3RhbXAgdHlwZSBpcworb2ZmZXJlZCBmb3IgdGhhdCBjYXB0dXJlIGRldmljZS4gIElmIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSwgdGhlCisuQlIgcGNhcF9zZXRfdHN0YW1wX3R5cGUgKDNQQ0FQKQorcm91dGluZSBjYW4gYmUgdXNlZCBhZnRlciBhCisuQiBwY2FwX2NyZWF0ZSgpCitjYWxsIGFuZCBiZWZvcmUgYQorLkIgcGNhcF9hY3RpdmF0ZSgpCitjYWxsIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgdGltZSBzdGFtcCB0byBiZSB1c2VkIG9uIHRoZSBkZXZpY2UuCitUaGUgdGltZSBzdGFtcCB0eXBlcyBhcmUgbGlzdGVkIGhlcmU7IHRoZSBmaXJzdCB2YWx1ZSBpcyB0aGUgI2RlZmluZSB0bwordXNlIGluIGNvZGUsIHRoZSBzZWNvbmQgdmFsdWUgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisuQiBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKCkKK2FuZCBhY2NlcHRlZCBieQorLkJSIHBjYXBfdHN0YW1wX25hbWVfdG9fdmFsKCkgLgorLlJTIDUKKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfSE9TVCAiIC0gIiBob3N0CitUaW1lIHN0YW1wIHByb3ZpZGVkIGJ5IHRoZSBob3N0IG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUuICBUaGUKK3ByZWNpc2lvbiBvZiB0aGlzIHRpbWUgc3RhbXAgaXMgdW5zcGVjaWZpZWQ7IGl0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZQorc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSdzIGNsb2NrLgorLlRQIDUKKy5CUiBQQ0FQX1RTVEFNUF9IT1NUX0xPV1BSRUMgIiAtICIgaG9zdF9sb3dwcmVjCitUaW1lIHN0YW1wIHByb3ZpZGVkIGJ5IHRoZSBob3N0IG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUuIAorVGhpcyBpcyBhIGxvdy1wcmVjaXNpb24gdGltZSBzdGFtcCwgc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3Qgb3BlcmF0aW5nCitzeXN0ZW0ncyBjbG9jay4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfSE9TVF9ISVBSRUMgIiAtICIgaG9zdF9oaXByZWMKK1RpbWUgc3RhbXAgcHJvdmlkZWQgYnkgdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcgZG9uZS4gCitUaGlzIGlzIGEgaGlnaC1wcmVjaXNpb24gdGltZSBzdGFtcDsgaXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlCitzeW5jaHJvbml6ZWQgd2l0aCB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgY2xvY2suICBJdCBtaWdodCBiZSBtb3JlCitleHBlbnNpdmUgdG8gZmV0Y2ggdGhhbgorLkJSIFBDQVBfVFNUQU1QX0hPU1RfTE9XUFJFQyAuCisuVFAgNQorLkJSIFBDQVBfVFNUQU1QX0FEQVBURVIgIiAtICIgYWRhcHRlcgorVGltZSBzdGFtcCBwcm92aWRlZCBieSB0aGUgbmV0d29yayBhZGFwdGVyIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nCitkb25lLiAgVGhpcyBpcyBhIGhpZ2gtcHJlY2lzaW9uIHRpbWUgc3RhbXAsIHN5bmNocm9uaXplZCB3aXRoIHRoZSBob3N0CitvcGVyYXRpbmcgc3lzdGVtJ3MgY2xvY2suCisuVFAgNQorLkJSIFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQgIiAtICIgYWRhcHRlcl91bnN5bmNlZAorVGltZSBzdGFtcCBwcm92aWRlZCBieSB0aGUgbmV0d29yayBhZGFwdGVyIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nCitkb25lLiAgVGhpcyBpcyBhIGhpZ2gtcHJlY2lzaW9uIHRpbWUgc3RhbXA7IGl0IGlzIG5vdCBzeW5jaHJvbml6ZWQgd2l0aAordGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSdzIGNsb2NrLgorLlJFCisuU0ggU0VFIEFMU08KK3BjYXBfc2V0X3RzdGFtcF90eXBlKDNQQ0FQKSwKK3BjYXBfbGlzdF90c3RhbXBfdHlwZXMoM1BDQVApLAorcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZSgzUENBUCksCitwY2FwX3RzdGFtcF9uYW1lX3RvX3ZhbCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXAtdXNiLWxpbnV4LmMgYi9wY2FwLXVzYi1saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODkyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLXVzYi1saW51eC5jCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhb2xvIEFiZW5pIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFVTQiBzbmlmZmluZyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IHBsYXRmb3JtCisgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CisgKiBNb2RpZmljYXRpb25zOiBLcmlzIEthdHRlcmpvaG4gPGthdHRlcmpvaG5AZ21haWwuY29tPgorICoKKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC11c2ItbGludXguYyx2IDEuMzMgMjAwOC0xMi0yMyAyMTozODo1MCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisgCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgInBjYXAtdXNiLWxpbnV4LmgiCisjaW5jbHVkZSAicGNhcC91c2IuaCIKKworI2lmZGVmIE5FRURfU1RSRVJST1JfSAorI2luY2x1ZGUgInN0cmVycm9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaWZkZWYgSEFWRV9MSU5VWF9VU0JERVZJQ0VfRlNfSAorLyoKKyAqIFdlIG1pZ2h0IG5lZWQgPGxpbnV4L2NvbXBpbGVyLmg+IHRvIGRlZmluZSBfX3VzZXIgZm9yCisgKiA8bGludXgvdXNiZGV2aWNlX2ZzLmg+LgorICovCisjaWZkZWYgSEFWRV9MSU5VWF9DT01QSUxFUl9ICisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNlbmRpZiAvKiBIQVZFX0xJTlVYX0NPTVBJTEVSX0ggKi8KKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KKyNlbmRpZiAvKiBIQVZFX0xJTlVYX1VTQkRFVklDRV9GU19IICovCisKKyNkZWZpbmUgVVNCX0lGQUNFICJ1c2Jtb24iCisjZGVmaW5lIFVTQl9URVhUX0RJUl9PTEQgIi9zeXMva2VybmVsL2RlYnVnL3VzYm1vbiIKKyNkZWZpbmUgVVNCX1RFWFRfRElSICIvc3lzL2tlcm5lbC9kZWJ1Zy91c2IvdXNibW9uIgorI2RlZmluZSBTWVNfVVNCX0JVU19ESVIgIi9zeXMvYnVzL3VzYi9kZXZpY2VzIgorI2RlZmluZSBQUk9DX1VTQl9CVVNfRElSICIvcHJvYy9idXMvdXNiIgorI2RlZmluZSBVU0JfTElORV9MRU4gNDA5NgorCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2RlZmluZSBodG9scyhzKSBzCisjZGVmaW5lIGh0b2xsKGwpIGwKKyNkZWZpbmUgaHRvbDY0KGxsKSBsbAorI2Vsc2UKKyNkZWZpbmUgaHRvbHMocykgYnN3YXBfMTYocykKKyNkZWZpbmUgaHRvbGwobCkgYnN3YXBfMzIobCkKKyNkZWZpbmUgaHRvbDY0KGxsKSBic3dhcF82NChsbCkKKyNlbmRpZgorCitzdHJ1Y3QgbW9uX2Jpbl9zdGF0cyB7CisJdV9pbnQzMl90IHF1ZXVlZDsKKwl1X2ludDMyX3QgZHJvcHBlZDsKK307CisKK3N0cnVjdCBtb25fYmluX2dldCB7CisJcGNhcF91c2JfaGVhZGVyICpoZHI7CisJdm9pZCAqZGF0YTsKKwlzaXplX3QgZGF0YV9sZW47ICAgLyogTGVuZ3RoIG9mIGRhdGEgKGNhbiBiZSB6ZXJvKSAqLworfTsKKworc3RydWN0IG1vbl9iaW5fbWZldGNoIHsKKwlpbnQzMl90ICpvZmZ2ZWM7ICAgLyogVmVjdG9yIG9mIGV2ZW50cyBmZXRjaGVkICovCisJaW50MzJfdCBuZmV0Y2g7ICAgIC8qIE51bWJlciBvZiBldmVudHMgdG8gZmV0Y2ggKG91dDogZmV0Y2hlZCkgKi8KKwlpbnQzMl90IG5mbHVzaDsgICAgLyogTnVtYmVyIG9mIGV2ZW50cyB0byBmbHVzaCAqLworfTsKKworI2RlZmluZSBNT05fSU9DX01BR0lDIDB4OTIKKworI2RlZmluZSBNT05fSU9DUV9VUkJfTEVOIF9JTyhNT05fSU9DX01BR0lDLCAxKQorI2RlZmluZSBNT05fSU9DWF9VUkIgIF9JT1dSKE1PTl9JT0NfTUFHSUMsIDIsIHN0cnVjdCBtb25fYmluX2hkcikKKyNkZWZpbmUgTU9OX0lPQ0dfU1RBVFMgX0lPUihNT05fSU9DX01BR0lDLCAzLCBzdHJ1Y3QgbW9uX2Jpbl9zdGF0cykKKyNkZWZpbmUgTU9OX0lPQ1RfUklOR19TSVpFIF9JTyhNT05fSU9DX01BR0lDLCA0KQorI2RlZmluZSBNT05fSU9DUV9SSU5HX1NJWkUgX0lPKE1PTl9JT0NfTUFHSUMsIDUpCisjZGVmaW5lIE1PTl9JT0NYX0dFVCAgIF9JT1coTU9OX0lPQ19NQUdJQywgNiwgc3RydWN0IG1vbl9iaW5fZ2V0KQorI2RlZmluZSBNT05fSU9DWF9NRkVUQ0ggX0lPV1IoTU9OX0lPQ19NQUdJQywgNywgc3RydWN0IG1vbl9iaW5fbWZldGNoKQorI2RlZmluZSBNT05fSU9DSF9NRkxVU0ggX0lPKE1PTl9JT0NfTUFHSUMsIDgpCisKKyNkZWZpbmUgTU9OX0JJTl9TRVRVUCAJMHgxIC8qIHNldHVwIGhkciBpcyBwcmVzZW50Ki8KKyNkZWZpbmUgTU9OX0JJTl9TRVRVUF9aRVJPIAkweDIgLyogc2V0dXAgYnVmZmVyIGlzIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTU9OX0JJTl9EQVRBX1pFUk8gCTB4NCAvKiBkYXRhIGJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIE1PTl9CSU5fRVJST1IgCTB4OAorCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gTGludXggVVNCLgorICovCitzdHJ1Y3QgcGNhcF91c2JfbGludXggeworCXVfY2hhciAqbW1hcGJ1ZjsJLyogbWVtb3J5LW1hcHBlZCByZWdpb24gcG9pbnRlciAqLworCXNpemVfdCBtbWFwYnVmbGVuOwkvKiBzaXplIG9mIHJlZ2lvbiAqLworCWludCBidXNfaW5kZXg7CisJdV9pbnQgcGFja2V0c19yZWFkOworfTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCB1c2JfYWN0aXZhdGUocGNhcF90ICopOworc3RhdGljIGludCB1c2Jfc3RhdHNfbGludXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CitzdGF0aWMgaW50IHVzYl9zdGF0c19saW51eF9iaW4ocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CitzdGF0aWMgaW50IHVzYl9yZWFkX2xpbnV4KHBjYXBfdCAqLCBpbnQgLCBwY2FwX2hhbmRsZXIgLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IHVzYl9yZWFkX2xpbnV4X2JpbihwY2FwX3QgKiwgaW50ICwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOworc3RhdGljIGludCB1c2JfcmVhZF9saW51eF9tbWFwKHBjYXBfdCAqLCBpbnQgLCBwY2FwX2hhbmRsZXIgLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IHVzYl9pbmplY3RfbGludXgocGNhcF90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdXNiX3NldGRpcmVjdGlvbl9saW51eChwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7CitzdGF0aWMgdm9pZCB1c2JfY2xlYW51cF9saW51eF9tbWFwKHBjYXBfdCAqKTsKKworLyogZmFjaWxpdHkgdG8gYWRkIGFuIFVTQiBkZXZpY2UgdG8gdGhlIGRldmljZSBsaXN0Ki8KK3N0YXRpYyBpbnQgCit1c2JfZGV2X2FkZChwY2FwX2lmX3QqKiBhbGxkZXZzcCwgaW50IG4sIGNoYXIgKmVycl9zdHIpCit7CisJY2hhciBkZXZfbmFtZVsxMF07CisJY2hhciBkZXZfZGVzY3JbMzBdOyAKKwlzbnByaW50ZihkZXZfbmFtZSwgMTAsIFVTQl9JRkFDRSIlZCIsIG4pOworCXNucHJpbnRmKGRldl9kZXNjciwgMzAsICJVU0IgYnVzIG51bWJlciAlZCIsIG4pOworCisJaWYgKHBjYXBfYWRkX2lmKGFsbGRldnNwLCBkZXZfbmFtZSwgMCwgCisJICAgIGRldl9kZXNjciwgZXJyX3N0cikgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7IAorfQorCitpbnQgCit1c2JfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycl9zdHIpCit7CisJc3RydWN0IGRpcmVudCogZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlESVIqIGRpcjsKKwlpbnQgbjsKKwljaGFyKiBuYW1lOworCXNpemVfdCBsZW47CisKKwkvKiB0cnkgc2Nhbm5pbmcgc3lzZnMgdXNiIGJ1cyBkaXJlY3RvcnkgKi8KKwlkaXIgPSBvcGVuZGlyKFNZU19VU0JfQlVTX0RJUik7CisJaWYgKGRpciAhPSBOVUxMKSB7CisJCXdoaWxlICgocmV0ID09IDApICYmICgoZGF0YSA9IHJlYWRkaXIoZGlyKSkgIT0gMCkpIHsKKwkJCW5hbWUgPSBkYXRhLT5kX25hbWU7CisKKwkJCWlmIChzdHJuY21wKG5hbWUsICJ1c2IiLCAzKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3NjYW5mKCZuYW1lWzNdLCAiJWQiLCAmbikgPT0gMCkgCisJCQkJY29udGludWU7CisKKwkJCXJldCA9IHVzYl9kZXZfYWRkKGFsbGRldnNwLCBuLCBlcnJfc3RyKTsKKwkJfQorCisJCWNsb3NlZGlyKGRpcik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogdGhhdCBkaWRuJ3Qgd29yazsgdHJ5IHNjYW5uaW5nIHByb2NmcyB1c2IgYnVzIGRpcmVjdG9yeSAqLworCWRpciA9IG9wZW5kaXIoUFJPQ19VU0JfQlVTX0RJUik7CisJaWYgKGRpciAhPSBOVUxMKSB7CisJCXdoaWxlICgocmV0ID09IDApICYmICgoZGF0YSA9IHJlYWRkaXIoZGlyKSkgIT0gMCkpIHsKKwkJCW5hbWUgPSBkYXRhLT5kX25hbWU7CisJCQlsZW4gPSBzdHJsZW4obmFtZSk7CisKKwkJCS8qIGlmIHRoaXMgZmlsZSBuYW1lIGRvZXMgbm90IGVuZCB3aXRoIGEgbnVtYmVyIGl0J3Mgbm90IG9mIG91ciBpbnRlcmVzdCAqLworCQkJaWYgKChsZW4gPCAxKSB8fCAhaXNkaWdpdChuYW1lWy0tbGVuXSkpCisJCQkJY29udGludWU7CisJCQl3aGlsZSAoaXNkaWdpdChuYW1lWy0tbGVuXSkpOworCQkJaWYgKHNzY2FuZigmbmFtZVtsZW4rMV0sICIlZCIsICZuKSAhPSAxKSAKKwkJCQljb250aW51ZTsKKworCQkJcmV0ID0gdXNiX2Rldl9hZGQoYWxsZGV2c3AsIG4sIGVycl9zdHIpOworCQl9CisKKwkJY2xvc2VkaXIoZGlyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBuZWl0aGVyIG9mIHRoZW0gd29ya2VkICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAKK2ludCB1c2JfbW1hcChwY2FwX3QqIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGNhcF91c2JfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJaW50IGxlbiA9IGlvY3RsKGhhbmRsZS0+ZmQsIE1PTl9JT0NRX1JJTkdfU0laRSk7CisJaWYgKGxlbiA8IDApIAorCQlyZXR1cm4gMDsKKworCWhhbmRsZXAtPm1tYXBidWZsZW4gPSBsZW47CisJaGFuZGxlcC0+bW1hcGJ1ZiA9IG1tYXAoMCwgaGFuZGxlcC0+bW1hcGJ1ZmxlbiwgUFJPVF9SRUFELAorCSAgICBNQVBfU0hBUkVELCBoYW5kbGUtPmZkLCAwKTsKKwlyZXR1cm4gaGFuZGxlcC0+bW1hcGJ1ZiAhPSBNQVBfRkFJTEVEOworfQorCisjZGVmaW5lIENUUkxfVElNRU9VVCAgICAoNSoxMDAwKSAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisKKyNkZWZpbmUgVVNCX0RJUl9JTgkJMHg4MAorI2RlZmluZSBVU0JfVFlQRV9TVEFOREFSRAkweDAwCisjZGVmaW5lIFVTQl9SRUNJUF9ERVZJQ0UJMHgwMAorCisjZGVmaW5lIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1IJNgorCisjZGVmaW5lIFVTQl9EVF9ERVZJQ0UJCTEKKworLyogcHJvYmUgdGhlIGRlc2NyaXB0b3JzIG9mIHRoZSBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBidXMgKi8KKy8qIHRoZSBkZXNjcmlwdG9ycyB3aWxsIGVuZCB1cCBpbiB0aGUgY2FwdHVyZWQgcGFja2V0IHN0cmVhbSAqLworLyogYW5kIGJlIGRlY29kZWQgYnkgZXh0ZXJuYWwgYXBwcyBsaWtlIHdpcmVzaGFyayAqLworLyogd2l0aG91dCB0aGVzZSBpZGVudGlmeWluZyBwcm9iZXMgcGFja2V0IGRhdGEgY2FuJ3QgYmUgZnVsbHkgZGVjb2RlZCAqLworc3RhdGljIHZvaWQKK3Byb2JlX2RldmljZXMoaW50IGJ1cykKK3sKKwlzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyIGN0cmw7CisJc3RydWN0IGRpcmVudCogZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwljaGFyIGJ1Zls0MF07CisJRElSKiBkaXI7CisKKwkvKiBzY2FuIHVzYiBidXMgZGlyZWN0b3JpZXMgZm9yIGRldmljZSBub2RlcyAqLworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIvZGV2L2J1cy91c2IvJTAzZCIsIGJ1cyk7CisJZGlyID0gb3BlbmRpcihidWYpOworCWlmICghZGlyKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKHJldCA+PSAwKSAmJiAoKGRhdGEgPSByZWFkZGlyKGRpcikpICE9IDApKSB7CisJCWludCBmZDsKKwkJY2hhciogbmFtZSA9IGRhdGEtPmRfbmFtZTsKKworCQlpZiAobmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiL2Rldi9idXMvdXNiLyUwM2QvJXMiLCBidXMsIGRhdGEtPmRfbmFtZSk7CisJCQorCQlmZCA9IG9wZW4oYnVmLCBPX1JEV1IpOworCQlpZiAoZmQgPT0gLTEpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBTaWdoLiAgRGlmZmVyZW50IGtlcm5lbHMgaGF2ZSBkaWZmZXJlbnQgbWVtYmVyIG5hbWVzCisJCSAqIGZvciB0aGlzIHN0cnVjdHVyZS4KKwkJICovCisjaWZkZWYgSEFWRV9VU0JERVZGU19DVFJMVFJBTlNGRVJfQlJFUVVFU1RUWVBFCisJCWN0cmwuYlJlcXVlc3RUeXBlID0gVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRTsKKwkJY3RybC5iUmVxdWVzdCA9IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I7CisJCWN0cmwud1ZhbHVlID0gVVNCX0RUX0RFVklDRSA8PCA4OworCQljdHJsLndJbmRleCA9IDA7CisgCQljdHJsLndMZW5ndGggPSBzaXplb2YoYnVmKTsKKyNlbHNlCisJCWN0cmwucmVxdWVzdHR5cGUgPSBVU0JfRElSX0lOIHwgVVNCX1RZUEVfU1RBTkRBUkQgfCBVU0JfUkVDSVBfREVWSUNFOworCQljdHJsLnJlcXVlc3QgPSBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOworCQljdHJsLnZhbHVlID0gVVNCX0RUX0RFVklDRSA8PCA4OworCQljdHJsLmluZGV4ID0gMDsKKyAJCWN0cmwubGVuZ3RoID0gc2l6ZW9mKGJ1Zik7CisjZW5kaWYKKwkJY3RybC5kYXRhID0gYnVmOworCQljdHJsLnRpbWVvdXQgPSBDVFJMX1RJTUVPVVQ7CisKKwkJcmV0ID0gaW9jdGwoZmQsIFVTQkRFVkZTX0NPTlRST0wsICZjdHJsKTsKKworCQljbG9zZShmZCk7CisJfQorCWNsb3NlZGlyKGRpcik7Cit9CisKK3BjYXBfdCAqCit1c2JfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKQoreworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmNwZW5kOworCWxvbmcgZGV2bnVtOworCXBjYXBfdCAqcDsKKworCS8qIERvZXMgdGhpcyBsb29rIGxpa2UgYSBVU0IgbW9uaXRvcmluZyBkZXZpY2U/ICovCisJY3AgPSBzdHJyY2hyKGRldmljZSwgJy8nKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJY3AgPSBkZXZpY2U7CisJLyogRG9lcyBpdCBiZWdpbiB3aXRoIFVTQl9JRkFDRT8gKi8KKwlpZiAoc3RybmNtcChjcCwgVVNCX0lGQUNFLCBzaXplb2YgVVNCX0lGQUNFIC0gMSkgIT0gMCkgeworCQkvKiBOb3BlLCBkb2Vzbid0IGJlZ2luIHdpdGggVVNCX0lGQUNFICovCisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIFllcyAtIGlzIFVTQl9JRkFDRSBmb2xsb3dlZCBieSBhIG51bWJlcj8gKi8KKwljcCArPSBzaXplb2YgVVNCX0lGQUNFIC0gMTsKKwlkZXZudW0gPSBzdHJ0b2woY3AsICZjcGVuZCwgMTApOworCWlmIChjcGVuZCA9PSBjcCB8fCAqY3BlbmQgIT0gJ1wwJykgeworCQkvKiBOb3QgZm9sbG93ZWQgYnkgYSBudW1iZXIuICovCisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChkZXZudW0gPCAwKSB7CisJCS8qIEZvbGxvd2VkIGJ5IGEgbm9uLXZhbGlkIG51bWJlci4gKi8KKwkJKmlzX291cnMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPSywgaXQncyBwcm9iYWJseSBvdXJzLiAqLworCSppc19vdXJzID0gMTsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3VzYl9saW51eCkpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IHVzYl9hY3RpdmF0ZTsKKwlyZXR1cm4gKHApOworfQorCitzdGF0aWMgaW50Cit1c2JfYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpCit7CisJc3RydWN0IHBjYXBfdXNiX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWNoYXIgCQlmdWxsX3BhdGhbVVNCX0xJTkVfTEVOXTsKKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCWhhbmRsZS0+b2Zmc2V0ID0gMDsKKwloYW5kbGUtPmxpbmt0eXBlID0gRExUX1VTQl9MSU5VWDsKKworCWhhbmRsZS0+aW5qZWN0X29wID0gdXNiX2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07IC8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IHVzYl9zZXRkaXJlY3Rpb25fbGludXg7CisJaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKworCS8qZ2V0IHVzYiBidXMgaW5kZXggZnJvbSBkZXZpY2UgbmFtZSAqLworCWlmIChzc2NhbmYoaGFuZGxlLT5vcHQuc291cmNlLCBVU0JfSUZBQ0UiJWQiLCAmaGFuZGxlcC0+YnVzX2luZGV4KSAhPSAxKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgZ2V0IFVTQiBidXMgaW5kZXggZnJvbSAlcyIsIGhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qbm93IHNlbGVjdCB0aGUgcmVhZCBtZXRob2Q6IHRyeSB0byBvcGVuIGJpbmFyeSBpbnRlcmZhY2UgKi8KKwlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgTElOVVhfVVNCX01PTl9ERVYiJWQiLCBoYW5kbGVwLT5idXNfaW5kZXgpOyAgCisJaGFuZGxlLT5mZCA9IG9wZW4oZnVsbF9wYXRoLCBPX1JET05MWSwgMCk7CisJaWYgKGhhbmRsZS0+ZmQgPj0gMCkKKwl7CisJCWlmIChoYW5kbGUtPm9wdC5yZm1vbikgeworCQkJLyoKKwkJCSAqIE1vbml0b3IgbW9kZSBkb2Vzbid0IGFwcGx5IHRvIFVTQiBkZXZpY2VzLgorCQkJICovCisJCQljbG9zZShoYW5kbGUtPmZkKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJfQorCisJCS8qIGJpbmFyeSBhcGkgaXMgYXZhaWxhYmxlLCB0cnkgdG8gdXNlIGZhc3QgbW1hcCBhY2Nlc3MgKi8KKwkJaWYgKHVzYl9tbWFwKGhhbmRsZSkpIHsKKwkJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfVVNCX0xJTlVYX01NQVBQRUQ7CisJCQloYW5kbGUtPnN0YXRzX29wID0gdXNiX3N0YXRzX2xpbnV4X2JpbjsKKwkJCWhhbmRsZS0+cmVhZF9vcCA9IHVzYl9yZWFkX2xpbnV4X21tYXA7CisJCQloYW5kbGUtPmNsZWFudXBfb3AgPSB1c2JfY2xlYW51cF9saW51eF9tbWFwOworCQkJcHJvYmVfZGV2aWNlcyhoYW5kbGVwLT5idXNfaW5kZXgpOworCisJCQkvKgorCQkJICogImhhbmRsZS0+ZmQiIGlzIGEgcmVhbCBmaWxlLCBzbyAic2VsZWN0KCkiIGFuZAorCQkJICogInBvbGwoKSIgd29yayBvbiBpdC4KKwkJCSAqLworCQkJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogY2FuJ3QgbW1hcCwgdXNlIHBsYWluIGJpbmFyeSBpbnRlcmZhY2UgYWNjZXNzICovCisJCWhhbmRsZS0+c3RhdHNfb3AgPSB1c2Jfc3RhdHNfbGludXhfYmluOworCQloYW5kbGUtPnJlYWRfb3AgPSB1c2JfcmVhZF9saW51eF9iaW47CisJCXByb2JlX2RldmljZXMoaGFuZGxlcC0+YnVzX2luZGV4KTsKKwl9CisJZWxzZSB7CisJCS8qQmluYXJ5IGludGVyZmFjZSBub3QgYXZhaWxhYmxlLCB0cnkgb3BlbiB0ZXh0IGludGVyZmFjZSAqLworCQlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSIi8lZHQiLCBoYW5kbGVwLT5idXNfaW5kZXgpOyAgCisJCWhhbmRsZS0+ZmQgPSBvcGVuKGZ1bGxfcGF0aCwgT19SRE9OTFksIDApOworCQlpZiAoaGFuZGxlLT5mZCA8IDApCisJCXsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBOb3QgZm91bmQgYXQgdGhlIG5ldyBsb2NhdGlvbjsgdHJ5CisJCQkJICogdGhlIG9sZCBsb2NhdGlvbi4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSX09MRCIvJWR0IiwgaGFuZGxlcC0+YnVzX2luZGV4KTsgIAorCQkJCWhhbmRsZS0+ZmQgPSBvcGVuKGZ1bGxfcGF0aCwgT19SRE9OTFksIDApOworCQkJfQorCQkJaWYgKGhhbmRsZS0+ZmQgPCAwKSB7CisJCQkJLyogbm8gbW9yZSBmYWxsYmFjaywgZ2l2ZSBpdCB1cCovCisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJDYW4ndCBvcGVuIFVTQiBidXMgZmlsZSAlczogJXMiLCBmdWxsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQl9CisJCX0KKworCQlpZiAoaGFuZGxlLT5vcHQucmZtb24pIHsKKwkJCS8qCisJCQkgKiBNb25pdG9yIG1vZGUgZG9lc24ndCBhcHBseSB0byBVU0IgZGV2aWNlcy4KKwkJCSAqLworCQkJY2xvc2UoaGFuZGxlLT5mZCk7CisJCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCX0KKworCQloYW5kbGUtPnN0YXRzX29wID0gdXNiX3N0YXRzX2xpbnV4OworCQloYW5kbGUtPnJlYWRfb3AgPSB1c2JfcmVhZF9saW51eDsKKwl9CisKKwkvKgorCSAqICJoYW5kbGUtPmZkIiBpcyBhIHJlYWwgZmlsZSwgc28gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIKKwkgKiB3b3JrIG9uIGl0LgorCSAqLworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQ7CisKKwkvKiBmb3IgcGxhaW4gYmluYXJ5IGFjY2VzcyBhbmQgdGV4dCBhY2Nlc3Mgd2UgbmVlZCB0byBhbGxvY2F0ZSB0aGUgcmVhZAorCSAqIGJ1ZmZlciAqLworCWhhbmRsZS0+YnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSk7CisJaWYgKCFoYW5kbGUtPmJ1ZmZlcikgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoaGFuZGxlLT5mZCk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgCithc2NpaV90b19pbnQoY2hhciBjKQoreworCXJldHVybiBjIDwgJ0EnID8gYy0gJzAnOiAoKGM8J2EnKSA/IGMgLSAnQScgKyAxMDogYy0nYScrMTApOworfQorCisvKgorICogc2VlIDxsaW51eC1rZXJuZWwtc291cmNlPi9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0IGFuZCAKKyAqIDxsaW51eC1rZXJuZWwtc291cmNlPi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYyBmb3IgdXJiIHN0cmluZyAKKyAqIGZvcm1hdCBkZXNjcmlwdGlvbgorICovCitzdGF0aWMgaW50Cit1c2JfcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwkvKiBzZWU6CisJKiAvdXNyL3NyYy9saW51eC9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0IAorCSogZm9yIG1lc3NhZ2UgZm9ybWF0CisJKi8KKwlzdHJ1Y3QgcGNhcF91c2JfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJdW5zaWduZWQgdGltZXN0YW1wOworCWludCB0YWcsIGNudCwgZXBfbnVtLCBkZXZfYWRkciwgZHVtbXksIHJldCwgdXJiX2xlbiwgZGF0YV9sZW47CisJY2hhciBldHlwZSwgcGlwZWlkMSwgcGlwZWlkMiwgc3RhdHVzWzE2XSwgdXJiX3RhZywgbGluZVtVU0JfTElORV9MRU5dOworCWNoYXIgKnN0cmluZyA9IGxpbmU7CisJdV9jaGFyICogcmF3ZGF0YSA9IGhhbmRsZS0+YnVmZmVyOworCXN0cnVjdCBwY2FwX3BrdGhkciBwa3RoOworCXBjYXBfdXNiX2hlYWRlciogdWhkciA9IChwY2FwX3VzYl9oZWFkZXIqKWhhbmRsZS0+YnVmZmVyOworCXVfY2hhciB1cmJfdHJhbnNmZXI9MDsKKwlpbnQgaW5jb21pbmc9MDsKKworCS8qIGlnbm9yZSBpbnRlcnJ1cHQgc3lzdGVtIGNhbGwgZXJyb3JzICovCisJZG8geworCQlyZXQgPSByZWFkKGhhbmRsZS0+ZmQsIGxpbmUsIFVTQl9MSU5FX0xFTiAtIDEpOworCQlpZiAoaGFuZGxlLT5icmVha19sb29wKQorCQl7CisJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJcmV0dXJuIC0yOworCQl9CisJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisJaWYgKHJldCA8IDApCisJeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJcmV0dXJuIDA7CS8qIG5vIGRhdGEgdGhlcmUgKi8KKworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCByZWFkIGZyb20gZmQgJWQ6ICVzIiwgaGFuZGxlLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHJlYWQgdXJiIGhlYWRlcjsgJW4gYXJndW1lbnQgbWF5IGluY3JlbWVudCByZXR1cm4gdmFsdWUsIGJ1dCBpdCdzIAorCSogbm90IG1hbmRhdG9yeSwgc28gZG9lcyBub3QgY291bnQgb24gaXQqLworCXN0cmluZ1tyZXRdID0gMDsKKwlyZXQgPSBzc2NhbmYoc3RyaW5nLCAiJXggJWQgJWMgJWMlYzolZDolZCAlcyVuIiwgJnRhZywgJnRpbWVzdGFtcCwgJmV0eXBlLCAKKwkJJnBpcGVpZDEsICZwaXBlaWQyLCAmZGV2X2FkZHIsICZlcF9udW0sIHN0YXR1cywgCisJCSZjbnQpOworCWlmIChyZXQgPCA4KQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3QgcGFyc2UgVVNCIGJ1cyBtZXNzYWdlICclcycsIHRvbyBmZXcgdG9rZW5zIChleHBlY3RlZCA4IGdvdCAlZCkiLAorCQkgICAgc3RyaW5nLCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCXVoZHItPmlkID0gdGFnOworCXVoZHItPmRldmljZV9hZGRyZXNzID0gZGV2X2FkZHI7CisJdWhkci0+YnVzX2lkID0gaGFuZGxlcC0+YnVzX2luZGV4OworCXVoZHItPnN0YXR1cyA9IDA7CisJc3RyaW5nICs9IGNudDsKKworCS8qIGRvbid0IHVzZSB1c2Jtb24gcHJvdmlkZWQgdGltZXN0YW1wLCBzaW5jZSBpdCBoYXZlIGxvdyBwcmVjaXNpb24qLworCWlmIChnZXR0aW1lb2ZkYXkoJnBrdGgudHMsIE5VTEwpIDwgMCkgCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSJDYW4ndCBnZXQgdGltZXN0YW1wIGZvciBtZXNzYWdlICclcycgJWQ6JXMiLCAKKwkJCXN0cmluZywgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJdWhkci0+dHNfc2VjID0gcGt0aC50cy50dl9zZWM7CisJdWhkci0+dHNfdXNlYyA9IHBrdGgudHMudHZfdXNlYzsKKworCS8qIHBhcnNlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCisJaWYgKHBpcGVpZDEgPT0gJ0MnKQorCQl1cmJfdHJhbnNmZXIgPSBVUkJfQ09OVFJPTDsKKwllbHNlIGlmIChwaXBlaWQxID09ICdaJykKKwkJdXJiX3RyYW5zZmVyID0gVVJCX0lTT0NIUk9OT1VTOworCWVsc2UgaWYgKHBpcGVpZDEgPT0gJ0knKQorCQl1cmJfdHJhbnNmZXIgPSBVUkJfSU5URVJSVVBUOworCWVsc2UgaWYgKHBpcGVpZDEgPT0gJ0InKQorCQl1cmJfdHJhbnNmZXIgPSBVUkJfQlVMSzsKKwlpZiAocGlwZWlkMiA9PSAnaScpIHsKKwkJZXBfbnVtIHw9IFVSQl9UUkFOU0ZFUl9JTjsKKwkJaW5jb21pbmcgPSAxOworCX0KKwlpZiAoZXR5cGUgPT0gJ0MnKQorCQlpbmNvbWluZyA9ICFpbmNvbWluZzsKKworCS8qIGRpcmVjdGlvbiBjaGVjayovCisJaWYgKGluY29taW5nKQorCXsKKwkJaWYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9PVVQpCisJCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCQlpZiAoaGFuZGxlLT5kaXJlY3Rpb24gPT0gUENBUF9EX0lOKQorCQkJcmV0dXJuIDA7CisJdWhkci0+ZXZlbnRfdHlwZSA9IGV0eXBlOworCXVoZHItPnRyYW5zZmVyX3R5cGUgPSB1cmJfdHJhbnNmZXI7CisJdWhkci0+ZW5kcG9pbnRfbnVtYmVyID0gZXBfbnVtOworCXBrdGguY2FwbGVuID0gc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcik7CisJcmF3ZGF0YSArPSBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSBzZXR1cCBwYWNrZXQgKi8KKwlyZXQgPSBzc2NhbmYoc3RhdHVzLCAiJWQiLCAmZHVtbXkpOworCWlmIChyZXQgIT0gMSkKKwl7CisJCS8qIHRoaXMgYSBzZXR1cCBwYWNrZXQsIHNldHVwIGRhdGEgY2FuIGJlIGZpbGxlZCB3aXRoIHVuZGVyc2NvcmUgaWYKKwkJKiB1c2Jtb24gaGFzIG5vdCBiZWVuIGFibGUgdG8gcmVhZCB0aGVtLCBzbyB3ZSBtdXN0IHBhcnNlIHRoaXMgZmllbGRzIGFzIAorCQkqIHN0cmluZ3MgKi8KKwkJcGNhcF91c2Jfc2V0dXAqIHNoZHI7CisJCWNoYXIgc3RyMVszXSwgc3RyMlszXSwgc3RyM1s1XSwgc3RyNFs1XSwgc3RyNVs1XTsKKwkJcmV0ID0gc3NjYW5mKHN0cmluZywgIiVzICVzICVzICVzICVzJW4iLCBzdHIxLCBzdHIyLCBzdHIzLCBzdHI0LCAKKwkJc3RyNSwgJmNudCk7CisJCWlmIChyZXQgPCA1KQorCQl7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkiQ2FuJ3QgcGFyc2UgVVNCIGJ1cyBtZXNzYWdlICclcycsIHRvbyBmZXcgdG9rZW5zIChleHBlY3RlZCA1IGdvdCAlZCkiLAorCQkJCXN0cmluZywgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzdHJpbmcgKz0gY250OworCisJCS8qIHRyeSB0byBjb252ZXJ0IHRvIGNvcnJlc3BvbmRpbmcgaW50ZWdlciAqLworCQlzaGRyID0gJnVoZHItPnNldHVwOworCQlzaGRyLT5ibVJlcXVlc3RUeXBlID0gc3RydG91bChzdHIxLCAwLCAxNik7CisJCXNoZHItPmJSZXF1ZXN0ID0gc3RydG91bChzdHIyLCAwLCAxNik7CisJCXNoZHItPndWYWx1ZSA9IGh0b2xzKHN0cnRvdWwoc3RyMywgMCwgMTYpKTsKKwkJc2hkci0+d0luZGV4ID0gaHRvbHMoc3RydG91bChzdHI0LCAwLCAxNikpOworCQlzaGRyLT53TGVuZ3RoID0gaHRvbHMoc3RydG91bChzdHI1LCAwLCAxNikpOworCisJCXVoZHItPnNldHVwX2ZsYWcgPSAwOworCX0KKwllbHNlIAorCQl1aGRyLT5zZXR1cF9mbGFnID0gMTsKKworCS8qIHJlYWQgdXJiIGRhdGEgKi8KKwlyZXQgPSBzc2NhbmYoc3RyaW5nLCAiICVkJW4iLCAmdXJiX2xlbiwgJmNudCk7CisJaWYgKHJldCA8IDEpCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAiQ2FuJ3QgcGFyc2UgdXJiIGxlbmd0aCBmcm9tICclcyciLCBzdHJpbmcpOworCQlyZXR1cm4gLTE7CisJfQorCXN0cmluZyArPSBjbnQ7CisKKwkvKiB1cmIgdGFnIGlzIG5vdCBwcmVzZW50IGlmIHVyYiBsZW5ndGggaXMgMCwgc28gd2UgY2FuIHN0b3AgaGVyZSAKKwkgKiB0ZXh0IHBhcnNpbmcgKi8KKwlwa3RoLmxlbiA9IHVyYl9sZW4rcGt0aC5jYXBsZW47CisJdWhkci0+dXJiX2xlbiA9IHVyYl9sZW47CisJdWhkci0+ZGF0YV9mbGFnID0gMTsKKwlkYXRhX2xlbiA9IDA7CisJaWYgKHVoZHItPnVyYl9sZW4gPT0gMCkKKwkJZ290byBnb3Q7CisKKwkvKiBjaGVjayBmb3IgZGF0YSBwcmVzZW5jZTsgZGF0YSBpcyBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIHVyYiB0YWcgaXMgJz0nICovCisJaWYgKHNzY2FuZihzdHJpbmcsICIgJWMiLCAmdXJiX3RhZykgIT0gMSkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJIkNhbid0IHBhcnNlIHVyYiB0YWcgZnJvbSAnJXMnIiwgc3RyaW5nKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh1cmJfdGFnICE9ICc9JykgCisJCWdvdG8gZ290OworCisJLyogc2tpcCB1cmIgdGFnIGFuZCBmb2xsb3dpbmcgc3BhY2UgKi8KKwlzdHJpbmcgKz0gMzsKKworCS8qIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgd2UgZ290IHNvbWUgdXJiIGRhdGEqLworCXVoZHItPmRhdGFfZmxhZyA9IDA7CisKKwkvKiByZWFkIGFsbCB1cmIgZGF0YTsgaWYgdXJiIGxlbmd0aCBpcyBncmVhdGVyIHRoZW4gdGhlIHVzYm1vbiBpbnRlcm5hbCAKKwkgKiBidWZmZXIgbGVuZ3RoIHVzZWQgYnkgdGhlIGtlcm5lbCB0byBzcG9vbCB0aGUgVVJCLCB3ZSBnZXQgb25seQorCSAqIGEgcGFydGlhbCBpbmZvcm1hdGlvbi4KKwkgKiBBdCBsZWFzdCB1bnRpbCBsaW51eCAyLjYuMTcgdGhlcmUgaXMgbm8gd2F5IHRvIHNldCB1c2Jtb24gaW50ZW5hbCBidWZmZXIKKwkgKiBsZW5ndGggYW5kIGRlZmF1bHQgdmFsdWUgaXMgMTMwLiAqLworCXdoaWxlICgoc3RyaW5nWzBdICE9IDApICYmIChzdHJpbmdbMV0gIT0gMCkgJiYgKHBrdGguY2FwbGVuIDwgaGFuZGxlLT5zbmFwc2hvdCkpCisJeworCQlyYXdkYXRhWzBdID0gYXNjaWlfdG9faW50KHN0cmluZ1swXSkgKiAxNiArIGFzY2lpX3RvX2ludChzdHJpbmdbMV0pOworCQlyYXdkYXRhKys7CisJCXN0cmluZys9MjsKKwkJaWYgKHN0cmluZ1swXSA9PSAnICcpCisJCQlzdHJpbmcrKzsKKwkJcGt0aC5jYXBsZW4rKzsKKwkJZGF0YV9sZW4rKzsKKwl9CisKK2dvdDoKKwl1aGRyLT5kYXRhX2xlbiA9IGRhdGFfbGVuOworCWlmIChwa3RoLmNhcGxlbiA+IGhhbmRsZS0+c25hcHNob3QpCisJCXBrdGguY2FwbGVuID0gaGFuZGxlLT5zbmFwc2hvdDsKKworCWlmIChoYW5kbGUtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKKwkgICAgYnBmX2ZpbHRlcihoYW5kbGUtPmZjb2RlLmJmX2luc25zLCBoYW5kbGUtPmJ1ZmZlciwKKwkgICAgICBwa3RoLmxlbiwgcGt0aC5jYXBsZW4pKSB7CisJCWhhbmRsZXAtPnBhY2tldHNfcmVhZCsrOworCQljYWxsYmFjayh1c2VyLCAmcGt0aCwgaGFuZGxlLT5idWZmZXIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CS8qIGRpZG4ndCBwYXNzIGZpbHRlciAqLworfQorCitzdGF0aWMgaW50Cit1c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiaW5qZWN0IG5vdCBzdXBwb3J0ZWQgb24gIgorCQkiVVNCIGRldmljZXMiKTsKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludCAKK3VzYl9zdGF0c19saW51eChwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHBjYXBfc3RhdCAqc3RhdHMpCit7CisJc3RydWN0IHBjYXBfdXNiX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCWludCBkdW1teSwgcmV0LCBjb25zdW1lZCwgY250OworCWNoYXIgc3RyaW5nW1VTQl9MSU5FX0xFTl07CisJY2hhciB0b2tlbltVU0JfTElORV9MRU5dOworCWNoYXIgKiBwdHIgPSBzdHJpbmc7CisJaW50IGZkOworCisJc25wcmludGYoc3RyaW5nLCBVU0JfTElORV9MRU4sIFVTQl9URVhUX0RJUiIvJWRzIiwgaGFuZGxlcC0+YnVzX2luZGV4KTsKKwlmZCA9IG9wZW4oc3RyaW5nLCBPX1JET05MWSwgMCk7CisJaWYgKGZkIDwgMCkKKwl7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCXsKKwkJCS8qCisJCQkgKiBOb3QgZm91bmQgYXQgdGhlIG5ldyBsb2NhdGlvbjsgdHJ5IHRoZSBvbGQKKwkJCSAqIGxvY2F0aW9uLgorCQkJICovCisJCQlzbnByaW50ZihzdHJpbmcsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSX09MRCIvJWRzIiwgaGFuZGxlcC0+YnVzX2luZGV4KTsKKwkJCWZkID0gb3BlbihzdHJpbmcsIE9fUkRPTkxZLCAwKTsKKwkJfQorCQlpZiAoZmQgPCAwKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkiQ2FuJ3Qgb3BlbiBVU0Igc3RhdHMgZmlsZSAlczogJXMiLCAKKwkJCQlzdHJpbmcsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiByZWFkIHN0YXRzIGxpbmUgKi8KKwlkbyB7CisJCXJldCA9IHJlYWQoZmQsIHN0cmluZywgVVNCX0xJTkVfTEVOLTEpOworCX0gd2hpbGUgKChyZXQgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCWNsb3NlKGZkKTsKKworCWlmIChyZXQgPCAwKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgcmVhZCBzdGF0cyBmcm9tIGZkICVkICIsIGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJpbmdbcmV0XSA9IDA7CisKKwkvKiBleHRyYWN0IGluZm8gb24gZHJvcHBlZCB1cmJzICovCisJZm9yIChjb25zdW1lZD0wOyBjb25zdW1lZCA8IHJldDsgKSB7CisJCS8qIGZyb20gdGhlIHNzY2FuZiBtYW4gcGFnZTogCisgCQkgKiBUaGUgQyBzdGFuZGFyZCBzYXlzOiAiRXhlY3V0aW9uIG9mIGEgJW4gZGlyZWN0aXZlIGRvZXMgCisgCQkgKiBub3QgaW5jcmVtZW50IHRoZSBhc3NpZ25tZW50IGNvdW50IHJldHVybmVkIGF0IHRoZSBjb21wbGV0aW9uCisJCSAqIG9mICBleGVjdXRpb24iIGJ1dCB0aGUgQ29ycmlnZW5kdW0gc2VlbXMgdG8gY29udHJhZGljdCB0aGlzLgorCQkgKiBEbyBub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgb24gdGhlIGVmZmVjdCBvZiAlbiBjb252ZXJzaW9ucyAKKwkJICogb24gdGhlIHJldHVybiB2YWx1ZSBhbmQgZXhwbGljaXRseSBjaGVjayBmb3IgY250IGFzc2lnbm1ldCovCisJCWludCBudG9rOworCisJCWNudCA9IC0xOworCQludG9rID0gc3NjYW5mKHB0ciwgIiVzJW4iLCB0b2tlbiwgJmNudCk7CisJCWlmICgobnRvayA8IDEpIHx8IChjbnQgPCAwKSkKKwkJCWJyZWFrOworCQljb25zdW1lZCArPSBjbnQ7CisJCXB0ciArPSBjbnQ7CisJCWlmIChzdHJjbXAodG9rZW4sICJucmVhZGVycyIpID09IDApCisJCQlyZXQgPSBzc2NhbmYocHRyLCAiJWQiLCAmc3RhdHMtPnBzX2Ryb3ApOworCQllbHNlIAorCQkJcmV0ID0gc3NjYW5mKHB0ciwgIiVkIiwgJmR1bW15KTsKKwkJaWYgKG50b2sgIT0gMSkKKwkJCWJyZWFrOworCQljb25zdW1lZCArPSBjbnQ7CisJCXB0ciArPSBjbnQ7CisJfQorCisJc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGVwLT5wYWNrZXRzX3JlYWQ7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCit1c2Jfc2V0ZGlyZWN0aW9uX2xpbnV4KHBjYXBfdCAqcCwgcGNhcF9kaXJlY3Rpb25fdCBkKQoreworCXAtPmRpcmVjdGlvbiA9IGQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCAKK3VzYl9zdGF0c19saW51eF9iaW4ocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBwY2FwX3N0YXQgKnN0YXRzKQoreworCXN0cnVjdCBwY2FwX3VzYl9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwlpbnQgcmV0OworCXN0cnVjdCBtb25fYmluX3N0YXRzIHN0OworCXJldCA9IGlvY3RsKGhhbmRsZS0+ZmQsIE1PTl9JT0NHX1NUQVRTLCAmc3QpOworCWlmIChyZXQgPCAwKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgcmVhZCBzdGF0cyBmcm9tIGZkICVkOiVzICIsIGhhbmRsZS0+ZmQsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdGF0cy0+cHNfcmVjdiA9IGhhbmRsZXAtPnBhY2tldHNfcmVhZCArIHN0LnF1ZXVlZDsKKwlzdGF0cy0+cHNfZHJvcCA9IHN0LmRyb3BwZWQ7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZWUgPGxpbnV4LWtlcm5lbC1zb3VyY2U+L0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQgYW5kIAorICogPGxpbnV4LWtlcm5lbC1zb3VyY2U+L2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMgYmluYXJ5IEFCSQorICovCitzdGF0aWMgaW50Cit1c2JfcmVhZF9saW51eF9iaW4ocGNhcF90ICpoYW5kbGUsIGludCBtYXhfcGFja2V0cywgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJc3RydWN0IHBjYXBfdXNiX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCXN0cnVjdCBtb25fYmluX2dldCBpbmZvOworCWludCByZXQ7CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisJaW50IGNsZW4gPSBoYW5kbGUtPnNuYXBzaG90IC0gc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcik7CisKKwkvKiB0aGUgdXNiIGhlYWRlciBpcyBnb2luZyB0byBiZSBwYXJ0IG9mICdwYWNrZXQnIGRhdGEqLworCWluZm8uaGRyID0gKHBjYXBfdXNiX2hlYWRlciopIGhhbmRsZS0+YnVmZmVyOworCWluZm8uZGF0YSA9IGhhbmRsZS0+YnVmZmVyICsgc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcik7CisJaW5mby5kYXRhX2xlbiA9IGNsZW47CisKKwkvKiBpZ25vcmUgaW50ZXJydXB0IHN5c3RlbSBjYWxsIGVycm9ycyAqLworCWRvIHsKKwkJcmV0ID0gaW9jdGwoaGFuZGxlLT5mZCwgTU9OX0lPQ1hfR0VULCAmaW5mbyk7CisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApCisJCXsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gLTI7CisJCX0KKwl9IHdoaWxlICgocmV0ID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpKTsKKwlpZiAocmV0IDwgMCkKKwl7CisJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQlyZXR1cm4gMDsJLyogbm8gZGF0YSB0aGVyZSAqLworCisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IHJlYWQgZnJvbSBmZCAlZDogJXMiLCBoYW5kbGUtPmZkLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogd2UgY2FuIGdldCBsZXNzIHRoYXQgdGhhbiByZWFsbHkgY2FwdHVyZWQgZnJvbSBrZXJuZWwsIGRlcGVuZGluZyBvbgorCSAqIHNuYXBsZW4sIHNvIGFkanVzdCBoZWFkZXIgYWNjb3JkaW5nbHkgKi8KKwlpZiAoaW5mby5oZHItPmRhdGFfbGVuIDwgY2xlbikKKwkJY2xlbiA9IGluZm8uaGRyLT5kYXRhX2xlbjsKKwlpbmZvLmhkci0+ZGF0YV9sZW4gPSBjbGVuOworCXBrdGguY2FwbGVuID0gY2xlbiArIHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOworCXBrdGgubGVuID0gaW5mby5oZHItPmRhdGFfbGVuICsgc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcik7CisJcGt0aC50cy50dl9zZWMgPSBpbmZvLmhkci0+dHNfc2VjOworCXBrdGgudHMudHZfdXNlYyA9IGluZm8uaGRyLT50c191c2VjOworCisJaWYgKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMgPT0gTlVMTCB8fAorCSAgICBicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIGhhbmRsZS0+YnVmZmVyLAorCSAgICAgIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIHsKKwkJaGFuZGxlcC0+cGFja2V0c19yZWFkKys7CisJCWNhbGxiYWNrKHVzZXIsICZwa3RoLCBoYW5kbGUtPmJ1ZmZlcik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwkvKiBkaWRuJ3QgcGFzcyBmaWx0ZXIgKi8KK30KKworLyoKKyAqIHNlZSA8bGludXgta2VybmVsLXNvdXJjZT4vRG9jdW1lbnRhdGlvbi91c2IvdXNibW9uLnR4dCBhbmQgCisgKiA8bGludXgta2VybmVsLXNvdXJjZT4vZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYyBiaW5hcnkgQUJJCisgKi8KKyNkZWZpbmUgVkVDX1NJWkUgMzIKK3N0YXRpYyBpbnQKK3VzYl9yZWFkX2xpbnV4X21tYXAocGNhcF90ICpoYW5kbGUsIGludCBtYXhfcGFja2V0cywgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJc3RydWN0IHBjYXBfdXNiX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCXN0cnVjdCBtb25fYmluX21mZXRjaCBmZXRjaDsKKwlpbnQzMl90IHZlY1tWRUNfU0laRV07CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisJcGNhcF91c2JfaGVhZGVyKiBoZHI7CisJaW50IG5mbHVzaCA9IDA7CisJaW50IHBhY2tldHMgPSAwOworCWludCBjbGVuLCBtYXhfY2xlbjsKKworCW1heF9jbGVuID0gaGFuZGxlLT5zbmFwc2hvdCAtIHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOworCisJZm9yICg7OykgeworCQlpbnQgaSwgcmV0OworCQlpbnQgbGltaXQgPSBtYXhfcGFja2V0cyAtIHBhY2tldHM7CisJCWlmIChsaW1pdCA8PSAwKQorCQkJbGltaXQgPSBWRUNfU0laRTsKKwkJaWYgKGxpbWl0ID4gVkVDX1NJWkUpCisJCQlsaW1pdCA9IFZFQ19TSVpFOworCisJCS8qIHRyeSB0byBmZXRjaCBhcyBtYW55IGV2ZW50cyBhcyBwb3NzaWJsZSovCisJCWZldGNoLm9mZnZlYyA9IHZlYzsKKwkJZmV0Y2gubmZldGNoID0gbGltaXQ7CisJCWZldGNoLm5mbHVzaCA9IG5mbHVzaDsKKwkJLyogaWdub3JlIGludGVycnVwdCBzeXN0ZW0gY2FsbCBlcnJvcnMgKi8KKwkJZG8geworCQkJcmV0ID0gaW9jdGwoaGFuZGxlLT5mZCwgTU9OX0lPQ1hfTUZFVENILCAmZmV0Y2gpOworCQkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkKKwkJCXsKKwkJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJCXJldHVybiAtMjsKKwkJCX0KKwkJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisJCWlmIChyZXQgPCAwKQorCQl7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJCXJldHVybiAwOwkvKiBubyBkYXRhIHRoZXJlICovCisKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJDYW4ndCBtZmV0Y2ggZmQgJWQ6ICVzIiwgaGFuZGxlLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIGtlZXAgdHJhY2sgb2YgcHJvY2Vzc2VkIGV2ZW50cywgd2Ugd2lsbCBmbHVzaCB0aGVtIGxhdGVyICovCisJCW5mbHVzaCA9IGZldGNoLm5mZXRjaDsKKwkJZm9yIChpPTA7IGk8ZmV0Y2gubmZldGNoOyArK2kpIHsKKwkJCS8qIGRpc2NhcmQgZmlsbGVyICovCisJCQloZHIgPSAocGNhcF91c2JfaGVhZGVyKikgJmhhbmRsZXAtPm1tYXBidWZbdmVjW2ldXTsKKwkJCWlmIChoZHItPmV2ZW50X3R5cGUgPT0gJ0AnKSAKKwkJCQljb250aW51ZTsKKworCQkJLyogd2UgY2FuIGdldCBsZXNzIHRoYXQgdGhhbiByZWFsbHkgY2FwdHVyZWQgZnJvbSBrZXJuZWwsIGRlcGVuZGluZyBvbgorCSAJCSogc25hcGxlbiwgc28gYWRqdXN0IGhlYWRlciBhY2NvcmRpbmdseSAqLworCQkJY2xlbiA9IG1heF9jbGVuOworCQkJaWYgKGhkci0+ZGF0YV9sZW4gPCBjbGVuKQorCQkJCWNsZW4gPSBoZHItPmRhdGFfbGVuOworCisJCQkvKiBnZXQgcGFja2V0IGluZm8gZnJvbSBoZWFkZXIqLworCQkJcGt0aC5jYXBsZW4gPSBjbGVuICsgc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcl9tbWFwcGVkKTsKKwkJCXBrdGgubGVuID0gaGRyLT5kYXRhX2xlbiArIHNpemVvZihwY2FwX3VzYl9oZWFkZXJfbW1hcHBlZCk7CisJCQlwa3RoLnRzLnR2X3NlYyA9IGhkci0+dHNfc2VjOworCQkJcGt0aC50cy50dl91c2VjID0gaGRyLT50c191c2VjOworCisJCQlpZiAoaGFuZGxlLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMIHx8CisJCQkgICAgYnBmX2ZpbHRlcihoYW5kbGUtPmZjb2RlLmJmX2luc25zLCAodV9jaGFyKikgaGRyLAorCQkJICAgICAgcGt0aC5sZW4sIHBrdGguY2FwbGVuKSkgeworCQkJCWhhbmRsZXAtPnBhY2tldHNfcmVhZCsrOworCQkJCWNhbGxiYWNrKHVzZXIsICZwa3RoLCAodV9jaGFyKikgaGRyKTsKKwkJCQlwYWNrZXRzKys7CisJCQl9CisJCX0KKworCQkvKiB3aXRoIG1heF9wYWNrZXRzIHNwZWNpZnlpbmcgInVubGltaXRlZCIgd2Ugc3RvcCBhZmVyIHRoZSBmaXJzdCBjaHVuayovCisJCWlmIChQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKG1heF9wYWNrZXRzKSB8fCAocGFja2V0cyA9PSBtYXhfcGFja2V0cykpCisJCQlicmVhazsKKwl9CisKKwkvKiBmbHVzaCBwZW5kaW5nIGV2ZW50cyovCisJaW9jdGwoaGFuZGxlLT5mZCwgTU9OX0lPQ0hfTUZMVVNILCBuZmx1c2gpOworCXJldHVybiBwYWNrZXRzOworfQorCitzdGF0aWMgdm9pZAordXNiX2NsZWFudXBfbGludXhfbW1hcChwY2FwX3QqIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGNhcF91c2JfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisKKwkvKiBpZiB3ZSBoYXZlIGEgbWVtb3J5LW1hcHBlZCBidWZmZXIsIHVubWFwIGl0ICovCisJaWYgKGhhbmRsZXAtPm1tYXBidWYgIT0gTlVMTCkgeworCQltdW5tYXAoaGFuZGxlcC0+bW1hcGJ1ZiwgaGFuZGxlcC0+bW1hcGJ1Zmxlbik7CisJCWhhbmRsZXAtPm1tYXBidWYgPSBOVUxMOworCX0KKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKK30KZGlmZiAtLWdpdCBhL3BjYXAtdXNiLWxpbnV4LmggYi9wY2FwLXVzYi1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDM4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLXVzYi1saW51eC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGFvbG8gQWJlbmkgKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVVNCIHNuaWZmaW5nIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggcGxhdGZvcm0KKyAqIEJ5IFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtdXNiLWxpbnV4LmgsdiAxLjUgMjAwOC0wNC0wNCAxOTozNzo0NSBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogUHJvdG90eXBlcyBmb3IgVVNCLXJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KK2ludCB1c2JfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycl9zdHIpOworcGNhcF90ICp1c2JfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKTsKZGlmZiAtLWdpdCBhL3BjYXAtd2luMzIuYyBiL3BjYXAtd2luMzIuYwppbmRleCA0MzVkYTY2Li44N2IzZmM2IDEwMDY0NAotLS0gYS9wY2FwLXdpbjMyLmMKKysrIGIvcGNhcC13aW4zMi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMTk5OSAtIDIwMDUgTmV0R3JvdXAsIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyAoSXRhbHkpCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDA3IENBQ0UgVGVjaG5vbG9naWVzLCBEYXZpcyAoQ2FsaWZvcm5pYSkKKyAqIENvcHlyaWdodCAoYykgMjAwNSAtIDIwMDggQ0FDRSBUZWNobm9sb2dpZXMsIERhdmlzIChDYWxpZm9ybmlhKQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMzLDEyICszMywyMSBAQAogCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXdpbjMyLmMsdiAxLjI1LjIuNyAyMDA3LzA2LzE0IDIyOjA3OjE0IGdpYW5sdWNhIEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXdpbjMyLmMsdiAxLjQyIDIwMDgtMDUtMjEgMjI6MTU6MjUgZ2lhbmx1Y2EgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpbmNsdWRlIDxwY2FwLWludC5oPgogI2luY2x1ZGUgPFBhY2tldDMyLmg+Ci0jaW5jbHVkZSA8TnRkZG5kaXMuaD4KKyNpZmRlZiBfX01JTkdXMzJfXworI2lmZGVmIF9fTUlOR1c2NF9fCisjaW5jbHVkZSA8bnRkZG5kaXMuaD4KKyNlbHNlICAvKl9fTUlOR1c2NF9fKi8KKyNpbmNsdWRlIDxkZGsvbnRkZG5kaXMuaD4KKyNpbmNsdWRlIDxkZGsvbmRpcy5oPgorI2VuZGlmIC8qX19NSU5HVzY0X18qLworI2Vsc2UgLypfX01JTkdXMzJfXyovCisjaW5jbHVkZSA8bnRkZG5kaXMuaD4KKyNlbmRpZiAvKl9fTUlOR1czMl9fKi8KICNpZmRlZiBIQVZFX0RBR19BUEkKICNpbmNsdWRlIDxkYWduZXcuaD4KICNpbmNsdWRlIDxkYWdhcGkuaD4KQEAgLTUzLDEzICs2MiwyNyBAQAogc3RhdGljIGludCBwY2FwX2dldG5vbmJsb2NrX3dpbjMyKHBjYXBfdCAqLCBjaGFyICopOwogc3RhdGljIGludCBwY2FwX3NldG5vbmJsb2NrX3dpbjMyKHBjYXBfdCAqLCBpbnQsIGNoYXIgKik7CiAKLSNkZWZpbmUJUGNhcEJ1ZlNpemUgMjU2MDAwCS8qZGltZW5zaW9uIG9mIHRoZSBidWZmZXIgaW4gdGhlIHBjYXBfdCBzdHJ1Y3R1cmUqLwotI2RlZmluZQlTSVpFX0JVRiAxMDAwMDAwCisvKmRpbWVuc2lvbiBvZiB0aGUgYnVmZmVyIGluIHRoZSBwY2FwX3Qgc3RydWN0dXJlKi8KKyNkZWZpbmUJV0lOMzJfREVGQVVMVF9VU0VSX0JVRkZFUl9TSVpFIDI1NjAwMAorCisvKmRpbWVuc2lvbiBvZiB0aGUgYnVmZmVyIGluIHRoZSBrZXJuZWwgZHJpdmVyIE5QRiAqLworI2RlZmluZQlXSU4zMl9ERUZBVUxUX0tFUk5FTF9CVUZGRVJfU0laRSAxMDAwMDAwCiAKIC8qIEVxdWl2YWxlbnQgdG8gbnRvaHMoKSwgYnV0IGEgbG90IGZhc3RlciB1bmRlciBXaW5kb3dzICovCiAjZGVmaW5lIFNXQVBTKF9YKSAoKF9YICYgMHhmZikgPDwgOCkgfCAoX1ggPj4gOCkKIAogLyoKKyAqIFByaXZhdGUgZGF0YSBmb3IgY2FwdHVyaW5nIG9uIFdpblBjYXAgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfd2luIHsKKwlpbnQgbm9uYmxvY2s7CisKKyNpZmRlZiBIQVZFX0RBR19BUEkKKwlpbnQJZGFnX2Zjc19iaXRzOwkvKiBOdW1iZXIgb2YgY2hlY2tzdW0gYml0cyBmcm9tIGxpbmsgbGF5ZXIgKi8KKyNlbmRpZgorfTsKKworLyoKICAqIEhlYWRlciB0aGF0IHRoZSBXaW5QY2FwIGRyaXZlciBhc3NvY2lhdGVzIHRvIHRoZSBwYWNrZXRzLgogICogT25jZSB3YXMgaW4gYnBmLmgKICAqLwpAQCAtNzEsNiArOTQsMjIgQEAKIAkJCQkJICAgcGx1cyBhbGlnbm1lbnQgcGFkZGluZykgKi8KIH07CiAKK0NSSVRJQ0FMX1NFQ1RJT04gZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbjsKKworQk9PTCBXSU5BUEkgRGxsTWFpbigKKyAgSEFORExFIGhpbnN0RExMLAorICBEV09SRCBkd1JlYXNvbiwKKyAgTFBWT0lEIGxwdlJlc2VydmVkCispCit7CisJaWYgKGR3UmVhc29uID09IERMTF9QUk9DRVNTX0FUVEFDSCkKKwl7CisJCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmdfUGNhcENvbXBpbGVDcml0aWNhbFNlY3Rpb24pOworCX0KKworCXJldHVybiBUUlVFOworfQorCiAvKiBTdGFydCB3aW5zb2NrICovCiBpbnQgCiB3c29ja2luaXQoKQpAQCAtMTAwLDYgKzEzOSw1MCBAQAogCXJldHVybiAwOwogfQogCisvKiBTZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsLWxldmVsIGNhcHR1cmUgYnVmZmVyICovCitzdGF0aWMgaW50CitwY2FwX3NldGJ1ZmZfd2luMzIocGNhcF90ICpwLCBpbnQgZGltKQoreworCWlmKFBhY2tldFNldEJ1ZmYocC0+YWRhcHRlcixkaW0pPT1GQUxTRSkKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGtlcm5lbCBidWZmZXIiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHRoZSBkcml2ZXIgd29ya2luZyBtb2RlICovCitzdGF0aWMgaW50CitwY2FwX3NldG1vZGVfd2luMzIocGNhcF90ICpwLCBpbnQgbW9kZSkKK3sKKwlpZihQYWNrZXRTZXRNb2RlKHAtPmFkYXB0ZXIsbW9kZSk9PUZBTFNFKQorCXsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiB3b3JraW5nIG1vZGUgbm90IHJlY29nbml6ZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKnNldCB0aGUgbWluaW11bSBhbW91bnQgb2YgZGF0YSB0aGF0IHdpbGwgcmVsZWFzZSBhIHJlYWQgY2FsbCovCitzdGF0aWMgaW50CitwY2FwX3NldG1pbnRvY29weV93aW4zMihwY2FwX3QgKnAsIGludCBzaXplKQoreworCWlmKFBhY2tldFNldE1pblRvQ29weShwLT5hZGFwdGVyLCBzaXplKT09RkFMU0UpCisJeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkcml2ZXIgZXJyb3I6IHVuYWJsZSB0byBzZXQgdGhlIHJlcXVlc3RlZCBtaW50b2NvcHkgc2l6ZSIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKnJldHVybiB0aGUgQWRhcHRlciBmb3IgYSBwY2FwX3QqLworc3RhdGljIEFkYXB0ZXIgKgorcGNhcF9nZXRhZGFwdGVyX3dpbjMyKHBjYXBfdCAqcCkKK3sKKwlyZXR1cm4gcC0+YWRhcHRlcjsKK30KKwogc3RhdGljIGludAogcGNhcF9yZWFkX3dpbjMyX25wZihwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQogewpAQCAtMTcyLDggKzI1NSw4IEBACiAJCSAqIFhYWCBBIGJwZl9oZHIgbWF0Y2hlcyBhIHBjYXBfcGt0aGRyLgogCQkgKi8KIAkJKCpjYWxsYmFjaykodXNlciwgKHN0cnVjdCBwY2FwX3BrdGhkciopYnAsIGJwICsgaGRybGVuKTsKLQkJYnAgKz0gQlBGX1dPUkRBTElHTihjYXBsZW4gKyBoZHJsZW4pOwotCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKSB7CisJCWJwICs9IFBhY2tldF9XT1JEQUxJR04oY2FwbGVuICsgaGRybGVuKTsKKwkJaWYgKCsrbiA+PSBjbnQgJiYgIVBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQoY250KSkgewogCQkJcC0+YnAgPSBicDsKIAkJCXAtPmNjID0gZXAgLSBicDsKIAkJCXJldHVybiAobik7CkBAIC0xODgsNiArMjcxLDcgQEAKIHN0YXRpYyBpbnQKIHBjYXBfcmVhZF93aW4zMl9kYWcocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKIHsKKwlzdHJ1Y3QgcGNhcF93aW4gKnB3ID0gcC0+cHJpdjsKIAl1X2NoYXIgKmRwID0gTlVMTDsKIAlpbnQJcGFja2V0X2xlbiA9IDAsIGNhcGxlbiA9IDA7CiAJc3RydWN0IHBjYXBfcGt0aGRyCXBjYXBfaGVhZGVyOwpAQCAtMjMwLDcgKzMxNCw3IEBACiAJCQlicmVhazsKIAogCQkvKiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGNhcHR1cmVkIHBhY2tldHMgKi8KLQkJcC0+bWQuc3RhdC5wc19yZWN2Kys7CisJCXB3LT5zdGF0LnBzX3JlY3YrKzsKIAkJCiAJCS8qIEZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0ICovCiAJCWRwID0gKCh1X2NoYXIgKiloZWFkZXIpICsgZGFnX3JlY29yZF9zaXplOwpAQCAtMjQ3LDcgKzMzMSw3IEBACiAKIAkJY2FzZSBUWVBFX0VUSDoKIAkJCXN3dCA9IFNXQVBTKGhlYWRlci0+d2xlbik7Ci0JCQlwYWNrZXRfbGVuID0gc3d0IC0gKHAtPm1kLmRhZ19mY3NfYml0cyk7CisJCQlwYWNrZXRfbGVuID0gc3d0IC0gKHB3LT5kYWdfZmNzX2JpdHMpOwogCQkJY2FwbGVuID0gZXJmX3JlY29yZF9sZW4gLSBkYWdfcmVjb3JkX3NpemUgLSAyOwogCQkJaWYgKGNhcGxlbiA+IHBhY2tldF9sZW4pCiAJCQl7CkBAIC0yNTksNyArMzQzLDcgQEAKIAkJCiAJCWNhc2UgVFlQRV9IRExDX1BPUzoKIAkJCXN3dCA9IFNXQVBTKGhlYWRlci0+d2xlbik7Ci0JCQlwYWNrZXRfbGVuID0gc3d0IC0gKHAtPm1kLmRhZ19mY3NfYml0cyk7CisJCQlwYWNrZXRfbGVuID0gc3d0IC0gKHB3LT5kYWdfZmNzX2JpdHMpOwogCQkJY2FwbGVuID0gZXJmX3JlY29yZF9sZW4gLSBkYWdfcmVjb3JkX3NpemU7CiAJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikKIAkJCXsKQEAgLTMzMiw3ICs0MTYsNyBAQAogCQloZWFkZXIgPSAoZGFnX3JlY29yZF90KikoKGNoYXIqKWhlYWRlciArIGVyZl9yZWNvcmRfbGVuKTsKIAogCQkvKiBTdG9wIGlmIHRoZSBudW1iZXIgb2YgcGFja2V0cyByZXF1ZXN0ZWQgYnkgdXNlciBoYXMgYmVlbiByZWFjaGVkKi8KLQkJaWYgKCsrbiA+PSBjbnQgJiYgY250ID4gMCkgCisJCWlmICgrK24gPj0gY250ICYmICFQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKGNudCkpIAogCQl7CiAJCQlwLT5icCA9IChjaGFyKiloZWFkZXI7CiAJCQlwLT5jYyA9IGVuZG9mYnVmIC0gKGNoYXIqKWhlYWRlcjsKQEAgLTM3Niw5ICs0NjAsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotcGNhcF9jbG9zZV93aW4zMihwY2FwX3QgKnApCitwY2FwX2NsZWFudXBfd2luMzIocGNhcF90ICpwKQogewotCXBjYXBfY2xvc2VfY29tbW9uKHApOwogCWlmIChwLT5hZGFwdGVyICE9IE5VTEwpIHsKIAkJUGFja2V0Q2xvc2VBZGFwdGVyKHAtPmFkYXB0ZXIpOwogCQlwLT5hZGFwdGVyID0gTlVMTDsKQEAgLTM4Nyw0MSArNDcwLDQwIEBACiAJCVBhY2tldEZyZWVQYWNrZXQocC0+UGFja2V0KTsKIAkJcC0+UGFja2V0ID0gTlVMTDsKIAl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOwogfQogCi1wY2FwX3QgKgotcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywKLSAgICBjaGFyICplYnVmKQorc3RhdGljIGludAorcGNhcF9hY3RpdmF0ZV93aW4zMihwY2FwX3QgKnApCiB7Ci0JcmVnaXN0ZXIgcGNhcF90ICpwOworCXN0cnVjdCBwY2FwX3dpbiAqcHcgPSBwLT5wcml2OwogCU5ldFR5cGUgdHlwZTsKIAorCWlmIChwLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogTm8gbW9uaXRvciBtb2RlIG9uIFdpbmRvd3MuICBJdCBjb3VsZCBiZSBkb25lIG9uCisJCSAqIFZpc3RhIHdpdGggZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhlIG5hdGl2ZSA4MDIuMTEKKwkJICogbWVjaGFuaXNtIGFuZCBtb25pdG9yIG1vZGUuCisJCSAqLworCQlyZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKKwl9CisKIAkvKiBJbml0IFdpblNvY2sgKi8KIAl3c29ja2luaXQoKTsKIAotCXAgPSAocGNhcF90ICopbWFsbG9jKHNpemVvZigqcCkpOwotCWlmIChwID09IE5VTEwpIAotCXsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKLQlwLT5hZGFwdGVyPU5VTEw7Ci0KLQlwLT5hZGFwdGVyID0gUGFja2V0T3BlbkFkYXB0ZXIoKGNoYXIqKWRldmljZSk7CisJcC0+YWRhcHRlciA9IFBhY2tldE9wZW5BZGFwdGVyKHAtPm9wdC5zb3VyY2UpOwogCQogCWlmIChwLT5hZGFwdGVyID09IE5VTEwpCiAJewotCQlmcmVlKHApOwogCQkvKiBBZGFwdGVyIGRldGVjdGVkIGJ1dCB3ZSBhcmUgbm90IGFibGUgdG8gb3BlbiBpdC4gUmV0dXJuIGZhaWx1cmUuICovCi0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFcnJvciBvcGVuaW5nIGFkYXB0ZXI6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOwotCQlyZXR1cm4gTlVMTDsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRXJyb3Igb3BlbmluZyBhZGFwdGVyOiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CiAJfQogCQogCS8qZ2V0IG5ldHdvcmsgdHlwZSovCiAJaWYoUGFja2V0R2V0TmV0VHlwZSAocC0+YWRhcHRlciwmdHlwZSkgPT0gRkFMU0UpCiAJewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2Fubm90IGRldGVybWluZSB0aGUgbmV0d29yayB0eXBlOiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2Fubm90IGRldGVybWluZSB0aGUgbmV0d29yayB0eXBlOiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKIAkJZ290byBiYWQ7CiAJfQogCQpAQCAtNTA1LDEyICs1ODcsMTIgQEAKIAl9CiAKIAkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwotCWlmIChwcm9taXNjKSAKKwlpZiAocC0+b3B0LnByb21pc2MpIAogCXsKIAogCQlpZiAoUGFja2V0U2V0SHdGaWx0ZXIocC0+YWRhcHRlcixORElTX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTKSA9PSBGQUxTRSkKIAkJewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBzZXQgaGFyZHdhcmUgZmlsdGVyIHRvIHByb21pc2N1b3VzIG1vZGUiKTsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBzZXQgaGFyZHdhcmUgZmlsdGVyIHRvIHByb21pc2N1b3VzIG1vZGUiKTsKIAkJCWdvdG8gYmFkOwogCQl9CiAJfQpAQCAtNTE4LDIxICs2MDAsMTggQEAKIAl7CiAJCWlmIChQYWNrZXRTZXRId0ZpbHRlcihwLT5hZGFwdGVyLE5ESVNfUEFDS0VUX1RZUEVfQUxMX0xPQ0FMKSA9PSBGQUxTRSkKIAkJewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBzZXQgaGFyZHdhcmUgZmlsdGVyIHRvIG5vbi1wcm9taXNjdW91cyBtb2RlIik7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJmYWlsZWQgdG8gc2V0IGhhcmR3YXJlIGZpbHRlciB0byBub24tcHJvbWlzY3VvdXMgbW9kZSIpOwogCQkJZ290byBiYWQ7CiAJCX0KIAl9CiAKIAkvKiBTZXQgdGhlIGJ1ZmZlciBzaXplICovCi0JcC0+YnVmc2l6ZSA9IFBjYXBCdWZTaXplOwotCi0JLyogU3RvcmUgdGhlIHRpbWVvdXQuIFVzZWQgYnkgcGNhcF9zZXRub25ibG9jaygpICovCi0JcC0+dGltZW91dD0gdG9fbXM7CisJcC0+YnVmc2l6ZSA9IFdJTjMyX0RFRkFVTFRfVVNFUl9CVUZGRVJfU0laRTsKIAogCS8qIGFsbG9jYXRlIFBhY2tldCBzdHJ1Y3R1cmUgdXNlZCBkdXJpbmcgdGhlIGNhcHR1cmUgKi8KIAlpZigocC0+UGFja2V0ID0gUGFja2V0QWxsb2NhdGVQYWNrZXQoKSk9PU5VTEwpCiAJewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBQQUNLRVQgc3RydWN0dXJlIik7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgUEFDS0VUIHN0cnVjdHVyZSIpOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTU0MSwzMCArNjIwLDQ1IEBACiAJLyogCiAJICogVHJhZGl0aW9uYWwgQWRhcHRlciAKIAkgKi8KKwkJLyoKKwkJICogSWYgdGhlIGJ1ZmZlciBzaXplIHdhc24ndCBleHBsaWNpdGx5IHNldCwgZGVmYXVsdCB0bworCQkgKiBXSU4zMl9ERUZBVUxUX1VTRVJfQlVGRkVSX1NJWkUuCisJCSAqLworCSAJaWYgKHAtPm9wdC5idWZmZXJfc2l6ZSA9PSAwKQorCSAJCXAtPm9wdC5idWZmZXJfc2l6ZSA9IFdJTjMyX0RFRkFVTFRfS0VSTkVMX0JVRkZFUl9TSVpFOworCisJCWlmKFBhY2tldFNldEJ1ZmYocC0+YWRhcHRlcixwLT5vcHQuYnVmZmVyX3NpemUpPT1GQUxTRSkKKwkJeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUga2VybmVsIGJ1ZmZlciIpOworCQkJZ290byBiYWQ7CisJCX0KIAkJCi0JCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MoUGNhcEJ1ZlNpemUpOworCQlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUpOwogCQlpZiAocC0+YnVmZmVyID09IE5VTEwpIAogCQl7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlnb3RvIGJhZDsKIAkJfQogCQkKIAkJUGFja2V0SW5pdFBhY2tldChwLT5QYWNrZXQsKEJZVEUqKXAtPmJ1ZmZlcixwLT5idWZzaXplKTsKIAkJCi0JCXAtPnNuYXBzaG90ID0gc25hcGxlbjsKLQkJCi0JCS8qIGFsbG9jYXRlIHRoZSBzdGFuZGFyZCBidWZmZXIgaW4gdGhlIGRyaXZlciAqLwotCQlpZihQYWNrZXRTZXRCdWZmKCBwLT5hZGFwdGVyLCBTSVpFX0JVRik9PUZBTFNFKQorCQlpZiAocC1vcHQuaW1tZWRpYXRlKQogCQl7Ci0JCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCJkcml2ZXIgZXJyb3I6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBrZXJuZWwgYnVmZmVyXG4iKTsKLQkJCWdvdG8gYmFkOworCQkJLyogdGVsbCB0aGUgZHJpdmVyIHRvIGNvcHkgdGhlIGJ1ZmZlciBhcyBzb29uIGFzIGRhdGEgYXJyaXZlcyAqLworCQkJaWYoUGFja2V0U2V0TWluVG9Db3B5KHAtPmFkYXB0ZXIsMCk9PUZBTFNFKQorCQkJeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiRXJyb3IgY2FsbGluZyBQYWNrZXRTZXRNaW5Ub0NvcHk6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQkJCWdvdG8gYmFkOworCQkJfQogCQl9Ci0JCQotCQkvKiB0ZWxsIHRoZSBkcml2ZXIgdG8gY29weSB0aGUgYnVmZmVyIG9ubHkgaWYgaXQgY29udGFpbnMgYXQgbGVhc3QgMTZLICovCi0JCWlmKFBhY2tldFNldE1pblRvQ29weShwLT5hZGFwdGVyLDE2MDAwKT09RkFMU0UpCisJCWVsc2UKIAkJewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiRXJyb3IgY2FsbGluZyBQYWNrZXRTZXRNaW5Ub0NvcHk6ICVzXG4iLCBwY2FwX3dpbjMyc3RyZXJyb3IoKSk7Ci0JCQlnb3RvIGJhZDsKKwkJCS8qIHRlbGwgdGhlIGRyaXZlciB0byBjb3B5IHRoZSBidWZmZXIgb25seSBpZiBpdCBjb250YWlucyBhdCBsZWFzdCAxNksgKi8KKwkJCWlmKFBhY2tldFNldE1pblRvQ29weShwLT5hZGFwdGVyLDE2MDAwKT09RkFMU0UpCisJCQl7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCJFcnJvciBjYWxsaW5nIFBhY2tldFNldE1pblRvQ29weTogJXMiLCBwY2FwX3dpbjMyc3RyZXJyb3IoKSk7CisJCQkJZ290byBiYWQ7CisJCQl9CiAJCX0KIAl9CiAJZWxzZQpAQCAtNTgyLDcgKzY3Niw3IEBACiAJCQogCQlzbnByaW50ZihrZXluYW1lLCBzaXplb2Yoa2V5bmFtZSksICIlc1xcQ2FyZFBhcmFtc1xcJXMiLCAKIAkJCSJTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcREFHIiwKLQkJCXN0cnN0cihfc3RybHdyKChjaGFyKilkZXZpY2UpLCAiZGFnIikpOworCQkJc3Ryc3RyKF9zdHJsd3IocC0+b3B0LnNvdXJjZSksICJkYWciKSk7CiAJCWRvCiAJCXsKIAkJCXN0YXR1cyA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleW5hbWUsIDAsIEtFWV9SRUFELCAmZGFna2V5KTsKQEAgLTYxMCwxMyArNzA0LDEzIEBACiAJCQogCQkvKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgRkNTIGFzc29jaWF0ZWQgdG8gYW55IHBhY2tldC4gVGhpcyB2YWx1ZSAKIAkJICogd2lsbCBiZSBzdWJ0cmFjdGVkIHRvIHRoZSBwYWNrZXQgbGVuZ3RoICovCi0JCXAtPm1kLmRhZ19mY3NfYml0cyA9IHAtPmFkYXB0ZXItPkRhZ0Zjc0xlbjsKKwkJcHctPmRhZ19mY3NfYml0cyA9IHAtPmFkYXB0ZXItPkRhZ0Zjc0xlbjsKIAl9CiAjZWxzZQogCWdvdG8gYmFkOwogI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLwogCQotCVBhY2tldFNldFJlYWRUaW1lb3V0KHAtPmFkYXB0ZXIsIHRvX21zKTsKKwlQYWNrZXRTZXRSZWFkVGltZW91dChwLT5hZGFwdGVyLCBwLT5vcHQudGltZW91dCk7CiAJCiAjaWZkZWYgSEFWRV9EQUdfQVBJCiAJaWYocC0+YWRhcHRlci0+RmxhZ3MgJiBJTkZPX0ZMQUdfREFHX0NBUkQpCkBAIC02NDEsMjUgKzczNSw2MSBAQAogCXAtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja193aW4zMjsKIAlwLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfd2luMzI7CiAJcC0+c3RhdHNfb3AgPSBwY2FwX3N0YXRzX3dpbjMyOwotCXAtPmNsb3NlX29wID0gcGNhcF9jbG9zZV93aW4zMjsKKwlwLT5zZXRidWZmX29wID0gcGNhcF9zZXRidWZmX3dpbjMyOworCXAtPnNldG1vZGVfb3AgPSBwY2FwX3NldG1vZGVfd2luMzI7CisJcC0+c2V0bWludG9jb3B5X29wID0gcGNhcF9zZXRtaW50b2NvcHlfd2luMzI7CisJcC0+Z2V0YWRhcHRlcl9vcCA9IHBjYXBfZ2V0YWRhcHRlcl93aW4zMjsKKwlwLT5jbGVhbnVwX29wID0gcGNhcF9jbGVhbnVwX3dpbjMyOwogCi0JcmV0dXJuIChwKTsKKwlyZXR1cm4gKDApOwogYmFkOgotCWlmIChwLT5hZGFwdGVyKQotCSAgICBQYWNrZXRDbG9zZUFkYXB0ZXIocC0+YWRhcHRlcik7Ci0JaWYgKHAtPmJ1ZmZlciAhPSBOVUxMKQotCQlmcmVlKHAtPmJ1ZmZlcik7Ci0JaWYocC0+UGFja2V0KQotCQlQYWNrZXRGcmVlUGFja2V0KHAtPlBhY2tldCk7Ci0JLyoKLQkgKiBHZXQgcmlkIG9mIGFueSBsaW5rLWxheWVyIHR5cGUgbGlzdCB3ZSBhbGxvY2F0ZWQuCi0JICovCi0JaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpCi0JCWZyZWUocC0+ZGx0X2xpc3QpOwotCWZyZWUocCk7Ci0JcmV0dXJuIChOVUxMKTsKKwlwY2FwX2NsZWFudXBfd2luMzIocCk7CisJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIH0KIAorcGNhcF90ICoKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisJaWYgKHN0cmxlbihkZXZpY2UpID09IDEpCisJeworCQkvKgorCQkgKiBJdCdzIHByb2JhYmx5IGEgdW5pY29kZSBzdHJpbmcKKwkJICogQ29udmVydCB0byBhc2NpaSBhbmQgcGFzcyBpdCB0byBwY2FwX2NyZWF0ZV9jb21tb24KKwkJICoKKwkJICogVGhpcyB3b25kZXJmdWwgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSBwY2FwX2xvb2t1cGRldiBzdGlsbCByZXR1cm5zCisJCSAqIHVuaWNvZGUgc3RyaW5ncywgYW5kIGl0J3MgdXNlZCBieSB3aW5kdW1wIHdoZW4gbm8gZGV2aWNlIGlzIHNwZWNpZmllZAorCQkgKiBpbiB0aGUgY29tbWFuZCBsaW5lCisJCSAqLworCQlzaXplX3QgbGVuZ3RoOworCQljaGFyKiBkZXZpY2VBc2NpaTsKKworCQlsZW5ndGggPSB3Y3NsZW4oKHdjaGFyX3QqKWRldmljZSk7CisKKwkJZGV2aWNlQXNjaWkgPSAoY2hhciopbWFsbG9jKGxlbmd0aCArIDEpOworCisJCWlmIChkZXZpY2VBc2NpaSA9PSBOVUxMKQorCQl7CisJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTWFsbG9jIGZhaWxlZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlzbnByaW50ZihkZXZpY2VBc2NpaSwgbGVuZ3RoICsgMSwgIiV3cyIsICh3Y2hhcl90KilkZXZpY2UpOworCQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZUFzY2lpLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3dpbikpOworCQlmcmVlKGRldmljZUFzY2lpKTsKKwl9CisJZWxzZQorCXsKKwkJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfd2luKSk7CisJfQorCisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV93aW4zMjsKKwlyZXR1cm4gKHApOworfQogCiBzdGF0aWMgaW50CiBwY2FwX3NldGZpbHRlcl93aW4zMl9ucGYocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQpAQCAtNzA0LDI1ICs4MzQsMjYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAkKLQlwLT5tZC51c2VfYnBmID0gMDsKLQkKIAlyZXR1cm4gKDApOwogfQogCiBzdGF0aWMgaW50CiBwY2FwX2dldG5vbmJsb2NrX3dpbjMyKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQogeworCXN0cnVjdCBwY2FwX3dpbiAqcHcgPSBwLT5wcml2OworCiAJLyoKIAkgKiBYWFggLSBpZiB0aGVyZSB3ZXJlIGEgUGFja2V0R2V0UmVhZFRpbWVvdXQoKSBjYWxsLCB3ZQogCSAqIHdvdWxkIHVzZSBpdCwgYW5kIHJldHVybiAxIGlmIHRoZSB0aW1lb3V0IGlzIC0xCiAJICogYW5kIDAgb3RoZXJ3aXNlLgogCSAqLwotCXJldHVybiAocC0+bm9uYmxvY2spOworCXJldHVybiAocHctPm5vbmJsb2NrKTsKIH0KIAogc3RhdGljIGludAogcGNhcF9zZXRub25ibG9ja193aW4zMihwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQogeworCXN0cnVjdCBwY2FwX3dpbiAqcHcgPSBwLT5wcml2OwogCWludCBuZXd0aW1lb3V0OwogCiAJaWYgKG5vbmJsb2NrKSB7CkBAIC03MzYsNjggKzg2NywyMCBAQAogCQkgKiAoTm90ZSB0aGF0IHRoaXMgbWF5IGJlIC0xLCBpbiB3aGljaCBjYXNlIHdlJ3JlIG5vdAogCQkgKiByZWFsbHkgbGVhdmluZyBub24tYmxvY2tpbmcgbW9kZS4pCiAJCSAqLwotCQluZXd0aW1lb3V0ID0gcC0+dGltZW91dDsKKwkJbmV3dGltZW91dCA9IHAtPm9wdC50aW1lb3V0OwogCX0KIAlpZiAoIVBhY2tldFNldFJlYWRUaW1lb3V0KHAtPmFkYXB0ZXIsIG5ld3RpbWVvdXQpKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIlBhY2tldFNldFJlYWRUaW1lb3V0OiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKIAkJcmV0dXJuICgtMSk7CiAJfQotCXAtPm5vbmJsb2NrID0gKG5ld3RpbWVvdXQgPT0gLTEpOworCXB3LT5ub25ibG9jayA9IChuZXd0aW1lb3V0ID09IC0xKTsKIAlyZXR1cm4gKDApOwogfQogCi0vKiBTZXQgdGhlIGRyaXZlciB3b3JraW5nIG1vZGUgKi8KLWludCAKLXBjYXBfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKXsKLQkKLQlpZiAocC0+YWRhcHRlcj09TlVMTCkKLQl7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImltcG9zc2libGUgdG8gc2V0IG1vZGUgd2hpbGUgcmVhZGluZyBmcm9tIGEgZmlsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYoUGFja2V0U2V0TW9kZShwLT5hZGFwdGVyLG1vZGUpPT1GQUxTRSkKLQl7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogd29ya2luZyBtb2RlIG5vdCByZWNvZ25pemVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogU2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIGtlcm5lbC1sZXZlbCBjYXB0dXJlIGJ1ZmZlciAqLwotaW50IAotcGNhcF9zZXRidWZmKHBjYXBfdCAqcCwgaW50IGRpbSkKKy8qcGxhdGZvcm0tZGVwZW5kZW50IHJvdXRpbmUgdG8gYWRkIGRldmljZXMgb3RoZXIgdGhhbiBORElTIGludGVyZmFjZXMqLworaW50CitwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7Ci0JaWYgKHAtPmFkYXB0ZXI9PU5VTEwpCi0JewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUaGUga2VybmVsIGJ1ZmZlciBzaXplIGNhbm5vdCBiZSBzZXQgd2hpbGUgcmVhZGluZyBmcm9tIGEgZmlsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCWlmKFBhY2tldFNldEJ1ZmYocC0+YWRhcHRlcixkaW0pPT1GQUxTRSkKLQl7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGtlcm5lbCBidWZmZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLypzZXQgdGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgdGhhdCB3aWxsIHJlbGVhc2UgYSByZWFkIGNhbGwqLwotaW50IAotcGNhcF9zZXRtaW50b2NvcHkocGNhcF90ICpwLCBpbnQgc2l6ZSkKLXsKLQlpZiAocC0+YWRhcHRlcj09TlVMTCkKLQl7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkltcG9zc2libGUgdG8gc2V0IHRoZSBtaW50b2NvcHkgcGFyYW1ldGVyIG9uIGFuIG9mZmxpbmUgY2FwdHVyZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQkKLQotCWlmKFBhY2tldFNldE1pblRvQ29weShwLT5hZGFwdGVyLCBzaXplKT09RkFMU0UpCi0JewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkcml2ZXIgZXJyb3I6IHVuYWJsZSB0byBzZXQgdGhlIHJlcXVlc3RlZCBtaW50b2NvcHkgc2l6ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworCXJldHVybiAoMCk7CiB9CmRpZmYgLS1naXQgYS9wY2FwLjMgYi9wY2FwLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjFmNmEuLjAwMDAwMDAKLS0tIGEvcGNhcC4zCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMiArMCwwIEBACi0uXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLjMsdiAxLjY0LjIuMTEgMjAwNy8wNi8xMSAwOTo1MjowNSBndXkgRXhwICQKLS5cIgotLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NwotLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0uXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0uXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLS5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0uXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0uXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLS5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0uXCIKLS5USCBQQ0FQIDMgIjI3IEZlYnJ1YXJ5IDIwMDQiCi0uU0ggTkFNRQotcGNhcCBcLSBQYWNrZXQgQ2FwdHVyZSBsaWJyYXJ5Ci0uU0ggU1lOT1BTSVMKLS5uZgotLmZ0IEIKLSNpbmNsdWRlIDxwY2FwLmg+Ci0uZnQKLS5MUAotLm5mCi0uZnQgQgotY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07Ci0uZnQKLS5MUAotLmZ0IEIKLXBjYXBfdCAqcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgc25hcGxlbiwKLS50aSArOAotaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZXJyYnVmKQotcGNhcF90ICpwY2FwX29wZW5fZGVhZChpbnQgbGlua3R5cGUsIGludCBzbmFwbGVuKQotcGNhcF90ICpwY2FwX29wZW5fb2ZmbGluZShjb25zdCBjaGFyICpmbmFtZSwgY2hhciAqZXJyYnVmKQotcGNhcF90ICpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqZnAsIGNoYXIgKmVycmJ1ZikKLXBjYXBfZHVtcGVyX3QgKnBjYXBfZHVtcF9vcGVuKHBjYXBfdCAqcCwgY29uc3QgY2hhciAqZm5hbWUpCi1wY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICpwLCBGSUxFICpmcCkKLS5mdAotLkxQCi0uZnQgQgotaW50IHBjYXBfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1Zik7Ci1pbnQgcGNhcF9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1Zik7Ci0uZnQKLS5MUAotLmZ0IEIKLWludCBwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCi12b2lkIHBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICphbGxkZXZzKQotY2hhciAqcGNhcF9sb29rdXBkZXYoY2hhciAqZXJyYnVmKQotaW50IHBjYXBfbG9va3VwbmV0KGNvbnN0IGNoYXIgKmRldmljZSwgYnBmX3VfaW50MzIgKm5ldHAsCi0udGkgKzgKLWJwZl91X2ludDMyICptYXNrcCwgY2hhciAqZXJyYnVmKQotLmZ0Ci0uTFAKLS5mdCBCCi10eXBlZGVmIHZvaWQgKCpwY2FwX2hhbmRsZXIpKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLAotLnRpICs4Ci0JCQkgICAgIGNvbnN0IHVfY2hhciAqYnl0ZXMpOwotLmZ0IEIKLWludCBwY2FwX2Rpc3BhdGNoKHBjYXBfdCAqcCwgaW50IGNudCwKLS50aSArOAotcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCi1pbnQgcGNhcF9sb29wKHBjYXBfdCAqcCwgaW50IGNudCwKLS50aSArOAotcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCi12b2lkIHBjYXBfZHVtcCh1X2NoYXIgKnVzZXIsIHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKLS50aSArOAotdV9jaGFyICpzcCkKLS5mdAotLkxQCi0uZnQgQgotaW50IHBjYXBfY29tcGlsZShwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnAsCi0udGkgKzgKLWNvbnN0IGNoYXIgKnN0ciwgaW50IG9wdGltaXplLCBicGZfdV9pbnQzMiBuZXRtYXNrKQotaW50IHBjYXBfc2V0ZmlsdGVyKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkKLXZvaWQgcGNhcF9mcmVlY29kZShzdHJ1Y3QgYnBmX3Byb2dyYW0gKikKLWludCBwY2FwX3NldGRpcmVjdGlvbihwY2FwX3QgKnAsIHBjYXBfZGlyZWN0aW9uX3QgZCkKLS5mdAotLkxQCi0uZnQgQgotY29uc3QgdV9jaGFyICpwY2FwX25leHQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgpCi1pbnQgcGNhcF9uZXh0X2V4KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfcGt0aGRyICoqcGt0X2hlYWRlciwKLS50aSArOAotY29uc3QgdV9jaGFyICoqcGt0X2RhdGEpCi0uZnQKLS5MUAotLmZ0IEIKLXZvaWQgcGNhcF9icmVha2xvb3AocGNhcF90ICopCi0uZnQKLS5MUAotLmZ0IEIKLWludCBwY2FwX2luamVjdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCi1pbnQgcGNhcF9zZW5kcGFja2V0KHBjYXBfdCAqcCwgY29uc3QgdV9jaGFyICpidWYsIGludCBzaXplKQotLmZ0Ci0uTFAKLS5mdCBCCi1pbnQgcGNhcF9kYXRhbGluayhwY2FwX3QgKnApCi1pbnQgcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKnAsIGludCAqKmRsdF9idWYpOwotaW50IHBjYXBfc2V0X2RhdGFsaW5rKHBjYXBfdCAqcCwgaW50IGRsdCk7Ci1pbnQgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICpuYW1lKTsKLWNvbnN0IGNoYXIgKnBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoaW50IGRsdCk7Ci1jb25zdCBjaGFyICpwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihpbnQgZGx0KTsKLWludCBwY2FwX3NuYXBzaG90KHBjYXBfdCAqcCkKLWludCBwY2FwX2lzX3N3YXBwZWQocGNhcF90ICpwKQotaW50IHBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKnApCi1pbnQgcGNhcF9taW5vcl92ZXJzaW9uKHBjYXBfdCAqcCkKLWludCBwY2FwX3N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCi1GSUxFICpwY2FwX2ZpbGUocGNhcF90ICpwKQotaW50IHBjYXBfZmlsZW5vKHBjYXBfdCAqcCkKLWludCBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkKHBjYXBfdCAqcCk7Ci12b2lkIHBjYXBfcGVycm9yKHBjYXBfdCAqcCwgY2hhciAqcHJlZml4KQotY2hhciAqcGNhcF9nZXRlcnIocGNhcF90ICpwKQotY29uc3QgY2hhciAqcGNhcF9zdHJlcnJvcihpbnQgZXJyb3IpCi1jb25zdCBjaGFyICpwY2FwX2xpYl92ZXJzaW9uKHZvaWQpCi0uZnQKLS5MUAotLmZ0IEIKLXZvaWQgcGNhcF9jbG9zZShwY2FwX3QgKnApCi1pbnQgcGNhcF9kdW1wX2ZsdXNoKHBjYXBfZHVtcGVyX3QgKnApCi1sb25nIHBjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICpwKQotRklMRSAqcGNhcF9kdW1wX2ZpbGUocGNhcF9kdW1wZXJfdCAqcCkKLXZvaWQgcGNhcF9kdW1wX2Nsb3NlKHBjYXBfZHVtcGVyX3QgKnApCi0uZnQKLS5maQotLlNIIERFU0NSSVBUSU9OCi1UaGUgUGFja2V0IENhcHR1cmUgbGlicmFyeQotcHJvdmlkZXMgYSBoaWdoIGxldmVsIGludGVyZmFjZSB0byBwYWNrZXQgY2FwdHVyZSBzeXN0ZW1zLiBBbGwgcGFja2V0cwotb24gdGhlIG5ldHdvcmssIGV2ZW4gdGhvc2UgZGVzdGluZWQgZm9yIG90aGVyIGhvc3RzLCBhcmUgYWNjZXNzaWJsZQotdGhyb3VnaCB0aGlzIG1lY2hhbmlzbS4KLS5QUAotLlNIIFJPVVRJTkVTCi1OT1RFOgotLkkgZXJyYnVmCi1pbgotLkJSIHBjYXBfb3Blbl9saXZlKCkgLAotLkJSIHBjYXBfb3Blbl9kZWFkKCkgLAotLkJSIHBjYXBfb3Blbl9vZmZsaW5lKCkgLAotLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSgpICwKLS5CUiBwY2FwX3NldG5vbmJsb2NrKCkgLAotLkJSIHBjYXBfZ2V0bm9uYmxvY2soKSAsCi0uQlIgcGNhcF9maW5kYWxsZGV2cygpICwKLS5CUiBwY2FwX2xvb2t1cGRldigpICwKLWFuZAotLkIgcGNhcF9sb29rdXBuZXQoKQotaXMgYXNzdW1lZCB0byBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QKLS5CIFBDQVBfRVJSQlVGX1NJWkUKLWNoYXJzLgotLlBQCi0uQiBwY2FwX29wZW5fbGl2ZSgpCi1pcyB1c2VkIHRvIG9idGFpbiBhIHBhY2tldCBjYXB0dXJlIGRlc2NyaXB0b3IgdG8gbG9vawotYXQgcGFja2V0cyBvbiB0aGUgbmV0d29yay4KLS5JIGRldmljZQotaXMgYSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIG5ldHdvcmsgZGV2aWNlIHRvIG9wZW47IG9uIExpbnV4IHN5c3RlbXMKLXdpdGggMi4yIG9yIGxhdGVyIGtlcm5lbHMsIGEKLS5JIGRldmljZQotYXJndW1lbnQgb2YgImFueSIgb3IKLS5CIE5VTEwKLWNhbiBiZSB1c2VkIHRvIGNhcHR1cmUgcGFja2V0cyBmcm9tIGFsbCBpbnRlcmZhY2VzLgotLkkgc25hcGxlbgotc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlLiAgSWYgdGhpcyB2YWx1ZSBpcyBsZXNzCi10aGFuIHRoZSBzaXplIG9mIGEgcGFja2V0IHRoYXQgaXMgY2FwdHVyZWQsIG9ubHkgdGhlIGZpcnN0Ci0uSSBzbmFwbGVuCi1ieXRlcyBvZiB0aGF0IHBhY2tldCB3aWxsIGJlIGNhcHR1cmVkIGFuZCBwcm92aWRlZCBhcyBwYWNrZXQgZGF0YS4gIEEKLXZhbHVlIG9mIDY1NTM1IHNob3VsZCBiZSBzdWZmaWNpZW50LCBvbiBtb3N0IGlmIG5vdCBhbGwgbmV0d29ya3MsIHRvCi1jYXB0dXJlIGFsbCB0aGUgZGF0YSBhdmFpbGFibGUgZnJvbSB0aGUgcGFja2V0LgotLkkgcHJvbWlzYwotc3BlY2lmaWVzIGlmIHRoZSBpbnRlcmZhY2UgaXMgdG8gYmUgcHV0IGludG8gcHJvbWlzY3VvdXMgbW9kZS4KLShOb3RlIHRoYXQgZXZlbiBpZiB0aGlzIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlIGludGVyZmFjZQotY291bGQgd2VsbCBiZSBpbiBwcm9taXNjdW91cyBtb2RlIGZvciBzb21lIG90aGVyIHJlYXNvbi4pICBGb3Igbm93LCB0aGlzCi1kb2Vzbid0IHdvcmsgb24gdGhlICJhbnkiIGRldmljZTsgaWYgYW4gYXJndW1lbnQgb2YgImFueSIgb3IgTlVMTCBpcwotc3VwcGxpZWQsIHRoZQotLkkgcHJvbWlzYwotZmxhZyBpcyBpZ25vcmVkLgotLkkgdG9fbXMKLXNwZWNpZmllcyB0aGUgcmVhZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gIFRoZSByZWFkIHRpbWVvdXQgaXMgdXNlZCB0bwotYXJyYW5nZSB0aGF0IHRoZSByZWFkIG5vdCBuZWNlc3NhcmlseSByZXR1cm4gaW1tZWRpYXRlbHkgd2hlbiBhIHBhY2tldAotaXMgc2VlbiwgYnV0IHRoYXQgaXQgd2FpdCBmb3Igc29tZSBhbW91bnQgb2YgdGltZSB0byBhbGxvdyBtb3JlIHBhY2tldHMKLXRvIGFycml2ZSBhbmQgdG8gcmVhZCBtdWx0aXBsZSBwYWNrZXRzIGZyb20gdGhlIE9TIGtlcm5lbCBpbiBvbmUKLW9wZXJhdGlvbi4gIE5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgYSByZWFkIHRpbWVvdXQ7IG9uIHBsYXRmb3JtcyB0aGF0Ci1kb24ndCwgdGhlIHJlYWQgdGltZW91dCBpcyBpZ25vcmVkLiAgQSB6ZXJvIHZhbHVlIGZvcgotLklSIHRvX21zICwKLW9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgYSByZWFkIHRpbWVvdXQsCi13aWxsIGNhdXNlIGEgcmVhZCB0byB3YWl0IGZvcmV2ZXIgdG8gYWxsb3cgZW5vdWdoIHBhY2tldHMgdG8KLWFycml2ZSwgd2l0aCBubyB0aW1lb3V0LgotLkkgZXJyYnVmCi1pcyB1c2VkIHRvIHJldHVybiBlcnJvciBvciB3YXJuaW5nIHRleHQuICBJdCB3aWxsIGJlIHNldCB0byBlcnJvciB0ZXh0IHdoZW4KLS5CIHBjYXBfb3Blbl9saXZlKCkKLWZhaWxzIGFuZCByZXR1cm5zCi0uQlIgTlVMTCAuCi0uSSBlcnJidWYKLW1heSBhbHNvIGJlIHNldCB0byB3YXJuaW5nIHRleHQgd2hlbgotLkIgcGNhcF9vcGVuX2xpdmUoKQotc3VjY2VkczsgdG8gZGV0ZWN0IHRoaXMgY2FzZSB0aGUgY2FsbGVyIHNob3VsZCBzdG9yZSBhIHplcm8tbGVuZ3RoIHN0cmluZyBpbgotLkkgZXJyYnVmCi1iZWZvcmUgY2FsbGluZwotLkIgcGNhcF9vcGVuX2xpdmUoKQotYW5kIGRpc3BsYXkgdGhlIHdhcm5pbmcgdG8gdGhlIHVzZXIgaWYKLS5JIGVycmJ1ZgotaXMgbm8gbG9uZ2VyIGEgemVyby1sZW5ndGggc3RyaW5nLgotLlBQCi0uQiBwY2FwX29wZW5fZGVhZCgpCi1pcyB1c2VkIGZvciBjcmVhdGluZyBhCi0uQiBwY2FwX3QKLXN0cnVjdHVyZSB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgaW4gbGlicGNhcC4gIEl0IGlzCi10eXBpY2FsbHkgdXNlZCB3aGVuIGp1c3QgdXNpbmcgbGlicGNhcCBmb3IgY29tcGlsaW5nIEJQRiBjb2RlLgotLlBQCi0uQiBwY2FwX29wZW5fb2ZmbGluZSgpCi1pcyBjYWxsZWQgdG8gb3BlbiBhIGBgc2F2ZWZpbGUnJyBmb3IgcmVhZGluZy4KLS5JIGZuYW1lCi1zcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3Blbi4gVGhlIGZpbGUgaGFzCi10aGUgc2FtZSBmb3JtYXQgYXMgdGhvc2UgdXNlZCBieQotLkIgdGNwZHVtcCgxKQotYW5kCi0uQlIgdGNwc2xpY2UoMSkgLgotVGhlIG5hbWUgIi0iIGluIGEgc3lub255bSBmb3IKLS5CUiBzdGRpbiAuCi1BbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNhbGwKLS5CIHBjYXBfZm9wZW5fb2ZmbGluZSgpCi10byByZWFkIGR1bXBlZCBkYXRhIGZyb20gYW4gZXhpc3Rpbmcgb3BlbiBzdHJlYW0KLS5JUiBmcCAuCi1Ob3RlIHRoYXQgb24gV2luZG93cywgdGhhdCBzdHJlYW0gc2hvdWxkIGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KLS5JIGVycmJ1ZgotaXMgdXNlZCB0byByZXR1cm4gZXJyb3IgdGV4dCBhbmQgaXMgb25seSBzZXQgd2hlbgotLkIgcGNhcF9vcGVuX29mZmxpbmUoKQotb3IKLS5CIHBjYXBfZm9wZW5fb2ZmbGluZSgpCi1mYWlscyBhbmQgcmV0dXJucwotLkJSIE5VTEwgLgotLlBQCi0uQiBwY2FwX2R1bXBfb3BlbigpCi1pcyBjYWxsZWQgdG8gb3BlbiBhIGBgc2F2ZWZpbGUnJyBmb3Igd3JpdGluZy4gVGhlIG5hbWUgIi0iIGluIGEgc3lub255bQotZm9yCi0uQlIgc3Rkb3V0IC4KLS5CIE5VTEwKLWlzIHJldHVybmVkIG9uIGZhaWx1cmUuCi0uSSBwCi1pcyBhCi0uSSBwY2FwCi1zdHJ1Y3QgYXMgcmV0dXJuZWQgYnkKLS5CIHBjYXBfb3Blbl9vZmZsaW5lKCkKLW9yCi0uQlIgcGNhcF9vcGVuX2xpdmUoKSAuCi0uSSBmbmFtZQotc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW4uIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY2FsbAotLkIgcGNhcF9kdW1wX2ZvcGVuKCkKLXRvIHdyaXRlIGRhdGEgdG8gYW4gZXhpc3Rpbmcgb3BlbiBzdHJlYW0KLS5JUiBmcCAuCi1Ob3RlIHRoYXQgb24gV2luZG93cywgdGhhdCBzdHJlYW0gc2hvdWxkIGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KLUlmCi0uQiBOVUxMCi1pcyByZXR1cm5lZCwKLS5CIHBjYXBfZ2V0ZXJyKCkKLWNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZXJyb3IgdGV4dC4KLS5QUAotLlBQCi0uQiBwY2FwX3NldG5vbmJsb2NrKCkKLXB1dHMgYSBjYXB0dXJlIGRlc2NyaXB0b3IsIG9wZW5lZCB3aXRoCi0uQlIgcGNhcF9vcGVuX2xpdmUoKSAsCi1pbnRvIGBgbm9uLWJsb2NraW5nJycgbW9kZSwgb3IgdGFrZXMgaXQgb3V0IG9mIGBgbm9uLWJsb2NraW5nJycgbW9kZSwKLWRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQotLkkgbm9uYmxvY2sKLWFyZ3VtZW50IGlzIG5vbi16ZXJvIG9yIHplcm8uICBJdCBoYXMgbm8gZWZmZWN0IG9uIGBgc2F2ZWZpbGVzJycuCi1JZiB0aGVyZSBpcyBhbiBlcnJvciwgXC0xIGlzIHJldHVybmVkIGFuZAotLkkgZXJyYnVmCi1pcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlOyBvdGhlcndpc2UsIDAgaXMKLXJldHVybmVkLgotSW4KLWBgbm9uLWJsb2NraW5nJycgbW9kZSwgYW4gYXR0ZW1wdCB0byByZWFkIGZyb20gdGhlIGNhcHR1cmUgZGVzY3JpcHRvcgotd2l0aAotLkIgcGNhcF9kaXNwYXRjaCgpCi13aWxsLCBpZiBubyBwYWNrZXRzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIHRvIGJlIHJlYWQsIHJldHVybiAwCi1pbW1lZGlhdGVseSByYXRoZXIgdGhhbiBibG9ja2luZyB3YWl0aW5nIGZvciBwYWNrZXRzIHRvIGFycml2ZS4KLS5CIHBjYXBfbG9vcCgpCi1hbmQKLS5CIHBjYXBfbmV4dCgpCi13aWxsIG5vdCB3b3JrIGluIGBgbm9uLWJsb2NraW5nJycgbW9kZS4KLS5QUAotLkIgcGNhcF9nZXRub25ibG9jaygpCi1yZXR1cm5zIHRoZSBjdXJyZW50IGBgbm9uLWJsb2NraW5nJycgc3RhdGUgb2YgdGhlIGNhcHR1cmUgZGVzY3JpcHRvcjsgaXQKLWFsd2F5cyByZXR1cm5zIDAgb24gYGBzYXZlZmlsZXMnJy4KLUlmIHRoZXJlIGlzIGFuIGVycm9yLCBcLTEgaXMgcmV0dXJuZWQgYW5kCi0uSSBlcnJidWYKLWlzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCi0uUFAKLS5CIHBjYXBfZmluZGFsbGRldnMoKQotY29uc3RydWN0cyBhIGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCB3aXRoCi0uQlIgcGNhcF9vcGVuX2xpdmUoKSAuCi0oTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBuZXR3b3JrIGRldmljZXMgdGhhdCBjYW5ub3QgYmUgb3BlbmVkIHdpdGgKLS5CUiBwY2FwX29wZW5fbGl2ZSgpCi1ieSB0aGUKLXByb2Nlc3MgY2FsbGluZwotLkJSIHBjYXBfZmluZGFsbGRldnMoKSAsCi1iZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhhdCBwcm9jZXNzIG1pZ2h0IG5vdCBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlcwotdG8gb3BlbiB0aGVtIGZvciBjYXB0dXJpbmc7IGlmIHNvLCB0aG9zZSBkZXZpY2VzIHdpbGwgbm90IGFwcGVhciBvbiB0aGUKLWxpc3QuKQotLkkgYWxsZGV2c3AKLWlzIHNldCB0byBwb2ludCB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdDsgZWFjaCBlbGVtZW50IG9mIHRoZQotbGlzdCBpcyBvZiB0eXBlCi0uQlIgcGNhcF9pZl90ICwKLWFuZCBoYXMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgotLlJTCi0uVFAKLS5CIG5leHQKLWlmIG5vdAotLkJSIE5VTEwgLAotYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3Q7Ci0uQiBOVUxMCi1mb3IgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdAotLlRQCi0uQiBuYW1lCi1hIHBvaW50ZXIgdG8gYSBzdHJpbmcgZ2l2aW5nIGEgbmFtZSBmb3IgdGhlIGRldmljZSB0byBwYXNzIHRvCi0uQiBwY2FwX29wZW5fbGl2ZSgpCi0uVFAKLS5CIGRlc2NyaXB0aW9uCi1pZiBub3QKLS5CUiBOVUxMICwKLWEgcG9pbnRlciB0byBhIHN0cmluZyBnaXZpbmcgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGV2aWNlCi0uVFAKLS5CIGFkZHJlc3NlcwotYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgbGlzdCBvZiBhZGRyZXNzZXMgZm9yIHRoZSBpbnRlcmZhY2UKLS5UUAotLkIgZmxhZ3MKLWludGVyZmFjZSBmbGFnczoKLS5SUwotLlRQCi0uQiBQQ0FQX0lGX0xPT1BCQUNLCi1zZXQgaWYgdGhlIGludGVyZmFjZSBpcyBhIGxvb3BiYWNrIGludGVyZmFjZQotLlJFCi0uUkUKLS5QUAotRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBpcyBvZiB0eXBlCi0uQlIgcGNhcF9hZGRyX3QgLAotYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6Ci0uUlMKLS5UUAotLkIgbmV4dAotaWYgbm90Ci0uQlIgTlVMTCAsCi1hIHBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdDsKLS5CIE5VTEwKLWZvciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsaXN0Ci0uVFAKLS5CIGFkZHIKLWEgcG9pbnRlciB0byBhCi0uQiAic3RydWN0IHNvY2thZGRyIgotY29udGFpbmluZyBhbiBhZGRyZXNzCi0uVFAKLS5CIG5ldG1hc2sKLWlmIG5vdAotLkJSIE5VTEwgLAotYSBwb2ludGVyIHRvIGEKLS5CICJzdHJ1Y3Qgc29ja2FkZHIiCi10aGF0IGNvbnRhaW5zIHRoZSBuZXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgcG9pbnRlZCB0byBieQotLkIgYWRkcgotLlRQCi0uQiBicm9hZGFkZHIKLWlmIG5vdAotLkJSIE5VTEwgLAotYSBwb2ludGVyIHRvIGEKLS5CICJzdHJ1Y3Qgc29ja2FkZHIiCi10aGF0IGNvbnRhaW5zIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhZGRyZXNzIHBvaW50ZWQKLXRvIGJ5Ci0uQlIgYWRkciA7Ci1tYXkgYmUgbnVsbCBpZiB0aGUgaW50ZXJmYWNlIGRvZXNuJ3Qgc3VwcG9ydCBicm9hZGNhc3RzCi0uVFAKLS5CIGRzdGFkZHIKLWlmIG5vdAotLkJSIE5VTEwgLAotYSBwb2ludGVyIHRvIGEKLS5CICJzdHJ1Y3Qgc29ja2FkZHIiCi10aGF0IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgcG9pbnRlZAotdG8gYnkKLS5CUiBhZGRyIDsKLW1heSBiZSBudWxsIGlmIHRoZSBpbnRlcmZhY2UgaXNuJ3QgYSBwb2ludC10by1wb2ludCBpbnRlcmZhY2UKLS5SRQotLlBQCi1Ob3RlIHRoYXQgbm90IGFsbCB0aGUgYWRkcmVzc2VzIGluIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBhcmUKLW5lY2Vzc2FyaWx5IElQdjQgb3IgSVB2NiBhZGRyZXNzZXMgLSB5b3UgbXVzdCBjaGVjayB0aGUKLS5CIHNhX2ZhbWlseQotbWVtYmVyIG9mIHRoZQotLkIgInN0cnVjdCBzb2NrYWRkciIKLWJlZm9yZSBpbnRlcnByZXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhZGRyZXNzLgotLlBQCi0uQiBcLTEKLWlzIHJldHVybmVkIG9uIGZhaWx1cmUsIGluIHdoaWNoIGNhc2UKLS5CIGVycmJ1ZgotaXMgZmlsbGVkIGluIHdpdGggYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZTsKLS5CIDAKLWlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuCi0uUFAKLS5CIHBjYXBfZnJlZWFsbGRldnMoKQotaXMgdXNlZCB0byBmcmVlIGEgbGlzdCBhbGxvY2F0ZWQgYnkKLS5CUiBwY2FwX2ZpbmRhbGxkZXZzKCkgLgotLlBQCi0uQiBwY2FwX2xvb2t1cGRldigpCi1yZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldHdvcmsgZGV2aWNlIHN1aXRhYmxlIGZvciB1c2Ugd2l0aAotLkIgcGNhcF9vcGVuX2xpdmUoKQotYW5kCi0uQlIgcGNhcF9sb29rdXBuZXQoKSAuCi1JZiB0aGVyZSBpcyBhbiBlcnJvciwKLS5CIE5VTEwKLWlzIHJldHVybmVkIGFuZAotLkkgZXJyYnVmCi1pcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgotLlBQCi0uQiBwY2FwX2xvb2t1cG5ldCgpCi1pcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbmV0d29yayBudW1iZXIgYW5kIG1hc2sKLWFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yayBkZXZpY2UKLS5CUiBkZXZpY2UgLgotQm90aAotLkkgbmV0cAotYW5kCi0uSSBtYXNrcAotYXJlCi0uSSBicGZfdV9pbnQzMgotcG9pbnRlcnMuCi1BIHJldHVybiBvZiBcLTEgaW5kaWNhdGVzIGFuIGVycm9yIGluIHdoaWNoIGNhc2UKLS5JIGVycmJ1ZgotaXMgZmlsbGVkIGluIHdpdGggYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS4KLS5QUAotLkIgcGNhcF9kaXNwYXRjaCgpCi1pcyB1c2VkIHRvIGNvbGxlY3QgYW5kIHByb2Nlc3MgcGFja2V0cy4KLS5JIGNudAotc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIHByb2Nlc3MgYmVmb3JlIHJldHVybmluZy4KLVRoaXMgaXMgbm90IGEgbWluaW11bSBudW1iZXI7IHdoZW4gcmVhZGluZyBhIGxpdmUgY2FwdHVyZSwgb25seSBvbmUKLWJ1ZmZlcmZ1bCBvZiBwYWNrZXRzIGlzIHJlYWQgYXQgYSB0aW1lLCBzbyBmZXdlciB0aGFuCi0uSSBjbnQKLXBhY2tldHMgbWF5IGJlIHByb2Nlc3NlZC4gQQotLkkgY250Ci1vZiBcLTEgcHJvY2Vzc2VzIGFsbCB0aGUgcGFja2V0cyByZWNlaXZlZCBpbiBvbmUgYnVmZmVyIHdoZW4gcmVhZGluZyBhCi1saXZlIGNhcHR1cmUsIG9yIGFsbCB0aGUgcGFja2V0cyBpbiB0aGUgZmlsZSB3aGVuIHJlYWRpbmcgYQotYGBzYXZlZmlsZScnLgotLkkgY2FsbGJhY2sKLXNwZWNpZmllcyBhIHJvdXRpbmUgdG8gYmUgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOgotYQotLkkgdV9jaGFyCi1wb2ludGVyIHdoaWNoIGlzIHBhc3NlZCBpbiBmcm9tCi0uQlIgcGNhcF9kaXNwYXRjaCgpICwKLWEKLS5JIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkcgotcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aXRoIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKLS5SUwotLlRQCi0uQiB0cwotYQotLkkgc3RydWN0IHRpbWV2YWwKLWNvbnRhaW5pbmcgdGhlIHRpbWUgd2hlbiB0aGUgcGFja2V0IHdhcyBjYXB0dXJlZAotLlRQCi0uQiBjYXBsZW4KLWEKLS5JIGJwZl91X2ludDMyCi1naXZpbmcgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgcGFja2V0IHRoYXQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZQotY2FwdHVyZQotLlRQCi0uQiBsZW4KLWEKLS5JIGJwZl91X2ludDMyCi1naXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0LCBpbiBieXRlcyAod2hpY2ggbWlnaHQgYmUgbW9yZSB0aGFuIHRoZQotbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmcm9tIHRoZSBjYXB0dXJlLCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQKLWlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlKQotLlJFCi0uUFAKLWFuZCBhCi0uSSBjb25zdCB1X2NoYXIKLXBvaW50ZXIgdG8gdGhlIGZpcnN0Ci0uQiBjYXBsZW4KLShhcyBnaXZlbiBpbiB0aGUKLS5JIHN0cnVjdCBwY2FwX3BrdGhkcgotYSBwb2ludGVyIHRvIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgcm91dGluZSkKLWJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgcGFja2V0ICh3aGljaCB3b24ndCBuZWNlc3NhcmlseSBiZSB0aGUgZW50aXJlCi1wYWNrZXQ7IHRvIGNhcHR1cmUgdGhlIGVudGlyZSBwYWNrZXQsIHlvdSB3aWxsIGhhdmUgdG8gcHJvdmlkZSBhIHZhbHVlCi1mb3IKLS5JIHNuYXBsZW4KLWluIHlvdXIgY2FsbCB0bwotLkIgcGNhcF9vcGVuX2xpdmUoKQotdGhhdCBpcyBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gZ2V0IGFsbCBvZiB0aGUgcGFja2V0J3MgZGF0YSAtIGEgdmFsdWUgb2YKLTY1NTM1IHNob3VsZCBiZSBzdWZmaWNpZW50IG9uIG1vc3QgaWYgbm90IGFsbCBuZXR3b3JrcykuCi0uUFAKLVRoZSBudW1iZXIgb2YgcGFja2V0cyByZWFkIGlzIHJldHVybmVkLgotMCBpcyByZXR1cm5lZCBpZiBubyBwYWNrZXRzIHdlcmUgcmVhZCBmcm9tIGEgbGl2ZSBjYXB0dXJlIChpZiwgZm9yCi1leGFtcGxlLCB0aGV5IHdlcmUgZGlzY2FyZGVkIGJlY2F1c2UgdGhleSBkaWRuJ3QgcGFzcyB0aGUgcGFja2V0IGZpbHRlciwKLW9yIGlmLCBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGEgcmVhZCB0aW1lb3V0IHRoYXQgc3RhcnRzIGJlZm9yZSBhbnkKLXBhY2tldHMgYXJyaXZlLCB0aGUgdGltZW91dCBleHBpcmVzIGJlZm9yZSBhbnkgcGFja2V0cyBhcnJpdmUsIG9yIGlmIHRoZQotZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgY2FwdHVyZSBkZXZpY2UgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vCi1wYWNrZXRzIHdlcmUgYXZhaWxhYmxlIHRvIGJlIHJlYWQpIG9yIGlmIG5vIG1vcmUgcGFja2V0cyBhcmUgYXZhaWxhYmxlCi1pbiBhIGBgc2F2ZWZpbGUuJycgQSByZXR1cm4gb2YgXC0xIGluZGljYXRlcwotYW4gZXJyb3IgaW4gd2hpY2ggY2FzZQotLkIgcGNhcF9wZXJyb3IoKQotb3IKLS5CIHBjYXBfZ2V0ZXJyKCkKLW1heSBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCi1BIHJldHVybiBvZiBcLTIgaW5kaWNhdGVzIHRoYXQgdGhlIGxvb3AgdGVybWluYXRlZCBkdWUgdG8gYSBjYWxsIHRvCi0uQiBwY2FwX2JyZWFrbG9vcCgpCi1iZWZvcmUgYW55IHBhY2tldHMgd2VyZSBwcm9jZXNzZWQuCi0uZnQgQgotSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHBjYXBfYnJlYWtsb29wKCksCi1tYWtlIHN1cmUgdGhhdCB5b3UgZXhwbGljaXRseSBjaGVjayBmb3IgXC0xIGFuZCBcLTIsIHJhdGhlciB0aGFuIGp1c3QKLWNoZWNraW5nIGZvciBhIHJldHVybiB2YWx1ZSA8IDAuCi0uZnQgUgotLlBQCi0uQlIgTk9URSA6Ci13aGVuIHJlYWRpbmcgYSBsaXZlIGNhcHR1cmUsCi0uQiBwY2FwX2Rpc3BhdGNoKCkKLXdpbGwgbm90IG5lY2Vzc2FyaWx5IHJldHVybiB3aGVuIHRoZSByZWFkIHRpbWVzIG91dDsgb24gc29tZSBwbGF0Zm9ybXMsCi10aGUgcmVhZCB0aW1lb3V0IGlzbid0IHN1cHBvcnRlZCwgYW5kLCBvbiBvdGhlciBwbGF0Zm9ybXMsIHRoZSB0aW1lcgotZG9lc24ndCBzdGFydCB1bnRpbCBhdCBsZWFzdCBvbmUgcGFja2V0IGFycml2ZXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlCi1yZWFkIHRpbWVvdXQgc2hvdWxkCi0uQiBOT1QKLWJlIHVzZWQgaW4sIGZvciBleGFtcGxlLCBhbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbiwgdG8gYWxsb3cgdGhlIHBhY2tldAotY2FwdHVyZSBsb29wIHRvIGBgcG9sbCcnIGZvciB1c2VyIGlucHV0IHBlcmlvZGljYWxseSwgYXMgdGhlcmUncyBubwotZ3VhcmFudGVlIHRoYXQKLS5CIHBjYXBfZGlzcGF0Y2goKQotd2lsbCByZXR1cm4gYWZ0ZXIgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLS5QUAotLkIgcGNhcF9sb29wKCkKLWlzIHNpbWlsYXIgdG8KLS5CIHBjYXBfZGlzcGF0Y2goKQotZXhjZXB0IGl0IGtlZXBzIHJlYWRpbmcgcGFja2V0cyB1bnRpbAotLkkgY250Ci1wYWNrZXRzIGFyZSBwcm9jZXNzZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgotSXQgZG9lcwotLkIgbm90Ci1yZXR1cm4gd2hlbiBsaXZlIHJlYWQgdGltZW91dHMgb2NjdXIuCi1SYXRoZXIsIHNwZWNpZnlpbmcgYSBub24temVybyByZWFkIHRpbWVvdXQgdG8KLS5CIHBjYXBfb3Blbl9saXZlKCkKLWFuZCB0aGVuIGNhbGxpbmcKLS5CIHBjYXBfZGlzcGF0Y2goKQotYWxsb3dzIHRoZSByZWNlcHRpb24gYW5kIHByb2Nlc3Npbmcgb2YgYW55IHBhY2tldHMgdGhhdCBhcnJpdmUgd2hlbiB0aGUKLXRpbWVvdXQgb2NjdXJzLgotQSBuZWdhdGl2ZQotLkkgY250Ci1jYXVzZXMKLS5CIHBjYXBfbG9vcCgpCi10byBsb29wIGZvcmV2ZXIgKG9yIGF0IGxlYXN0IHVudGlsIGFuIGVycm9yIG9jY3VycykuICBcLTEgaXMgcmV0dXJuZWQgb24KLWFuIGVycm9yOyAwIGlzIHJldHVybmVkIGlmCi0uSSBjbnQKLWlzIGV4aGF1c3RlZDsgXC0yIGlzIHJldHVybmVkIGlmIHRoZSBsb29wIHRlcm1pbmF0ZWQgZHVlIHRvIGEgY2FsbCB0bwotLkIgcGNhcF9icmVha2xvb3AoKQotYmVmb3JlIGFueSBwYWNrZXRzIHdlcmUgcHJvY2Vzc2VkLgotLmZ0IEIKLUlmIHlvdXIgYXBwbGljYXRpb24gdXNlcyBwY2FwX2JyZWFrbG9vcCgpLAotbWFrZSBzdXJlIHRoYXQgeW91IGV4cGxpY2l0bHkgY2hlY2sgZm9yIFwtMSBhbmQgXC0yLCByYXRoZXIgdGhhbiBqdXN0Ci1jaGVja2luZyBmb3IgYSByZXR1cm4gdmFsdWUgPCAwLgotLmZ0IFIKLS5QUAotLkIgcGNhcF9uZXh0KCkKLXJlYWRzIHRoZSBuZXh0IHBhY2tldCAoYnkgY2FsbGluZwotLkIgcGNhcF9kaXNwYXRjaCgpCi13aXRoIGEKLS5JIGNudAotb2YgMSkgYW5kIHJldHVybnMgYQotLkkgdV9jaGFyCi1wb2ludGVyIHRvIHRoZSBkYXRhIGluIHRoYXQgcGFja2V0LiAgKFRoZQotLkkgcGNhcF9wa3RoZHIKLXN0cnVjdCBmb3IgdGhhdCBwYWNrZXQgaXMgbm90IHN1cHBsaWVkLikKLS5CIE5VTEwKLWlzIHJldHVybmVkIGlmIGFuIGVycm9yIG9jY3VyZWQsIG9yIGlmIG5vIHBhY2tldHMgd2VyZSByZWFkIGZyb20gYSBsaXZlCi1jYXB0dXJlIChpZiwgZm9yIGV4YW1wbGUsIHRoZXkgd2VyZSBkaXNjYXJkZWQgYmVjYXVzZSB0aGV5IGRpZG4ndCBwYXNzCi10aGUgcGFja2V0IGZpbHRlciwgb3IgaWYsIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgYSByZWFkIHRpbWVvdXQgdGhhdAotc3RhcnRzIGJlZm9yZSBhbnkgcGFja2V0cyBhcnJpdmUsIHRoZSB0aW1lb3V0IGV4cGlyZXMgYmVmb3JlIGFueSBwYWNrZXRzCi1hcnJpdmUsIG9yIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjYXB0dXJlIGRldmljZSBpcyBpbgotbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIHBhY2tldHMgd2VyZSBhdmFpbGFibGUgdG8gYmUgcmVhZCksIG9yIGlmIG5vCi1tb3JlIHBhY2tldHMgYXJlIGF2YWlsYWJsZSBpbiBhIGBgc2F2ZWZpbGUuJycgIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzCi1ubyB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJlZCBvciBub3QuCi0uUFAKLS5CIHBjYXBfbmV4dF9leCgpCi1yZWFkcyB0aGUgbmV4dCBwYWNrZXQgYW5kIHJldHVybnMgYSBzdWNjZXNzL2ZhaWx1cmUgaW5kaWNhdGlvbjoKLS5SUwotLlRQCi0xCi10aGUgcGFja2V0IHdhcyByZWFkIHdpdGhvdXQgcHJvYmxlbXMKLS5UUAotMAotcGFja2V0cyBhcmUgYmVpbmcgcmVhZCBmcm9tIGEgbGl2ZSBjYXB0dXJlLCBhbmQgdGhlIHRpbWVvdXQgZXhwaXJlZAotLlRQCi1cLTEKLWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIHBhY2tldAotLlRQCi1cLTIKLXBhY2tldHMgYXJlIGJlaW5nIHJlYWQgZnJvbSBhIGBgc2F2ZWZpbGUnJywgYW5kIHRoZXJlIGFyZSBubyBtb3JlCi1wYWNrZXRzIHRvIHJlYWQgZnJvbSB0aGUgc2F2ZWZpbGUuCi0uUkUKLS5QUAotSWYgdGhlIHBhY2tldCB3YXMgcmVhZCB3aXRob3V0IHByb2JsZW1zLCB0aGUgcG9pbnRlciBwb2ludGVkIHRvIGJ5IHRoZQotLkkgcGt0X2hlYWRlcgotYXJndW1lbnQgaXMgc2V0IHRvIHBvaW50IHRvIHRoZQotLkkgcGNhcF9wa3RoZHIKLXN0cnVjdCBmb3IgdGhlIHBhY2tldCwgYW5kIHRoZQotcG9pbnRlciBwb2ludGVkIHRvIGJ5IHRoZQotLkkgcGt0X2RhdGEKLWFyZ3VtZW50IGlzIHNldCB0byBwb2ludCB0byB0aGUgZGF0YSBpbiB0aGUgcGFja2V0LgotLlBQCi0uQiBwY2FwX2JyZWFrbG9vcCgpCi1zZXRzIGEgZmxhZyB0aGF0IHdpbGwgZm9yY2UKLS5CIHBjYXBfZGlzcGF0Y2goKQotb3IKLS5CIHBjYXBfbG9vcCgpCi10byByZXR1cm4gcmF0aGVyIHRoYW4gbG9vcGluZzsgdGhleSB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMKLXRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZCBzbyBmYXIsIG9yIFwtMiBpZiBubyBwYWNrZXRzIGhhdmUgYmVlbgotcHJvY2Vzc2VkIHNvIGZhci4KLS5QUAotVGhpcyByb3V0aW5lIGlzIHNhZmUgdG8gdXNlIGluc2lkZSBhIHNpZ25hbCBoYW5kbGVyIG9uIFVOSVggb3IgYSBjb25zb2xlCi1jb250cm9sIGhhbmRsZXIgb24gV2luZG93cywgYXMgaXQgbWVyZWx5IHNldHMgYSBmbGFnIHRoYXQgaXMgY2hlY2tlZAotd2l0aGluIHRoZSBsb29wLgotLlBQCi1UaGUgZmxhZyBpcyBjaGVja2VkIGluIGxvb3BzIHJlYWRpbmcgcGFja2V0cyBmcm9tIHRoZSBPUyAtIGEgc2lnbmFsIGJ5Ci1pdHNlbGYgd2lsbCBub3QgbmVjZXNzYXJpbHkgdGVybWluYXRlIHRob3NlIGxvb3BzIC0gYXMgd2VsbCBhcyBpbiBsb29wcwotcHJvY2Vzc2luZyBhIHNldCBvZiBwYWNrZXRzIHJldHVybmVkIGJ5IHRoZSBPUy4KLS5mdCBCCi1Ob3RlIHRoYXQgaWYgeW91IGFyZSBjYXRjaGluZyBzaWduYWxzIG9uIFVOSVggc3lzdGVtcyB0aGF0IHN1cHBvcnQKLXJlc3RhcnRpbmcgc3lzdGVtIGNhbGxzIGFmdGVyIGEgc2lnbmFsLCBhbmQgY2FsbGluZyBwY2FwX2JyZWFrbG9vcCgpCi1pbiB0aGUgc2lnbmFsIGhhbmRsZXIsIHlvdSBtdXN0IHNwZWNpZnksIHdoZW4gY2F0Y2hpbmcgdGhvc2Ugc2lnbmFscywKLXRoYXQgc3lzdGVtIGNhbGxzIHNob3VsZCBOT1QgYmUgcmVzdGFydGVkIGJ5IHRoYXQgc2lnbmFsLiAgT3RoZXJ3aXNlLAotaWYgdGhlIHNpZ25hbCBpbnRlcnJ1cHRlZCBhIGNhbGwgcmVhZGluZyBwYWNrZXRzIGluIGEgbGl2ZSBjYXB0dXJlLAotd2hlbiB5b3VyIHNpZ25hbCBoYW5kbGVyIHJldHVybnMgYWZ0ZXIgY2FsbGluZyBwY2FwX2JyZWFrbG9vcCgpLCB0aGUKLWNhbGwgd2lsbCBiZSByZXN0YXJ0ZWQsIGFuZCB0aGUgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUgdW50aWwgbW9yZQotcGFja2V0cyBhcnJpdmUgYW5kIHRoZSBjYWxsIGNvbXBsZXRlcy4KLS5QUAotTm90ZSBhbHNvIHRoYXQsIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIGlmIG9uZSB0aHJlYWQgaXMKLWJsb2NrZWQgaW4KLS5CUiBwY2FwX2Rpc3BhdGNoKCkgLAotLkJSIHBjYXBfbG9vcCgpICwKLS5CUiBwY2FwX25leHQoKSAsCi1vcgotLkJSIHBjYXBfbmV4dF9leCgpICwKLWEgY2FsbCB0bwotLkIgcGNhcF9icmVha2xvb3AoKQotaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHdpbGwgbm90IHVuYmxvY2sgdGhhdCB0aHJlYWQ7IHlvdSB3aWxsIG5lZWQgdG8gdXNlCi13aGF0ZXZlciBtZWNoYW5pc20gdGhlIE9TIHByb3ZpZGVzIGZvciBicmVha2luZyBhIHRocmVhZCBvdXQgb2YgYmxvY2tpbmcKLWNhbGxzIGluIG9yZGVyIHRvIHVuYmxvY2sgdGhlIHRocmVhZCwgc3VjaCBhcyB0aHJlYWQgY2FuY2VsbGF0aW9uIGluCi1zeXN0ZW1zIHRoYXQgc3VwcG9ydCBQT1NJWCB0aHJlYWRzLgotLmZ0IFIKLS5QUAotTm90ZSB0aGF0Ci0uQiBwY2FwX25leHQoKQotd2lsbCwgb24gc29tZSBwbGF0Zm9ybXMsIGxvb3AgcmVhZGluZyBwYWNrZXRzIGZyb20gdGhlIE9TOyB0aGF0IGxvb3AKLXdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwsIHNvCi0uQiBwY2FwX2JyZWFrbG9vcCgpCi1zaG91bGQgYmUgdXNlZCB0byB0ZXJtaW5hdGUgcGFja2V0IHByb2Nlc3NpbmcgZXZlbiBpZgotLkIgcGNhcF9uZXh0KCkKLWlzIGJlaW5nIHVzZWQuCi0uUFAKLS5CIHBjYXBfYnJlYWtsb29wKCkKLWRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IG5vIGZ1cnRoZXIgcGFja2V0cyB3aWxsIGJlIHByb2Nlc3NlZCBieQotLkIgcGNhcF9kaXNwYXRjaCgpCi1vcgotLkIgcGNhcF9sb29wKCkKLWFmdGVyIGl0IGlzIGNhbGxlZDsgYXQgbW9zdCBvbmUgbW9yZSBwYWNrZXQgbWlnaHQgYmUgcHJvY2Vzc2VkLgotLlBQCi1JZiBcLTIgaXMgcmV0dXJuZWQgZnJvbQotLkIgcGNhcF9kaXNwYXRjaCgpCi1vcgotLkJSIHBjYXBfbG9vcCgpICwKLXRoZSBmbGFnIGlzIGNsZWFyZWQsIHNvIGEgc3Vic2VxdWVudCBjYWxsIHdpbGwgcmVzdW1lIHJlYWRpbmcgcGFja2V0cy4gCi1JZiBhIHBvc2l0aXZlIG51bWJlciBpcyByZXR1cm5lZCwgdGhlIGZsYWcgaXMgbm90IGNsZWFyZWQsIHNvIGEKLXN1YnNlcXVlbnQgY2FsbCB3aWxsIHJldHVybiBcLTIgYW5kIGNsZWFyIHRoZSBmbGFnLgotLlBQCi0uQiBwY2FwX2luamVjdCgpCi1zZW5kcyBhIHJhdyBwYWNrZXQgdGhyb3VnaCB0aGUgbmV0d29yayBpbnRlcmZhY2U7Ci0uSSBidWYKLXBvaW50cyB0byB0aGUgZGF0YSBvZiB0aGUgcGFja2V0LCBpbmNsdWRpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLCBhbmQKLS5JIHNpemUKLWlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHBhY2tldC4KLUl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3MuICBBIHJldHVybiBvZiBcLTEKLWluZGljYXRlcyBhbiBlcnJvciBpbiB3aGljaCBjYXNlCi0uQiBwY2FwX3BlcnJvcigpCi1vcgotLkIgcGNhcF9nZXRlcnIoKQotbWF5IGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KLU5vdGUgdGhhdCwgZXZlbiBpZiB5b3Ugc3VjY2Vzc2Z1bGx5IG9wZW4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLCB5b3UKLW1pZ2h0IG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gc2VuZCBwYWNrZXRzIG9uIGl0LCBvciBpdCBtaWdodCBub3Qgc3VwcG9ydAotc2VuZGluZyBwYWNrZXRzOyBhcwotLkkgcGNhcF9vcGVuX2xpdmUoKQotZG9lc24ndCBoYXZlIGEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIG9wZW4gZm9yIGNhcHR1cmluZywgc2VuZGluZywKLW9yIGNhcHR1cmluZyBhbmQgc2VuZGluZywgeW91IGNhbm5vdCByZXF1ZXN0IGFuIG9wZW4gdGhhdCBzdXBwb3J0cwotc2VuZGluZyBhbmQgYmUgbm90aWZpZWQgYXQgb3BlbiB0aW1lIHdoZXRoZXIgc2VuZGluZyB3aWxsIGJlIHBvc3NpYmxlLgotTm90ZSBhbHNvIHRoYXQgc29tZSBkZXZpY2VzIG1pZ2h0IG5vdCBzdXBwb3J0IHNlbmRpbmcgcGFja2V0cy4KLS5QUAotTm90ZSB0aGF0LCBvbiBzb21lIHBsYXRmb3JtcywgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIG9mIHRoZSBwYWNrZXQgdGhhdCdzCi1zZW50IG1pZ2h0IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbGluay1sYXllciBoZWFkZXIgb2YgdGhlIHBhY2tldAotc3VwcGxpZWQgdG8KLS5CUiBwY2FwX2luamVjdCgpICwKLWFzIHRoZSBzb3VyY2UgbGluay1sYXllciBhZGRyZXNzLCBpZiB0aGUgaGVhZGVyIGNvbnRhaW5zIHN1Y2ggYW4KLWFkZHJlc3MsIG1pZ2h0IGJlIGNoYW5nZWQgdG8gYmUgdGhlIGFkZHJlc3MgYXNzaWduZWQgdG8gdGhlIGludGVyZmFjZSBvbgotd2hpY2ggdGhlIHBhY2tldCBpdCBzZW50LCBpZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcKLWNvbXBsZXRlbHkgcmF3IGFuZCB1bmNoYW5nZWQgcGFja2V0cy4gIEV2ZW4gd29yc2UsIHNvbWUgZHJpdmVycyBvbiBzb21lCi1wbGF0Zm9ybXMgbWlnaHQgY2hhbmdlIHRoZSBsaW5rLWxheWVyIHR5cGUgZmllbGQgdG8gd2hhdGV2ZXIgdmFsdWUKLWxpYnBjYXAgdXNlZCB3aGVuIGF0dGFjaGluZyB0byB0aGUgZGV2aWNlLCBldmVuIG9uIHBsYXRmb3JtcyB0aGF0Ci0uSSBkbwotbm9taW5hbGx5IHN1cHBvcnQgc2VuZGluZyBjb21wbGV0ZWx5IHJhdyBhbmQgdW5jaGFuZ2VkIHBhY2tldHMuCi0uUFAKLS5CIHBjYXBfc2VuZHBhY2tldCgpCi1pcyBsaWtlCi0uQlIgcGNhcF9pbmplY3QoKSAsCi1idXQgaXQgcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgotLlJCICggcGNhcF9pbmplY3QoKQotY29tZXMgZnJvbSBPcGVuQlNEOwotLkIgcGNhcF9zZW5kcGFja2V0KCkKLWNvbWVzIGZyb20gV2luUGNhcC4gIEJvdGggYXJlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5LikKLS5QUAotLkIgcGNhcF9kdW1wKCkKLW91dHB1dHMgYSBwYWNrZXQgdG8gdGhlIGBgc2F2ZWZpbGUnJyBvcGVuZWQgd2l0aAotLkJSIHBjYXBfZHVtcF9vcGVuKCkgLgotTm90ZSB0aGF0IGl0cyBjYWxsaW5nIGFyZ3VtZW50cyBhcmUgc3VpdGFibGUgZm9yIHVzZSB3aXRoCi0uQiBwY2FwX2Rpc3BhdGNoKCkKLW9yCi0uQlIgcGNhcF9sb29wKCkgLgotSWYgY2FsbGVkIGRpcmVjdGx5LCB0aGUgCi0uSSB1c2VyCi1wYXJhbWV0ZXIgaXMgb2YgdHlwZSAKLS5JIHBjYXBfZHVtcGVyX3QKLWFzIHJldHVybmVkIGJ5Ci0uQlIgcGNhcF9kdW1wX29wZW4oKSAuCi0uUFAKLS5CIHBjYXBfY29tcGlsZSgpCi1pcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHN0cmluZwotLkkgc3RyCi1pbnRvIGEgZmlsdGVyIHByb2dyYW0uCi0uSSBwcm9ncmFtCi1pcyBhIHBvaW50ZXIgdG8gYQotLkkgYnBmX3Byb2dyYW0KLXN0cnVjdCBhbmQgaXMgZmlsbGVkIGluIGJ5Ci0uQlIgcGNhcF9jb21waWxlKCkgLgotLkkgb3B0aW1pemUKLWNvbnRyb2xzIHdoZXRoZXIgb3B0aW1pemF0aW9uIG9uIHRoZSByZXN1bHRpbmcgY29kZSBpcyBwZXJmb3JtZWQuCi0uSSBuZXRtYXNrCi1zcGVjaWZpZXMgdGhlIElQdjQgbmV0bWFzayBvZiB0aGUgbmV0d29yayBvbiB3aGljaCBwYWNrZXRzIGFyZSBiZWluZwotY2FwdHVyZWQ7IGl0IGlzIHVzZWQgb25seSB3aGVuIGNoZWNraW5nIGZvciBJUHY0IGJyb2FkY2FzdCBhZGRyZXNzZXMgaW4KLXRoZSBmaWx0ZXIgcHJvZ3JhbS4gIElmIHRoZSBuZXRtYXNrIG9mIHRoZSBuZXR3b3JrIG9uIHdoaWNoIHBhY2tldHMgYXJlCi1iZWluZyBjYXB0dXJlZCBpc24ndCBrbm93biB0byB0aGUgcHJvZ3JhbSwgb3IgaWYgcGFja2V0cyBhcmUgYmVpbmcKLWNhcHR1cmVkIG9uIHRoZSBMaW51eCAiYW55IiBwc2V1ZG8taW50ZXJmYWNlIHRoYXQgY2FuIGNhcHR1cmUgb24gbW9yZQotdGhhbiBvbmUgbmV0d29yaywgYSB2YWx1ZSBvZiAwIGNhbiBiZSBzdXBwbGllZDsgdGVzdHMgZm9yIElQdjQgYnJvYWRjYXN0Ci1hZGRyZXNlcyB3b24ndCBiZSBkb25lIGNvcnJlY3RseSwgYnV0IGFsbCBvdGhlciB0ZXN0cyBpbiB0aGUgZmlsdGVyCi1wcm9ncmFtIHdpbGwgYmUgT0suICBBIHJldHVybiBvZiBcLTEgaW5kaWNhdGVzIGFuIGVycm9yIGluIHdoaWNoIGNhc2UKLS5CUiBwY2FwX2dldGVycigpCi1tYXkgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgotLlBQCi0uQiBwY2FwX2NvbXBpbGVfbm9wY2FwKCkKLWlzIHNpbWlsYXIgdG8KLS5CIHBjYXBfY29tcGlsZSgpCi1leGNlcHQgdGhhdCBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBwY2FwIHN0cnVjdHVyZSwgb25lIHBhc3NlcyB0aGUKLXNuYXBsZW4gYW5kIGxpbmt0eXBlIGV4cGxpY2l0bHkuICBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvcgotY29tcGlsaW5nIGZpbHRlcnMgZm9yIGRpcmVjdCBCUEYgdXNhZ2UsIHdpdGhvdXQgbmVjZXNzYXJpbHkgaGF2aW5nCi1jYWxsZWQKLS5CUiBwY2FwX29wZW4oKSAuCi1BIHJldHVybiBvZiBcLTEgaW5kaWNhdGVzIGFuIGVycm9yOyB0aGUgZXJyb3IgdGV4dCBpcyB1bmF2YWlsYWJsZS4KLS5SQiAoIHBjYXBfY29tcGlsZV9ub3BjYXAoKQotaXMgYSB3cmFwcGVyIGFyb3VuZAotLkJSIHBjYXBfb3Blbl9kZWFkKCkgLAotLkJSIHBjYXBfY29tcGlsZSgpICwKLWFuZAotLkJSIHBjYXBfY2xvc2UoKSA7Ci10aGUgbGF0dGVyIHRocmVlIHJvdXRpbmVzIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGluIG9yZGVyIHRvIGdldCB0aGUgZXJyb3IKLXRleHQgZm9yIGEgY29tcGlsYXRpb24gZXJyb3IuKQotLkIKLS5QUAotLkIgcGNhcF9zZXRmaWx0ZXIoKQotaXMgdXNlZCB0byBzcGVjaWZ5IGEgZmlsdGVyIHByb2dyYW0uCi0uSSBmcAotaXMgYSBwb2ludGVyIHRvIGEKLS5JIGJwZl9wcm9ncmFtCi1zdHJ1Y3QsIHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8KLS5CUiBwY2FwX2NvbXBpbGUoKSAuCi0uQiBcLTEKLWlzIHJldHVybmVkIG9uIGZhaWx1cmUsIGluIHdoaWNoIGNhc2UKLS5CUiBwY2FwX2dldGVycigpCi1tYXkgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0OwotLkIgMAotaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KLS5QUAotLkIgcGNhcF9mcmVlY29kZSgpCi1pcyB1c2VkIHRvIGZyZWUgdXAgYWxsb2NhdGVkIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGEKLS5JIGJwZl9wcm9ncmFtCi1zdHJ1Y3QgZ2VuZXJhdGVkIGJ5Ci0uQiBwY2FwX2NvbXBpbGUoKQotd2hlbiB0aGF0IEJQRiBwcm9ncmFtIGlzIG5vIGxvbmdlciBuZWVkZWQsIGZvciBleGFtcGxlIGFmdGVyIGl0Ci1oYXMgYmVlbiBtYWRlIHRoZSBmaWx0ZXIgcHJvZ3JhbSBmb3IgYSBwY2FwIHN0cnVjdHVyZSBieSBhIGNhbGwgdG8KLS5CUiBwY2FwX3NldGZpbHRlcigpIC4KLS5QUAotLkIgcGNhcF9zZXRkaXJlY3Rpb24oKQotaXMgdXNlZCB0byBzcGVjaWZ5IGEgZGlyZWN0aW9uIHRoYXQgcGFja2V0cyB3aWxsIGJlIGNhcHR1cmVkLgotLkkgcGNhcF9kaXJlY3Rpb25fdCAKLWlzIG9uZSBvZiB0aGUgY29uc3RhbnRzCi0uQlIgUENBUF9EX0lOICwKLS5CIFBDQVBfRF9PVVQKLW9yIAotLkJSIFBDQVBfRF9JTk9VVCAuCi0uQiBQQ0FQX0RfSU4KLXdpbGwgb25seSBjYXB0dXJlIHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIGRldmljZSwKLS5CIFBDQVBfRF9PVVQKLXdpbGwgb25seSBjYXB0dXJlIHBhY2tldHMgc2VudCBieSB0aGUgZGV2aWNlIGFuZAotLkIgUENBUF9EX0lOT1VUCi13aWxsIGNhcHR1cmUgcGFja2V0cyByZWNlaXZlZCBieSBvciBzZW50IGJ5IHRoZSBkZXZpY2UuCi0uQiBQQ0FQX0RfSU5PVVQKLWlzIHRoZSBkZWZhdWx0IHNldHRpbmcgaWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLiAgVGhpcyBpc24ndAotbmVjZXNzYXJpbHkgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXM7IHNvbWUgcGxhdGZvcm1zIG1pZ2h0IHJldHVybiBhbgotZXJyb3IsIGFuZCBzb21lIG90aGVyIHBsYXRmb3JtcyBtaWdodCBub3Qgc3VwcG9ydAotLkJSIFBDQVBfRF9PVVQgLgotVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpZiBhIGBgc2F2ZWZpbGUnJyBpcyBiZWluZyByZWFkLgotLkIgXC0xCi1pcyByZXR1cm5lZCBvbiBmYWlsdXJlLAotLkIgMAotaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KLS5QUAotLkIgcGNhcF9kYXRhbGluaygpCi1yZXR1cm5zIHRoZSBsaW5rIGxheWVyIHR5cGU7IGxpbmsgbGF5ZXIgdHlwZXMgaXQgY2FuIHJldHVybiBpbmNsdWRlOgotLlBQCi0uUlMgNQotLlRQIDUKLS5CIERMVF9OVUxMCi1CU0QgbG9vcGJhY2sgZW5jYXBzdWxhdGlvbjsgdGhlIGxpbmsgbGF5ZXIgaGVhZGVyIGlzIGEgNC1ieXRlIGZpZWxkLCBpbgotLkkgaG9zdAotYnl0ZSBvcmRlciwgY29udGFpbmluZyBhIFBGXyB2YWx1ZSBmcm9tCi0uQiBzb2NrZXQuaAotZm9yIHRoZSBuZXR3b3JrLWxheWVyIHByb3RvY29sIG9mIHRoZSBwYWNrZXQuCi0uSVAKLU5vdGUgdGhhdCBgYGhvc3QgYnl0ZSBvcmRlcicnIGlzIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBtYWNoaW5lIG9uIHdoaWNoCi10aGUgcGFja2V0cyBhcmUgY2FwdHVyZWQsIGFuZCB0aGUgUEZfIHZhbHVlcyBhcmUgZm9yIHRoZSBPUyBvZiB0aGUKLW1hY2hpbmUgb24gd2hpY2ggdGhlIHBhY2tldHMgYXJlIGNhcHR1cmVkOyBpZiBhIGxpdmUgY2FwdHVyZSBpcyBiZWluZwotZG9uZSwgYGBob3N0IGJ5dGUgb3JkZXInJyBpcyB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgbWFjaGluZSBjYXB0dXJpbmcgdGhlCi1wYWNrZXRzLCBhbmQgdGhlIFBGXyB2YWx1ZXMgYXJlIHRob3NlIG9mIHRoZSBPUyBvZiB0aGUgbWFjaGluZSBjYXB0dXJpbmcKLXRoZSBwYWNrZXRzLCBidXQgaWYgYSBgYHNhdmVmaWxlJycgaXMgYmVpbmcgcmVhZCwgdGhlIGJ5dGUgb3JkZXIgYW5kIFBGXwotdmFsdWVzIGFyZQotLkkgbm90Ci1uZWNlc3NhcmlseSB0aG9zZSBvZiB0aGUgbWFjaGluZSByZWFkaW5nIHRoZSBjYXB0dXJlIGZpbGUuCi0uVFAgNQotLkIgRExUX0VOMTBNQgotRXRoZXJuZXQgKDEwTWIsIDEwME1iLCAxMDAwTWIsIGFuZCB1cCkKLS5UUCA1Ci0uQiBETFRfSUVFRTgwMgotSUVFRSA4MDIuNSBUb2tlbiBSaW5nCi0uVFAgNQotLkIgRExUX0FSQ05FVAotQVJDTkVUCi0uVFAgNQotLkIgRExUX1NMSVAKLVNMSVA7IHRoZSBsaW5rIGxheWVyIGhlYWRlciBjb250YWlucywgaW4gb3JkZXI6Ci0uUlMgMTAKLS5MUAotYSAxLWJ5dGUgZmxhZywgd2hpY2ggaXMgMCBmb3IgcGFja2V0cyByZWNlaXZlZCBieSB0aGUgbWFjaGluZSBhbmQgMSBmb3IKLXBhY2tldHMgc2VudCBieSB0aGUgbWFjaGluZTsKLS5MUAotYSAxLWJ5dGUgZmllbGQsIHRoZSB1cHBlciA0IGJpdHMgb2Ygd2hpY2ggaW5kaWNhdGUgdGhlIHR5cGUgb2YgcGFja2V0LAotYXMgcGVyIFJGQyAxMTQ0OgotLlJTIDUKLS5UUCA1Ci0weDQwCi1hbiB1bm1vZGlmaWVkIElQIGRhdGFncmFtIChUWVBFX0lQKTsKLS5UUCA1Ci0weDcwCi1hbiB1bmNvbXByZXNzZWQtVENQIElQIGRhdGFncmFtIChVTkNPTVBSRVNTRURfVENQKSwgd2l0aCB0aGF0IGJ5dGUgYmVpbmcKLXRoZSBmaXJzdCBieXRlIG9mIHRoZSByYXcgSVAgaGVhZGVyIG9uIHRoZSB3aXJlLCBjb250YWluaW5nIHRoZQotY29ubmVjdGlvbiBudW1iZXIgaW4gdGhlIHByb3RvY29sIGZpZWxkOwotLlRQIDUKLTB4ODAKLWEgY29tcHJlc3NlZC1UQ1AgSVAgZGF0YWdyYW0gKENPTVBSRVNTRURfVENQKSwgd2l0aCB0aGF0IGJ5dGUgYmVpbmcgdGhlCi1maXJzdCBieXRlIG9mIHRoZSBjb21wcmVzc2VkIFRDUC9JUCBkYXRhZ3JhbSBoZWFkZXI7Ci0uUkUKLS5MUAotZm9yIFVOQ09NUFJFU1NFRF9UQ1AsIHRoZSByZXN0IG9mIHRoZSBtb2RpZmllZCBJUCBoZWFkZXIsIGFuZCBmb3IKLUNPTVBSRVNTRURfVENQLCB0aGUgY29tcHJlc3NlZCBUQ1AvSVAgZGF0YWdyYW0gaGVhZGVyOwotLlJFCi0uUlMgNQotLkxQCi1mb3IgYSB0b3RhbCBvZiAxNiBieXRlczsgdGhlIHVuY29tcHJlc3NlZCBJUCBkYXRhZ3JhbSBmb2xsb3dzIHRoZSBoZWFkZXIuCi0uUkUKLS5UUCA1Ci0uQiBETFRfUFBQCi1QUFA7IGlmIHRoZSBmaXJzdCAyIGJ5dGVzIGFyZSAweGZmIGFuZCAweDAzLCBpdCdzIFBQUCBpbiBIRExDLWxpa2UKLWZyYW1pbmcsIHdpdGggdGhlIFBQUCBoZWFkZXIgZm9sbG93aW5nIHRob3NlIHR3byBieXRlcywgb3RoZXJ3aXNlIGl0J3MKLVBQUCB3aXRob3V0IGZyYW1pbmcsIGFuZCB0aGUgcGFja2V0IGJlZ2lucyB3aXRoIHRoZSBQUFAgaGVhZGVyLgotLlRQIDUKLS5CIERMVF9GRERJCi1GRERJCi0uVFAgNQotLkIgRExUX0FUTV9SRkMxNDgzCi1SRkMgMTQ4MyBMTEMvU05BUC1lbmNhcHN1bGF0ZWQgQVRNOyB0aGUgcGFja2V0IGJlZ2lucyB3aXRoIGFuIElFRUUgODAyLjIKLUxMQyBoZWFkZXIuCi0uVFAgNQotLkIgRExUX1JBVwotcmF3IElQOyB0aGUgcGFja2V0IGJlZ2lucyB3aXRoIGFuIElQIGhlYWRlci4KLS5UUCA1Ci0uQiBETFRfUFBQX1NFUklBTAotUFBQIGluIEhETEMtbGlrZSBmcmFtaW5nLCBhcyBwZXIgUkZDIDE2NjIsIG9yIENpc2NvIFBQUCB3aXRoIEhETEMKLWZyYW1pbmcsIGFzIHBlciBzZWN0aW9uIDQuMy4xIG9mIFJGQyAxNTQ3OyB0aGUgZmlyc3QgYnl0ZSB3aWxsIGJlIDB4RkYKLWZvciBQUFAgaW4gSERMQy1saWtlIGZyYW1pbmcsIGFuZCB3aWxsIGJlIDB4MEYgb3IgMHg4RiBmb3IgQ2lzY28gUFBQCi13aXRoIEhETEMgZnJhbWluZy4KLS5UUCA1Ci0uQiBETFRfUFBQX0VUSEVSCi1QUFBvRTsgdGhlIHBhY2tldCBiZWdpbnMgd2l0aCBhIFBQUG9FIGhlYWRlciwgYXMgcGVyIFJGQyAyNTE2LgotLlRQIDUKLS5CIERMVF9DX0hETEMKLUNpc2NvIFBQUCB3aXRoIEhETEMgZnJhbWluZywgYXMgcGVyIHNlY3Rpb24gNC4zLjEgb2YgUkZDIDE1NDcuCi0uVFAgNQotLkIgRExUX0lFRUU4MDJfMTEKLUlFRUUgODAyLjExIHdpcmVsZXNzIExBTgotLlRQIDUKLS5CIERMVF9GUkVMQVkKLUZyYW1lIFJlbGF5Ci0uVFAgNQotLkIgRExUX0xPT1AKLU9wZW5CU0QgbG9vcGJhY2sgZW5jYXBzdWxhdGlvbjsgdGhlIGxpbmsgbGF5ZXIgaGVhZGVyIGlzIGEgNC1ieXRlIGZpZWxkLCBpbgotLkkgbmV0d29yawotYnl0ZSBvcmRlciwgY29udGFpbmluZyBhIFBGXyB2YWx1ZSBmcm9tIE9wZW5CU0QncwotLkIgc29ja2V0LmgKLWZvciB0aGUgbmV0d29yay1sYXllciBwcm90b2NvbCBvZiB0aGUgcGFja2V0LgotLklQCi1Ob3RlIHRoYXQsIGlmIGEgYGBzYXZlZmlsZScnIGlzIGJlaW5nIHJlYWQsIHRob3NlIFBGXyB2YWx1ZXMgYXJlCi0uSSBub3QKLW5lY2Vzc2FyaWx5IHRob3NlIG9mIHRoZSBtYWNoaW5lIHJlYWRpbmcgdGhlIGNhcHR1cmUgZmlsZS4KLS5UUCA1Ci0uQiBETFRfTElOVVhfU0xMCi1MaW51eCAiY29va2VkIiBjYXB0dXJlIGVuY2Fwc3VsYXRpb247IHRoZSBsaW5rIGxheWVyIGhlYWRlciBjb250YWlucywgaW4KLW9yZGVyOgotLlJTIDEwCi0uTFAKLWEgMi1ieXRlICJwYWNrZXQgdHlwZSIsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgd2hpY2ggaXMgb25lIG9mOgotLlJTIDUKLS5UUCA1Ci0wCi1wYWNrZXQgd2FzIHNlbnQgdG8gdXMgYnkgc29tZWJvZHkgZWxzZQotLlRQIDUKLTEKLXBhY2tldCB3YXMgYnJvYWRjYXN0IGJ5IHNvbWVib2R5IGVsc2UKLS5UUCA1Ci0yCi1wYWNrZXQgd2FzIG11bHRpY2FzdCwgYnV0IG5vdCBicm9hZGNhc3QsIGJ5IHNvbWVib2R5IGVsc2UKLS5UUCA1Ci0zCi1wYWNrZXQgd2FzIHNlbnQgYnkgc29tZWJvZHkgZWxzZSB0byBzb21lYm9keSBlbHNlCi0uVFAgNQotNAotcGFja2V0IHdhcyBzZW50IGJ5IHVzCi0uUkUKLS5MUAotYSAyLWJ5dGUgZmllbGQsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgY29udGFpbmluZyBhIExpbnV4IEFSUEhSRF8gdmFsdWUKLWZvciB0aGUgbGluayBsYXllciBkZXZpY2UgdHlwZTsKLS5MUAotYSAyLWJ5dGUgZmllbGQsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHRoZQotbGluayBsYXllciBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgb2YgdGhlIHBhY2tldCAod2hpY2ggY291bGQgYmUgMCk7Ci0uTFAKLWFuIDgtYnl0ZSBmaWVsZCBjb250YWluaW5nIHRoYXQgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBsaW5rIGxheWVyIGhlYWRlcgotKGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gOCBieXRlcywgb25seSB0aGUgZmlyc3QgOCBhcmUgcHJlc2VudCk7Ci0uTFAKLWEgMi1ieXRlIGZpZWxkIGNvbnRhaW5pbmcgYW4gRXRoZXJuZXQgcHJvdG9jb2wgdHlwZSwgaW4gbmV0d29yayBieXRlCi1vcmRlciwgb3IgY29udGFpbmluZyAxIGZvciBOb3ZlbGwgODAyLjMgZnJhbWVzIHdpdGhvdXQgYW4gODAyLjIgTExDCi1oZWFkZXIgb3IgNCBmb3IgZnJhbWVzIGJlZ2lubmluZyB3aXRoIGFuIDgwMi4yIExMQyBoZWFkZXIuCi0uUkUKLS5UUCA1Ci0uQiBETFRfTFRBTEsKLUFwcGxlIExvY2FsVGFsazsgdGhlIHBhY2tldCBiZWdpbnMgd2l0aCBhbiBBcHBsZVRhbGsgTExBUCBoZWFkZXIuCi0uVFAgNQotLkIgRExUX1BGTE9HCi1PcGVuQlNEIHBmbG9nOyB0aGUgbGluayBsYXllciBoZWFkZXIgY29udGFpbnMsIGluIG9yZGVyOgotLlJTIDEwCi0uTFAKLWEgMS1ieXRlIGhlYWRlciBsZW5ndGgsIGluIGhvc3QgYnl0ZSBvcmRlcjsKLS5MUAotYSA0LWJ5dGUgUEZfIHZhbHVlLCBpbiBob3N0IGJ5dGUgb3JkZXI7Ci0uTFAKLWEgMi1ieXRlIGFjdGlvbiBjb2RlLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIHdoaWNoIGlzIG9uZSBvZjoKLS5SUyA1Ci0uVFAgNQotMAotcGFzc2VkCi0uVFAgNQotMQotZHJvcHBlZAotLlRQIDUKLTIKLXNjcnViYmVkCi0uUkUKLS5MUAotYSAyLWJ5dGUgcmVhc29uIGNvZGUsIGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgd2hpY2ggaXMgb25lIG9mOgotLlJTIDUKLS5UUCA1Ci0wCi1tYXRjaAotLlRQIDUKLTEKLWJhZCBvZmZzZXQKLS5UUCA1Ci0yCi1mcmFnbWVudAotLlRQIDUKLTMKLXNob3J0Ci0uVFAgNQotNAotbm9ybWFsaXplCi0uVFAgNQotNQotbWVtb3J5Ci0uUkUKLS5MUAotYSAxNi1jaGFyYWN0ZXIgaW50ZXJmYWNlIG5hbWU7Ci0uTFAKLWEgMTYtY2hhcmFjdGVyIHJ1bGVzZXQgbmFtZSAob25seSBtZWFuaW5nZnVsIGlmIHN1YnJ1bGUgaXMgc2V0KTsKLS5MUAotYSA0LWJ5dGUgcnVsZSBudW1iZXIsIGluIG5ldHdvcmsgYnl0ZSBvcmRlcjsKLS5MUAotYSA0LWJ5dGUgc3VicnVsZSBudW1iZXIsIGluIG5ldHdvcmsgYnl0ZSBvcmRlcjsKLS5MUAotYSAxLWJ5dGUgZGlyZWN0aW9uLCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIHdoaWNoIGlzIG9uZSBvZjoKLS5SUyA1Ci0uVFAgNQotMAotaW5jb21pbmcgb3Igb3V0Z29pbmcKLS5UUCA1Ci0xCi1pbmNvbWluZwotLlRQIDUKLTIKLW91dGdvaW5nCi0uUkUKLS5SRQotLlRQIDUKLS5CIERMVF9QUklTTV9IRUFERVIKLVByaXNtIG1vbml0b3IgbW9kZSBpbmZvcm1hdGlvbiBmb2xsb3dlZCBieSBhbiA4MDIuMTEgaGVhZGVyLgotLlRQIDUKLS5CIERMVF9JUF9PVkVSX0ZDCi1SRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwsIHdpdGggdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGJlaW5nIHRoZQotTmV0d29ya19IZWFkZXIgYXMgZGVzY3JpYmVkIGluIHRoYXQgUkZDLgotLlRQIDUKLS5CIERMVF9TVU5BVE0KLVN1bkFUTSBkZXZpY2VzOyB0aGUgbGluayBsYXllciBoZWFkZXIgY29udGFpbnMsIGluIG9yZGVyOgotLlJTIDEwCi0uTFAKLWEgMS1ieXRlIGZsYWcgZmllbGQsIGNvbnRhaW5pbmcgYSBkaXJlY3Rpb24gZmxhZyBpbiB0aGUgdXBwZXJtb3N0IGJpdCwKLXdoaWNoIGlzIHNldCBmb3IgcGFja2V0cyB0cmFuc21pdHRlZCBieSB0aGUgbWFjaGluZSBhbmQgY2xlYXIgZm9yCi1wYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBtYWNoaW5lLCBhbmQgYSA0LWJ5dGUgdHJhZmZpYyB0eXBlIGluIHRoZQotbG93LW9yZGVyIDQgYml0cywgd2hpY2ggaXMgb25lIG9mOgotLlJTIDUKLS5UUCA1Ci0wCi1yYXcgdHJhZmZpYwotLlRQIDUKLTEKLUxBTkUgdHJhZmZpYwotLlRQIDUKLTIKLUxMQy1lbmNhcHN1bGF0ZWQgdHJhZmZpYwotLlRQIDUKLTMKLU1BUlMgdHJhZmZpYwotLlRQIDUKLTQKLUlGTVAgdHJhZmZpYwotLlRQIDUKLTUKLUlMTUkgdHJhZmZpYwotLlRQIDUKLTYKLVEuMjkzMSB0cmFmZmljCi0uUkUKLS5MUAotYSAxLWJ5dGUgVlBJIHZhbHVlOwotLkxQCi1hIDItYnl0ZSBWQ0kgZmllbGQsIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KLS5SRQotLlRQIDUKLS5CIERMVF9JRUVFODAyXzExX1JBRElPCi1saW5rLWxheWVyIGluZm9ybWF0aW9uIGZvbGxvd2VkIGJ5IGFuIDgwMi4xMSBoZWFkZXIgLSBzZWUKLWh0dHA6Ly93d3cuc2hhZnRuZXQub3JnL35waXp6YS9zb2Z0d2FyZS9jYXB0dXJlZnJtLnR4dCBmb3IgYSBkZXNjcmlwdGlvbgotb2YgdGhlIGxpbmstbGF5ZXIgaW5mb3JtYXRpb24uCi0uVFAgNQotLkIgRExUX0FSQ05FVF9MSU5VWAotQVJDTkVULCB3aXRoIG5vIGV4Y2VwdGlvbiBmcmFtZXMsIHJlYXNzZW1ibGVkIHBhY2tldHMgcmF0aGVyIHRoYW4gcmF3Ci1mcmFtZXMsIGFuZCBhbiBleHRyYSAxNi1iaXQgb2Zmc2V0IGZpZWxkIGJldHdlZW4gdGhlIGRlc3RpbmF0aW9uIGhvc3QKLWFuZCB0eXBlIGJ5dGVzLgotLlRQIDUKLS5CIERMVF9MSU5VWF9JUkRBCi1MaW51eC1JckRBIHBhY2tldHMsIHdpdGggYQotLkIgRExUX0xJTlVYX1NMTAotaGVhZGVyIGZvbGxvd2VkIGJ5IHRoZSBJckxBUCBoZWFkZXIuCi0uVFAgNQotLkIgRExUX0xJTlVYX0xBUEQKLUxBUEQgKFEuOTIxKSBmcmFtZXMsIHdpdGggYQotLkIgRExUX0xJTlVYX1NMTAotaGVhZGVyIGNhcHR1cmVkIHZpYSB2SVNETi4KLS5SRQotLlBQCi0uQiBwY2FwX2xpc3RfZGF0YWxpbmtzKCkKLWlzIHVzZWQgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgbGluayB0eXBlcyBvZiB0aGUgaW50ZXJmYWNlCi1hc3NvY2lhdGVkIHdpdGggdGhlIHBjYXAgZGVzY3JpcHRvci4KLS5CIHBjYXBfbGlzdF9kYXRhbGlua3MoKQotYWxsb2NhdGVzIGFuIGFycmF5IHRvIGhvbGQgdGhlIGxpc3QgYW5kIHNldHMKLS5JUiAqZGx0X2J1ZiAuCi1UaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBhcnJheS4KLS5CIFwtMQotaXMgcmV0dXJuZWQgb24gZmFpbHVyZTsKLW90aGVyd2lzZSwgdGhlIG51bWJlciBvZiBkYXRhIGxpbmsgdHlwZXMgaW4gdGhlIGFycmF5IGlzIHJldHVybmVkLgotLlBQCi0uQiBwY2FwX3NldF9kYXRhbGluaygpCi1pcyB1c2VkIHRvIHNldCB0aGUgY3VycmVudCBkYXRhIGxpbmsgdHlwZSBvZiB0aGUgcGNhcCBkZXNjcmlwdG9yCi10byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKLS5JUiBkbHQgLgotLkIgXC0xCi1pcyByZXR1cm5lZCBvbiBmYWlsdXJlLgotLlBQCi0uQiBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKCkKLXRyYW5zbGF0ZXMgYSBkYXRhIGxpbmsgdHlwZSBuYW1lLCB3aGljaCBpcyBhCi0uQiBETFRfCi1uYW1lIHdpdGggdGhlCi0uQiBETFRfCi1yZW1vdmVkLCB0byB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGxpbmsgdHlwZSB2YWx1ZS4gIFRoZSB0cmFuc2xhdGlvbgotaXMgY2FzZS1pbnNlbnNpdGl2ZS4gIAotLkIgXC0xCi1pcyByZXR1cm5lZCBvbiBmYWlsdXJlLgotLlBQCi0uQiBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKCkKLXRyYW5zbGF0ZXMgYSBkYXRhIGxpbmsgdHlwZSB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGxpbmsgdHlwZQotbmFtZS4gIE5VTEwgaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KLS5QUAotLkIgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKQotdHJhbnNsYXRlcyBhIGRhdGEgbGluayB0eXBlIHZhbHVlIHRvIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhhdCBkYXRhCi1saW5rIHR5cGUuICBOVUxMIGlzIHJldHVybmVkIG9uIGZhaWx1cmUuCi0uUFAKLS5CIHBjYXBfc25hcHNob3QoKQotcmV0dXJucyB0aGUgc25hcHNob3QgbGVuZ3RoIHNwZWNpZmllZCB3aGVuCi0uQiBwY2FwX29wZW5fbGl2ZSgpCi13YXMgY2FsbGVkLgotLlBQCi0uQiBwY2FwX2lzX3N3YXBwZWQoKQotcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGBgc2F2ZWZpbGUnJyB1c2VzIGEgZGlmZmVyZW50IGJ5dGUgb3JkZXIKLXRoYW4gdGhlIGN1cnJlbnQgc3lzdGVtLgotLlBQCi0uQiBwY2FwX21ham9yX3ZlcnNpb24oKQotcmV0dXJucyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgc2F2ZWZpbGU7Ci0uQiBwY2FwX21pbm9yX3ZlcnNpb24oKQotcmV0dXJucyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgc2F2ZWZpbGUuICBUaGUKLXZlcnNpb24gbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgaGVhZGVyIG9mIHRoZSBzYXZlZmlsZS4KLS5QUAotLkIgcGNhcF9maWxlKCkKLXJldHVybnMgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gb2YgdGhlIGBgc2F2ZWZpbGUsJycgaWYgYSBgYHNhdmVmaWxlJycKLXdhcyBvcGVuZWQgd2l0aAotLkJSIHBjYXBfb3Blbl9vZmZsaW5lKCkgLAotb3IgTlVMTCwgaWYgYSBuZXR3b3JrIGRldmljZSB3YXMgb3BlbmVkIHdpdGgKLS5CUiBwY2FwX29wZW5fbGl2ZSgpIC4KLS5QUAotLkIgcGNhcF9zdGF0cygpCi1yZXR1cm5zIDAgYW5kIGZpbGxzIGluIHRoZQotLkIgcGNhcF9zdGF0Ci1zdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSBpdHMgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIHZhbHVlcyByZXByZXNlbnQKLXBhY2tldCBzdGF0aXN0aWNzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIHRpbWUgb2YgdGhlIGNhbGwuICBJZgotdGhlcmUgaXMgYW4gZXJyb3Igb3IgdGhlIHVuZGVybHlpbmcgcGFja2V0IGNhcHR1cmUgZG9lc24ndCBzdXBwb3J0Ci1wYWNrZXQgc3RhdGlzdGljcywgXC0xIGlzIHJldHVybmVkIGFuZCB0aGUgZXJyb3IgdGV4dCBjYW4gYmUgb2J0YWluZWQKLXdpdGgKLS5CIHBjYXBfcGVycm9yKCkKLW9yCi0uQlIgcGNhcF9nZXRlcnIoKSAuCi0uQiBwY2FwX3N0YXRzKCkKLWlzIHN1cHBvcnRlZCBvbmx5IG9uIGxpdmUgY2FwdHVyZXMsIG5vdCBvbiBgYHNhdmVmaWxlcycnOyBubyBzdGF0aXN0aWNzCi1hcmUgc3RvcmVkIGluIGBgc2F2ZWZpbGVzJycsIHNvIG5vIHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSB3aGVuIHJlYWRpbmcKLWZyb20gYSBgYHNhdmVmaWxlJycuCi0uUFAKLS5CIHBjYXBfZmlsZW5vKCkKLXJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgZnJvbSB3aGljaCBjYXB0dXJlZCBwYWNrZXRzIGFyZSByZWFkLAotaWYgYSBuZXR3b3JrIGRldmljZSB3YXMgb3BlbmVkIHdpdGgKLS5CUiBwY2FwX29wZW5fbGl2ZSgpICwKLW9yIFwtMSwgaWYgYSBgYHNhdmVmaWxlJycgd2FzIG9wZW5lZCB3aXRoCi0uQlIgcGNhcF9vcGVuX29mZmxpbmUoKSAuCi0uUFAKLS5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQotcmV0dXJucywgb24gVU5JWCwgYSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGZvciBhIGZpbGUgZGVzY3JpcHRvciBvbgotd2hpY2ggb25lIGNhbgotZG8gYQotLkIgc2VsZWN0KCkKLW9yCi0uQiBwb2xsKCkKLXRvIHdhaXQgZm9yIGl0IHRvIGJlIHBvc3NpYmxlIHRvIHJlYWQgcGFja2V0cyB3aXRob3V0IGJsb2NraW5nLCBpZiBzdWNoCi1hIGRlc2NyaXB0b3IgZXhpc3RzLCBvciBcLTEsIGlmIG5vIHN1Y2ggZGVzY3JpcHRvciBleGlzdHMuICBTb21lIG5ldHdvcmsKLWRldmljZXMgb3BlbmVkIHdpdGgKLS5CIHBjYXBfb3Blbl9saXZlKCkKLWRvIG5vdCBzdXBwb3J0Ci0uQiBzZWxlY3QoKQotb3IKLS5CIHBvbGwoKQotKGZvciBleGFtcGxlLCByZWd1bGFyIG5ldHdvcmsgZGV2aWNlcyBvbiBGcmVlQlNEIDQuMyBhbmQgNC40LCBhbmQgRW5kYWNlCi1EQUcgZGV2aWNlcyksIHNvIFwtMSBpcyByZXR1cm5lZCBmb3IgdGhvc2UgZGV2aWNlcy4KLS5QUAotTm90ZSB0aGF0IG9uIG1vc3QgdmVyc2lvbnMgb2YgbW9zdCBCU0RzIChpbmNsdWRpbmcgTWFjIE9TIFgpCi0uQiBzZWxlY3QoKQotYW5kCi0uQiBwb2xsKCkKLWRvIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBCUEYgZGV2aWNlczsKLS5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQotd2lsbCByZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3Igb24gbW9zdCBvZiB0aG9zZSB2ZXJzaW9ucyAodGhlIGV4Y2VwdGlvbnMKLWJlaW5nIEZyZWVCU0QgNC4zIGFuZCA0LjQpLCBhIHNpbXBsZQotLkIgc2VsZWN0KCkKLW9yCi0uQiBwb2xsKCkKLXdpbGwgbm90IHJldHVybiBldmVuIGFmdGVyIGEgdGltZW91dCBzcGVjaWZpZWQgaW4KLS5CIHBjYXBfb3Blbl9saXZlKCkKLWV4cGlyZXMuICBUbyB3b3JrIGFyb3VuZCB0aGlzLCBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMKLS5CIHNlbGVjdCgpCi1vcgotLkIgcG9sbCgpCi10byB3YWl0IGZvciBwYWNrZXRzIHRvIGFycml2ZSBtdXN0IHB1dCB0aGUKLS5CIHBjYXBfdAotaW4gbm9uLWJsb2NraW5nIG1vZGUsIGFuZCBtdXN0IGFycmFuZ2UgdGhhdCB0aGUKLS5CIHNlbGVjdCgpCi1vcgotLkIgcG9sbCgpCi1oYXZlIGEgdGltZW91dCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRpbWVvdXQgc3BlY2lmaWVkIGluCi0uQlIgcGNhcF9vcGVuX2xpdmUoKSAsCi1hbmQgbXVzdCB0cnkgdG8gcmVhZCBwYWNrZXRzIGFmdGVyIHRoYXQgdGltZW91dCBleHBpcmVzLCByZWdhcmRsZXNzIG9mCi13aGV0aGVyCi0uQiBzZWxlY3QoKQotb3IKLS5CIHBvbGwoKQotaW5kaWNhdGVkIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlCi0uQiBwY2FwX3QKLWlzIHJlYWR5IHRvIGJlIHJlYWQgb3Igbm90LiAgKFRoYXQgd29ya2Fyb3VuZCB3aWxsIG5vdCB3b3JrIGluIEZyZWVCU0QKLTQuMyBhbmQgbGF0ZXI7IGhvd2V2ZXIsIGluIEZyZWVCU0QgNC42IGFuZCBsYXRlciwKLS5CIHNlbGVjdCgpCi1hbmQKLS5CIHBvbGwoKQotd29yayBjb3JyZWN0bHkgb24gQlBGIGRldmljZXMsIHNvIHRoZSB3b3JrYXJvdW5kIGlzbid0IG5lY2Vzc2FyeSwKLWFsdGhvdWdoIGl0IGRvZXMgbm8gaGFybS4pCi0uUFAKLS5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQotaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgotLlBQCi0uQiBwY2FwX3BlcnJvcigpCi1wcmludHMgdGhlIHRleHQgb2YgdGhlIGxhc3QgcGNhcCBsaWJyYXJ5IGVycm9yIG9uCi0uQlIgc3RkZXJyICwKLXByZWZpeGVkIGJ5Ci0uSVIgcHJlZml4IC4KLS5QUAotLkIgcGNhcF9nZXRlcnIoKQotcmV0dXJucyB0aGUgZXJyb3IgdGV4dCBwZXJ0YWluaW5nIHRvIHRoZSBsYXN0IHBjYXAgbGlicmFyeSBlcnJvci4KLS5CUiBOT1RFIDoKLXRoZSBwb2ludGVyIGl0IHJldHVybnMgd2lsbCBubyBsb25nZXIgcG9pbnQgdG8gYSB2YWxpZCBlcnJvciBtZXNzYWdlCi1zdHJpbmcgYWZ0ZXIgdGhlCi0uQiBwY2FwX3QKLXBhc3NlZCB0byBpdCBpcyBjbG9zZWQ7IHlvdSBtdXN0IHVzZSBvciBjb3B5IHRoZSBzdHJpbmcgYmVmb3JlIGNsb3NpbmcKLXRoZQotLkJSIHBjYXBfdCAuCi0uUFAKLS5CIHBjYXBfc3RyZXJyb3IoKQotaXMgcHJvdmlkZWQgaW4gY2FzZQotLkJSIHN0cmVycm9yICgxKQotaXNuJ3QgYXZhaWxhYmxlLgotLlBQCi0uQiBwY2FwX2xpYl92ZXJzaW9uKCkKLXJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGdpdmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZgotdGhlIGxpYnBjYXAgbGlicmFyeSBiZWluZyB1c2VkOyBub3RlIHRoYXQgaXQgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbgotdGhhbiBqdXN0IGEgdmVyc2lvbiBudW1iZXIuCi0uUFAKLS5CIHBjYXBfY2xvc2UoKQotY2xvc2VzIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGgKLS5JIHAKLWFuZCBkZWFsbG9jYXRlcyByZXNvdXJjZXMuCi0uUFAKLS5CIHBjYXBfZHVtcF9maWxlKCkKLXJldHVybnMgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gb2YgdGhlIGBgc2F2ZWZpbGUnJyBvcGVuZWQgYnkKLS5CUiBwY2FwX2R1bXBfb3BlbigpLgotLlBQCi0uQiBwY2FwX2R1bXBfZmx1c2goKQotZmx1c2hlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgYGBzYXZlZmlsZSwnJyBzbyB0aGF0IGFueSBwYWNrZXRzCi13cml0dGVuIHdpdGgKLS5CIHBjYXBfZHVtcCgpCi1idXQgbm90IHlldCB3cml0dGVuIHRvIHRoZSBgYHNhdmVmaWxlJycgd2lsbCBiZSB3cml0dGVuLgotLkIgXC0xCi1pcyByZXR1cm5lZCBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLgotLlBQCi0uQiBwY2FwX2R1bXBfZnRlbGwoKQotcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGZvciB0aGUgYGBzYXZlZmlsZScnLCByZXByZXNlbnRpbmcgdGhlCi1udW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieQotLkIgcGNhcF9kdW1wX29wZW4oKQotYW5kCi0uQlIgcGNhcF9kdW1wKCkgLgotLkIgXC0xCi1pcyByZXR1cm5lZCBvbiBlcnJvci4KLS5QUAotLkIgcGNhcF9kdW1wX2Nsb3NlKCkKLWNsb3NlcyB0aGUgYGBzYXZlZmlsZS4nJwotLlBQCi0uU0ggU0VFIEFMU08KLXRjcGR1bXAoMSksIHRjcHNsaWNlKDEpCi0uU0ggQVVUSE9SUwotVGhlIG9yaWdpbmFsIGF1dGhvcnMgYXJlOgotLkxQCi1WYW4gSmFjb2Jzb24sCi1DcmFpZyBMZXJlcyBhbmQKLVN0ZXZlbiBNY0Nhbm5lLCBhbGwgb2YgdGhlCi1MYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWJvcmF0b3J5LCBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LCBDQS4KLS5MUAotVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhdmFpbGFibGUgZnJvbSAiVGhlIFRjcGR1bXAgR3JvdXAiJ3MgV2ViIHNpdGUgYXQKLS5MUAotLlJTCi0uSSBodHRwOi8vd3d3LnRjcGR1bXAub3JnLwotLlJFCi0uU0ggQlVHUwotUGxlYXNlIHNlbmQgcHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiB0bzoKLS5MUAotLlJTCi10Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmcKLS5SRQotLkxQCi1QbGVhc2Ugc2VuZCBzb3VyY2UgY29kZSBjb250cmlidXRpb25zLCBldGMuIHRvOgotLkxQCi0uUlMKLXBhdGNoZXNAdGNwZHVtcC5vcmcKLS5SRQpkaWZmIC0tZ2l0IGEvcGNhcC4zcGNhcC5pbiBiL3BjYXAuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwOGRlYgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAuM3BjYXAuaW4KQEAgLTAsMCArMSw5MDkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAuM3BjYXAuaW4sdiAxLjEgMjAwOC0xMC0yMSAwNzozMzowMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQIDNQQ0FQICIxIEp1bHkgMjAxMyIKKy5TSCBOQU1FCitwY2FwIFwtIFBhY2tldCBDYXB0dXJlIGxpYnJhcnkKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLkxQCisuZnQgQgorLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorVGhlIFBhY2tldCBDYXB0dXJlIGxpYnJhcnkKK3Byb3ZpZGVzIGEgaGlnaCBsZXZlbCBpbnRlcmZhY2UgdG8gcGFja2V0IGNhcHR1cmUgc3lzdGVtcy4gQWxsIHBhY2tldHMKK29uIHRoZSBuZXR3b3JrLCBldmVuIHRob3NlIGRlc3RpbmVkIGZvciBvdGhlciBob3N0cywgYXJlIGFjY2Vzc2libGUKK3Rocm91Z2ggdGhpcyBtZWNoYW5pc20uCitJdCBhbHNvIHN1cHBvcnRzIHNhdmluZyBjYXB0dXJlZCBwYWNrZXRzIHRvIGEgYGBzYXZlZmlsZScnLCBhbmQgcmVhZGluZworcGFja2V0cyBmcm9tIGEgYGBzYXZlZmlsZScnLgorLlNTIE9wZW5pbmcgYSBjYXB0dXJlIGhhbmRsZSBmb3IgcmVhZGluZworVG8gb3BlbiBhIGhhbmRsZSBmb3IgYSBsaXZlIGNhcHR1cmUsIGdpdmVuIHRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIG9yCitvdGhlciBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGNhcHR1cmUgc2hvdWxkIGJlIGRvbmUsIGNhbGwKKy5CUiBwY2FwX2NyZWF0ZSAoKSwKK3NldCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9ucyBvbiB0aGUgaGFuZGxlLCBhbmQgdGhlbiBhY3RpdmF0ZSBpdCB3aXRoCisuQlIgcGNhcF9hY3RpdmF0ZSAoKS4KKy5QUAorVG8gb2J0YWluIGEgbGlzdCBvZiBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCBmb3IgYSBsaXZlIGNhcHR1cmUsIGNhbGwKKy5CUiBwY2FwX2ZpbmRhbGxkZXZzICgpOwordG8gZnJlZSB0aGUgbGlzdCByZXR1cm5lZCBieQorLkJSIHBjYXBfZmluZGFsbGRldnMgKCksCitjYWxsCisuQlIgcGNhcF9mcmVlYWxsZGV2cyAoKS4KKy5CUiBwY2FwX2xvb2t1cGRldiAoKQord2lsbCByZXR1cm4gdGhlIGZpcnN0IGRldmljZSBvbiB0aGF0IGxpc3QgdGhhdCBpcyBub3QgYSBgYGxvb3BiYWNrYGAKK25ldHdvcmsgaW50ZXJmYWNlLgorLlBQCitUbyBvcGVuIGEgaGFuZGxlIGZvciBhIGBgc2F2ZWZpbGUnJyBmcm9tIHdoaWNoIHRvIHJlYWQgcGFja2V0cywgZ2l2ZW4gdGhlCitwYXRobmFtZSBvZiB0aGUgYGBzYXZlZmlsZScnLCBjYWxsCisuQlIgcGNhcF9vcGVuX29mZmxpbmUgKCk7Cit0byBzZXQgdXAgYSBoYW5kbGUgZm9yIGEgYGBzYXZlZmlsZScnLCBnaXZlbiBhCisuQiAiRklMRVwgKiIKK3JlZmVycmluZyB0byBhIGZpbGUgYWxyZWFkeSBvcGVuZWQgZm9yIHJlYWRpbmcsIGNhbGwKKy5CUiBwY2FwX2ZvcGVuX29mZmxpbmUgKCkuCisuUFAKK0luIG9yZGVyIHRvIGdldCBhIGBgZmFrZScnCisuQiBwY2FwX3QKK2ZvciB1c2UgaW4gcm91dGluZXMgdGhhdCByZXF1aXJlIGEKKy5CIHBjYXBfdAorYXMgYW4gYXJndW1lbnQsIHN1Y2ggYXMgcm91dGluZXMgdG8gb3BlbiBhIGBgc2F2ZWZpbGUnJyBmb3Igd3JpdGluZyBhbmQKK3RvIGNvbXBpbGUgYSBmaWx0ZXIgZXhwcmVzc2lvbiwgY2FsbAorLkJSIHBjYXBfb3Blbl9kZWFkICgpLgorLlBQCisuQlIgcGNhcF9jcmVhdGUgKCksCisuQlIgcGNhcF9vcGVuX29mZmxpbmUgKCksCisuQlIgcGNhcF9mb3Blbl9vZmZsaW5lICgpLAorYW5kCisuQlIgcGNhcF9vcGVuX2RlYWQgKCkKK3JldHVybiBhIHBvaW50ZXIgdG8gYQorLkJSIHBjYXBfdCAsCit3aGljaCBpcyB0aGUgaGFuZGxlIHVzZWQgZm9yIHJlYWRpbmcgcGFja2V0cyBmcm9tIHRoZSBjYXB0dXJlIHN0cmVhbSBvcgordGhlIGBgc2F2ZWZpbGUnJywgYW5kIGZvciBmaW5kaW5nIG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FwdHVyZQorc3RyZWFtIG9yIGBgc2F2ZWZpbGUnJy4KK1RvIGNsb3NlIGEgaGFuZGxlLCB1c2UKKy5CUiBwY2FwX2Nsb3NlICgpLgorLlBQCitUaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgb24gYSBjYXB0dXJlIGhhbmRsZSBpbmNsdWRlCisuSVAgInNuYXBzaG90IGxlbmd0aCIKK0lmLCB3aGVuIGNhcHR1cmluZywgeW91IGNhcHR1cmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcGFja2V0LCB0aGF0CityZXF1aXJlcyBtb3JlIENQVSB0aW1lIHRvIGNvcHkgdGhlIHBhY2tldCB0byB5b3VyIGFwcGxpY2F0aW9uLCBtb3JlIGRpc2sKK2FuZCBwb3NzaWJseSBuZXR3b3JrIGJhbmR3aWR0aCB0byB3cml0ZSB0aGUgcGFja2V0IGRhdGEgdG8gYSBmaWxlLCBhbmQKK21vcmUgZGlzayBzcGFjZSB0byBzYXZlIHRoZSBwYWNrZXQuICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgZW50aXJlCitjb250ZW50cyBvZiB0aGUgcGFja2V0IC0gZm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQorVENQIGhlYWRlcnMgb2YgcGFja2V0cyAtIHlvdSBjYW4gc2V0IHRoZSAic25hcHNob3QgbGVuZ3RoIiBmb3IgdGhlCitjYXB0dXJlIHRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlLiAgSWYgdGhlIHNuYXBzaG90IGxlbmd0aCBpcyBzZXQgdG8KKy5JUiBzbmFwbGVuICwKK2FuZAorLkkgc25hcGxlbgoraXMgbGVzcwordGhhbiB0aGUgc2l6ZSBvZiBhIHBhY2tldCB0aGF0IGlzIGNhcHR1cmVkLCBvbmx5IHRoZSBmaXJzdAorLkkgc25hcGxlbgorYnl0ZXMgb2YgdGhhdCBwYWNrZXQgd2lsbCBiZSBjYXB0dXJlZCBhbmQgcHJvdmlkZWQgYXMgcGFja2V0IGRhdGEuCisuSVAKK0Egc25hcHNob3QgbGVuZ3RoIG9mIDY1NTM1IHNob3VsZCBiZSBzdWZmaWNpZW50LCBvbiBtb3N0IGlmIG5vdCBhbGwKK25ldHdvcmtzLCB0byBjYXB0dXJlIGFsbCB0aGUgZGF0YSBhdmFpbGFibGUgZnJvbSB0aGUgcGFja2V0LgorLklQCitUaGUgc25hcHNob3QgbGVuZ3RoIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfc25hcGxlbiAoKS4KKy5JUCAicHJvbWlzY3VvdXMgbW9kZSIKK09uIGJyb2FkY2FzdCBMQU5zIHN1Y2ggYXMgRXRoZXJuZXQsIGlmIHRoZSBuZXR3b3JrIGlzbid0IHN3aXRjaGVkLCBvciBpZgordGhlIGFkYXB0ZXIgaXMgY29ubmVjdGVkIHRvIGEgIm1pcnJvciBwb3J0IiBvbiBhIHN3aXRjaCB0byB3aGljaCBhbGwKK3BhY2tldHMgcGFzc2luZyB0aHJvdWdoIHRoZSBzd2l0Y2ggYXJlIHNlbnQsIGEgbmV0d29yayBhZGFwdGVyIHJlY2VpdmVzCithbGwgcGFja2V0cyBvbiB0aGUgTEFOLCBpbmNsdWRpbmcgdW5pY2FzdCBvciBtdWx0aWNhc3QgcGFja2V0cyBub3Qgc2VudAordG8gYSBuZXR3b3JrIGFkZHJlc3MgdGhhdCB0aGUgbmV0d29yayBhZGFwdGVyIGlzbid0IGNvbmZpZ3VyZWQgdG8KK3JlY29nbml6ZS4KKy5JUAorTm9ybWFsbHksIHRoZSBhZGFwdGVyIHdpbGwgZGlzY2FyZCB0aG9zZSBwYWNrZXRzOyBob3dldmVyLCBtYW55IG5ldHdvcmsKK2FkYXB0ZXJzIHN1cHBvcnQgInByb21pc2N1b3VzIG1vZGUiLCB3aGljaCBpcyBhIG1vZGUgaW4gd2hpY2ggYWxsCitwYWNrZXRzLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBzZW50IHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUgYWRhcHRlcgorcmVjb2duaXplcywgYXJlIHByb3ZpZGVkIHRvIHRoZSBob3N0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIHBhc3NpdmVseQorY2FwdHVyaW5nIHRyYWZmaWMgYmV0d2VlbiB0d28gb3IgbW9yZSBvdGhlciBob3N0cyBmb3IgYW5hbHlzaXMuCisuSVAKK05vdGUgdGhhdCBldmVuIGlmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHNldCBwcm9taXNjdW91cyBtb2RlLCB0aGUKK2FkYXB0ZXIgY291bGQgd2VsbCBiZSBpbiBwcm9taXNjdW91cyBtb2RlIGZvciBzb21lIG90aGVyIHJlYXNvbi4KKy5JUAorRm9yIG5vdywgdGhpcyBkb2Vzbid0IHdvcmsgb24gdGhlICJhbnkiIGRldmljZTsgaWYgYW4gYXJndW1lbnQgb2YgImFueSIKK29yIE5VTEwgaXMgc3VwcGxpZWQsIHRoZSBzZXR0aW5nIG9mIHByb21pc2N1b3VzIG1vZGUgaXMgaWdub3JlZC4KKy5JUAorUHJvbWlzY3VvdXMgbW9kZSBpcyBzZXQgd2l0aAorLkJSIHBjYXBfc2V0X3Byb21pc2MgKCkuCisuSVAgIm1vbml0b3IgbW9kZSIKK09uIElFRUUgODAyLjExIHdpcmVsZXNzIExBTnMsIGV2ZW4gaWYgYW4gYWRhcHRlciBpcyBpbiBwcm9taXNjdW91cyBtb2RlLAoraXQgd2lsbCBzdXBwbHkgdG8gdGhlIGhvc3Qgb25seSBmcmFtZXMgZm9yIHRoZSBuZXR3b3JrIHdpdGggd2hpY2ggaXQncworYXNzb2NpYXRlZC4gIEl0IG1pZ2h0IGFsc28gc3VwcGx5IG9ubHkgZGF0YSBmcmFtZXMsIG5vdCBtYW5hZ2VtZW50IG9yCitjb250cm9sIGZyYW1lcywgYW5kIG1pZ2h0IG5vdCBwcm92aWRlIHRoZSA4MDIuMTEgaGVhZGVyIG9yIHJhZGlvCitpbmZvcm1hdGlvbiBwc2V1ZG8taGVhZGVyIGZvciB0aG9zZSBmcmFtZXMuCisuSVAKK0luICJtb25pdG9yIG1vZGUiLCBzb21ldGltZXMgYWxzbyBjYWxsZWQgInJmbW9uIG1vZGUiIChmb3IgIlJhZGlvCitGcmVxdWVuY3kgTU9OaXRvciIpLCB0aGUgYWRhcHRlciB3aWxsIHN1cHBseSBhbGwgZnJhbWVzIHRoYXQgaXQKK3JlY2VpdmVzLCB3aXRoIDgwMi4xMSBoZWFkZXJzLCBhbmQgbWlnaHQgc3VwcGx5IGEgcHNldWRvLWhlYWRlciB3aXRoCityYWRpbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnJhbWUgYXMgd2VsbC4KKy5JUAorTm90ZSB0aGF0IGluIG1vbml0b3IgbW9kZSB0aGUgYWRhcHRlciBtaWdodCBkaXNhc3NvY2lhdGUgZnJvbSB0aGUKK25ldHdvcmsgd2l0aCB3aGljaCBpdCdzIGFzc29jaWF0ZWQsIHNvIHRoYXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gdXNlCithbnkgd2lyZWxlc3MgbmV0d29ya3Mgd2l0aCB0aGF0IGFkYXB0ZXIuICBUaGlzIGNvdWxkIHByZXZlbnQgYWNjZXNzaW5nCitmaWxlcyBvbiBhIG5ldHdvcmsgc2VydmVyLCBvciByZXNvbHZpbmcgaG9zdCBuYW1lcyBvciBuZXR3b3JrIGFkZHJlc3NlcywKK2lmIHlvdSBhcmUgY2FwdHVyaW5nIGluIG1vbml0b3IgbW9kZSBhbmQgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYW5vdGhlcgorbmV0d29yayB3aXRoIGFub3RoZXIgYWRhcHRlci4KKy5JUAorTW9uaXRvciBtb2RlIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfcmZtb24gKCksCithbmQKKy5CUiBwY2FwX2Nhbl9zZXRfcmZtb24gKCkKK2NhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGFkYXB0ZXIgY2FuIGJlIHB1dCBpbnRvIG1vbml0b3IKK21vZGUuCisuSVAgInJlYWQgdGltZW91dCIKK0lmLCB3aGVuIGNhcHR1cmluZywgcGFja2V0cyBhcmUgZGVsaXZlcmVkIGFzIHNvb24gYXMgdGhleSBhcnJpdmUsIHRoZQorYXBwbGljYXRpb24gY2FwdHVyaW5nIHRoZSBwYWNrZXRzIHdpbGwgYmUgd29rZW4gdXAgZm9yIGVhY2ggcGFja2V0IGFzIGl0CithcnJpdmVzLCBhbmQgbWlnaHQgaGF2ZSB0byBtYWtlIG9uZSBvciBtb3JlIGNhbGxzIHRvIHRoZSBvcGVyYXRpbmcKK3N5c3RlbSB0byBmZXRjaCBlYWNoIHBhY2tldC4KKy5JUAorSWYsIGluc3RlYWQsIHBhY2tldHMgYXJlIG5vdCBkZWxpdmVyZWQgYXMgc29vbiBhcyB0aGV5IGFycml2ZSwgYnV0IGFyZQorZGVsaXZlcmVkIGFmdGVyIGEgc2hvcnQgZGVsYXkgKGNhbGxlZCBhICJyZWFkIHRpbWVvdXQiKSwgbW9yZSB0aGFuIG9uZQorcGFja2V0IGNhbiBiZSBhY2N1bXVsYXRlZCBiZWZvcmUgdGhlIHBhY2tldHMgYXJlIGRlbGl2ZXJlZCwgc28gdGhhdCBhCitzaW5nbGUgd2FrZXVwIHdvdWxkIGJlIGRvbmUgZm9yIG11bHRpcGxlIHBhY2tldHMsIGFuZCBlYWNoIHNldCBvZiBjYWxscworbWFkZSB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3b3VsZCBzdXBwbHkgbXVsdGlwbGUgcGFja2V0cywgcmF0aGVyIHRoYW4KK2Egc2luZ2xlIHBhY2tldC4gIFRoaXMgcmVkdWNlcyB0aGUgcGVyLXBhY2tldCBDUFUgb3ZlcmhlYWQgaWYgcGFja2V0cworYXJlIGFycml2aW5nIGF0IGEgaGlnaCByYXRlLCBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgcGFja2V0cyBwZXIgc2Vjb25kCit0aGF0IGNhbiBiZSBjYXB0dXJlZC4KKy5JUAorVGhlIHJlYWQgdGltZW91dCBpcyByZXF1aXJlZCBzbyB0aGF0IGFuIGFwcGxpY2F0aW9uIHdvbid0IHdhaXQgZm9yIHRoZQorb3BlcmF0aW5nIHN5c3RlbSdzIGNhcHR1cmUgYnVmZmVyIHRvIGZpbGwgdXAgYmVmb3JlIHBhY2tldHMgYXJlCitkZWxpdmVyZWQ7IGlmIHBhY2tldHMgYXJlIGFycml2aW5nIHNsb3dseSwgdGhhdCB3YWl0IGNvdWxkIHRha2UgYW4KK2FyYml0cmFyaWx5IGxvbmcgcGVyaW9kIG9mIHRpbWUuCisuSVAKK05vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgYSByZWFkIHRpbWVvdXQ7IG9uIHBsYXRmb3JtcyB0aGF0Citkb24ndCwgdGhlIHJlYWQgdGltZW91dCBpcyBpZ25vcmVkLiAgQSB6ZXJvIHZhbHVlIGZvciB0aGUgdGltZW91dCwKK29uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgYSByZWFkIHRpbWVvdXQsIGhhcyBwbGF0Zm9ybS1kZXBlbmRlbnQKK2JlaGF2aW9yIHRoYXQgY291bGQgY2F1c2UgYSByZWFkIHRvIHdhaXQgZm9yIGFuIHVubGltaXRlZCBhbW91bnQKK29mIHRpbWUgdW50aWwgdGhlIGNhcHR1cmUgYnVmZmVyIGZpbGxzIHVwIG9yIGNvdWxkIGNhdXNlIGEgcmVhZCB0aW1lb3V0CitvZiAxIG1pbGxpc2Vjb25kIHRvIGJlIHVzZWQuICBXZSByZWNvbW1lbmQgdGhhdCBhIHZhbHVlIG9mIHplcm8gbm90IGJlCit1c2VkLgorLklQCisuQlIgTk9URSA6Cit0aGUgcmVhZCB0aW1lb3V0IGNhbm5vdCBiZSB1c2VkIHRvIGNhdXNlIGNhbGxzIHRoYXQgcmVhZAorcGFja2V0cyB0byByZXR1cm4gd2l0aGluIGEgbGltaXRlZCBwZXJpb2Qgb2YgdGltZSwgYmVjYXVzZSwgb24gc29tZQorcGxhdGZvcm1zLCB0aGUgcmVhZCB0aW1lb3V0IGlzbid0IHN1cHBvcnRlZCwgYW5kLCBvbiBvdGhlciBwbGF0Zm9ybXMsCit0aGUgdGltZXIgZG9lc24ndCBzdGFydCB1bnRpbCBhdCBsZWFzdCBvbmUgcGFja2V0IGFycml2ZXMuICBUaGlzIG1lYW5zCit0aGF0IHRoZSByZWFkIHRpbWVvdXQgc2hvdWxkCisuQiBOT1QKK2JlIHVzZWQsIGZvciBleGFtcGxlLCBpbiBhbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbiB0byBhbGxvdyB0aGUgcGFja2V0CitjYXB0dXJlIGxvb3AgdG8gYGBwb2xsJycgZm9yIHVzZXIgaW5wdXQgcGVyaW9kaWNhbGx5LCBhcyB0aGVyZSdzIG5vCitndWFyYW50ZWUgdGhhdCBhIGNhbGwgcmVhZGluZyBwYWNrZXRzIHdpbGwgcmV0dXJuIGFmdGVyIHRoZSB0aW1lb3V0CitleHBpcmVzIGV2ZW4gaWYgbm8gcGFja2V0cyBoYXZlIGFycml2ZWQuCisuSVAKK1RoZSByZWFkIHRpbWVvdXQgaXMgc2V0IHdpdGgKKy5CUiBwY2FwX3NldF90aW1lb3V0ICgpLgorLklQICJidWZmZXIgc2l6ZSIKK1BhY2tldHMgdGhhdCBhcnJpdmUgZm9yIGEgY2FwdHVyZSBhcmUgc3RvcmVkIGluIGEgYnVmZmVyLCBzbyB0aGF0IHRoZXkKK2RvIG5vdCBoYXZlIHRvIGJlIHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFzIHNvb24gYXMgdGhleSBhcnJpdmUuICBPbgorc29tZSBwbGF0Zm9ybXMsIHRoZSBidWZmZXIncyBzaXplIGNhbiBiZSBzZXQ7IGEgc2l6ZSB0aGF0J3MgdG9vIHNtYWxsCitjb3VsZCBtZWFuIHRoYXQsIGlmIHRvbyBtYW55IHBhY2tldHMgYXJlIGJlaW5nIGNhcHR1cmVkIGFuZCB0aGUgc25hcHNob3QKK2xlbmd0aCBkb2Vzbid0IGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0J3MgYnVmZmVyZWQsIHBhY2tldHMgY291bGQKK2JlIGRyb3BwZWQgaWYgdGhlIGJ1ZmZlciBmaWxscyB1cCBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIGNhbiByZWFkCitwYWNrZXRzIGZyb20gaXQsIHdoaWxlIGEgc2l6ZSB0aGF0J3MgdG9vIGxhcmdlIGNvdWxkIHVzZSBtb3JlCitub24tcGFnZWFibGUgb3BlcmF0aW5nIHN5c3RlbSBtZW1vcnkgdGhhbiBpcyBuZWNlc3NhcnkgdG8gcHJldmVudAorcGFja2V0cyBmcm9tIGJlaW5nIGRyb3BwZWQuCisuSVAKK1RoZSBidWZmZXIgc2l6ZSBpcyBzZXQgd2l0aAorLkJSIHBjYXBfc2V0X2J1ZmZlcl9zaXplICgpLgorLklQICJ0aW1lc3RhbXAgdHlwZSIKK09uIHNvbWUgcGxhdGZvcm1zLCB0aGUgdGltZSBzdGFtcCBnaXZlbiB0byBwYWNrZXRzIG9uIGxpdmUgY2FwdHVyZXMgY2FuCitjb21lIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgdGhhdCBjYW4gaGF2ZSBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgb3IgdGhhdAorY2FuIGhhdmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgdG8gdGhlIHRpbWUgdmFsdWVzIGZvciB0aGUgY3VycmVudCB0aW1lCitzdXBwbGllZCBieSByb3V0aW5lcyBvbiB0aGUgbmF0aXZlIG9wZXJhdGluZyBzeXN0ZW0uICBTZWUKKy5CUiBwY2FwLXRzdGFtcCAoQE1BTl9NSVNDX0lORk9AKQorZm9yIGEgbGlzdCBvZiB0aW1lIHN0YW1wIHR5cGVzLgorLklQCitUaGUgdGltZSBzdGFtcCB0eXBlIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfdHN0YW1wX3R5cGUgKCkuCisuUFAKK1JlYWRpbmcgcGFja2V0cyBmcm9tIGEgbmV0d29yayBpbnRlcmZhY2UgbWF5IHJlcXVpcmUgdGhhdCB5b3UgaGF2ZQorc3BlY2lhbCBwcml2aWxlZ2VzOgorLlRQCisuQiBVbmRlciBTdW5PUyAzLnggb3IgNC54IHdpdGggTklUIG9yIEJQRjoKK1lvdSBtdXN0IGhhdmUgcmVhZCBhY2Nlc3MgdG8KKy5JIC9kZXYvbml0CitvcgorLklSIC9kZXYvYnBmKiAuCisuVFAKKy5CIFVuZGVyIFNvbGFyaXMgd2l0aCBETFBJOgorWW91IG11c3QgaGF2ZSByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGUgbmV0d29yayBwc2V1ZG8gZGV2aWNlLCBlLmcuCisuSVIgL2Rldi9sZSAuCitPbiBhdCBsZWFzdCBzb21lIHZlcnNpb25zIG9mIFNvbGFyaXMsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IHN1ZmZpY2llbnQgdG8KK2FsbG93CisuSSB0Y3BkdW1wCit0byBjYXB0dXJlIGluIHByb21pc2N1b3VzIG1vZGU7IG9uIHRob3NlIHZlcnNpb25zIG9mIFNvbGFyaXMsIHlvdSBtdXN0CitiZSByb290LCBvciB0aGUgYXBwbGljYXRpb24gY2FwdHVyaW5nIHBhY2tldHMKK211c3QgYmUgaW5zdGFsbGVkIHNldHVpZCB0byByb290LCBpbiBvcmRlciB0byBjYXB0dXJlIGluIHByb21pc2N1b3VzCittb2RlLiAgTm90ZSB0aGF0LCBvbiBtYW55IChwZXJoYXBzIGFsbCkgaW50ZXJmYWNlcywgaWYgeW91IGRvbid0IGNhcHR1cmUKK2luIHByb21pc2N1b3VzIG1vZGUsIHlvdSB3aWxsIG5vdCBzZWUgYW55IG91dGdvaW5nIHBhY2tldHMsIHNvIGEgY2FwdHVyZQorbm90IGRvbmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBtYXkgbm90IGJlIHZlcnkgdXNlZnVsLgorLklQCitJbiBuZXdlciB2ZXJzaW9ucyBvZiBTb2xhcmlzLCB5b3UgbXVzdCBoYXZlIGJlZW4gZ2l2ZW4gdGhlCisuQiBuZXRfcmF3YWNjZXNzCitwcml2aWxlZ2U7IHRoaXMgaXMgYm90aCBuZWNlc3NhcnkgYW5kIHN1ZmZpY2llbnQgdG8gZ2l2ZSB5b3UgYWNjZXNzIHRvIHRoZQorbmV0d29yayBwc2V1ZG8tZGV2aWNlIC0gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIHByaXZpbGVnZXMgb24KK3RoYXQgZGV2aWNlLiAgQSB1c2VyIGNhbiBiZSBnaXZlbiB0aGF0IHByaXZpbGVnZSBieSwgZm9yIGV4YW1wbGUsIGFkZGluZwordGhhdCBwcml2aWxlZ2UgdG8gdGhlIHVzZXIncworLkIgZGVmYXVsdHByaXYKK2tleSB3aXRoIHRoZQorLkIgdXNlcm1vZCAoMU0pCitjb21tYW5kLgorLlRQCisuQiBVbmRlciBIUC1VWCB3aXRoIERMUEk6CitZb3UgbXVzdCBiZSByb290IG9yIHRoZSBhcHBsaWNhdGlvbiBjYXB0dXJpbmcgcGFja2V0cyBtdXN0IGJlIGluc3RhbGxlZAorc2V0dWlkIHRvIHJvb3QuCisuVFAKKy5CIFVuZGVyIElSSVggd2l0aCBzbm9vcDoKK1lvdSBtdXN0IGJlIHJvb3Qgb3IgdGhlIGFwcGxpY2F0aW9uIGNhcHR1cmluZyBwYWNrZXRzIG11c3QgYmUgaW5zdGFsbGVkCitzZXR1aWQgdG8gcm9vdC4KKy5UUAorLkIgVW5kZXIgTGludXg6CitZb3UgbXVzdCBiZSByb290IG9yIHRoZSBhcHBsaWNhdGlvbiBjYXB0dXJpbmcgcGFja2V0cyBtdXN0IGJlIGluc3RhbGxlZAorc2V0dWlkIHRvIHJvb3QgKHVubGVzcyB5b3VyIGRpc3RyaWJ1dGlvbiBoYXMgYSBrZXJuZWwKK3RoYXQgc3VwcG9ydHMgY2FwYWJpbGl0eSBiaXRzIHN1Y2ggYXMgQ0FQX05FVF9SQVcgYW5kIGNvZGUgdG8gYWxsb3cKK3Rob3NlIGNhcGFiaWxpdHkgYml0cyB0byBiZSBnaXZlbiB0byBwYXJ0aWN1bGFyIGFjY291bnRzIGFuZCB0byBjYXVzZQordGhvc2UgYml0cyB0byBiZSBzZXQgb24gYSB1c2VyJ3MgaW5pdGlhbCBwcm9jZXNzZXMgd2hlbiB0aGV5IGxvZyBpbiwgaW4KK3doaWNoIGNhc2UgeW91ICBtdXN0IGhhdmUgQ0FQX05FVF9SQVcgaW4gb3JkZXIgdG8gY2FwdHVyZSBhbmQKK0NBUF9ORVRfQURNSU4gdG8gZW51bWVyYXRlIG5ldHdvcmsgZGV2aWNlcyB3aXRoLCBmb3IgZXhhbXBsZSwgdGhlCisuQiBcLUQKK2ZsYWcpLgorLlRQCisuQiBVbmRlciBVTFRSSVggYW5kIERpZ2l0YWwgVU5JWC9UcnU2NCBVTklYOgorQW55IHVzZXIgbWF5IGNhcHR1cmUgbmV0d29yayB0cmFmZmljLgorSG93ZXZlciwgbm8gdXNlciAobm90IGV2ZW4gdGhlIHN1cGVyLXVzZXIpIGNhbiBjYXB0dXJlIGluIHByb21pc2N1b3VzCittb2RlIG9uIGFuIGludGVyZmFjZSB1bmxlc3MgdGhlIHN1cGVyLXVzZXIgaGFzIGVuYWJsZWQgcHJvbWlzY3VvdXMtbW9kZQorb3BlcmF0aW9uIG9uIHRoYXQgaW50ZXJmYWNlIHVzaW5nCisuSVIgcGZjb25maWcgKDgpLAorYW5kIG5vIHVzZXIgKG5vdCBldmVuIHRoZSBzdXBlci11c2VyKSBjYW4gY2FwdHVyZSB1bmljYXN0IHRyYWZmaWMKK3JlY2VpdmVkIGJ5IG9yIHNlbnQgYnkgdGhlIG1hY2hpbmUgb24gYW4gaW50ZXJmYWNlIHVubGVzcyB0aGUgc3VwZXItdXNlcgoraGFzIGVuYWJsZWQgY29weS1hbGwtbW9kZSBvcGVyYXRpb24gb24gdGhhdCBpbnRlcmZhY2UgdXNpbmcKKy5JUiBwZmNvbmZpZyAsCitzbworLkkgdXNlZnVsCitwYWNrZXQgY2FwdHVyZSBvbiBhbiBpbnRlcmZhY2UgcHJvYmFibHkgcmVxdWlyZXMgdGhhdCBlaXRoZXIKK3Byb21pc2N1b3VzLW1vZGUgb3IgY29weS1hbGwtbW9kZSBvcGVyYXRpb24sIG9yIGJvdGggbW9kZXMgb2YKK29wZXJhdGlvbiwgYmUgZW5hYmxlZCBvbiB0aGF0IGludGVyZmFjZS4KKy5UUAorLkIgVW5kZXIgQlNEICh0aGlzIGluY2x1ZGVzIE1hYyBPUyBYKToKK1lvdSBtdXN0IGhhdmUgcmVhZCBhY2Nlc3MgdG8KKy5JIC9kZXYvYnBmKgorb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgYSBjbG9uaW5nIEJQRiBkZXZpY2UsIG9yIHRvCisuSSAvZGV2L2JwZgorb24gc3lzdGVtcyB0aGF0IGRvLgorT24gQlNEcyB3aXRoIGEgZGV2ZnMgKHRoaXMgaW5jbHVkZXMgTWFjIE9TIFgpLCB0aGlzIG1pZ2h0IGludm9sdmUgbW9yZQordGhhbiBqdXN0IGhhdmluZyBzb21lYm9keSB3aXRoIHN1cGVyLXVzZXIgYWNjZXNzIHNldHRpbmcgdGhlIG93bmVyc2hpcAorb3IgcGVybWlzc2lvbnMgb24gdGhlIEJQRiBkZXZpY2VzIC0gaXQgbWlnaHQgaW52b2x2ZSBjb25maWd1cmluZyBkZXZmcwordG8gc2V0IHRoZSBvd25lcnNoaXAgb3IgcGVybWlzc2lvbnMgZXZlcnkgdGltZSB0aGUgc3lzdGVtIGlzIGJvb3RlZCwKK2lmIHRoZSBzeXN0ZW0gZXZlbiBzdXBwb3J0cyB0aGF0OyBpZiBpdCBkb2Vzbid0IHN1cHBvcnQgdGhhdCwgeW91IG1pZ2h0CitoYXZlIHRvIGZpbmQgc29tZSBvdGhlciB3YXkgdG8gbWFrZSB0aGF0IGhhcHBlbiBhdCBib290IHRpbWUuCisuUFAKK1JlYWRpbmcgYSBzYXZlZCBwYWNrZXQgZmlsZSBkb2Vzbid0IHJlcXVpcmUgc3BlY2lhbCBwcml2aWxlZ2VzLgorLlBQCitUaGUgcGFja2V0cyByZWFkIGZyb20gdGhlIGhhbmRsZSBtYXkgaW5jbHVkZSBhIGBgcHNldWRvLWhlYWRlcicnCitjb250YWluaW5nIHZhcmlvdXMgZm9ybXMgb2YgcGFja2V0IG1ldGEtZGF0YSwgYW5kIHByb2JhYmx5IGluY2x1ZGVzIGEKK2xpbmstbGF5ZXIgaGVhZGVyIHdob3NlIGNvbnRlbnRzIGNhbiBkaWZmZXIgZm9yIGRpZmZlcmVudCBuZXR3b3JrCitpbnRlcmZhY2VzLiAgVG8gZGV0ZXJtaW5lIHRoZSBmb3JtYXQgb2YgdGhlIHBhY2tldHMgc3VwcGxpZWQgYnkgdGhlCitoYW5kbGUsIGNhbGwKKy5CUiBwY2FwX2RhdGFsaW5rICgpOworLkkgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbAorbGlzdHMgdGhlIHZhbHVlcyBpdCByZXR1cm5zIGFuZCBkZXNjcmliZXMgdGhlIHBhY2tldCBmb3JtYXRzIHRoYXQKK2NvcnJlc3BvbmQgdG8gdGhvc2UgdmFsdWVzLgorLlBQCitEbworLkIgTk9UCithc3N1bWUgdGhhdCB0aGUgcGFja2V0cyBmb3IgYSBnaXZlbiBjYXB0dXJlIG9yIGBgc2F2ZWZpbGVgYCB3aWxsIGhhdmUKK2FueSBnaXZlbiBsaW5rLWxheWVyIGhlYWRlciB0eXBlLCBzdWNoIGFzCisuQiBETFRfRU4xME1CCitmb3IgRXRoZXJuZXQuICBGb3IgZXhhbXBsZSwgdGhlICJhbnkiIGRldmljZSBvbiBMaW51eCB3aWxsIGhhdmUgYQorbGluay1sYXllciBoZWFkZXIgdHlwZSBvZgorLkIgRExUX0xJTlVYX1NMTAorZXZlbiBpZiBhbGwgZGV2aWNlcyBvbiB0aGUgc3lzdGVtIGF0IHRoZSB0aW1lIHRoZSAiYW55IiBkZXZpY2UgaXMgb3BlbmVkCitoYXZlIHNvbWUgb3RoZXIgZGF0YSBsaW5rIHR5cGUsIHN1Y2ggYXMKKy5CIERMVF9FTjEwTUIKK2ZvciBFdGhlcm5ldC4KKy5QUAorVG8gb2J0YWluIHRoZQorLkIgIkZJTEVcICoiCitjb3JyZXNwb25kaW5nIHRvIGEKKy5CIHBjYXBfdAorb3BlbmVkIGZvciBhIGBgc2F2ZWZpbGUnJywgY2FsbAorLkJSIHBjYXBfZmlsZSAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9jcmVhdGUgKDNQQ0FQKQorZ2V0IGEKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9hY3RpdmF0ZSAoM1BDQVApCithY3RpdmF0ZSBhCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZmluZGFsbGRldnMgKDNQQ0FQKQorZ2V0IGEgbGlzdCBvZiBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCBmb3IgYSBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZnJlZWFsbGRldnMgKDNQQ0FQKQorZnJlZSBsaXN0IG9mIGRldmljZXMKKy5UUAorLkJSIHBjYXBfbG9va3VwZGV2ICgzUENBUCkKK2dldCBmaXJzdCBub24tbG9vcGJhY2sgZGV2aWNlIG9uIHRoYXQgbGlzdAorLlRQCisuQlIgcGNhcF9vcGVuX29mZmxpbmUgKDNQQ0FQKQorb3BlbiBhCisuQiBwY2FwX3QKK2ZvciBhIGBgc2F2ZWZpbGUnJywgZ2l2ZW4gYSBwYXRobmFtZQorLlRQCisuQlIgcGNhcF9mb3Blbl9vZmZsaW5lICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF90Citmb3IgYSBgYHNhdmVmaWxlJycsIGdpdmVuIGEKKy5CICJGSUxFXCAqIgorLlRQCisuQlIgcGNhcF9vcGVuX2RlYWQgKDNQQ0FQKQorY3JlYXRlIGEgYGBmYWtlJycKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9jbG9zZSAoM1BDQVApCitjbG9zZSBhCisuQiBwY2FwX3QKKy5UUAorLkJSIHBjYXBfc2V0X3NuYXBsZW4gKDNQQ0FQKQorc2V0IHRoZSBzbmFwc2hvdCBsZW5ndGggZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9zbmFwc2hvdCAoM1BDQVApCitnZXQgdGhlIHNuYXBzaG90IGxlbmd0aCBmb3IgYQorLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX3NldF9wcm9taXNjICgzUENBUCkKK3NldCBwcm9taXNjdW91cyBtb2RlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfc2V0X3JmbW9uICgzUENBUCkKK3NldCBtb25pdG9yIG1vZGUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9jYW5fc2V0X3JmbW9uICgzUENBUCkKK2RldGVybWluZSB3aGV0aGVyIG1vbml0b3IgbW9kZSBjYW4gYmUgc2V0IGZvciBhCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfc2V0X3RpbWVvdXQgKDNQQ0FQKQorc2V0IHJlYWQgdGltZW91dCBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX3NldF9idWZmZXJfc2l6ZSAoM1BDQVApCitzZXQgYnVmZmVyIHNpemUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9zZXRfdHN0YW1wX3R5cGUgKDNQQ0FQKQorc2V0IHRpbWUgc3RhbXAgdHlwZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzICgzUENBUCkKK2dldCBsaXN0IG9mIGF2YWlsYWJsZSB0aW1lIHN0YW1wIHR5cGVzIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZnJlZV90c3RhbXBfdHlwZXMgKDNQQ0FQKQorZnJlZSBsaXN0IG9mIGF2YWlsYWJsZSB0aW1lIHN0YW1wIHR5cGVzCisuVFAKKy5CUiBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lICgzUENBUCkKK2dldCBuYW1lIGZvciBhIHRpbWUgc3RhbXAgdHlwZQorLlRQCisuQlIgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24gKDNQQ0FQKQorZ2V0IGRlc2NyaXB0aW9uIGZvciBhIHRpbWUgc3RhbXAgdHlwZQorLlRQCisuQlIgcGNhcF90c3RhbXBfbmFtZV90b192YWwgKDNQQ0FQKQorZ2V0IHRpbWUgc3RhbXAgdHlwZSBjb3JyZXNwb25kaW5nIHRvIGEgbmFtZQorLlRQCisuQlIgcGNhcF9kYXRhbGluayAoM1BDQVApCitnZXQgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgYQorLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX2ZpbGUgKDNQQ0FQKQorZ2V0IHRoZQorLkIgIkZJTEVcICoiCitmb3IgYQorLkIgcGNhcF90CitvcGVuZWQgZm9yIGEgYGBzYXZlZmlsZScnCisuVFAKKy5CUiBwY2FwX2lzX3N3YXBwZWQgKDNQQ0FQKQorZGV0ZXJtaW5lIHdoZXRoZXIgYSBgYHNhdmVmaWxlJycgYmVpbmcgcmVhZCBjYW1lIGZyb20gYSBtYWNoaW5lIHdpdGggdGhlCitvcHBvc2l0ZSBieXRlIG9yZGVyCisuVFAKKy5CUiBwY2FwX21ham9yX3ZlcnNpb24gKDNQQ0FQKQorLlBEIDAKKy5UUAorLkJSIHBjYXBfbWlub3JfdmVyc2lvbiAoM1BDQVApCitnZXQgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG9mIHRoZSBmaWxlIGZvcm1hdCB2ZXJzaW9uIGZvciBhCitgYHNhdmVmaWxlJycKKy5QRAorLlJFCisuU1MgU2VsZWN0aW5nIGEgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgYSBsaXZlIGNhcHR1cmUKK1NvbWUgZGV2aWNlcyBtYXkgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUuICBUbworb2J0YWluIGEgbGlzdCBvZiBhbGwgbGluay1sYXllciBoZWFkZXIgdHlwZXMgcHJvdmlkZWQgYnkgYSBkZXZpY2UsIGNhbGwKKy5CUiBwY2FwX2xpc3RfZGF0YWxpbmtzICgpCitvbiBhbiBhY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIHRoZSBkZXZpY2UuCitUbyBmcmVlIGEgbGlzdCBvZiBsaW5rLWxheWVyIGhlYWRlciB0eXBlcywgY2FsbAorLkJSIHBjYXBfZnJlZV9kYXRhbGlua3MgKCkuCitUbyBzZXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIGEgZGV2aWNlLCBjYWxsCisuQlIgcGNhcF9zZXRfZGF0YWxpbmsgKCkuCitUaGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBkZXZpY2UgaGFzIGJlZW4gYWN0aXZhdGVkIGJ1dCBiZWZvcmUgYW55CitwYWNrZXRzIGFyZSByZWFkIGFuZCBiZWZvcmUgYW55IGZpbHRlcnMgYXJlIGNvbXBpbGVkIG9yIGluc3RhbGxlZC4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9saXN0X2RhdGFsaW5rcyAoM1BDQVApCitnZXQgYSBsaXN0IG9mIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIGZvciBhIGRldmljZQorLlRQCisuQlIgcGNhcF9mcmVlX2RhdGFsaW5rcyAoM1BDQVApCitmcmVlIGxpc3Qgb2YgbGluay1sYXllciBoZWFkZXIgdHlwZXMKKy5UUAorLkJSIHBjYXBfc2V0X2RhdGFsaW5rICgzUENBUCkKK3NldCBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGZvciBhIGRldmljZQorLlRQCisuQlIgcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZSAoM1BDQVApCitnZXQgbmFtZSBmb3IgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisuVFAKKy5CUiBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiAoM1BDQVApCitnZXQgZGVzY3JpcHRpb24gZm9yIGEgbGluay1sYXllciBoZWFkZXIgdHlwZQorLlRQCisuQlIgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCAoM1BDQVApCitnZXQgbGluay1sYXllciBoZWFkZXIgdHlwZSBjb3JyZXNwb25kaW5nIHRvIGEgbmFtZQorLlJFCisuU1MgUmVhZGluZyBwYWNrZXRzCitQYWNrZXRzIGFyZSByZWFkIHdpdGgKKy5CUiBwY2FwX2Rpc3BhdGNoICgpCitvcgorLkJSIHBjYXBfbG9vcCAoKSwKK3doaWNoIHByb2Nlc3Mgb25lIG9yIG1vcmUgcGFja2V0cywgY2FsbGluZyBhIGNhbGxiYWNrIHJvdXRpbmUgZm9yIGVhY2gKK3BhY2tldCwgb3Igd2l0aAorLkJSIHBjYXBfbmV4dCAoKQorb3IKKy5CUiBwY2FwX25leHRfZXggKCksCit3aGljaCByZXR1cm4gdGhlIG5leHQgcGFja2V0LgorVGhlIGNhbGxiYWNrIGZvcgorLkJSIHBjYXBfZGlzcGF0Y2ggKCkKK2FuZAorLkJSIHBjYXBfbG9vcCAoKQoraXMgc3VwcGxpZWQgYSBwb2ludGVyIHRvIGEKKy5JUiAic3RydWN0IHBjYXBfcGt0aGRyIiAsCit3aGljaCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisuUlMKKy5UUAorLkIgdHMKK2EKKy5JIHN0cnVjdCB0aW1ldmFsCitjb250YWluaW5nIHRoZSB0aW1lIHdoZW4gdGhlIHBhY2tldCB3YXMgY2FwdHVyZWQKKy5UUAorLkIgY2FwbGVuCithCisuSSBicGZfdV9pbnQzMgorZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIHBhY2tldCB0aGF0IGFyZSBhdmFpbGFibGUgZnJvbSB0aGUKK2NhcHR1cmUKKy5UUAorLkIgbGVuCithCisuSSBicGZfdV9pbnQzMgorZ2l2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCwgaW4gYnl0ZXMgKHdoaWNoIG1pZ2h0IGJlIG1vcmUgdGhhbiB0aGUKK251bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZnJvbSB0aGUgY2FwdHVyZSwgaWYgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0CitpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY2FwdHVyZSkuCisuUkUKKy5QUAorVGhlIGNhbGxiYWNrIGlzIGFsc28gc3VwcGxpZWQgYQorLkkgY29uc3QgdV9jaGFyCitwb2ludGVyIHRvIHRoZSBmaXJzdAorLkIgY2FwbGVuCisoYXMgZ2l2ZW4gaW4gdGhlCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK21lbnRpb25lZCBhYm92ZSkKK2J5dGVzIG9mIGRhdGEgZnJvbSB0aGUgcGFja2V0LiAgVGhpcyB3b24ndCBuZWNlc3NhcmlseSBiZSB0aGUgZW50aXJlCitwYWNrZXQ7IHRvIGNhcHR1cmUgdGhlIGVudGlyZSBwYWNrZXQsIHlvdSB3aWxsIGhhdmUgdG8gcHJvdmlkZSBhIHZhbHVlCitmb3IKKy5JIHNuYXBsZW4KK2luIHlvdXIgY2FsbCB0bworLkJSIHBjYXBfc2V0X3NuYXBsZW4gKCkKK3RoYXQgaXMgc3VmZmljaWVudGx5IGxhcmdlIHRvIGdldCBhbGwgb2YgdGhlIHBhY2tldCdzIGRhdGEgLSBhIHZhbHVlIG9mCis2NTUzNSBzaG91bGQgYmUgc3VmZmljaWVudCBvbiBtb3N0IGlmIG5vdCBhbGwgbmV0d29ya3MpLiAgV2hlbiByZWFkaW5nCitmcm9tIGEgYGBzYXZlZmlsZScnLCB0aGUgc25hcHNob3QgbGVuZ3RoIHNwZWNpZmllZCB3aGVuIHRoZSBjYXB0dXJlIHdhcworcGVyZm9ybWVkIHdpbGwgbGltaXQgdGhlIGFtb3VudCBvZiBwYWNrZXQgZGF0YSBhdmFpbGFibGUuCisuUFAKKy5CUiBwY2FwX25leHQgKCkKK2lzIHBhc3NlZCBhbiBhcmd1bWVudCB0aGF0IHBvaW50cyB0byBhCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK3N0cnVjdHVyZSwgYW5kIGZpbGxzIGl0IGluIHdpdGggdGhlIHRpbWUgc3RhbXAgYW5kIGxlbmd0aCB2YWx1ZXMgZm9yIHRoZQorcGFja2V0LiAgSXQgcmV0dXJucyBhCisuSSBjb25zdCB1X2NoYXIKK3RvIHRoZSBmaXJzdAorLkIgY2FwbGVuCitieXRlcyBvZiB0aGUgcGFja2V0IG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGVycm9yLgorLlBQCisuQlIgcGNhcF9uZXh0X2V4ICgpCitpcyBwYXNzZWQgdHdvIHBvaW50ZXIgYXJndW1lbnRzLCBvbmUgb2Ygd2hpY2ggcG9pbnRzIHRvIGEKKy5JUiBzdHJ1Y3QgcGNhcF9wa3RoZHIgKgorYW5kIG9uZSBvZiB3aGljaCBwb2ludHMgdG8gYSAKKy5JUiAiY29uc3QgdV9jaGFyIiAqLgorSXQgc2V0cyB0aGUgZmlyc3QgcG9pbnRlciB0byBwb2ludCB0byBhCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK3N0cnVjdHVyZSB3aXRoIHRoZSB0aW1lIHN0YW1wIGFuZCBsZW5ndGggdmFsdWVzIGZvciB0aGUgcGFja2V0LCBhbmQgc2V0cwordGhlIHNlY29uZCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBmaXJzdAorLkIgY2FwbGVuCitieXRlcyBvZiB0aGUgcGFja2V0LgorLlBQCitUbyBmb3JjZSB0aGUgbG9vcCBpbgorLkJSIHBjYXBfZGlzcGF0Y2ggKCkKK29yCisuQlIgcGNhcF9sb29wICgpCit0byB0ZXJtaW5hdGUsIGNhbGwKKy5CUiBwY2FwX2JyZWFrbG9vcCAoKS4KKy5QUAorQnkgZGVmYXVsdCwgd2hlbiByZWFkaW5nIHBhY2tldHMgZnJvbSBhbiBpbnRlcmZhY2Ugb3BlbmVkIGZvciBhIGxpdmUKK2NhcHR1cmUsCisuQlIgcGNhcF9kaXNwYXRjaCAoKSwKKy5CUiBwY2FwX25leHQgKCksCithbmQKKy5CUiBwY2FwX25leHRfZXggKCkKK3dpbGwsIGlmIG5vIHBhY2tldHMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgdG8gYmUgcmVhZCwgYmxvY2sgd2FpdGluZworZm9yIHBhY2tldHMgdG8gYmVjb21lIGF2YWlsYWJsZS4gIE9uIHNvbWUsIGJ1dAorLkkgbm90CithbGwsIHBsYXRmb3JtcywgaWYgYSByZWFkIHRpbWVvdXQgd2FzIHNwZWNpZmllZCwgdGhlIHdhaXQgd2lsbCB0ZXJtaW5hdGUKK2FmdGVyIHRoZSByZWFkIHRpbWVvdXQgZXhwaXJlczsgYXBwbGljYXRpb25zIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IKK3RoaXMsIGFzIGl0IGhhcHBlbnMgb24gc29tZSBwbGF0Zm9ybXMsIGJ1dCBzaG91bGQgbm90IHJlbHkgb24gaXQsIGFzIGl0Citkb2VzIG5vdCBoYXBwZW4gb24gb3RoZXIgcGxhdGZvcm1zLgorLlBQCitBIGhhbmRsZSBjYW4gYmUgcHV0IGludG8gYGBub24tYmxvY2tpbmcgbW9kZScnLCBzbyB0aGF0IHRob3NlIHJvdXRpbmVzCit3aWxsLCByYXRoZXIgdGhhbiBibG9ja2luZywgcmV0dXJuIGFuIGluZGljYXRpb24gdGhhdCBubyBwYWNrZXRzIGFyZQorYXZhaWxhYmxlIHRvIHJlYWQuICBDYWxsCisuQlIgcGNhcF9zZXRub25ibG9jayAoKQordG8gcHV0IGEgaGFuZGxlIGludG8gbm9uLWJsb2NraW5nIG1vZGUgb3IgdG8gdGFrZSBpdCBvdXQgb2Ygbm9uLWJsb2NraW5nCittb2RlOyBjYWxsCisuQlIgcGNhcF9nZXRub25ibG9jayAoKQordG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBoYW5kbGUgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUuICBOb3RlIHRoYXQKK25vbi1ibG9ja2luZyBtb2RlIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGluIE1hYyBPUyBYIDEwLjYuCisuUFAKK05vbi1ibG9ja2luZyBtb2RlIGlzIG9mdGVuIGNvbWJpbmVkIHdpdGggcm91dGluZXMgc3VjaCBhcworLkJSIHNlbGVjdCAoMikKK29yCisuQlIgcG9sbCAoMikKK29yIG90aGVyIHJvdXRpbmVzIGEgcGxhdGZvcm0gb2ZmZXJzIHRvIHdhaXQgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgZGF0YQorb24gYW55IG9mIGEgc2V0IG9mIGRlc2NyaXB0b3JzLiAgVG8gb2J0YWluLCBmb3IgYSBoYW5kbGUsIGEgZGVzY3JpcHRvcgordGhhdCBjYW4gYmUgdXNlZCBpbiB0aG9zZSByb3V0aW5lcywgY2FsbAorLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQgKCkuCitOb3QgYWxsIGhhbmRsZXMgaGF2ZSBzdWNoIGEgZGVzY3JpcHRvciBhdmFpbGFibGU7CisuQlIgcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCAoKQord2lsbCByZXR1cm4gXC0xIGlmIG5vIHN1Y2ggZGVzY3JpcHRvciBleGlzdHMuICBJbiBhZGRpdGlvbiwgZm9yIHZhcmlvdXMKK3JlYXNvbnMsIG9uZSBvciBtb3JlIG9mIHRob3NlIHJvdXRpbmVzIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUKK2Rlc2NyaXB0b3I7IHRoZSBkb2N1bWVudGF0aW9uIGZvcgorLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQgKCkKK2dpdmVzIGRldGFpbHMuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfZGlzcGF0Y2ggKDNQQ0FQKQorcmVhZCBhIGJ1ZmZlcmZ1bCBvZiBwYWNrZXRzIGZyb20gYQorLkIgcGNhcF90CitvcGVuIGZvciBhIGxpdmUgY2FwdHVyZSBvciB0aGUgZnVsbCBzZXQgb2YgcGFja2V0cyBmcm9tIGEKKy5CIHBjYXBfdAorb3BlbiBmb3IgYSBgYHNhdmVmaWxlJycKKy5UUAorLkJSIHBjYXBfbG9vcCAoM1BDQVApCityZWFkIHBhY2tldHMgZnJvbSBhCisuQiBwY2FwX3QKK3VudGlsIGFuIGludGVycnVwdCBvciBlcnJvciBvY2N1cnMKKy5UUAorLkJSIHBjYXBfbmV4dCAoM1BDQVApCityZWFkIHRoZSBuZXh0IHBhY2tldCBmcm9tIGEKKy5CIHBjYXBfdAord2l0aG91dCBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJyZWQKKy5UUAorLkJSIHBjYXBfbmV4dF9leCAoM1BDQVApCityZWFkIHRoZSBuZXh0IHBhY2tldCBmcm9tIGEKKy5CIHBjYXBfdAord2l0aCBhbiBlcnJvciBpbmRpY2F0aW9uIG9uIGFuIGVycm9yCisuVFAKKy5CUiBwY2FwX2JyZWFrbG9vcCAoM1BDQVApCitwcmVtYXR1cmVseSB0ZXJtaW5hdGUgdGhlIGxvb3AgaW4KKy5CUiBwY2FwX2Rpc3BhdGNoICgpCitvcgorLkJSIHBjYXBfbG9vcCAoKQorLlRQCisuQlIgcGNhcF9zZXRub25ibG9jayAoM1BDQVApCitzZXQgb3IgY2xlYXIgbm9uLWJsb2NraW5nIG1vZGUgb24gYQorLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX2dldG5vbmJsb2NrICgzUENBUCkKK2dldCB0aGUgc3RhdGUgb2Ygbm9uLWJsb2NraW5nIG1vZGUgZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCAoM1BDQVApCithdHRlbXB0IHRvIGdldCBhIGRlc2NyaXB0b3IgZm9yIGEKKy5CIHBjYXBfdAordGhhdCBjYW4gYmUgdXNlZCBpbiBjYWxscyBzdWNoIGFzCisuQlIgc2VsZWN0ICgyKQorYW5kCisuQlIgcG9sbCAoMikKKy5SRQorLlNTIEZpbHRlcnMKK0luIG9yZGVyIHRvIGNhdXNlIG9ubHkgY2VydGFpbiBwYWNrZXRzIHRvIGJlIHJldHVybmVkIHdoZW4gcmVhZGluZworcGFja2V0cywgYSBmaWx0ZXIgY2FuIGJlIHNldCBvbiBhIGhhbmRsZS4gIEZvciBhIGxpdmUgY2FwdHVyZSwgdGhlCitmaWx0ZXJpbmcgd2lsbCBiZSBwZXJmb3JtZWQgaW4ga2VybmVsIG1vZGUsIGlmIHBvc3NpYmxlLCB0byBhdm9pZAorY29weWluZyBgYHVuaW50ZXJlc3RpbmcnJyBwYWNrZXRzIGZyb20gdGhlIGtlcm5lbCB0byB1c2VyIG1vZGUuCisuUFAKK0EgZmlsdGVyIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSB0ZXh0IHN0cmluZzsgdGhlIHN5bnRheCBhbmQgc2VtYW50aWNzIG9mCit0aGUgc3RyaW5nIGFyZSBhcyBkZXNjcmliZWQgYnkKKy5CUiBwY2FwLWZpbHRlciAoQE1BTl9NSVNDX0lORk9AKS4KK0EgZmlsdGVyIHN0cmluZyBpcyBjb21waWxlZCBpbnRvIGEgcHJvZ3JhbSBpbiBhIHBzZXVkby1tYWNoaW5lLWxhbmd1YWdlCitieQorLkJSIHBjYXBfY29tcGlsZSAoKQorYW5kIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSBjYW4gYmUgbWFkZSBhIGZpbHRlciBmb3IgYSBoYW5kbGUgd2l0aAorLkJSIHBjYXBfc2V0ZmlsdGVyICgpLgorVGhlIHJlc3VsdCBvZgorLkJSIHBjYXBfY29tcGlsZSAoKQorY2FuIGJlIGZyZWVkIHdpdGggYSBjYWxsIHRvCisuQlIgcGNhcF9mcmVlY29kZSAoKS4KKy5CUiBwY2FwX2NvbXBpbGUgKCkKK21heSByZXF1aXJlIGEgbmV0d29yayBtYXNrIGZvciBjZXJ0YWluIGV4cHJlc3Npb25zIGluIHRoZSBmaWx0ZXIgc3RyaW5nOworLkJSIHBjYXBfbG9va3VwbmV0ICgpCitjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBuZXR3b3JrIGFkZHJlc3MgYW5kIG5ldHdvcmsgbWFzayBmb3IgYSBnaXZlbgorY2FwdHVyZSBkZXZpY2UuCisuUFAKK0EgY29tcGlsZWQgZmlsdGVyIGNhbiBhbHNvIGJlIGFwcGxpZWQgZGlyZWN0bHkgdG8gYSBwYWNrZXQgdGhhdCBoYXMgYmVlbgorcmVhZCB1c2luZworLkJSIHBjYXBfb2ZmbGluZV9maWx0ZXIgKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfY29tcGlsZSAoM1BDQVApCitjb21waWxlIGZpbHRlciBleHByZXNzaW9uIHRvIGEgcHNldWRvLW1hY2hpbmUtbGFuZ3VhZ2UgY29kZSBwcm9ncmFtCisuVFAKKy5CUiBwY2FwX2ZyZWVjb2RlICgzUENBUCkKK2ZyZWUgYSBmaWx0ZXIgcHJvZ3JhbQorLlRQCisuQlIgcGNhcF9zZXRmaWx0ZXIgKDNQQ0FQKQorc2V0IGZpbHRlciBmb3IgYQorLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX2xvb2t1cG5ldCAoM1BDQVApCitnZXQgbmV0d29yayBhZGRyZXNzIGFuZCBuZXR3b3JrIG1hc2sgZm9yIGEgY2FwdHVyZSBkZXZpY2UKKy5UUAorLkJSIHBjYXBfb2ZmbGluZV9maWx0ZXIgKDNQQ0FQKQorYXBwbHkgYSBmaWx0ZXIgcHJvZ3JhbSB0byBhIHBhY2tldAorLlJFCisuU1MgSW5jb21pbmcgYW5kIG91dGdvaW5nIHBhY2tldHMKK0J5IGRlZmF1bHQsIGxpYnBjYXAgd2lsbCBhdHRlbXB0IHRvIGNhcHR1cmUgYm90aCBwYWNrZXRzIHNlbnQgYnkgdGhlCittYWNoaW5lIGFuZCBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBtYWNoaW5lLiAgVG8gbGltaXQgaXQgdG8gY2FwdHVyaW5nCitvbmx5IHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIG1hY2hpbmUgb3IsIGlmIHBvc3NpYmxlLCBvbmx5IHBhY2tldHMgc2VudAorYnkgdGhlIG1hY2hpbmUsIGNhbGwKKy5CUiBwY2FwX3NldGRpcmVjdGlvbiAoKS4KKy5UUAorLkJSIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfc2V0ZGlyZWN0aW9uICgzUENBUCkKK3NwZWNpZnkgd2hldGhlciB0byBjYXB0dXJlIGluY29taW5nIHBhY2tldHMsIG91dGdvaW5nIHBhY2tldHMsIG9yIGJvdGgKKy5SRQorLlNTIENhcHR1cmUgc3RhdGlzdGljcworVG8gZ2V0IHN0YXRpc3RpY3MgYWJvdXQgcGFja2V0cyByZWNlaXZlZCBhbmQgZHJvcHBlZCBpbiBhIGxpdmUgY2FwdHVyZSwKK2NhbGwKKy5CUiBwY2FwX3N0YXRzICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX3N0YXRzICgzUENBUCkKK2dldCBjYXB0dXJlIHN0YXRpc3RpY3MKKy5SRQorLlNTIE9wZW5pbmcgYSBoYW5kbGUgZm9yIHdyaXRpbmcgY2FwdHVyZWQgcGFja2V0cworVG8gb3BlbiBhIGBgc2F2ZWZpbGVgYCB0byB3aGljaCB0byB3cml0ZSBwYWNrZXRzLCBnaXZlbiB0aGUgcGF0aG5hbWUgdGhlCitgYHNhdmVmaWxlJycgc2hvdWxkIGhhdmUsIGNhbGwKKy5CUiBwY2FwX2R1bXBfb3BlbiAoKS4KK1RvIG9wZW4gYSBgYHNhdmVmaWxlYGAgdG8gd2hpY2ggdG8gd3JpdGUgcGFja2V0cywgZ2l2ZW4gdGhlIHBhdGhuYW1lIHRoZQorYGBzYXZlZmlsZScnIHNob3VsZCBoYXZlLCBjYWxsCisuQlIgcGNhcF9kdW1wX29wZW4gKCk7Cit0byBzZXQgdXAgYSBoYW5kbGUgZm9yIGEgYGBzYXZlZmlsZScnLCBnaXZlbiBhCisuQiAiRklMRVwgKiIKK3JlZmVycmluZyB0byBhIGZpbGUgYWxyZWFkeSBvcGVuZWQgZm9yIHdyaXRpbmcsIGNhbGwKKy5CUiBwY2FwX2R1bXBfZm9wZW4gKCkuCitUaGV5IGVhY2ggcmV0dXJuIHBvaW50ZXJzIHRvIGEKKy5CUiBwY2FwX2R1bXBlcl90ICwKK3doaWNoIGlzIHRoZSBoYW5kbGUgdXNlZCBmb3Igd3JpdGluZyBwYWNrZXRzIHRvIHRoZSBgYHNhdmVmaWxlJycuICBJZiBpdAorc3VjY2VlZHMsIGl0IHdpbGwgaGF2ZSBjcmVhdGVkIHRoZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kCit0cnVuY2F0ZWQgdGhlIGZpbGUgaWYgaXQgZG9lcyBleGlzdC4KK1RvIGNsb3NlIGEKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2NhbGwKKy5CUiBwY2FwX2R1bXBfY2xvc2UgKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfZHVtcF9vcGVuICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF9kdW1wZXJfdAorZm9yIGEgYGBzYXZlZmlsZWBgLCBnaXZlbiBhIHBhdGhuYW1lCisuVFAKKy5CUiBwY2FwX2R1bXBfZm9wZW4gKDNQQ0FQKQorb3BlbiBhCisuQiBwY2FwX2R1bXBlcl90Citmb3IgYSBgYHNhdmVmaWxlYGAsIGdpdmVuIGEKKy5CICJGSUxFXCAqIgorLlRQCisuQlIgcGNhcF9kdW1wX2Nsb3NlICgzUENBUCkKK2Nsb3NlIGEKKy5CIHBjYXBfZHVtcGVyX3QKKy5UUAorLkJSIHBjYXBfZHVtcF9maWxlICgzUENBUCkKK2dldCB0aGUKKy5CICJGSUxFXCAqIgorZm9yIGEKKy5CIHBjYXBfZHVtcGVyX3QKK29wZW5lZCBmb3IgYSBgYHNhdmVmaWxlJycKKy5SRQorLlNTIFdyaXRpbmcgcGFja2V0cworVG8gd3JpdGUgYSBwYWNrZXQgdG8gYQorLkJSIHBjYXBfZHVtcGVyX3QgLAorY2FsbAorLkJSIHBjYXBfZHVtcCAoKS4KK1BhY2tldHMgd3JpdHRlbiB3aXRoCisuQlIgcGNhcF9kdW1wICgpCittYXkgYmUgYnVmZmVyZWQsIHJhdGhlciB0aGFuIGJlaW5nIGltbWVkaWF0ZWx5IHdyaXR0ZW4gdG8gdGhlCitgYHNhdmVmaWxlJycuICBDbG9zaW5nIHRoZQorLkIgcGNhcF9kdW1wZXJfdAord2lsbCBjYXVzZSBhbGwgYnVmZmVyZWQtYnV0LW5vdC15ZXQtd3JpdHRlbiBwYWNrZXRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlCitgYHNhdmVmaWxlJycuCitUbyBmb3JjZSBhbGwgcGFja2V0cyB3cml0dGVuIHRvIHRoZQorLkJSIHBjYXBfZHVtcGVyX3QgLAorYW5kIG5vdCB5ZXQgd3JpdHRlbiB0byB0aGUgYGBzYXZlZmlsZScnIGJlY2F1c2UgdGhleSdyZSBidWZmZXJlZCBieSB0aGUKKy5CUiBwY2FwX2R1bXBlcl90ICwKK3RvIGJlIHdyaXR0ZW4gdG8gdGhlIGBgc2F2ZWZpbGUnJywgd2l0aG91dCBjbG9zaW5nIHRoZQorLkJSIHBjYXBfZHVtcGVyX3QgLAorY2FsbAorLkJSIHBjYXBfZHVtcF9mbHVzaCAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9kdW1wICgzUENBUCkKK3dyaXRlIHBhY2tldCB0byBhCisuQiBwY2FwX2R1bXBlcl90CisuVFAKKy5CUiBwY2FwX2R1bXBfZmx1c2ggKDNQQ0FQKQorZmx1c2ggYnVmZmVyZWQgcGFja2V0cyB3cml0dGVuIHRvIGEKKy5CIHBjYXBfZHVtcGVyX3QKK3RvIHRoZSBgYHNhdmVmaWxlJycKKy5UUAorLkJSIHBjYXBfZHVtcF9mdGVsbCAoM1BDQVApCitnZXQgY3VycmVudCBmaWxlIHBvc2l0aW9uIGZvciBhCisuQiBwY2FwX2R1bXBlcl90CisuUkUKKy5TUyBJbmplY3RpbmcgcGFja2V0cworSWYgeW91IGhhdmUgdGhlIHJlcXVpcmVkIHByaXZpbGVnZXMsIHlvdSBjYW4gaW5qZWN0IHBhY2tldHMgb250byBhCituZXR3b3JrIHdpdGggYQorLkIgcGNhcF90Citmb3IgYSBsaXZlIGNhcHR1cmUsIHVzaW5nCisuQlIgcGNhcF9pbmplY3QgKCkKK29yCisuQlIgcGNhcF9zZW5kcGFja2V0ICgpLgorKFRoZSB0d28gcm91dGluZXMgZXhpc3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBib3RoIE9wZW5CU0QgYW5kIFdpblBjYXA7Cit0aGV5IHBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb24sIGJ1dCBoYXZlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzLikKKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9pbmplY3QgKDNQQ0FQKQorLlBEIDAKKy5UUAorLkJSIHBjYXBfc2VuZHBhY2tldCAoM1BDQVApCit0cmFuc21pdCBhIHBhY2tldAorLlBECisuUkUKKy5TUyBSZXBvcnRpbmcgZXJyb3JzCitTb21lIHJvdXRpbmVzIHJldHVybiBlcnJvciBvciB3YXJuaW5nIHN0YXR1cyBjb2RlczsgdG8gY29udmVydCB0aGVtIHRvIGEKK3N0cmluZywgdXNlCisuQlIgcGNhcF9zdGF0dXN0b3N0ciAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9zdGF0dXN0b3N0ciAoM1BDQVApCitnZXQgYSBzdHJpbmcgZm9yIGFuIGVycm9yIG9yIHdhcm5pbmcgc3RhdHVzIGNvZGUKKy5SRQorLlNTIEdldHRpbmcgbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uCitUbyBnZXQgYSBzdHJpbmcgZ2l2aW5nIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgbGlicGNhcCwgY2FsbAorLkJSIHBjYXBfbGlicmFyeV92ZXJzaW9uICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2xpYnJhcnlfdmVyc2lvbiAoM1BDQVApCitnZXQgbGlicmFyeSB2ZXJzaW9uIHN0cmluZworLlJFCisuU0ggQkFDS1dBUkRTIENPTVBBVElCSUxJVFkKKy5QUAorSW4gdmVyc2lvbnMgb2YgbGlicGNhcCBwcmlvciB0byAxLjAsIHRoZQorLkIgcGNhcC5oCitoZWFkZXIgZmlsZSB3YXMgbm90IGluIGEKKy5CIHBjYXAKK2RpcmVjdG9yeSBvbiBtb3N0IHBsYXRmb3JtczsgaWYgeW91IGFyZSB3cml0aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgbXVzdAord29yayBvbiB2ZXJzaW9ucyBvZiBsaWJwY2FwIHByaW9yIHRvIDEuMCwgaW5jbHVkZQorLkJSIDxwY2FwLmg+ICwKK3doaWNoIHdpbGwgaW5jbHVkZQorLkIgPHBjYXAvcGNhcC5oPgorZm9yIHlvdSwgcmF0aGVyIHRoYW4gaW5jbHVkaW5nCisuQlIgPHBjYXAvcGNhcC5oPiAuCisuUFAKKy5CUiBwY2FwX2NyZWF0ZSAoKQorYW5kCisuQlIgcGNhcF9hY3RpdmF0ZSAoKQord2VyZSBub3QgYXZhaWxhYmxlIGluIHZlcnNpb25zIG9mIGxpYnBjYXAgcHJpb3IgdG8gMS4wOyBpZiB5b3UgYXJlCit3cml0aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgbXVzdCB3b3JrIG9uIHZlcnNpb25zIG9mIGxpYnBjYXAgcHJpb3IgdG8KKzEuMCwgZWl0aGVyIHVzZQorLkJSIHBjYXBfb3Blbl9saXZlICgpCit0byBnZXQgYSBoYW5kbGUgZm9yIGEgbGl2ZSBjYXB0dXJlIG9yLCBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSB0aGUKK2FkZGl0aW9uYWwgY2FwYWJpbGl0aWVzIG9mZmVyZWQgYnkgdXNpbmcKKy5CUiBwY2FwX2NyZWF0ZSAoKQorYW5kCisuQlIgcGNhcF9hY3RpdmF0ZSAoKSwKK3VzZSBhbgorLkJSIGF1dG9jb25mICgxKQorc2NyaXB0IG9yIHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbiBzY3JpcHQgdG8gY2hlY2sgd2hldGhlciB0aGUgbGlicGNhcAorMS4wIEFQSXMgYXJlIGF2YWlsYWJsZSBhbmQgdXNlIHRoZW0gb25seSBpZiB0aGV5IGFyZS4KKy5TSCBTRUUgQUxTTworYXV0b2NvbmYoMSksIHRjcGR1bXAoMSksIHRjcHNsaWNlKDEpLCBwY2FwLWZpbHRlcihATUFOX01JU0NfSU5GT0ApLCBwZmNvbmZpZyg4KSwKK3VzZXJtb2QoMU0pCisuU0ggQVVUSE9SUworVGhlIG9yaWdpbmFsIGF1dGhvcnMgb2YgbGlicGNhcCBhcmU6CisuTFAKK1ZhbiBKYWNvYnNvbiwKK0NyYWlnIExlcmVzIGFuZAorU3RldmVuIE1jQ2FubmUsIGFsbCBvZiB0aGUKK0xhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYm9yYXRvcnksIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXksIENBLgorLkxQCitUaGUgY3VycmVudCB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBmcm9tICJUaGUgVGNwZHVtcCBHcm91cCIncyBXZWIgc2l0ZSBhdAorLkxQCisuUlMKKy5JIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvCisuUkUKKy5TSCBCVUdTCitQbGVhc2Ugc2VuZCBwcm9ibGVtcywgYnVncywgcXVlc3Rpb25zLCBkZXNpcmFibGUgZW5oYW5jZW1lbnRzLCBldGMuIHRvOgorLkxQCisuUlMKK3RjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZworLlJFCmRpZmYgLS1naXQgYS9wY2FwLmMgYi9wY2FwLmMKaW5kZXggMDgyMmUxYS4uNmIxNmNlYSAxMDA2NDQKLS0tIGEvcGNhcC5jCisrKyBiL3BjYXAuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZuZGVmIGxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLmMsdiAxLjg4LjIuMTkgMjAwNy8wOS8xOSAwMjo1MDo1MiBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAuYyx2IDEuMTI4IDIwMDgtMTItMjMgMjA6MTM6MjkgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSApAQCAtNDMsMTMgKzQzLDIxIEBACiAjaWZkZWYgV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgogI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2VuZGlmIC8qIFdJTjMyICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxmY250bC5oPgpAQCAtNjYsMTE0ICs3NCwxNzEgQEAKICNpbmNsdWRlICJwY2FwLWludC5oIgogCiAjaWZkZWYgSEFWRV9EQUdfQVBJCi0jaW5jbHVkZSA8ZGFnbmV3Lmg+Ci0jaW5jbHVkZSA8ZGFnYXBpLmg+CisjaW5jbHVkZSAicGNhcC1kYWcuaCIKKyNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KKworI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQorI2luY2x1ZGUgInBjYXAtc2VwdGVsLmgiCisjZW5kaWYgLyogSEFWRV9TRVBURUxfQVBJICovCisKKyNpZmRlZiBIQVZFX1NORl9BUEkKKyNpbmNsdWRlICJwY2FwLXNuZi5oIgorI2VuZGlmIC8qIEhBVkVfU05GX0FQSSAqLworCisjaWZkZWYgUENBUF9TVVBQT1JUX1VTQgorI2luY2x1ZGUgInBjYXAtdXNiLWxpbnV4LmgiCiAjZW5kaWYKIAotaW50Ci1wY2FwX2Rpc3BhdGNoKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCi17CisjaWZkZWYgUENBUF9TVVBQT1JUX0JUCisjaW5jbHVkZSAicGNhcC1idC1saW51eC5oIgorI2VuZGlmCiAKLQlyZXR1cm4gcC0+cmVhZF9vcChwLCBjbnQsIGNhbGxiYWNrLCB1c2VyKTsKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfQ0FOCisjaW5jbHVkZSAicGNhcC1jYW4tbGludXguaCIKKyNlbmRpZgorCisjaWZkZWYgUENBUF9TVVBQT1JUX0NBTlVTQgorI2luY2x1ZGUgInBjYXAtY2FudXNiLWxpbnV4LmgiCisjZW5kaWYKKworI2lmZGVmIFBDQVBfU1VQUE9SVF9ORVRGSUxURVIKKyNpbmNsdWRlICJwY2FwLW5ldGZpbHRlci1saW51eC5oIgorI2VuZGlmCisKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfREJVUworI2luY2x1ZGUgInBjYXAtZGJ1cy5oIgorI2VuZGlmCisKK2ludCAKK3BjYXBfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqcGNhcCBfVV8pCit7CisJLyogdGhpcyBtZWFucyAnbm90IGluaXRpYWxpemVkJyAqLworCXJldHVybiAoUENBUF9FUlJPUl9OT1RfQUNUSVZBVEVEKTsKK30KKworI2lmZGVmIFdJTjMyCitBZGFwdGVyICoKK3BjYXBfbm9fYWRhcHRlcihwY2FwX3QgKnBjYXAgX1VfKQoreworCXJldHVybiAoTlVMTCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybnMgMSBpZiByZm1vbiBtb2RlIGNhbiBiZSBzZXQgb24gdGhlIHBjYXBfdCwgMCBpZiBpdCBjYW4ndCwKKyAqIGEgUENBUF9FUlJPUiB2YWx1ZSBvbiBhbiBlcnJvci4KKyAqLworaW50CitwY2FwX2Nhbl9zZXRfcmZtb24ocGNhcF90ICpwKQoreworCXJldHVybiAocC0+Y2FuX3NldF9yZm1vbl9vcChwKSk7CiB9CiAKIC8qCi0gKiBYWFggLSBpcyB0aGlzIG5lY2Vzc2FyeT8KKyAqIEZvciBzeXN0ZW1zIHdoZXJlIHJmbW9uIG1vZGUgaXMgbmV2ZXIgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50CitwY2FwX2NhbnRfc2V0X3JmbW9uKHBjYXBfdCAqcCBfVV8pCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFNldHMgKnRzdGFtcF90eXBlc3AgdG8gcG9pbnQgdG8gYW4gYXJyYXkgMSBvciBtb3JlIHN1cHBvcnRlZCB0aW1lIHN0YW1wCisgKiB0eXBlczsgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCB0aW1lIHN0YW1wIHR5cGVzLgorICogVGhlIGxpc3Qgc2hvdWxkIGJlIGZyZWVkIGJ5IGEgY2FsbCB0byBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKCkgd2hlbgorICogeW91J3JlIGRvbmUgd2l0aCBpdC4KKyAqCisgKiBBIHJldHVybiB2YWx1ZSBvZiAwIG1lYW5zICJ5b3UgZG9uJ3QgZ2V0IGEgY2hvaWNlIG9mIHRpbWUgc3RhbXAgdHlwZSIsCisgKiBpbiB3aGljaCBjYXNlICp0c3RhbXBfdHlwZXNwIGlzIHNldCB0byBudWxsLgorICoKKyAqIFBDQVBfRVJST1IgaXMgcmV0dXJuZWQgb24gZXJyb3IuCiAgKi8KIGludAotcGNhcF9yZWFkKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCitwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKHBjYXBfdCAqcCwgaW50ICoqdHN0YW1wX3R5cGVzcCkKIHsKLQotCXJldHVybiBwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpOwotfQotCi1pbnQKLXBjYXBfbG9vcChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQotewotCXJlZ2lzdGVyIGludCBuOwotCi0JZm9yICg7OykgewotCQlpZiAocC0+c2YucmZpbGUgIT0gTlVMTCkgewotCQkJLyoKLQkJCSAqIDAgbWVhbnMgRU9GLCBzbyBkb24ndCBsb29wIGlmIHdlIGdldCAwLgotCQkJICovCi0JCQluID0gcGNhcF9vZmZsaW5lX3JlYWQocCwgY250LCBjYWxsYmFjaywgdXNlcik7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogWFhYIGtlZXAgcmVhZGluZyB1bnRpbCB3ZSBnZXQgc29tZXRoaW5nCi0JCQkgKiAob3IgYW4gZXJyb3Igb2NjdXJzKQotCQkJICovCi0JCQlkbyB7Ci0JCQkJbiA9IHAtPnJlYWRfb3AocCwgY250LCBjYWxsYmFjaywgdXNlcik7Ci0JCQl9IHdoaWxlIChuID09IDApOworCWlmIChwLT50c3RhbXBfdHlwZV9jb3VudCA9PSAwKSB7CisJCS8qCisJCSAqIFdlIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgdGltZSBzdGFtcCB0eXBlcy4KKwkJICovCisJCSp0c3RhbXBfdHlwZXNwID0gTlVMTDsKKwl9IGVsc2UgeworCQkqdHN0YW1wX3R5cGVzcCA9IChpbnQqKWNhbGxvYyhzaXplb2YoKip0c3RhbXBfdHlwZXNwKSwKKwkJICAgIHAtPnRzdGFtcF90eXBlX2NvdW50KTsKKwkJaWYgKCp0c3RhbXBfdHlwZXNwID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9Ci0JCWlmIChuIDw9IDApCi0JCQlyZXR1cm4gKG4pOwotCQlpZiAoY250ID4gMCkgewotCQkJY250IC09IG47Ci0JCQlpZiAoY250IDw9IDApCi0JCQkJcmV0dXJuICgwKTsKLQkJfQorCQkodm9pZCltZW1jcHkoKnRzdGFtcF90eXBlc3AsIHAtPnRzdGFtcF90eXBlX2xpc3QsCisJCSAgICBzaXplb2YoKip0c3RhbXBfdHlwZXNwKSAqIHAtPnRzdGFtcF90eXBlX2NvdW50KTsKIAl9CisJcmV0dXJuIChwLT50c3RhbXBfdHlwZV9jb3VudCk7CiB9CiAKLXN0cnVjdCBzaW5nbGV0b24gewotCXN0cnVjdCBwY2FwX3BrdGhkciAqaGRyOwotCWNvbnN0IHVfY2hhciAqcGt0OwotfTsKLQotCi1zdGF0aWMgdm9pZAotcGNhcF9vbmVzaG90KHVfY2hhciAqdXNlckRhdGEsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwa3QpCisvKgorICogSW4gV2luZG93cywgeW91IG1pZ2h0IGhhdmUgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggb25lIHZlcnNpb24gb2YgdGhlCisgKiBDIHJ1bnRpbWUgbGlicmFyeSBhbmQgYW4gYXBwbGljYXRpb24gYnVpbHQgd2l0aCBhbm90aGVyIHZlcnNpb24gb2YKKyAqIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGlicmFyeSBtaWdodCB1c2Ugb25lCisgKiB2ZXJzaW9uIG9mIG1hbGxvYygpIGFuZCBmcmVlKCkgYW5kIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB1c2UgYW5vdGhlcgorICogdmVyc2lvbiBvZiBtYWxsb2MoKSBhbmQgZnJlZSgpLiAgSWYgc28sIHRoYXQgbWVhbnMgc29tZXRoaW5nCisgKiBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkgY2Fubm90IGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc28gd2UKKyAqIG5lZWQgdG8gaGF2ZSBhIHBjYXBfZnJlZV90c3RhbXBfdHlwZXMoKSByb3V0aW5lIHRvIGZyZWUgdXAgdGhlIGxpc3QKKyAqIGFsbG9jYXRlZCBieSBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKCksIGV2ZW4gdGhvdWdoIGl0J3MganVzdCBhIHdyYXBwZXIKKyAqIGFyb3VuZCBmcmVlKCkuCisgKi8KK3ZvaWQKK3BjYXBfZnJlZV90c3RhbXBfdHlwZXMoaW50ICp0c3RhbXBfdHlwZV9saXN0KQogewotCXN0cnVjdCBzaW5nbGV0b24gKnNwID0gKHN0cnVjdCBzaW5nbGV0b24gKil1c2VyRGF0YTsKKwlmcmVlKHRzdGFtcF90eXBlX2xpc3QpOworfQorCisvKgorICogRGVmYXVsdCBvbmUtc2hvdCBjYWxsYmFjazsgb3ZlcnJpZGRlbiBmb3IgY2FwdHVyZSB0eXBlcyB3aGVyZSB0aGUKKyAqIHBhY2tldCBkYXRhIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZSBhZnRlciB0aGUgY2FsbGJhY2sKKyAqIHJldHVybnMsIHNvIHRoYXQgYSBjb3B5IG11c3QgYmUgbWFkZS4KKyAqLwordm9pZAorcGNhcF9vbmVzaG90KHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnBrdCkKK3sKKwlzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSAqc3AgPSAoc3RydWN0IG9uZXNob3RfdXNlcmRhdGEgKil1c2VyOworCiAJKnNwLT5oZHIgPSAqaDsKLQlzcC0+cGt0ID0gcGt0OworCSpzcC0+cGt0ID0gcGt0OwogfQogCiBjb25zdCB1X2NoYXIgKgogcGNhcF9uZXh0KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfcGt0aGRyICpoKQogewotCXN0cnVjdCBzaW5nbGV0b24gczsKKwlzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSBzOworCWNvbnN0IHVfY2hhciAqcGt0OwogCiAJcy5oZHIgPSBoOwotCWlmIChwY2FwX2Rpc3BhdGNoKHAsIDEsIHBjYXBfb25lc2hvdCwgKHVfY2hhciopJnMpIDw9IDApCisJcy5wa3QgPSAmcGt0OworCXMucGQgPSBwOworCWlmIChwY2FwX2Rpc3BhdGNoKHAsIDEsIHAtPm9uZXNob3RfY2FsbGJhY2ssICh1X2NoYXIgKikmcykgPD0gMCkKIAkJcmV0dXJuICgwKTsKLQlyZXR1cm4gKHMucGt0KTsKLX0KLQotc3RydWN0IHBrdF9mb3JfZmFrZWNhbGxiYWNrIHsKLQlzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkcjsKLQljb25zdCB1X2NoYXIgKipwa3Q7Ci19OwotCi1zdGF0aWMgdm9pZAotcGNhcF9mYWtlY2FsbGJhY2sodV9jaGFyICp1c2VyRGF0YSwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLAotICAgIGNvbnN0IHVfY2hhciAqcGt0KQotewotCXN0cnVjdCBwa3RfZm9yX2Zha2VjYWxsYmFjayAqc3AgPSAoc3RydWN0IHBrdF9mb3JfZmFrZWNhbGxiYWNrICopdXNlckRhdGE7Ci0KLQkqc3AtPmhkciA9ICpoOwotCSpzcC0+cGt0ID0gcGt0OworCXJldHVybiAocGt0KTsKIH0KIAogaW50IAogcGNhcF9uZXh0X2V4KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfcGt0aGRyICoqcGt0X2hlYWRlciwKICAgICBjb25zdCB1X2NoYXIgKipwa3RfZGF0YSkKIHsKLQlzdHJ1Y3QgcGt0X2Zvcl9mYWtlY2FsbGJhY2sgczsKKwlzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSBzOwogCiAJcy5oZHIgPSAmcC0+cGNhcF9oZWFkZXI7CiAJcy5wa3QgPSBwa3RfZGF0YTsKKwlzLnBkID0gcDsKIAogCS8qIFNhdmVzIGEgcG9pbnRlciB0byB0aGUgcGFja2V0IGhlYWRlcnMgKi8KIAkqcGt0X2hlYWRlcj0gJnAtPnBjYXBfaGVhZGVyOwogCi0JaWYgKHAtPnNmLnJmaWxlICE9IE5VTEwpIHsKKwlpZiAocC0+cmZpbGUgIT0gTlVMTCkgewogCQlpbnQgc3RhdHVzOwogCiAJCS8qIFdlIGFyZSBvbiBhbiBvZmZsaW5lIGNhcHR1cmUgKi8KLQkJc3RhdHVzID0gcGNhcF9vZmZsaW5lX3JlYWQocCwgMSwgcGNhcF9mYWtlY2FsbGJhY2ssCisJCXN0YXR1cyA9IHBjYXBfb2ZmbGluZV9yZWFkKHAsIDEsIHAtPm9uZXNob3RfY2FsbGJhY2ssCiAJCSAgICAodV9jaGFyICopJnMpOwogCiAJCS8qCkBAIC0yMDMsNyArMjY4LDYwMiBAQAogCSAqIFRoZSBmaXJzdCBvbmUgKCcwJykgY29uZmxpY3RzIHdpdGggdGhlIHJldHVybiBjb2RlIG9mIDAgZnJvbQogCSAqIHBjYXBfb2ZmbGluZV9yZWFkKCkgbWVhbmluZyAiZW5kIG9mIGZpbGUiLgogCSovCi0JcmV0dXJuIChwLT5yZWFkX29wKHAsIDEsIHBjYXBfZmFrZWNhbGxiYWNrLCAodV9jaGFyICopJnMpKTsKKwlyZXR1cm4gKHAtPnJlYWRfb3AocCwgMSwgcC0+b25lc2hvdF9jYWxsYmFjaywgKHVfY2hhciAqKSZzKSk7Cit9CisKKyNpZiBkZWZpbmVkKERBR19PTkxZKQoraW50CitwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuIChkYWdfZmluZGFsbGRldnMoYWxsZGV2c3AsIGVycmJ1ZikpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuIChkYWdfY3JlYXRlKHNvdXJjZSwgZXJyYnVmKSk7Cit9CisjZWxpZiBkZWZpbmVkKFNFUFRFTF9PTkxZKQoraW50CitwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuIChzZXB0ZWxfZmluZGFsbGRldnMoYWxsZGV2c3AsIGVycmJ1ZikpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuIChzZXB0ZWxfY3JlYXRlKHNvdXJjZSwgZXJyYnVmKSk7Cit9CisjZWxpZiBkZWZpbmVkKFNORl9PTkxZKQoraW50CitwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuIChzbmZfZmluZGFsbGRldnMoYWxsZGV2c3AsIGVycmJ1ZikpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuIChzbmZfY3JlYXRlKHNvdXJjZSwgZXJyYnVmKSk7Cit9CisjZWxzZSAvKiByZWd1bGFyIHBjYXAgKi8KK3N0cnVjdCBjYXB0dXJlX3NvdXJjZV90eXBlIHsKKwlpbnQgKCpmaW5kYWxsZGV2c19vcCkocGNhcF9pZl90ICoqLCBjaGFyICopOworCXBjYXBfdCAqKCpjcmVhdGVfb3ApKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQgKik7Cit9IGNhcHR1cmVfc291cmNlX3R5cGVzW10gPSB7CisjaWZkZWYgSEFWRV9EQUdfQVBJCisJeyBkYWdfZmluZGFsbGRldnMsIGRhZ19jcmVhdGUgfSwKKyNlbmRpZgorI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQorCXsgc2VwdGVsX2ZpbmRhbGxkZXZzLCBzZXB0ZWxfY3JlYXRlIH0sCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NORl9BUEkKKwl7IHNuZl9maW5kYWxsZGV2cywgc25mX2NyZWF0ZSB9LAorI2VuZGlmCisjaWZkZWYgUENBUF9TVVBQT1JUX0JUCisJeyBidF9maW5kYWxsZGV2cywgYnRfY3JlYXRlIH0sCisjZW5kaWYKKyNpZiBQQ0FQX1NVUFBPUlRfQ0FOVVNCCisJeyBjYW51c2JfZmluZGFsbGRldnMsIGNhbnVzYl9jcmVhdGUgfSwKKyNlbmRpZgorI2lmZGVmIFBDQVBfU1VQUE9SVF9DQU4KKwl7IGNhbl9maW5kYWxsZGV2cywgY2FuX2NyZWF0ZSB9LAorI2VuZGlmCisjaWZkZWYgUENBUF9TVVBQT1JUX1VTQgorCXsgdXNiX2ZpbmRhbGxkZXZzLCB1c2JfY3JlYXRlIH0sCisjZW5kaWYKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfTkVURklMVEVSCisJeyBuZXRmaWx0ZXJfZmluZGFsbGRldnMsIG5ldGZpbHRlcl9jcmVhdGUgfSwKKyNlbmRpZgorI2lmZGVmIFBDQVBfU1VQUE9SVF9EQlVTCisJeyBkYnVzX2ZpbmRhbGxkZXZzLCBkYnVzX2NyZWF0ZSB9LAorI2VuZGlmCisJeyBOVUxMLCBOVUxMIH0KK307CisKKy8qCisgKiBHZXQgYSBsaXN0IG9mIGFsbCBjYXB0dXJlIHNvdXJjZXMgdGhhdCBhcmUgdXAgYW5kIHRoYXQgd2UgY2FuIG9wZW4uCisgKiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4KKyAqIFRoZSBsaXN0LCBhcyByZXR1cm5lZCB0aHJvdWdoICJhbGxkZXZzcCIsIG1heSBiZSBudWxsIGlmIG5vIGludGVyZmFjZXMKKyAqIHdlcmUgdXAgYW5kIGNvdWxkIGJlIG9wZW5lZC4KKyAqLworaW50CitwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJc2l6ZV90IGk7CisKKwkvKgorCSAqIEdldCB0aGUgbGlzdCBvZiByZWd1bGFyIGludGVyZmFjZXMgZmlyc3QuCisJICovIAorCWlmIChwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoYWxsZGV2c3AsIGVycmJ1ZikgPT0gLTEpCisJCXJldHVybiAoLTEpOwkvKiBmYWlsdXJlICovCisKKwkvKgorCSAqIEFkZCBhbnkgaW50ZXJmYWNlcyB0aGF0IG5lZWQgYSBwbGF0Zm9ybS1zcGVjaWZpYyBtZWNoYW5pc20KKwkgKiB0byBmaW5kLgorCSAqLworCWlmIChwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKGFsbGRldnNwLCBlcnJidWYpID09IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhZCBhbiBlcnJvcjsgZnJlZSB0aGUgbGlzdCB3ZSd2ZSBiZWVuCisJCSAqIGNvbnN0cnVjdGluZy4KKwkJICovCisJCWlmICgqYWxsZGV2c3AgIT0gTlVMTCkgeworCQkJcGNhcF9mcmVlYWxsZGV2cygqYWxsZGV2c3ApOworCQkJKmFsbGRldnNwID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIEFzayBlYWNoIG9mIHRoZSBub24tbG9jYWwtbmV0d29yay1pbnRlcmZhY2UgY2FwdHVyZQorCSAqIHNvdXJjZSB0eXBlcyB3aGF0IGludGVyZmFjZXMgdGhleSBoYXZlLgorCSAqLworCWZvciAoaSA9IDA7IGNhcHR1cmVfc291cmNlX3R5cGVzW2ldLmZpbmRhbGxkZXZzX29wICE9IE5VTEw7IGkrKykgeworCQlpZiAoY2FwdHVyZV9zb3VyY2VfdHlwZXNbaV0uZmluZGFsbGRldnNfb3AoYWxsZGV2c3AsIGVycmJ1ZikgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBXZSBoYWQgYW4gZXJyb3I7IGZyZWUgdGhlIGxpc3Qgd2UndmUgYmVlbgorCQkJICogY29uc3RydWN0aW5nLgorCQkJICovCisJCQlpZiAoKmFsbGRldnNwICE9IE5VTEwpIHsKKwkJCQlwY2FwX2ZyZWVhbGxkZXZzKCphbGxkZXZzcCk7CisJCQkJKmFsbGRldnNwID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZShjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmVycmJ1ZikKK3sKKwlzaXplX3QgaTsKKwlpbnQgaXNfdGhlaXJzOworCXBjYXBfdCAqcDsKKworCS8qCisJICogQSBudWxsIHNvdXJjZSBuYW1lIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJhbnkiIGRldmljZSAtCisJICogd2hpY2ggbWlnaHQgbm90IGJlIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLCBidXQKKwkgKiB0aGlzIG1lYW5zIHRoYXQgeW91J2xsIGdldCBhICJub3Qgc3VwcG9ydGVkIiBlcnJvcgorCSAqIHJhdGhlciB0aGFuLCBzYXksIGEgY3Jhc2ggd2hlbiB3ZSB0cnkgdG8gZGVyZWZlcmVuY2UKKwkgKiB0aGUgbnVsbCBwb2ludGVyLgorCSAqLworCWlmIChzb3VyY2UgPT0gTlVMTCkKKwkJc291cmNlID0gImFueSI7CisKKwkvKgorCSAqIFRyeSBlYWNoIG9mIHRoZSBub24tbG9jYWwtbmV0d29yay1pbnRlcmZhY2UgY2FwdHVyZQorCSAqIHNvdXJjZSB0eXBlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHdvcmtzIGZvciB0aGlzCisJICogZGV2aWNlIG9yIHJ1biBvdXQgb2YgdHlwZXMuCisJICovCisJZm9yIChpID0gMDsgY2FwdHVyZV9zb3VyY2VfdHlwZXNbaV0uY3JlYXRlX29wICE9IE5VTEw7IGkrKykgeworCQlpc190aGVpcnMgPSAwOworCQlwID0gY2FwdHVyZV9zb3VyY2VfdHlwZXNbaV0uY3JlYXRlX29wKHNvdXJjZSwgZXJyYnVmLCAmaXNfdGhlaXJzKTsKKwkJaWYgKGlzX3RoZWlycykgeworCQkJLyoKKwkJCSAqIFRoZSBkZXZpY2UgbmFtZSByZWZlcnMgdG8gYSBkZXZpY2Ugb2YgdGhlCisJCQkgKiB0eXBlIGluIHF1ZXN0aW9uOyBlaXRoZXIgaXQgc3VjY2VlZGVkLAorCQkJICogaW4gd2hpY2ggY2FzZSBwIHJlZmVycyB0byBhIHBjYXBfdCB0bworCQkJICogbGF0ZXIgYWN0aXZhdGUgZm9yIHRoZSBkZXZpY2UsIG9yIGl0CisJCQkgKiBmYWlsZWQsIGluIHdoaWNoIGNhc2UgcCBpcyBudWxsIGFuZCB3ZQorCQkJICogc2hvdWxkIHJldHVybiB0aGF0IHRvIHJlcG9ydCB0aGUgZmFpbHVyZQorCQkJICogdG8gY3JlYXRlLgorCQkJICovCisJCQlyZXR1cm4gKHApOworCQl9CisJfQorCisJLyoKKwkgKiBPSywgdHJ5IGl0IGFzIGEgcmVndWxhciBuZXR3b3JrIGludGVyZmFjZS4KKwkgKi8KKwlyZXR1cm4gKHBjYXBfY3JlYXRlX2ludGVyZmFjZShzb3VyY2UsIGVycmJ1ZikpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitpbml0aWFsaXplX29wcyhwY2FwX3QgKnApCit7CisJLyoKKwkgKiBTZXQgb3BlcmF0aW9uIHBvaW50ZXJzIGZvciBvcGVyYXRpb25zIHRoYXQgb25seSB3b3JrIG9uCisJICogYW4gYWN0aXZhdGVkIHBjYXBfdCB0byBwb2ludCB0byBhIHJvdXRpbmUgdGhhdCByZXR1cm5zCisJICogYSAidGhpcyBpc24ndCBhY3RpdmF0ZWQiIGVycm9yLgorCSAqLworCXAtPnJlYWRfb3AgPSAocmVhZF9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPmluamVjdF9vcCA9IChpbmplY3Rfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5zZXRmaWx0ZXJfb3AgPSAoc2V0ZmlsdGVyX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisJcC0+c2V0ZGlyZWN0aW9uX29wID0gKHNldGRpcmVjdGlvbl9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnNldF9kYXRhbGlua19vcCA9IChzZXRfZGF0YWxpbmtfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5nZXRub25ibG9ja19vcCA9IChnZXRub25ibG9ja19vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnNldG5vbmJsb2NrX29wID0gKHNldG5vbmJsb2NrX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisJcC0+c3RhdHNfb3AgPSAoc3RhdHNfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKyNpZmRlZiBXSU4zMgorCXAtPnNldGJ1ZmZfb3AgPSAoc2V0YnVmZl9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnNldG1vZGVfb3AgPSAoc2V0bW9kZV9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnNldG1pbnRvY29weV9vcCA9IChzZXRtaW50b2NvcHlfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5nZXRhZGFwdGVyX29wID0gcGNhcF9ub19hZGFwdGVyOworI2VuZGlmCisKKwkvKgorCSAqIERlZmF1bHQgY2xlYW51cCBvcGVyYXRpb24gLSBpbXBsZW1lbnRhdGlvbnMgY2FuIG92ZXJyaWRlCisJICogdGhpcywgYnV0IHNob3VsZCBjYWxsIHBjYXBfY2xlYW51cF9saXZlX2NvbW1vbigpIGFmdGVyCisJICogZG9pbmcgdGhlaXIgb3duIGFkZGl0aW9uYWwgY2xlYW51cC4KKwkgKi8KKwlwLT5jbGVhbnVwX29wID0gcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uOworCisJLyoKKwkgKiBJbiBtb3N0IGNhc2VzLCB0aGUgc3RhbmRhcmQgb25lLXNob3QgY2FsbGJhY2sgY2FuCisJICogYmUgdXNlZCBmb3IgcGNhcF9uZXh0KCkvcGNhcF9uZXh0X2V4KCkuCisJICovCisJcC0+b25lc2hvdF9jYWxsYmFjayA9IHBjYXBfb25lc2hvdDsKK30KKworc3RhdGljIHBjYXBfdCAqCitwY2FwX2FsbG9jX3BjYXBfdChjaGFyICplYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwljaGFyICpjaHVuazsKKwlwY2FwX3QgKnA7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5IGJpZyBlbm91Z2ggZm9yIGEgcGNhcF90CisJICogcGx1cyBhIHN0cnVjdHVyZSBmb2xsb3dpbmcgaXQgb2Ygc2l6ZSAic2l6ZSIuICBUaGUKKwkgKiBzdHJ1Y3R1cmUgZm9sbG93aW5nIGl0IGlzIGEgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorCSAqIGZvciB0aGUgcm91dGluZXMgdGhhdCBoYW5kbGUgdGhpcyBwY2FwX3QuCisJICovCisJY2h1bmsgPSBtYWxsb2Moc2l6ZW9mIChwY2FwX3QpICsgc2l6ZSk7CisJaWYgKGNodW5rID09IE5VTEwpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwltZW1zZXQoY2h1bmssIDAsIHNpemVvZiAocGNhcF90KSArIHNpemUpOworCisJLyoKKwkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBwY2FwX3QgYXQgdGhlIGJlZ2lubmluZy4KKwkgKi8KKwlwID0gKHBjYXBfdCAqKWNodW5rOworCisjaWZuZGVmIFdJTjMyCisJcC0+ZmQgPSAtMTsJLyogbm90IG9wZW5lZCB5ZXQgKi8KKwlwLT5zZWxlY3RhYmxlX2ZkID0gLTE7CisjZW5kaWYgCisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCS8qIE5vIHByaXZhdGUgZGF0YSB3YXMgcmVxdWVzdGVkLiAqLworCQlwLT5wcml2ID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgZGF0YTsgdGhhdCdzIHRoZSBzdHJ1Y3R1cmUKKwkJICogb2Ygc2l6ZSAic2l6ZSIgZm9sbG93aW5nIHRoZSBwY2FwX3QuCisJCSAqLworCQlwLT5wcml2ID0gKHZvaWQgKikoY2h1bmsgKyBzaXplb2YgKHBjYXBfdCkpOworCX0KKworCXJldHVybiAocCk7Cit9CisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZV9jb21tb24oY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlwY2FwX3QgKnA7CisKKwlwID0gcGNhcF9hbGxvY19wY2FwX3QoZWJ1Ziwgc2l6ZSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPm9wdC5zb3VyY2UgPSBzdHJkdXAoc291cmNlKTsKKwlpZiAocC0+b3B0LnNvdXJjZSA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZnJlZShwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIERlZmF1bHQgdG8gImNhbid0IHNldCByZm1vbiBtb2RlIjsgaWYgaXQncyBzdXBwb3J0ZWQgYnkKKwkgKiBhIHBsYXRmb3JtLCB0aGUgY3JlYXRlIHJvdXRpbmUgdGhhdCBjYWxsZWQgdXMgY2FuIHNldAorCSAqIHRoZSBvcCB0byBpdHMgcm91dGluZSB0byBjaGVjayB3aGV0aGVyIGEgcGFydGljdWxhcgorCSAqIGRldmljZSBzdXBwb3J0cyBpdC4KKwkgKi8KKwlwLT5jYW5fc2V0X3JmbW9uX29wID0gcGNhcF9jYW50X3NldF9yZm1vbjsKKworCWluaXRpYWxpemVfb3BzKHApOworCisJLyogcHV0IGluIHNvbWUgZGVmYXVsdHMqLworIAlwY2FwX3NldF9zbmFwbGVuKHAsIDY1NTM1KTsJLyogbWF4IHBhY2tldCBzaXplICovCisJcC0+b3B0LnRpbWVvdXQgPSAwOwkJLyogbm8gdGltZW91dCBzcGVjaWZpZWQgKi8KKwlwLT5vcHQuYnVmZmVyX3NpemUgPSAwOwkJLyogdXNlIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgKi8KKwlwLT5vcHQucHJvbWlzYyA9IDA7CisJcC0+b3B0LnJmbW9uID0gMDsKKwlwLT5vcHQuaW1tZWRpYXRlID0gMDsKKwlwLT5vcHQudHN0YW1wX3R5cGUgPSAtMTsJLyogZGVmYXVsdCB0byBub3Qgc2V0dGluZyB0aW1lIHN0YW1wIHR5cGUgKi8KKwlwLT5vcHQudHN0YW1wX3ByZWNpc2lvbiA9IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTzsKKwlyZXR1cm4gKHApOworfQorCitpbnQKK3BjYXBfY2hlY2tfYWN0aXZhdGVkKHBjYXBfdCAqcCkKK3sKKwlpZiAocC0+YWN0aXZhdGVkKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImNhbid0IHBlcmZvcm0gIgorCQkJIiBvcGVyYXRpb24gb24gYWN0aXZhdGVkIGNhcHR1cmUiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorcGNhcF9zZXRfc25hcGxlbihwY2FwX3QgKnAsIGludCBzbmFwbGVuKQoreworCWlmIChwY2FwX2NoZWNrX2FjdGl2YXRlZChwKSkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CisJcC0+c25hcHNob3QgPSBzbmFwbGVuOworCXJldHVybiAoMCk7Cit9CisKK2ludAorcGNhcF9zZXRfcHJvbWlzYyhwY2FwX3QgKnAsIGludCBwcm9taXNjKQoreworCWlmIChwY2FwX2NoZWNrX2FjdGl2YXRlZChwKSkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CisJcC0+b3B0LnByb21pc2MgPSBwcm9taXNjOworCXJldHVybiAoMCk7Cit9CisKK2ludAorcGNhcF9zZXRfcmZtb24ocGNhcF90ICpwLCBpbnQgcmZtb24pCit7CisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlwLT5vcHQucmZtb24gPSByZm1vbjsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3BjYXBfc2V0X3RpbWVvdXQocGNhcF90ICpwLCBpbnQgdGltZW91dF9tcykKK3sKKwlpZiAocGNhcF9jaGVja19hY3RpdmF0ZWQocCkpCisJCXJldHVybiAoUENBUF9FUlJPUl9BQ1RJVkFURUQpOworCXAtPm9wdC50aW1lb3V0ID0gdGltZW91dF9tczsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3BjYXBfc2V0X3RzdGFtcF90eXBlKHBjYXBfdCAqcCwgaW50IHRzdGFtcF90eXBlKQoreworCWludCBpOworCisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKworCS8qCisJICogSWYgcC0+dHN0YW1wX3R5cGVfY291bnQgaXMgMCwgd2Ugb25seSBzdXBwb3J0IFBDQVBfVFNUQU1QX0hPU1Q7CisJICogdGhlIGRlZmF1bHQgdGltZSBzdGFtcCB0eXBlIGlzIFBDQVBfVFNUQU1QX0hPU1QuCisJICovCisJaWYgKHAtPnRzdGFtcF90eXBlX2NvdW50ID09IDApIHsKKwkJaWYgKHRzdGFtcF90eXBlID09IFBDQVBfVFNUQU1QX0hPU1QpIHsKKwkJCXAtPm9wdC50c3RhbXBfdHlwZSA9IHRzdGFtcF90eXBlOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIENoZWNrIHdoZXRoZXIgd2UgY2xhaW0gdG8gc3VwcG9ydCB0aGlzIHR5cGUgb2YgdGltZSBzdGFtcC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBwLT50c3RhbXBfdHlwZV9jb3VudDsgaSsrKSB7CisJCQlpZiAocC0+dHN0YW1wX3R5cGVfbGlzdFtpXSA9PSB0c3RhbXBfdHlwZSkgeworCQkJCS8qCisJCQkJICogWWVzLgorCQkJCSAqLworCQkJCXAtPm9wdC50c3RhbXBfdHlwZSA9IHRzdGFtcF90eXBlOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgdGhpcyB0eXBlIG9mIHRpbWUgc3RhbXAuCisJICovCisJcmV0dXJuIChQQ0FQX1dBUk5JTkdfVFNUQU1QX1RZUEVfTk9UU1VQKTsKK30KKworaW50CitwY2FwX3NldF9pbW1lZGlhdGVfbW9kZShwY2FwX3QgKnAsIGludCBpbW1lZGlhdGUpCit7CisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlwLT5vcHQuaW1tZWRpYXRlID0gaW1tZWRpYXRlOworCXJldHVybiAoMCk7Cit9CisKK2ludAorcGNhcF9zZXRfYnVmZmVyX3NpemUocGNhcF90ICpwLCBpbnQgYnVmZmVyX3NpemUpCit7CisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlwLT5vcHQuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3BjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24ocGNhcF90ICpwLCBpbnQgdHN0YW1wX3ByZWNpc2lvbikKK3sKKwlpbnQgaTsKKworCWlmIChwY2FwX2NoZWNrX2FjdGl2YXRlZChwKSkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CisKKwkvKgorCSAqIElmIHAtPnRzdGFtcF9wcmVjaXNpb25fY291bnQgaXMgMCwgd2Ugb25seSBzdXBwb3J0IHNldHRpbmcKKwkgKiB0aGUgdGltZSBzdGFtcCBwcmVjaXNpb24gdG8gbWljcm9zZWNvbmQgcHJlY2lzaW9uOyBldmVyeQorCSAqIHBjYXAgbW9kdWxlICpNVVNUKiBzdXBwb3J0IG1pY3Jvc2Vjb25kIHByZWNpc2lvbiwgZXZlbiBpZgorCSAqIGl0IGRvZXMgc28gYnkgY29udmVydGluZyB0aGUgbmF0aXZlIHByZWNpc2lvbiB0bworCSAqIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwlpZiAocC0+dHN0YW1wX3ByZWNpc2lvbl9jb3VudCA9PSAwKSB7CisJCWlmICh0c3RhbXBfcHJlY2lzaW9uID09IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTykgeworCQkJcC0+b3B0LnRzdGFtcF9wcmVjaXNpb24gPSB0c3RhbXBfcHJlY2lzaW9uOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIENoZWNrIHdoZXRoZXIgd2UgY2xhaW0gdG8gc3VwcG9ydCB0aGlzIHByZWNpc2lvbiBvZgorCQkgKiB0aW1lIHN0YW1wLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHAtPnRzdGFtcF9wcmVjaXNpb25fY291bnQ7IGkrKykgeworCQkJaWYgKHAtPnRzdGFtcF9wcmVjaXNpb25fbGlzdFtpXSA9PSB0c3RhbXBfcHJlY2lzaW9uKSB7CisJCQkJLyoKKwkJCQkgKiBZZXMuCisJCQkJICovCisJCQkJcC0+b3B0LnRzdGFtcF9wcmVjaXNpb24gPSB0c3RhbXBfcHJlY2lzaW9uOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgdGhpcyB0aW1lIHN0YW1wIHByZWNpc2lvbi4KKwkgKi8KKwlyZXR1cm4gKFBDQVBfRVJST1JfVFNUQU1QX1BSRUNJU0lPTl9OT1RTVVApOworfQorCitpbnQKK3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24ocGNhcF90ICpwKQoreworICAgICAgICByZXR1cm4gKHAtPm9wdC50c3RhbXBfcHJlY2lzaW9uKTsKK30KKworaW50CitwY2FwX2FjdGl2YXRlKHBjYXBfdCAqcCkKK3sKKwlpbnQgc3RhdHVzOworCisJLyoKKwkgKiBDYXRjaCBhdHRlbXB0cyB0byByZS1hY3RpdmF0ZSBhbiBhbHJlYWR5LWFjdGl2YXRlZAorCSAqIHBjYXBfdDsgdGhpcyBzaG91bGQsIGZvciBleGFtcGxlLCBjYXRjaCBjb2RlIHRoYXQKKwkgKiBjYWxscyBwY2FwX29wZW5fbGl2ZSgpIGZvbGxvd2VkIGJ5IHBjYXBfYWN0aXZhdGUoKSwKKwkgKiBhcyBzb21lIGNvZGUgdGhhdCBzaG93ZWQgdXAgaW4gYSBTdGFjayBFeGNoYW5nZQorCSAqIHF1ZXN0aW9uIGRpZC4KKwkgKi8KKwlpZiAocGNhcF9jaGVja19hY3RpdmF0ZWQocCkpCisJCXJldHVybiAoUENBUF9FUlJPUl9BQ1RJVkFURUQpOworCXN0YXR1cyA9IHAtPmFjdGl2YXRlX29wKHApOworCWlmIChzdGF0dXMgPj0gMCkKKwkJcC0+YWN0aXZhdGVkID0gMTsKKwllbHNlIHsKKwkJaWYgKHAtPmVycmJ1ZlswXSA9PSAnXDAnKSB7CisJCQkvKgorCQkJICogTm8gZXJyb3IgbWVzc2FnZSBzdXBwbGllZCBieSB0aGUgYWN0aXZhdGUgcm91dGluZTsKKwkJCSAqIGZvciB0aGUgYmVuZWZpdCBvZiBwcm9ncmFtcyB0aGF0IGRvbid0IHNwZWNpYWxseQorCQkJICogaGFuZGxlIGVycm9ycyBvdGhlciB0aGFuIFBDQVBfRVJST1IsIHJldHVybiB0aGUKKwkJCSAqIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhdHVzLgorCQkJICovCisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlcyIsCisJCQkgICAgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJfQorCisJCS8qCisJCSAqIFVuZG8gYW55IG9wZXJhdGlvbiBwb2ludGVyIHNldHRpbmcsIGV0Yy4gZG9uZSBieQorCQkgKiB0aGUgYWN0aXZhdGUgb3BlcmF0aW9uLgorCQkgKi8KKwkJaW5pdGlhbGl6ZV9vcHMocCk7CisJfQorCXJldHVybiAoc3RhdHVzKTsKK30KKworcGNhcF90ICoKK3BjYXBfb3Blbl9saXZlKGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50IHNuYXBsZW4sIGludCBwcm9taXNjLCBpbnQgdG9fbXMsIGNoYXIgKmVycmJ1ZikKK3sKKwlwY2FwX3QgKnA7CisJaW50IHN0YXR1czsKKworCXAgPSBwY2FwX2NyZWF0ZShzb3VyY2UsIGVycmJ1Zik7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwlzdGF0dXMgPSBwY2FwX3NldF9zbmFwbGVuKHAsIHNuYXBsZW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisJc3RhdHVzID0gcGNhcF9zZXRfcHJvbWlzYyhwLCBwcm9taXNjKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCXN0YXR1cyA9IHBjYXBfc2V0X3RpbWVvdXQocCwgdG9fbXMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisJLyoKKwkgKiBNYXJrIHRoaXMgYXMgb3BlbmVkIHdpdGggcGNhcF9vcGVuX2xpdmUoKSwgc28gdGhhdCwgZm9yCisJICogZXhhbXBsZSwgd2Ugc2hvdyB0aGUgZnVsbCBsaXN0IG9mIERMVF8gdmFsdWVzLCByYXRoZXIKKwkgKiB0aGFuIGp1c3QgdGhlIG9uZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGNhcHR1cmluZworCSAqIHdoZW4gbm90IGluIG1vbml0b3IgbW9kZS4gIFRoYXQgYWxsb3dzIGV4aXN0aW5nIGFwcGxpY2F0aW9ucworCSAqIHRvIHdvcmsgdGhlIHdheSB0aGV5IHVzZWQgdG8gd29yaywgYnV0IGFsbG93cyBuZXcgYXBwbGljYXRpb25zCisJICogdGhhdCBrbm93IGFib3V0IHRoZSBuZXcgb3BlbiBBUEkgdG8sIGZvciBleGFtcGxlLCBmaW5kIG91dCB0aGUKKwkgKiBETFRfIHZhbHVlcyB0aGF0IHRoZXkgY2FuIHNlbGVjdCB3aXRob3V0IGNoYW5naW5nIHdoZXRoZXIKKwkgKiB0aGUgYWRhcHRlciBpcyBpbiBtb25pdG9yIG1vZGUgb3Igbm90LgorCSAqLworCXAtPm9sZHN0eWxlID0gMTsKKwlzdGF0dXMgPSBwY2FwX2FjdGl2YXRlKHApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIChwKTsKK2ZhaWw6CisJaWYgKHN0YXR1cyA9PSBQQ0FQX0VSUk9SKQorCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBzb3VyY2UsCisJCSAgICBwLT5lcnJidWYpOworCWVsc2UgaWYgKHN0YXR1cyA9PSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFIHx8CisJICAgIHN0YXR1cyA9PSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEIHx8CisJICAgIHN0YXR1cyA9PSBQQ0FQX0VSUk9SX1BST01JU0NfUEVSTV9ERU5JRUQpCisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyAoJXMpIiwgc291cmNlLAorCQkgICAgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpLCBwLT5lcnJidWYpOworCWVsc2UKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgc291cmNlLAorCQkgICAgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwlwY2FwX2Nsb3NlKHApOworCXJldHVybiAoTlVMTCk7Cit9CisKK3BjYXBfdCAqCitwY2FwX29wZW5fb2ZmbGluZV9jb21tb24oY2hhciAqZWJ1Ziwgc2l6ZV90IHNpemUpCit7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfYWxsb2NfcGNhcF90KGVidWYsIHNpemUpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5vcHQudHN0YW1wX3ByZWNpc2lvbiA9IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTzsKKwlwLT5vcHQuc291cmNlID0gc3RyZHVwKCIoc2F2ZWZpbGUpIik7CisJaWYgKHAtPm9wdC5zb3VyY2UgPT0gTlVMTCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWZyZWUocCk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJcmV0dXJuIChwKTsKK30KKworaW50CitwY2FwX2Rpc3BhdGNoKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJcmV0dXJuIChwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpKTsKK30KKworLyoKKyAqIFhYWCAtIGlzIHRoaXMgbmVjZXNzYXJ5PworICovCitpbnQKK3BjYXBfcmVhZChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCisJcmV0dXJuIChwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpKTsKK30KKworaW50CitwY2FwX2xvb3AocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlyZWdpc3RlciBpbnQgbjsKKworCWZvciAoOzspIHsKKwkJaWYgKHAtPnJmaWxlICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiAwIG1lYW5zIEVPRiwgc28gZG9uJ3QgbG9vcCBpZiB3ZSBnZXQgMC4KKwkJCSAqLworCQkJbiA9IHBjYXBfb2ZmbGluZV9yZWFkKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFhYWCBrZWVwIHJlYWRpbmcgdW50aWwgd2UgZ2V0IHNvbWV0aGluZworCQkJICogKG9yIGFuIGVycm9yIG9jY3VycykKKwkJCSAqLworCQkJZG8geworCQkJCW4gPSBwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpOworCQkJfSB3aGlsZSAobiA9PSAwKTsKKwkJfQorCQlpZiAobiA8PSAwKQorCQkJcmV0dXJuIChuKTsKKwkJaWYgKCFQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKGNudCkpIHsKKwkJCWNudCAtPSBuOworCQkJaWYgKGNudCA8PSAwKQorCQkJCXJldHVybiAoMCk7CisJCX0KKwl9CiB9CiAKIC8qCkBAIC0yMTgsMTIgKzg3OCwyNCBAQAogaW50CiBwY2FwX2RhdGFsaW5rKHBjYXBfdCAqcCkKIHsKKwlpZiAoIXAtPmFjdGl2YXRlZCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQpOwogCXJldHVybiAocC0+bGlua3R5cGUpOwogfQogCiBpbnQKK3BjYXBfZGF0YWxpbmtfZXh0KHBjYXBfdCAqcCkKK3sKKwlpZiAoIXAtPmFjdGl2YXRlZCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQpOworCXJldHVybiAocC0+bGlua3R5cGVfZXh0KTsKK30KKworaW50CiBwY2FwX2xpc3RfZGF0YWxpbmtzKHBjYXBfdCAqcCwgaW50ICoqZGx0X2J1ZmZlcikKIHsKKwlpZiAoIXAtPmFjdGl2YXRlZCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQpOwogCWlmIChwLT5kbHRfY291bnQgPT0gMCkgewogCQkvKgogCQkgKiBXZSBjb3VsZG4ndCBmZXRjaCB0aGUgbGlzdCBvZiBETFRzLCB3aGljaCBtZWFucwpAQCAtMjM1LDcgKzkwNyw3IEBACiAJCWlmICgqZGx0X2J1ZmZlciA9PSBOVUxMKSB7CiAJCQkodm9pZClzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAogCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuICgtMSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CiAJCSoqZGx0X2J1ZmZlciA9IHAtPmxpbmt0eXBlOwogCQlyZXR1cm4gKDEpOwpAQCAtMjQ0LDcgKzkxNiw3IEBACiAJCWlmICgqZGx0X2J1ZmZlciA9PSBOVUxMKSB7CiAJCQkodm9pZClzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAogCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuICgtMSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CiAJCSh2b2lkKW1lbWNweSgqZGx0X2J1ZmZlciwgcC0+ZGx0X2xpc3QsCiAJCSAgICBzaXplb2YoKipkbHRfYnVmZmVyKSAqIHAtPmRsdF9jb3VudCk7CkBAIC0yNTIsNiArOTI0LDIzIEBACiAJfQogfQogCisvKgorICogSW4gV2luZG93cywgeW91IG1pZ2h0IGhhdmUgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggb25lIHZlcnNpb24gb2YgdGhlCisgKiBDIHJ1bnRpbWUgbGlicmFyeSBhbmQgYW4gYXBwbGljYXRpb24gYnVpbHQgd2l0aCBhbm90aGVyIHZlcnNpb24gb2YKKyAqIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGlicmFyeSBtaWdodCB1c2Ugb25lCisgKiB2ZXJzaW9uIG9mIG1hbGxvYygpIGFuZCBmcmVlKCkgYW5kIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB1c2UgYW5vdGhlcgorICogdmVyc2lvbiBvZiBtYWxsb2MoKSBhbmQgZnJlZSgpLiAgSWYgc28sIHRoYXQgbWVhbnMgc29tZXRoaW5nCisgKiBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkgY2Fubm90IGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc28gd2UKKyAqIG5lZWQgdG8gaGF2ZSBhIHBjYXBfZnJlZV9kYXRhbGlua3MoKSByb3V0aW5lIHRvIGZyZWUgdXAgdGhlIGxpc3QKKyAqIGFsbG9jYXRlZCBieSBwY2FwX2xpc3RfZGF0YWxpbmtzKCksIGV2ZW4gdGhvdWdoIGl0J3MganVzdCBhIHdyYXBwZXIKKyAqIGFyb3VuZCBmcmVlKCkuCisgKi8KK3ZvaWQKK3BjYXBfZnJlZV9kYXRhbGlua3MoaW50ICpkbHRfbGlzdCkKK3sKKwlmcmVlKGRsdF9saXN0KTsKK30KKwogaW50CiBwY2FwX3NldF9kYXRhbGluayhwY2FwX3QgKnAsIGludCBkbHQpCiB7CkBAIC0zMTQsODMgKzEwMDMsNiBAQAogCXJldHVybiAoLTEpOwogfQogCi1zdHJ1Y3QgZGx0X2Nob2ljZSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKLQlpbnQJZGx0OwotfTsKLQotI2RlZmluZSBETFRfQ0hPSUNFKGNvZGUsIGRlc2NyaXB0aW9uKSB7ICNjb2RlLCBkZXNjcmlwdGlvbiwgY29kZSB9Ci0jZGVmaW5lIERMVF9DSE9JQ0VfU0VOVElORUwgeyBOVUxMLCBOVUxMLCAwIH0KLQotc3RhdGljIHN0cnVjdCBkbHRfY2hvaWNlIGRsdF9jaG9pY2VzW10gPSB7Ci0JRExUX0NIT0lDRShETFRfTlVMTCwgIkJTRCBsb29wYmFjayIpLAotCURMVF9DSE9JQ0UoRExUX0VOMTBNQiwgIkV0aGVybmV0IiksCi0JRExUX0NIT0lDRShETFRfSUVFRTgwMiwgIlRva2VuIHJpbmciKSwKLQlETFRfQ0hPSUNFKERMVF9BUkNORVQsICJBUkNORVQiKSwKLQlETFRfQ0hPSUNFKERMVF9TTElQLCAiU0xJUCIpLAotCURMVF9DSE9JQ0UoRExUX1BQUCwgIlBQUCIpLAotCURMVF9DSE9JQ0UoRExUX0ZEREksICJGRERJIiksCi0JRExUX0NIT0lDRShETFRfQVRNX1JGQzE0ODMsICJSRkMgMTQ4MyBMTEMtZW5jYXBzdWxhdGVkIEFUTSIpLAotCURMVF9DSE9JQ0UoRExUX1JBVywgIlJhdyBJUCIpLAotCURMVF9DSE9JQ0UoRExUX1NMSVBfQlNET1MsICJCU0QvT1MgU0xJUCIpLAotCURMVF9DSE9JQ0UoRExUX1BQUF9CU0RPUywgIkJTRC9PUyBQUFAiKSwKLQlETFRfQ0hPSUNFKERMVF9BVE1fQ0xJUCwgIkxpbnV4IENsYXNzaWNhbCBJUC1vdmVyLUFUTSIpLAotCURMVF9DSE9JQ0UoRExUX1BQUF9TRVJJQUwsICJQUFAgb3ZlciBzZXJpYWwiKSwKLQlETFRfQ0hPSUNFKERMVF9QUFBfRVRIRVIsICJQUFBvRSIpLAotCURMVF9DSE9JQ0UoRExUX0NfSERMQywgIkNpc2NvIEhETEMiKSwKLQlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExLCAiODAyLjExIiksCi0JRExUX0NIT0lDRShETFRfRlJFTEFZLCAiRnJhbWUgUmVsYXkiKSwKLQlETFRfQ0hPSUNFKERMVF9MT09QLCAiT3BlbkJTRCBsb29wYmFjayIpLAotCURMVF9DSE9JQ0UoRExUX0VOQywgIk9wZW5CU0QgZW5jYXBzdWxhdGVkIElQIiksCi0JRExUX0NIT0lDRShETFRfTElOVVhfU0xMLCAiTGludXggY29va2VkIiksCi0JRExUX0NIT0lDRShETFRfTFRBTEssICJMb2NhbHRhbGsiKSwKLQlETFRfQ0hPSUNFKERMVF9QRkxPRywgIk9wZW5CU0QgcGZsb2cgZmlsZSIpLAotCURMVF9DSE9JQ0UoRExUX1BSSVNNX0hFQURFUiwgIjgwMi4xMSBwbHVzIFByaXNtIGhlYWRlciIpLAotCURMVF9DSE9JQ0UoRExUX0lQX09WRVJfRkMsICJSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwiKSwKLQlETFRfQ0hPSUNFKERMVF9TVU5BVE0sICJTdW4gcmF3IEFUTSIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTFfUkFESU8sICI4MDIuMTEgcGx1cyBCU0QgcmFkaW8gaW5mb3JtYXRpb24gaGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCwgIkFwcGxlIElQLW92ZXItSUVFRSAxMzk0IiksCi0JRExUX0NIT0lDRShETFRfQVJDTkVUX0xJTlVYLCAiTGludXggQVJDTkVUIiksCi0JRExUX0NIT0lDRShETFRfRE9DU0lTLCAiRE9DU0lTIiksCi0JRExUX0NIT0lDRShETFRfTElOVVhfSVJEQSwgIkxpbnV4IElyREEiKSwKLQlETFRfQ0hPSUNFKERMVF9MSU5VWF9MQVBELCAiTGludXggdklTRE4gTEFQRCIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTLCAiODAyLjExIHBsdXMgQVZTIHJhZGlvIGluZm9ybWF0aW9uIGhlYWRlciIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9TWU1BTlRFQ19GSVJFV0FMTCwgIlN5bWFudGVjIEZpcmV3YWxsIiksCi0gICAgICAgIERMVF9DSE9JQ0UoRExUX0pVTklQRVJfQVRNMSwgIkp1bmlwZXIgQVRNMSBQSUMiKSwKLSAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9BVE0yLCAiSnVuaXBlciBBVE0yIFBJQyIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01MUFBQLCAiSnVuaXBlciBNdWx0aS1MaW5rIFBQUCIpLAotCURMVF9DSE9JQ0UoRExUX1BQUF9QUFBELCAiUFBQIGZvciBwcHBkLCB3aXRoIGRpcmVjdGlvbiBmbGFnIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9QUFBPRSwgIkp1bmlwZXIgUFBQb0UiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1BQUE9FX0FUTSwgIkp1bmlwZXIgUFBQb0UvQVRNIiksCi0JRExUX0NIT0lDRShETFRfR1BSU19MTEMsICJHUFJTIExMQyIpLAotCURMVF9DSE9JQ0UoRExUX0dQRl9ULCAiR1BGLVQiKSwKLQlETFRfQ0hPSUNFKERMVF9HUEZfRiwgIkdQRi1GIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9QSUNfUEVFUiwgIkp1bmlwZXIgUElDIFBlZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01MRlIsICJKdW5pcGVyIE11bHRpLUxpbmsgRnJhbWUgUmVsYXkiKSwKLQlETFRfQ0hPSUNFKERMVF9FUkZfRVRILAkiRXRoZXJuZXQgd2l0aCBFbmRhY2UgRVJGIGhlYWRlciIpLAotCURMVF9DSE9JQ0UoRExUX0VSRl9QT1MsICJQYWNrZXQtb3Zlci1TT05FVCB3aXRoIEVuZGFjZSBFUkYgaGVhZGVyIiksCi0gICAgICAgIERMVF9DSE9JQ0UoRExUX0pVTklQRVJfR0dTTiwgIkp1bmlwZXIgR0dTTiBQSUMiKSwKLSAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9FUywgIkp1bmlwZXIgRW5jcnlwdGlvbiBTZXJ2aWNlcyBQSUMiKSwKLSAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9NT05JVE9SLCAiSnVuaXBlciBQYXNzaXZlIE1vbml0b3IgUElDIiksCi0gICAgICAgIERMVF9DSE9JQ0UoRExUX0pVTklQRVJfU0VSVklDRVMsICJKdW5pcGVyIEFkdmFuY2VkIFNlcnZpY2VzIFBJQyIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfTUZSLCAiSnVuaXBlciBGUkYuMTYgRnJhbWUgUmVsYXkiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0VUSEVSLCAiSnVuaXBlciBFdGhlcm5ldCIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfUFBQLCAiSnVuaXBlciBQUFAiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0ZSRUxBWSwgIkp1bmlwZXIgRnJhbWUgUmVsYXkiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0NIRExDLCAiSnVuaXBlciBDLUhETEMiKSwKLQlETFRfQ0hPSUNFKERMVF9NRlIsICJGUkYuMTYgRnJhbWUgUmVsYXkiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1ZQLCAiSnVuaXBlciBWb2ljZSBQSUMiKSwKLQlETFRfQ0hPSUNFKERMVF9NVFAyLCAiU1M3IE1UUDIiKSwKLQlETFRfQ0hPSUNFKERMVF9BNDI5LCAiQXJpbmMgNDI5IiksCi0JRExUX0NIT0lDRShETFRfQTY1M19JQ00sICJBcmluYyA2NTMgSW50ZXJwYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiIpLAotCURMVF9DSE9JQ0UoRExUX1VTQiwgIlVTQiIpLAotCURMVF9DSE9JQ0UoRExUX0JMVUVUT09USF9IQ0lfSDQsICJCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIiksCi0JRExUX0NIT0lDRShETFRfQ0FOMjBCLCAiQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgKENBTikgdi4gMi4wQiIpLAotCURMVF9DSE9JQ0UoRExUX01UUDJfV0lUSF9QSERSLCAiU1M3IE1UUDIgd2l0aCBQc2V1ZG8taGVhZGVyIiksCi0JRExUX0NIT0lDRV9TRU5USU5FTAotfTsKLQogLyoKICAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCiAgKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCkBAIC00NzYsNiArMTA4OCwxMjQgQEAKIAlyZXR1cm4gKGNtWyp1czFdIC0gY21bKi0tdXMyXSk7CiB9CiAKK3N0cnVjdCBkbHRfY2hvaWNlIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOworCWludAlkbHQ7Cit9OworCisjZGVmaW5lIERMVF9DSE9JQ0UoY29kZSwgZGVzY3JpcHRpb24pIHsgI2NvZGUsIGRlc2NyaXB0aW9uLCBjb2RlIH0KKyNkZWZpbmUgRExUX0NIT0lDRV9TRU5USU5FTCB7IE5VTEwsIE5VTEwsIDAgfQorCitzdGF0aWMgc3RydWN0IGRsdF9jaG9pY2UgZGx0X2Nob2ljZXNbXSA9IHsKKwlETFRfQ0hPSUNFKERMVF9OVUxMLCAiQlNEIGxvb3BiYWNrIiksCisJRExUX0NIT0lDRShETFRfRU4xME1CLCAiRXRoZXJuZXQiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyLCAiVG9rZW4gcmluZyIpLAorCURMVF9DSE9JQ0UoRExUX0FSQ05FVCwgIkJTRCBBUkNORVQiKSwKKwlETFRfQ0hPSUNFKERMVF9TTElQLCAiU0xJUCIpLAorCURMVF9DSE9JQ0UoRExUX1BQUCwgIlBQUCIpLAorCURMVF9DSE9JQ0UoRExUX0ZEREksICJGRERJIiksCisJRExUX0NIT0lDRShETFRfQVRNX1JGQzE0ODMsICJSRkMgMTQ4MyBMTEMtZW5jYXBzdWxhdGVkIEFUTSIpLAorCURMVF9DSE9JQ0UoRExUX1JBVywgIlJhdyBJUCIpLAorCURMVF9DSE9JQ0UoRExUX1NMSVBfQlNET1MsICJCU0QvT1MgU0xJUCIpLAorCURMVF9DSE9JQ0UoRExUX1BQUF9CU0RPUywgIkJTRC9PUyBQUFAiKSwKKwlETFRfQ0hPSUNFKERMVF9BVE1fQ0xJUCwgIkxpbnV4IENsYXNzaWNhbCBJUC1vdmVyLUFUTSIpLAorCURMVF9DSE9JQ0UoRExUX1BQUF9TRVJJQUwsICJQUFAgb3ZlciBzZXJpYWwiKSwKKwlETFRfQ0hPSUNFKERMVF9QUFBfRVRIRVIsICJQUFBvRSIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9TWU1BTlRFQ19GSVJFV0FMTCwgIlN5bWFudGVjIEZpcmV3YWxsIiksCisJRExUX0NIT0lDRShETFRfQ19IRExDLCAiQ2lzY28gSERMQyIpLAorCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTEsICI4MDIuMTEiKSwKKwlETFRfQ0hPSUNFKERMVF9GUkVMQVksICJGcmFtZSBSZWxheSIpLAorCURMVF9DSE9JQ0UoRExUX0xPT1AsICJPcGVuQlNEIGxvb3BiYWNrIiksCisJRExUX0NIT0lDRShETFRfRU5DLCAiT3BlbkJTRCBlbmNhcHN1bGF0ZWQgSVAiKSwKKwlETFRfQ0hPSUNFKERMVF9MSU5VWF9TTEwsICJMaW51eCBjb29rZWQiKSwKKwlETFRfQ0hPSUNFKERMVF9MVEFMSywgIkxvY2FsdGFsayIpLAorCURMVF9DSE9JQ0UoRExUX1BGTE9HLCAiT3BlbkJTRCBwZmxvZyBmaWxlIiksCisJRExUX0NIT0lDRShETFRfUEZTWU5DLCAiUGFja2V0IGZpbHRlciBzdGF0ZSBzeW5jaW5nIiksCisJRExUX0NIT0lDRShETFRfUFJJU01fSEVBREVSLCAiODAyLjExIHBsdXMgUHJpc20gaGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfSVBfT1ZFUl9GQywgIlJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbCIpLAorCURMVF9DSE9JQ0UoRExUX1NVTkFUTSwgIlN1biByYXcgQVRNIiksCisJRExUX0NIT0lDRShETFRfSUVFRTgwMl8xMV9SQURJTywgIjgwMi4xMSBwbHVzIHJhZGlvdGFwIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0FSQ05FVF9MSU5VWCwgIkxpbnV4IEFSQ05FVCIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01MUFBQLCAiSnVuaXBlciBNdWx0aS1MaW5rIFBQUCIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfTUxGUiwgIkp1bmlwZXIgTXVsdGktTGluayBGcmFtZSBSZWxheSIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0VTLCAiSnVuaXBlciBFbmNyeXB0aW9uIFNlcnZpY2VzIFBJQyIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0dHU04sICJKdW5pcGVyIEdHU04gUElDIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9NRlIsICJKdW5pcGVyIEZSRi4xNiBGcmFtZSBSZWxheSIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0FUTTIsICJKdW5pcGVyIEFUTTIgUElDIiksCisgICAgICAgIERMVF9DSE9JQ0UoRExUX0pVTklQRVJfU0VSVklDRVMsICJKdW5pcGVyIEFkdmFuY2VkIFNlcnZpY2VzIFBJQyIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0FUTTEsICJKdW5pcGVyIEFUTTEgUElDIiksCisJRExUX0NIT0lDRShETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCwgIkFwcGxlIElQLW92ZXItSUVFRSAxMzk0IiksCisJRExUX0NIT0lDRShETFRfTVRQMl9XSVRIX1BIRFIsICJTUzcgTVRQMiB3aXRoIFBzZXVkby1oZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9NVFAyLCAiU1M3IE1UUDIiKSwKKwlETFRfQ0hPSUNFKERMVF9NVFAzLCAiU1M3IE1UUDMiKSwKKwlETFRfQ0hPSUNFKERMVF9TQ0NQLCAiU1M3IFNDQ1AiKSwKKwlETFRfQ0hPSUNFKERMVF9ET0NTSVMsICJET0NTSVMiKSwKKwlETFRfQ0hPSUNFKERMVF9MSU5VWF9JUkRBLCAiTGludXggSXJEQSIpLAorCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTLCAiODAyLjExIHBsdXMgQVZTIHJhZGlvIGluZm9ybWF0aW9uIGhlYWRlciIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01PTklUT1IsICJKdW5pcGVyIFBhc3NpdmUgTW9uaXRvciBQSUMiKSwKKwlETFRfQ0hPSUNFKERMVF9CQUNORVRfTVNfVFAsICJCQUNuZXQgTVMvVFAiKSwKKwlETFRfQ0hPSUNFKERMVF9QUFBfUFBQRCwgIlBQUCBmb3IgcHBwZCwgd2l0aCBkaXJlY3Rpb24gZmxhZyIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfUFBQT0UsICJKdW5pcGVyIFBQUG9FIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9QUFBPRV9BVE0sICJKdW5pcGVyIFBQUG9FL0FUTSIpLAorCURMVF9DSE9JQ0UoRExUX0dQUlNfTExDLCAiR1BSUyBMTEMiKSwKKwlETFRfQ0hPSUNFKERMVF9HUEZfVCwgIkdQRi1UIiksCisJRExUX0NIT0lDRShETFRfR1BGX0YsICJHUEYtRiIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfUElDX1BFRVIsICJKdW5pcGVyIFBJQyBQZWVyIiksCisJRExUX0NIT0lDRShETFRfRVJGX0VUSCwJIkV0aGVybmV0IHdpdGggRW5kYWNlIEVSRiBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9FUkZfUE9TLCAiUGFja2V0LW92ZXItU09ORVQgd2l0aCBFbmRhY2UgRVJGIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0xJTlVYX0xBUEQsICJMaW51eCB2SVNETiBMQVBEIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9FVEhFUiwgIkp1bmlwZXIgRXRoZXJuZXQiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1BQUCwgIkp1bmlwZXIgUFBQIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9GUkVMQVksICJKdW5pcGVyIEZyYW1lIFJlbGF5IiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9DSERMQywgIkp1bmlwZXIgQy1IRExDIiksCisJRExUX0NIT0lDRShETFRfTUZSLCAiRlJGLjE2IEZyYW1lIFJlbGF5IiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9WUCwgIkp1bmlwZXIgVm9pY2UgUElDIiksCisJRExUX0NIT0lDRShETFRfQTQyOSwgIkFyaW5jIDQyOSIpLAorCURMVF9DSE9JQ0UoRExUX0E2NTNfSUNNLCAiQXJpbmMgNjUzIEludGVycGFydGl0aW9uIENvbW11bmljYXRpb24iKSwKKwlETFRfQ0hPSUNFKERMVF9VU0IsICJVU0IiKSwKKwlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfSENJX0g0LCAiQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciIpLAorCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTZfTUFDX0NQUywgIklFRUUgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciIpLAorCURMVF9DSE9JQ0UoRExUX1VTQl9MSU5VWCwgIlVTQiB3aXRoIExpbnV4IGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0NBTjIwQiwgIkNvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIChDQU4pIHYuIDIuMEIiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE1XzRfTElOVVgsICJJRUVFIDgwMi4xNS40IHdpdGggTGludXggcGFkZGluZyIpLAorCURMVF9DSE9JQ0UoRExUX1BQSSwgIlBlci1QYWNrZXQgSW5mb3JtYXRpb24iKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE2X01BQ19DUFNfUkFESU8sICJJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgcGx1cyByYWRpb3RhcCBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0lTTSwgIkp1bmlwZXIgSW50ZWdyYXRlZCBTZXJ2aWNlIE1vZHVsZSIpLAorCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTVfNCwgIklFRUUgODAyLjE1LjQgd2l0aCBGQ1MiKSwKKwlETFRfQ0hPSUNFKERMVF9TSVRBLCAiU0lUQSBwc2V1ZG8taGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfRVJGLCAiRW5kYWNlIEVSRiBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9SQUlGMSwgIkV0aGVybmV0IHdpdGggdTEwIE5ldHdvcmtzIHBzZXVkby1oZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9JUE1CLCAiSVBNQiIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfU1QsICJKdW5pcGVyIFNlY3VyZSBUdW5uZWwiKSwKKwlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfSENJX0g0X1dJVEhfUEhEUiwgIkJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIgcGx1cyBwc2V1ZG8taGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfQVgyNV9LSVNTLCAiQVguMjUgd2l0aCBLSVNTIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZLCAiSUVFRSA4MDIuMTUuNCB3aXRoIG5vbi1BU0sgUEhZIGRhdGEiKSwKKwlETFRfQ0hPSUNFKERMVF9NUExTLCAiTVBMUyB3aXRoIGxhYmVsIGFzIGxpbmstbGF5ZXIgaGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfVVNCX0xJTlVYX01NQVBQRUQsICJVU0Igd2l0aCBwYWRkZWQgTGludXggaGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfREVDVCwgIkRFQ1QiKSwKKwlETFRfQ0hPSUNFKERMVF9BT1MsICJBT1MgU3BhY2UgRGF0YSBMaW5rIHByb3RvY29sIiksCisJRExUX0NIT0lDRShETFRfV0lIQVJULCAiV2lyZWxlc3MgSEFSVCIpLAorCURMVF9DSE9JQ0UoRExUX0ZDXzIsICJGaWJyZSBDaGFubmVsIEZDLTIiKSwKKwlETFRfQ0hPSUNFKERMVF9GQ18yX1dJVEhfRlJBTUVfREVMSU1TLCAiRmlicmUgQ2hhbm5lbCBGQy0yIHdpdGggZnJhbWUgZGVsaW1pdGVycyIpLAorCURMVF9DSE9JQ0UoRExUX0lQTkVULCAiU29sYXJpcyBpcG5ldCIpLAorCURMVF9DSE9JQ0UoRExUX0NBTl9TT0NLRVRDQU4sICJDQU4tYnVzIHdpdGggU29ja2V0Q0FOIGhlYWRlcnMiKSwKKwlETFRfQ0hPSUNFKERMVF9JUFY0LCAiUmF3IElQdjQiKSwKKwlETFRfQ0hPSUNFKERMVF9JUFY2LCAiUmF3IElQdjYiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE1XzRfTk9GQ1MsICJJRUVFIDgwMi4xNS40IHdpdGhvdXQgRkNTIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9WUywgIkp1bmlwZXIgVmlydHVhbCBTZXJ2ZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1NSWF9FMkUsICJKdW5pcGVyIFNSWCBFMkUiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0ZJQlJFQ0hBTk5FTCwgIkp1bmlwZXIgRmlicmUgQ2hhbm5lbCIpLAorCURMVF9DSE9JQ0UoRExUX0RWQl9DSSwgIkRWQi1DSSIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfQVRNX0NFTUlDLCAiSnVuaXBlciBBVE0gQ0VNSUMiKSwKKwlETFRfQ0hPSUNFKERMVF9ORkxPRywgIkxpbnV4IG5ldGZpbHRlciBsb2cgbWVzc2FnZXMiKSwKKwlETFRfQ0hPSUNFKERMVF9ORVRBTkFMWVpFUiwgIkV0aGVybmV0IHdpdGggSGlsc2NoZXIgbmV0QU5BTFlaRVIgcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5ULCAiRXRoZXJuZXQgd2l0aCBIaWxzY2hlciBuZXRBTkFMWVpFUiBwc2V1ZG8taGVhZGVyIGFuZCB3aXRoIHByZWFtYmxlIGFuZCBTRkQiKSwKKwlETFRfQ0hPSUNFKERMVF9JUE9JQiwgIlJGQyA0MzkxIElQLW92ZXItSW5maW5pYmFuZCIpLAorCURMVF9DSE9JQ0UoRExUX0RCVVMsICJELUJ1cyIpLAorCURMVF9DSE9JQ0VfU0VOVElORUwKK307CisKIGludAogcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNTEzLDM0ICsxMjQzLDkzIEBACiAJcmV0dXJuIChOVUxMKTsKIH0KIAorc3RydWN0IHRzdGFtcF90eXBlX2Nob2ljZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwlpbnQJdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHN0YW1wX3R5cGVfY2hvaWNlIHRzdGFtcF90eXBlX2Nob2ljZXNbXSA9IHsKKwl7ICJob3N0IiwgIkhvc3QiLCBQQ0FQX1RTVEFNUF9IT1NUIH0sCisJeyAiaG9zdF9sb3dwcmVjIiwgIkhvc3QsIGxvdyBwcmVjaXNpb24iLCBQQ0FQX1RTVEFNUF9IT1NUX0xPV1BSRUMgfSwKKwl7ICJob3N0X2hpcHJlYyIsICJIb3N0LCBoaWdoIHByZWNpc2lvbiIsIFBDQVBfVFNUQU1QX0hPU1RfSElQUkVDIH0sCisJeyAiYWRhcHRlciIsICJBZGFwdGVyIiwgUENBUF9UU1RBTVBfQURBUFRFUiB9LAorCXsgImFkYXB0ZXJfdW5zeW5jZWQiLCAiQWRhcHRlciwgbm90IHN5bmNlZCB3aXRoIHN5c3RlbSB0aW1lIiwgUENBUF9UU1RBTVBfQURBUFRFUl9VTlNZTkNFRCB9LAorCXsgTlVMTCwgTlVMTCwgMCB9Cit9OworCitpbnQKK3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHRzdGFtcF90eXBlX2Nob2ljZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHBjYXBfc3RyY2FzZWNtcCh0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gKHRzdGFtcF90eXBlX2Nob2ljZXNbaV0udHlwZSk7CisJfQorCXJldHVybiAoUENBUF9FUlJPUik7Cit9CisKK2NvbnN0IGNoYXIgKgorcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZShpbnQgdHN0YW1wX3R5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyB0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmICh0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLnR5cGUgPT0gdHN0YW1wX3R5cGUpCisJCQlyZXR1cm4gKHRzdGFtcF90eXBlX2Nob2ljZXNbaV0ubmFtZSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK2NvbnN0IGNoYXIgKgorcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24oaW50IHRzdGFtcF90eXBlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgdHN0YW1wX3R5cGVfY2hvaWNlc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgeworCQlpZiAodHN0YW1wX3R5cGVfY2hvaWNlc1tpXS50eXBlID09IHRzdGFtcF90eXBlKQorCQkJcmV0dXJuICh0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLmRlc2NyaXB0aW9uKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKwogaW50CiBwY2FwX3NuYXBzaG90KHBjYXBfdCAqcCkKIHsKKwlpZiAoIXAtPmFjdGl2YXRlZCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQpOwogCXJldHVybiAocC0+c25hcHNob3QpOwogfQogCiBpbnQKIHBjYXBfaXNfc3dhcHBlZChwY2FwX3QgKnApCiB7Ci0JcmV0dXJuIChwLT5zZi5zd2FwcGVkKTsKKwlpZiAoIXAtPmFjdGl2YXRlZCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQpOworCXJldHVybiAocC0+c3dhcHBlZCk7CiB9CiAKIGludAogcGNhcF9tYWpvcl92ZXJzaW9uKHBjYXBfdCAqcCkKIHsKLQlyZXR1cm4gKHAtPnNmLnZlcnNpb25fbWFqb3IpOworCWlmICghcC0+YWN0aXZhdGVkKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRCk7CisJcmV0dXJuIChwLT52ZXJzaW9uX21ham9yKTsKIH0KIAogaW50CiBwY2FwX21pbm9yX3ZlcnNpb24ocGNhcF90ICpwKQogewotCXJldHVybiAocC0+c2YudmVyc2lvbl9taW5vcik7CisJaWYgKCFwLT5hY3RpdmF0ZWQpCisJCXJldHVybiAoUENBUF9FUlJPUl9OT1RfQUNUSVZBVEVEKTsKKwlyZXR1cm4gKHAtPnZlcnNpb25fbWlub3IpOwogfQogCiBGSUxFICoKIHBjYXBfZmlsZShwY2FwX3QgKnApCiB7Ci0JcmV0dXJuIChwLT5zZi5yZmlsZSk7CisJcmV0dXJuIChwLT5yZmlsZSk7CiB9CiAKIGludApAQCAtNTUyLDcgKzEzNDEsNyBAQAogCWlmIChwLT5hZGFwdGVyICE9IE5VTEwpCiAJCXJldHVybiAoKGludCkoRFdPUkQpcC0+YWRhcHRlci0+aEZpbGUpOwogCWVsc2UKLQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CiAjZW5kaWYKIH0KIApAQCAtNTc5LDcgKzEzNjgsMTggQEAKIGludAogcGNhcF9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKIHsKLQlyZXR1cm4gcC0+Z2V0bm9uYmxvY2tfb3AocCwgZXJyYnVmKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcC0+Z2V0bm9uYmxvY2tfb3AocCwgZXJyYnVmKTsKKwlpZiAocmV0ID09IC0xKSB7CisJCS8qCisJCSAqIEluIGNhc2Ugc29tZWJvZHkgZGVwZW5kZWQgb24gdGhlIGJ1ZyB3aGVyZWluCisJCSAqIHRoZSBlcnJvciBtZXNzYWdlIHdhcyBwdXQgaW50byBwLT5lcnJidWYKKwkJICogYnkgcGNhcF9nZXRub25ibG9ja19mZCgpLgorCQkgKi8KKwkJc3RybGNweShwLT5lcnJidWYsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSk7CisJfQorCXJldHVybiAocmV0KTsKIH0KIAogLyoKQEAgLTU5Nyw3ICsxMzk3LDcgQEAKIAogCWZkZmxhZ3MgPSBmY250bChwLT5mZCwgRl9HRVRGTCwgMCk7CiAJaWYgKGZkZmxhZ3MgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRl9HRVRGTDogJXMiLAorCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGX0dFVEZMOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTYxMSw3ICsxNDExLDE4IEBACiBpbnQKIHBjYXBfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKIHsKLQlyZXR1cm4gcC0+c2V0bm9uYmxvY2tfb3AocCwgbm9uYmxvY2ssIGVycmJ1Zik7CisJaW50IHJldDsKKworCXJldCA9IHAtPnNldG5vbmJsb2NrX29wKHAsIG5vbmJsb2NrLCBlcnJidWYpOworCWlmIChyZXQgPT0gLTEpIHsKKwkJLyoKKwkJICogSW4gY2FzZSBzb21lYm9keSBkZXBlbmRlZCBvbiB0aGUgYnVnIHdoZXJlaW4KKwkJICogdGhlIGVycm9yIG1lc3NhZ2Ugd2FzIHB1dCBpbnRvIHAtPmVycmJ1ZgorCQkgKiBieSBwY2FwX3NldG5vbmJsb2NrX2ZkKCkuCisJCSAqLworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwl9CisJcmV0dXJuIChyZXQpOwogfQogCiAjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQpAQCAtNjI4LDcgKzE0MzksNyBAQAogCiAJZmRmbGFncyA9IGZjbnRsKHAtPmZkLCBGX0dFVEZMLCAwKTsKIAlpZiAoZmRmbGFncyA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGX0dFVEZMOiAlcyIsCisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZfR0VURkw6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtNjM3LDcgKzE0NDgsNyBAQAogCWVsc2UKIAkJZmRmbGFncyAmPSB+T19OT05CTE9DSzsKIAlpZiAoZmNudGwocC0+ZmQsIEZfU0VURkwsIGZkZmxhZ3MpID09IC0xKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZfU0VURkw6ICVzIiwKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRl9TRVRGTDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC02NzksNiArMTQ5MCw2NSBAQAogI2VuZGlmCiAKIC8qCisgKiBHZW5lcmF0ZSBlcnJvciBzdHJpbmdzIGZvciBQQ0FQX0VSUk9SXyBhbmQgUENBUF9XQVJOSU5HXyB2YWx1ZXMuCisgKi8KK2NvbnN0IGNoYXIgKgorcGNhcF9zdGF0dXN0b3N0cihpbnQgZXJybnVtKQoreworCXN0YXRpYyBjaGFyIGVidWZbMTUrMTArMV07CisKKwlzd2l0Y2ggKGVycm51bSkgeworCisJY2FzZSBQQ0FQX1dBUk5JTkc6CisJCXJldHVybigiR2VuZXJpYyB3YXJuaW5nIik7CisKKwljYXNlIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVA6CisJCXJldHVybiAoIlRoYXQgdHlwZSBvZiB0aW1lIHN0YW1wIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhhdCBkZXZpY2UiKTsKKworCWNhc2UgUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQOgorCQlyZXR1cm4gKCJUaGF0IGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcHJvbWlzY3VvdXMgbW9kZSIpOworCisJY2FzZSBQQ0FQX0VSUk9SOgorCQlyZXR1cm4oIkdlbmVyaWMgZXJyb3IiKTsKKworCWNhc2UgUENBUF9FUlJPUl9CUkVBSzoKKwkJcmV0dXJuKCJMb29wIHRlcm1pbmF0ZWQgYnkgcGNhcF9icmVha2xvb3AiKTsKKworCWNhc2UgUENBUF9FUlJPUl9OT1RfQUNUSVZBVEVEOgorCQlyZXR1cm4oIlRoZSBwY2FwX3QgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCIpOworCisJY2FzZSBQQ0FQX0VSUk9SX0FDVElWQVRFRDoKKwkJcmV0dXJuICgiVGhlIHNldHRpbmcgY2FuJ3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgcGNhcF90IGlzIGFjdGl2YXRlZCIpOworCisJY2FzZSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOgorCQlyZXR1cm4gKCJObyBzdWNoIGRldmljZSBleGlzdHMiKTsKKworCWNhc2UgUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA6CisJCXJldHVybiAoIlRoYXQgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtb25pdG9yIG1vZGUiKTsKKworCWNhc2UgUENBUF9FUlJPUl9OT1RfUkZNT046CisJCXJldHVybiAoIlRoYXQgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGluIG1vbml0b3IgbW9kZSIpOworCisJY2FzZSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOgorCQlyZXR1cm4gKCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNhcHR1cmUgb24gdGhhdCBkZXZpY2UiKTsKKworCWNhc2UgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVA6CisJCXJldHVybiAoIlRoYXQgZGV2aWNlIGlzIG5vdCB1cCIpOworCisJY2FzZSBQQ0FQX0VSUk9SX0NBTlRTRVRfVFNUQU1QX1RZUEU6CisJCXJldHVybiAoIlRoYXQgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSB0aW1lIHN0YW1wIHR5cGUiKTsKKworCWNhc2UgUENBUF9FUlJPUl9QUk9NSVNDX1BFUk1fREVOSUVEOgorCQlyZXR1cm4gKCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBvbiB0aGF0IGRldmljZSIpOworCisJY2FzZSBQQ0FQX0VSUk9SX1RTVEFNUF9QUkVDSVNJT05fTk9UU1VQOgorCQlyZXR1cm4gKCJUaGF0IGRldmljZSBkb2Vzbid0IHN1cHBvcnQgdGhhdCB0aW1lIHN0YW1wIHByZWNpc2lvbiIpOworCX0KKwkodm9pZClzbnByaW50ZihlYnVmLCBzaXplb2YgZWJ1ZiwgIlVua25vd24gZXJyb3I6ICVkIiwgZXJybnVtKTsKKwlyZXR1cm4oZWJ1Zik7Cit9CisKKy8qCiAgKiBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBzdHJlcnJvcigpLgogICovCiBjb25zdCBjaGFyICoKQEAgLTY4OSw3ICsxNTU5LDcgQEAKICNlbHNlCiAJZXh0ZXJuIGludCBzeXNfbmVycjsKIAlleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX2Vycmxpc3RbXTsKLQlzdGF0aWMgY2hhciBlYnVmWzIwXTsKKwlzdGF0aWMgY2hhciBlYnVmWzE1KzEwKzFdOwogCiAJaWYgKCh1bnNpZ25lZCBpbnQpZXJybnVtIDwgc3lzX25lcnIpCiAJCXJldHVybiAoKGNoYXIgKilzeXNfZXJybGlzdFtlcnJudW1dKTsKQEAgLTcwMSw3ICsxNTcxLDcgQEAKIGludAogcGNhcF9zZXRmaWx0ZXIocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQogewotCXJldHVybiBwLT5zZXRmaWx0ZXJfb3AocCwgZnApOworCXJldHVybiAocC0+c2V0ZmlsdGVyX29wKHAsIGZwKSk7CiB9CiAKIC8qCkBAIC03MTYsMTUgKzE1ODYsMTUgQEAKIAlpZiAocC0+c2V0ZGlyZWN0aW9uX29wID09IE5VTEwpIHsKIAkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIlNldHRpbmcgZGlyZWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuICgtMSk7CiAJfSBlbHNlCi0JCXJldHVybiBwLT5zZXRkaXJlY3Rpb25fb3AocCwgZCk7CisJCXJldHVybiAocC0+c2V0ZGlyZWN0aW9uX29wKHAsIGQpKTsKIH0KIAogaW50CiBwY2FwX3N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCiB7Ci0JcmV0dXJuIHAtPnN0YXRzX29wKHAsIHBzKTsKKwlyZXR1cm4gKHAtPnN0YXRzX29wKHAsIHBzKSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTczNSwzNyArMTYwNSwyMjAgQEAKIAlyZXR1cm4gKC0xKTsKIH0KIAotdm9pZAotcGNhcF9jbG9zZV9jb21tb24ocGNhcF90ICpwKQorI2lmZGVmIFdJTjMyCitpbnQKK3BjYXBfc2V0YnVmZihwY2FwX3QgKnAsIGludCBkaW0pCiB7Ci0JaWYgKHAtPmJ1ZmZlciAhPSBOVUxMKQorCXJldHVybiAocC0+c2V0YnVmZl9vcChwLCBkaW0pKTsKK30KKworc3RhdGljIGludAorcGNhcF9zZXRidWZmX2RlYWQocGNhcF90ICpwLCBpbnQgZGltKQoreworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlRoZSBrZXJuZWwgYnVmZmVyIHNpemUgY2Fubm90IGJlIHNldCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK3BjYXBfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKQoreworCXJldHVybiAocC0+c2V0bW9kZV9vcChwLCBtb2RlKSk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfc2V0bW9kZV9kZWFkKHBjYXBfdCAqcCwgaW50IG1vZGUpCit7CisJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiaW1wb3NzaWJsZSB0byBzZXQgbW9kZSBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK3BjYXBfc2V0bWludG9jb3B5KHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJcmV0dXJuIChwLT5zZXRtaW50b2NvcHlfb3AocCwgc2l6ZSkpOworfQorCitBZGFwdGVyICoKK3BjYXBfZ2V0X2FkYXB0ZXIocGNhcF90ICpwKQoreworCXJldHVybiAocC0+Z2V0YWRhcHRlcl9vcChwKSk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfc2V0bWludG9jb3B5X2RlYWQocGNhcF90ICpwLCBpbnQgc2l6ZSkKK3sKKwlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJUaGUgbWludG9jb3B5IHBhcmFtZXRlciBjYW5ub3QgYmUgc2V0IG9uIGEgcGNhcF9vcGVuX2RlYWQgcGNhcF90Iik7CisJcmV0dXJuICgtMSk7Cit9CisjZW5kaWYKKworLyoKKyAqIE9uIHNvbWUgcGxhdGZvcm1zLCB3ZSBuZWVkIHRvIGNsZWFuIHVwIHByb21pc2N1b3VzIG9yIG1vbml0b3IgbW9kZQorICogd2hlbiB3ZSBjbG9zZSBhIGRldmljZSAtIGFuZCB3ZSB3YW50IHRoYXQgdG8gaGFwcGVuIGV2ZW4gaWYgdGhlCisgKiBhcHBsaWNhdGlvbiBqdXN0IGV4aXRzIHdpdGhvdXQgZXhwbGljaXRsIGNsb3NpbmcgZGV2aWNlcy4KKyAqIE9uIHRob3NlIHBsYXRmb3Jtcywgd2UgbmVlZCB0byByZWdpc3RlciBhICJjbG9zZSBhbGwgdGhlIHBjYXBzIgorICogcm91dGluZSB0byBiZSBjYWxsZWQgd2hlbiB3ZSBleGl0LCBhbmQgbmVlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YKKyAqIHBjYXBzIHRoYXQgbmVlZCB0byBiZSBjbG9zZWQgdG8gY2xlYW4gdXAgbW9kZXMuCisgKgorICogWFhYIC0gbm90IHRocmVhZC1zYWZlLgorICovCisKKy8qCisgKiBMaXN0IG9mIHBjYXBzIG9uIHdoaWNoIHdlJ3ZlIGRvbmUgc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUKKyAqIGNsZWFuZWQgdXAuCisgKiBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggcGNhcHMsIHdlIGFycmFuZ2UgdG8gY2FsbCAicGNhcF9jbG9zZV9hbGwoKSIKKyAqIHdoZW4gd2UgZXhpdCwgYW5kIGhhdmUgaXQgY2xvc2UgYWxsIG9mIHRoZW0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNhcCAqcGNhcHNfdG9fY2xvc2U7CisKKy8qCisgKiBUUlVFIGlmIHdlJ3ZlIGFscmVhZHkgY2FsbGVkICJhdGV4aXQoKSIgdG8gY2F1c2UgInBjYXBfY2xvc2VfYWxsKCkiIHRvCisgKiBiZSBjYWxsZWQgb24gZXhpdC4KKyAqLworc3RhdGljIGludCBkaWRfYXRleGl0OworCitzdGF0aWMgdm9pZAorcGNhcF9jbG9zZV9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgcGNhcCAqaGFuZGxlOworCisJd2hpbGUgKChoYW5kbGUgPSBwY2Fwc190b19jbG9zZSkgIT0gTlVMTCkKKwkJcGNhcF9jbG9zZShoYW5kbGUpOworfQorCitpbnQKK3BjYXBfZG9fYWRkZXhpdChwY2FwX3QgKnApCit7CisJLyoKKwkgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgYXJyYW5nZSB0byBoYXZlCisJICogInBjYXBfY2xvc2VfYWxsKCkiIGNhbGxlZCB3aGVuIHdlIGV4aXQuCisJICovCisJaWYgKCFkaWRfYXRleGl0KSB7CisJCWlmIChhdGV4aXQocGNhcF9jbG9zZV9hbGwpID09IC0xKSB7CisJCQkvKgorCQkJICogImF0ZXhpdCgpIiBmYWlsZWQ7IGxldCBvdXIgY2FsbGVyIGtub3cuCisJCQkgKi8KKwkJCXN0cm5jcHkocC0+ZXJyYnVmLCAiYXRleGl0IGZhaWxlZCIsCisJCQkgICAgUENBUF9FUlJCVUZfU0laRSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWRpZF9hdGV4aXQgPSAxOworCX0KKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShwY2FwX3QgKnApCit7CisJcC0+bmV4dCA9IHBjYXBzX3RvX2Nsb3NlOworCXBjYXBzX3RvX2Nsb3NlID0gcDsKK30KKwordm9pZAorcGNhcF9yZW1vdmVfZnJvbV9wY2Fwc190b19jbG9zZShwY2FwX3QgKnApCit7CisJcGNhcF90ICpwYywgKnByZXZwYzsKKworCWZvciAocGMgPSBwY2Fwc190b19jbG9zZSwgcHJldnBjID0gTlVMTDsgcGMgIT0gTlVMTDsKKwkgICAgcHJldnBjID0gcGMsIHBjID0gcGMtPm5leHQpIHsKKwkJaWYgKHBjID09IHApIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBpdC4gIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LgorCQkJICovCisJCQlpZiAocHJldnBjID09IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIEl0IHdhcyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKwkJCQkgKi8KKwkJCQlwY2Fwc190b19jbG9zZSA9IHBjLT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIEl0IHdhcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCXByZXZwYy0+bmV4dCA9IHBjLT5uZXh0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQKK3BjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwY2FwX3QgKnApCit7CisJaWYgKHAtPmJ1ZmZlciAhPSBOVUxMKSB7CiAJCWZyZWUocC0+YnVmZmVyKTsKKwkJcC0+YnVmZmVyID0gTlVMTDsKKwl9CisJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJZnJlZShwLT5kbHRfbGlzdCk7CisJCXAtPmRsdF9saXN0ID0gTlVMTDsKKwkJcC0+ZGx0X2NvdW50ID0gMDsKKwl9CisJaWYgKHAtPnRzdGFtcF90eXBlX2xpc3QgIT0gTlVMTCkgeworCQlmcmVlKHAtPnRzdGFtcF90eXBlX2xpc3QpOworCQlwLT50c3RhbXBfdHlwZV9saXN0ID0gTlVMTDsKKwkJcC0+dHN0YW1wX3R5cGVfY291bnQgPSAwOworCX0KKwlpZiAocC0+dHN0YW1wX3ByZWNpc2lvbl9saXN0ICE9IE5VTEwpIHsKKwkJZnJlZShwLT50c3RhbXBfcHJlY2lzaW9uX2xpc3QpOworCQlwLT50c3RhbXBfcHJlY2lzaW9uX2xpc3QgPSBOVUxMOworCQlwLT50c3RhbXBfcHJlY2lzaW9uX2NvdW50ID0gMDsKKwl9CisJcGNhcF9mcmVlY29kZSgmcC0+ZmNvZGUpOwogI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKLQlpZiAocC0+ZmQgPj0gMCkKKwlpZiAocC0+ZmQgPj0gMCkgewogCQljbG9zZShwLT5mZCk7CisJCXAtPmZkID0gLTE7CisJfQorCXAtPnNlbGVjdGFibGVfZmQgPSAtMTsKICNlbmRpZgogfQogCiBzdGF0aWMgdm9pZAotcGNhcF9jbG9zZV9kZWFkKHBjYXBfdCAqcCBfVV8pCitwY2FwX2NsZWFudXBfZGVhZChwY2FwX3QgKnAgX1VfKQogewogCS8qIE5vdGhpbmcgdG8gZG8uICovCiB9CiAKIHBjYXBfdCAqCi1wY2FwX29wZW5fZGVhZChpbnQgbGlua3R5cGUsIGludCBzbmFwbGVuKQorcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGludCBsaW5rdHlwZSwgaW50IHNuYXBsZW4sIHVfaW50IHByZWNpc2lvbikKIHsKIAlwY2FwX3QgKnA7CiAKKwlzd2l0Y2ggKHByZWNpc2lvbikgeworCisJY2FzZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk86CisJY2FzZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CiAJcCA9IG1hbGxvYyhzaXplb2YoKnApKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQgKHAsIDAsIHNpemVvZigqcCkpOwogCXAtPnNuYXBzaG90ID0gc25hcGxlbjsKIAlwLT5saW5rdHlwZSA9IGxpbmt0eXBlOworCXAtPm9wdC50c3RhbXBfcHJlY2lzaW9uID0gcHJlY2lzaW9uOwogCXAtPnN0YXRzX29wID0gcGNhcF9zdGF0c19kZWFkOwotCXAtPmNsb3NlX29wID0gcGNhcF9jbG9zZV9kZWFkOwotCXJldHVybiBwOworI2lmZGVmIFdJTjMyCisJcC0+c2V0YnVmZl9vcCA9IHBjYXBfc2V0YnVmZl9kZWFkOworCXAtPnNldG1vZGVfb3AgPSBwY2FwX3NldG1vZGVfZGVhZDsKKwlwLT5zZXRtaW50b2NvcHlfb3AgPSBwY2FwX3NldG1pbnRvY29weV9kZWFkOworI2VuZGlmCisJcC0+Y2xlYW51cF9vcCA9IHBjYXBfY2xlYW51cF9kZWFkOworCXAtPmFjdGl2YXRlZCA9IDE7CisJcmV0dXJuIChwKTsKK30KKworcGNhcF90ICoKK3BjYXBfb3Blbl9kZWFkKGludCBsaW5rdHlwZSwgaW50IHNuYXBsZW4pCit7CisJcmV0dXJuIChwY2FwX29wZW5fZGVhZF93aXRoX3RzdGFtcF9wcmVjaXNpb24obGlua3R5cGUsIHNuYXBsZW4sCisJICAgIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTykpOwogfQogCiAvKgpAQCAtNzk1LDE0ICsxODQ4LDMxIEBACiB2b2lkCiBwY2FwX2Nsb3NlKHBjYXBfdCAqcCkKIHsKLQlwLT5jbG9zZV9vcChwKTsKLQlpZiAocC0+ZGx0X2xpc3QgIT0gTlVMTCkKLQkJZnJlZShwLT5kbHRfbGlzdCk7Ci0JcGNhcF9mcmVlY29kZSgmcC0+ZmNvZGUpOworCWlmIChwLT5vcHQuc291cmNlICE9IE5VTEwpCisJCWZyZWUocC0+b3B0LnNvdXJjZSk7CisJcC0+Y2xlYW51cF9vcChwKTsKIAlmcmVlKHApOwogfQogCiAvKgorICogR2l2ZW4gYSBCUEYgcHJvZ3JhbSwgYSBwY2FwX3BrdGhkciBzdHJ1Y3R1cmUgZm9yIGEgcGFja2V0LCBhbmQgdGhlIHJhdworICogZGF0YSBmb3IgdGhlIHBhY2tldCwgY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IHBhc3NlcyB0aGUgZmlsdGVyLgorICogUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaWx0ZXIgcHJvZ3JhbSwgd2hpY2ggd2lsbCBiZSB6ZXJvIGlmCisgKiB0aGUgcGFja2V0IGRvZXNuJ3QgcGFzcyBhbmQgbm9uLXplcm8gaWYgdGhlIHBhY2tldCBkb2VzIHBhc3MuCisgKi8KK2ludAorcGNhcF9vZmZsaW5lX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsCisgICAgY29uc3QgdV9jaGFyICpwa3QpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICpmY29kZSA9IGZwLT5iZl9pbnNuczsKKworCWlmIChmY29kZSAhPSBOVUxMKSAKKwkJcmV0dXJuIChicGZfZmlsdGVyKGZjb2RlLCBwa3QsIGgtPmxlbiwgaC0+Y2FwbGVuKSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorCisvKgogICogV2UgbWFrZSB0aGUgdmVyc2lvbiBzdHJpbmcgc3RhdGljLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdCwgcmF0aGVyCiAgKiB0aGFuIGV4cG9ydGluZyB0aGUgdmVyc2lvbiBzdHJpbmcgZGlyZWN0bHkuICBPbiBhdCBsZWFzdCBzb21lIFVOSVhlcywKICAqIGlmIHlvdSBpbXBvcnQgZGF0YSBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgaW50byBhbiBwcm9ncmFtLCB0aGUgZGF0YSBpcwpAQCAtODE3LDcgKzE4ODcsNyBAQAogI2lmZGVmIEhBVkVfVkVSU0lPTl9ICiAjaW5jbHVkZSAidmVyc2lvbi5oIgogI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICJsaWJwY2FwIHZlcnNpb24gMC45LjgiOworc3RhdGljIGNvbnN0IGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ1tdID0gImxpYnBjYXAgdmVyc2lvbiAxLngueSI7CiAjZW5kaWYKIAogI2lmZGVmIFdJTjMyCkBAIC04NTYsNiArMTkyNiw4IEBACiAJCQkgICAgc3RybGVuKHBjYXBfdmVyc2lvbl9zdHJpbmcpOwogCQkJZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID0KIAkJCSAgICBtYWxsb2MoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nX2xlbik7CisJCQlpZiAoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID09IE5VTEwpCisJCQkJcmV0dXJuIChOVUxMKTsKIAkJCXNwcmludGYoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nLAogCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmdfZm10LCB3cGNhcF92ZXJzaW9uX3N0cmluZywKIAkJCSAgICBwY2FwX3ZlcnNpb25fc3RyaW5nKTsKQEAgLTg3Myw3ICsxOTQ1LDggQEAKIAkJCSAgICBzdHJsZW4ocGFja2V0X3ZlcnNpb25fc3RyaW5nKSArCiAJCQkgICAgc3RybGVuKHBjYXBfdmVyc2lvbl9zdHJpbmcpOwogCQkJZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID0gbWFsbG9jKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZ19sZW4pOwotCisJCQlpZiAoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID09IE5VTEwpCisJCQkJcmV0dXJuIChOVUxMKTsKIAkJCXNwcmludGYoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nLAogCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmdfcGFja2V0X2RsbF9mbXQsCiAJCQkgICAgd3BjYXBfdmVyc2lvbl9zdHJpbmcsIHBhY2tldF92ZXJzaW9uX3N0cmluZywKQEAgLTkwMiw2ICsxOTc1LDggQEAKIAkJICAgIHNpemVvZiBkb3NwZnggKyBzdHJsZW4ocGNhcF92ZXJzaW9uX3N0cmluZyk7CiAJCWZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9CiAJCSAgICBtYWxsb2MoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nX2xlbik7CisJCWlmIChmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcgPT0gTlVMTCkKKwkJCXJldHVybiAoTlVMTCk7CiAJCXN0cmNweShmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsIGRvc3BmeCk7CiAJCXN0cmNhdChmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsIHBjYXBfdmVyc2lvbl9zdHJpbmcpOwogCX0KZGlmZiAtLWdpdCBhL3BjYXAuaCBiL3BjYXAuaAppbmRleCA5Yzg3NjdlLi40OTBhNGJmIDEwMDY0NAotLS0gYS9wY2FwLmgKKysrIGIvcGNhcC5oCkBAIC0xLDQgKzEsMyBAQAotLyogLSotIE1vZGU6IGM7IHRhYi13aWR0aDogODsgaW5kZW50LXRhYnMtbW9kZTogMTsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLSAqLwogLyoKICAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwogICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0zMSwyOTQgKzMwLDE2IEBACiAgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAgKiBTVUNIIERBTUFHRS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAuaCx2IDEuNTIuMi43IDIwMDcvMDYvMTEgMDk6NTI6MDUgZ3V5IEV4cCAkIChMQkwpCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAuaCx2IDEuNTkgMjAwNi0xMC0wNCAxODowOToyMiBndXkgRXhwICQgKExCTCkKICAqLwogCi0jaWZuZGVmIGxpYl9wY2FwX2gKLSNkZWZpbmUgbGliX3BjYXBfaAotCi0jaWYgZGVmaW5lZChXSU4zMikKLSAgI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+Ci0jZWxpZiBkZWZpbmVkKE1TRE9TKQotICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ICAvKiB1X2ludCwgdV9jaGFyIGV0Yy4gKi8KLSNlbHNlIC8qIFVOKlggKi8KLSAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZiAvKiBXSU4zMi9NU0RPUy9VTipYICovCi0KLSNpZm5kZWYgUENBUF9ET05UX0lOQ0xVREVfUENBUF9CUEZfSAotI2luY2x1ZGUgPHBjYXAtYnBmLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBQQ0FQX1ZFUlNJT05fTUFKT1IgMgotI2RlZmluZSBQQ0FQX1ZFUlNJT05fTUlOT1IgNAotCi0jZGVmaW5lIFBDQVBfRVJSQlVGX1NJWkUgMjU2Ci0KIC8qCi0gKiBDb21wYXRpYmlsaXR5IGZvciBzeXN0ZW1zIHRoYXQgaGF2ZSBhIGJwZi5oIHRoYXQKLSAqIHByZWRhdGVzIHRoZSBicGYgdHlwZWRlZnMgZm9yIDY0LWJpdCBzdXBwb3J0LgotICovCi0jaWYgQlBGX1JFTEVBU0UgLSAwIDwgMTk5NDA2Ci10eXBlZGVmCWludCBicGZfaW50MzI7Ci10eXBlZGVmCXVfaW50IGJwZl91X2ludDMyOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHBjYXAgcGNhcF90OwotdHlwZWRlZiBzdHJ1Y3QgcGNhcF9kdW1wZXIgcGNhcF9kdW1wZXJfdDsKLXR5cGVkZWYgc3RydWN0IHBjYXBfaWYgcGNhcF9pZl90OwotdHlwZWRlZiBzdHJ1Y3QgcGNhcF9hZGRyIHBjYXBfYWRkcl90OwotCi0vKgotICogVGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZmlsZSBjb250YWlucyBzYXZlZCB2YWx1ZXMgZm9yIHNvbWUKLSAqIG9mIHRoZSBmbGFncyB1c2VkIGluIHRoZSBwcmludG91dCBwaGFzZXMgb2YgdGNwZHVtcC4KLSAqIE1hbnkgZmllbGRzIGhlcmUgYXJlIDMyIGJpdCBpbnRzIHNvIGNvbXBpbGVycyB3b24ndCBpbnNlcnQgdW53YW50ZWQKLSAqIHBhZGRpbmc7IHRoZXNlIGZpbGVzIG5lZWQgdG8gYmUgaW50ZXJjaGFuZ2VhYmxlIGFjcm9zcyBhcmNoaXRlY3R1cmVzLgorICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICoKLSAqIERvIG5vdCBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gYW55IHdheSAodGhpcyBpbmNsdWRlcwotICogY2hhbmdlcyB0aGF0IG9ubHkgYWZmZWN0IHRoZSBsZW5ndGggb2YgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlKS4KLSAqCi0gKiBBbHNvLCBkbyBub3QgY2hhbmdlIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBhbnkgb2YgdGhlIG1lbWJlcnMgb2YgdGhpcwotICogc3RydWN0dXJlLCBpbiBhbnkgd2F5ICh0aGlzIGluY2x1ZGVzIHVzaW5nIHZhbHVlcyBvdGhlciB0aGFuCi0gKiBMSU5LVFlQRV8gdmFsdWVzLCBhcyBkZWZpbmVkIGluICJzYXZlZmlsZS5jIiwgaW4gdGhlICJsaW5rdHlwZSIKLSAqIGZpZWxkKS4KLSAqCi0gKiBJbnN0ZWFkOgotICoKLSAqCWludHJvZHVjZSBhIG5ldyBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgZm9ybWF0LCBpZiB0aGUgbGF5b3V0Ci0gKglvZiB0aGUgc3RydWN0dXJlIGNoYW5nZWQ7Ci0gKgotICoJc2VuZCBtYWlsIHRvICJ0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmciLCByZXF1ZXN0aW5nIGEgbmV3Ci0gKgltYWdpYyBudW1iZXIgZm9yIHlvdXIgbmV3IGNhcHR1cmUgZmlsZSBmb3JtYXQsIGFuZCwgd2hlbgotICoJeW91IGdldCB0aGUgbmV3IG1hZ2ljIG51bWJlciwgcHV0IGl0IGluICJzYXZlZmlsZS5jIjsKLSAqCi0gKgl1c2UgdGhhdCBtYWdpYyBudW1iZXIgZm9yIHNhdmUgZmlsZXMgd2l0aCB0aGUgY2hhbmdlZCBmaWxlCi0gKgloZWFkZXI7Ci0gKgotICoJbWFrZSB0aGUgY29kZSBpbiAic2F2ZWZpbGUuYyIgY2FwYWJsZSBvZiByZWFkaW5nIGZpbGVzIHdpdGgKLSAqCXRoZSBvbGQgZmlsZSBoZWFkZXIgYXMgd2VsbCBhcyBmaWxlcyB3aXRoIHRoZSBuZXcgZmlsZSBoZWFkZXIKLSAqCSh1c2luZyB0aGUgbWFnaWMgbnVtYmVyIHRvIGRldGVybWluZSB0aGUgaGVhZGVyIGZvcm1hdCkuCi0gKgotICogVGhlbiBzdXBwbHkgdGhlIGNoYW5nZXMgdG8gInBhdGNoZXNAdGNwZHVtcC5vcmciLCBzbyB0aGF0IGZ1dHVyZQotICogdmVyc2lvbnMgb2YgbGlicGNhcCBhbmQgcHJvZ3JhbXMgdGhhdCB1c2UgaXQgKHN1Y2ggYXMgdGNwZHVtcCkgd2lsbAotICogYmUgYWJsZSB0byByZWFkIHlvdXIgbmV3IGNhcHR1cmUgZmlsZSBmb3JtYXQuCisgKiBOb3RlIHRvIE9TIHZlbmRvcnM6IGRvIE5PVCBnZXQgcmlkIG9mIHRoaXMgZmlsZSEgIE1hbnkgYXBwbGljYXRpb25zCisgKiBleHBlY3QgdG8gYmUgYWJsZSB0byBpbmNsdWRlIDxwY2FwLmg+LCBhbmQgYXQgbGVhc3Qgc29tZSBvZiB0aGVtCisgKiBnbyB0aHJvdWdoIGNvbnRvcnRpb25zIGluIHRoZWlyIGNvbmZpZ3VyZSBzY3JpcHRzIHRvIHRyeSB0byBkZXRlY3QKKyAqIE9TZXMgdGhhdCBoYXZlICJoZWxwZnVsbHkiIG1vdmVkIHBjYXAuaCB0byA8cGNhcC9wY2FwLmg+IHdpdGhvdXQKKyAqIGxlYXZpbmcgYmVoaW5kIGEgPHBjYXAuaD4gZmlsZS4KICAqLwotc3RydWN0IHBjYXBfZmlsZV9oZWFkZXIgewotCWJwZl91X2ludDMyIG1hZ2ljOwotCXVfc2hvcnQgdmVyc2lvbl9tYWpvcjsKLQl1X3Nob3J0IHZlcnNpb25fbWlub3I7Ci0JYnBmX2ludDMyIHRoaXN6b25lOwkvKiBnbXQgdG8gbG9jYWwgY29ycmVjdGlvbiAqLwotCWJwZl91X2ludDMyIHNpZ2ZpZ3M7CS8qIGFjY3VyYWN5IG9mIHRpbWVzdGFtcHMgKi8KLQlicGZfdV9pbnQzMiBzbmFwbGVuOwkvKiBtYXggbGVuZ3RoIHNhdmVkIHBvcnRpb24gb2YgZWFjaCBwa3QgKi8KLQlicGZfdV9pbnQzMiBsaW5rdHlwZTsJLyogZGF0YSBsaW5rIHR5cGUgKExJTktUWVBFXyopICovCi19OwotCi10eXBlZGVmIGVudW0gewotICAgICAgIFBDQVBfRF9JTk9VVCA9IDAsCi0gICAgICAgUENBUF9EX0lOLAotICAgICAgIFBDQVBfRF9PVVQKLX0gcGNhcF9kaXJlY3Rpb25fdDsKLQotLyoKLSAqIEdlbmVyaWMgcGVyLXBhY2tldCBpbmZvcm1hdGlvbiwgYXMgc3VwcGxpZWQgYnkgbGlicGNhcC4KLSAqCi0gKiBUaGUgdGltZSBzdGFtcCBjYW4gYW5kIHNob3VsZCBiZSBhICJzdHJ1Y3QgdGltZXZhbCIsIHJlZ2FyZGxlc3Mgb2YKLSAqIHdoZXRoZXIgeW91ciBzeXN0ZW0gc3VwcG9ydHMgMzItYml0IHR2X3NlYyBpbiAic3RydWN0IHRpbWV2YWwiLAotICogNjQtYml0IHR2X3NlYyBpbiAic3RydWN0IHRpbWV2YWwiLCBvciBib3RoIGlmIGl0IHN1cHBvcnRzIGJvdGggMzItYml0Ci0gKiBhbmQgNjQtYml0IGFwcGxpY2F0aW9ucy4gIFRoZSBvbi1kaXNrIGZvcm1hdCBvZiBzYXZlZmlsZXMgdXNlcyAzMi1iaXQKLSAqIHR2X3NlYyAoYW5kIHR2X3VzZWMpOyB0aGlzIHN0cnVjdHVyZSBpcyBpcnJlbGV2YW50IHRvIHRoYXQuICAzMi1iaXQKLSAqIGFuZCA2NC1iaXQgdmVyc2lvbnMgb2YgbGlicGNhcCwgZXZlbiBpZiB0aGV5J3JlIG9uIHRoZSBzYW1lIHBsYXRmb3JtLAotICogc2hvdWxkIHN1cHBseSB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBvZiAic3RydWN0IHRpbWV2YWwiLCBldmVuIGlmCi0gKiB0aGF0J3Mgbm90IHdoYXQgdGhlIHVuZGVybHlpbmcgcGFja2V0IGNhcHR1cmUgbWVjaGFuaXNtIHN1cHBsaWVzLgotICovCi1zdHJ1Y3QgcGNhcF9wa3RoZHIgewotCXN0cnVjdCB0aW1ldmFsIHRzOwkvKiB0aW1lIHN0YW1wICovCi0JYnBmX3VfaW50MzIgY2FwbGVuOwkvKiBsZW5ndGggb2YgcG9ydGlvbiBwcmVzZW50ICovCi0JYnBmX3VfaW50MzIgbGVuOwkvKiBsZW5ndGggdGhpcyBwYWNrZXQgKG9mZiB3aXJlKSAqLwotfTsKLQotLyoKLSAqIEFzIHJldHVybmVkIGJ5IHRoZSBwY2FwX3N0YXRzKCkKLSAqLwotc3RydWN0IHBjYXBfc3RhdCB7Ci0JdV9pbnQgcHNfcmVjdjsJCS8qIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkICovCi0JdV9pbnQgcHNfZHJvcDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgKi8KLQl1X2ludCBwc19pZmRyb3A7CS8qIGRyb3BzIGJ5IGludGVyZmFjZSBYWFggbm90IHlldCBzdXBwb3J0ZWQgKi8KLSNpZmRlZiBXSU4zMgotCXVfaW50IGJzX2NhcHQ7CQkvKiBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHJlYWNoIHRoZSBhcHBsaWNhdGlvbiAqLwotI2VuZGlmIC8qIFdJTjMyICovCi19OwotCi0jaWZkZWYgTVNET1MKLS8qCi0gKiBBcyByZXR1cm5lZCBieSB0aGUgcGNhcF9zdGF0c19leCgpCi0gKi8KLXN0cnVjdCBwY2FwX3N0YXRfZXggewotICAgICAgIHVfbG9uZyAgcnhfcGFja2V0czsgICAgICAgIC8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgKi8KLSAgICAgICB1X2xvbmcgIHR4X3BhY2tldHM7ICAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkICAgICovCi0gICAgICAgdV9sb25nICByeF9ieXRlczsgICAgICAgICAgLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgICAgICAgICAqLwotICAgICAgIHVfbG9uZyAgdHhfYnl0ZXM7ICAgICAgICAgIC8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkICAgICAgKi8KLSAgICAgICB1X2xvbmcgIHJ4X2Vycm9yczsgICAgICAgICAvKiBiYWQgcGFja2V0cyByZWNlaXZlZCAgICAgICAgICovCi0gICAgICAgdV9sb25nICB0eF9lcnJvcnM7ICAgICAgICAgLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICAgICAqLwotICAgICAgIHVfbG9uZyAgcnhfZHJvcHBlZDsgICAgICAgIC8qIG5vIHNwYWNlIGluIFJ4IGJ1ZmZlcnMgICAgICAgKi8KLSAgICAgICB1X2xvbmcgIHR4X2Ryb3BwZWQ7ICAgICAgICAvKiBubyBzcGFjZSBhdmFpbGFibGUgZm9yIFR4ICAgICovCi0gICAgICAgdV9sb25nICBtdWx0aWNhc3Q7ICAgICAgICAgLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQgICAqLwotICAgICAgIHVfbG9uZyAgY29sbGlzaW9uczsKLQotICAgICAgIC8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KLSAgICAgICB1X2xvbmcgIHJ4X2xlbmd0aF9lcnJvcnM7Ci0gICAgICAgdV9sb25nICByeF9vdmVyX2Vycm9yczsgICAgLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93ICAqLwotICAgICAgIHVfbG9uZyAgcnhfY3JjX2Vycm9yczsgICAgIC8qIHJlY3YnZCBwa3Qgd2l0aCBjcmMgZXJyb3IgICAgKi8KLSAgICAgICB1X2xvbmcgIHJ4X2ZyYW1lX2Vycm9yczsgICAvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCi0gICAgICAgdV9sb25nICByeF9maWZvX2Vycm9yczsgICAgLyogcmVjdidyIGZpZm8gb3ZlcnJ1biAgICAgICAgICAqLwotICAgICAgIHVfbG9uZyAgcnhfbWlzc2VkX2Vycm9yczsgIC8qIHJlY3YnciBtaXNzZWQgcGFja2V0ICAgICAgICAgKi8KLQotICAgICAgIC8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLwotICAgICAgIHVfbG9uZyAgdHhfYWJvcnRlZF9lcnJvcnM7Ci0gICAgICAgdV9sb25nICB0eF9jYXJyaWVyX2Vycm9yczsKLSAgICAgICB1X2xvbmcgIHR4X2ZpZm9fZXJyb3JzOwotICAgICAgIHVfbG9uZyAgdHhfaGVhcnRiZWF0X2Vycm9yczsKLSAgICAgICB1X2xvbmcgIHR4X3dpbmRvd19lcnJvcnM7Ci0gICAgIH07Ci0jZW5kaWYKLQotLyoKLSAqIEl0ZW0gaW4gYSBsaXN0IG9mIGludGVyZmFjZXMuCi0gKi8KLXN0cnVjdCBwY2FwX2lmIHsKLQlzdHJ1Y3QgcGNhcF9pZiAqbmV4dDsKLQljaGFyICpuYW1lOwkJLyogbmFtZSB0byBoYW5kIHRvICJwY2FwX29wZW5fbGl2ZSgpIiAqLwotCWNoYXIgKmRlc2NyaXB0aW9uOwkvKiB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGludGVyZmFjZSwgb3IgTlVMTCAqLwotCXN0cnVjdCBwY2FwX2FkZHIgKmFkZHJlc3NlczsKLQlicGZfdV9pbnQzMiBmbGFnczsJLyogUENBUF9JRl8gaW50ZXJmYWNlIGZsYWdzICovCi19OwotCi0jZGVmaW5lIFBDQVBfSUZfTE9PUEJBQ0sJMHgwMDAwMDAwMQkvKiBpbnRlcmZhY2UgaXMgbG9vcGJhY2sgKi8KLQotLyoKLSAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVyZmFjZSBhZGRyZXNzLgotICovCi1zdHJ1Y3QgcGNhcF9hZGRyIHsKLQlzdHJ1Y3QgcGNhcF9hZGRyICpuZXh0OwotCXN0cnVjdCBzb2NrYWRkciAqYWRkcjsJCS8qIGFkZHJlc3MgKi8KLQlzdHJ1Y3Qgc29ja2FkZHIgKm5ldG1hc2s7CS8qIG5ldG1hc2sgZm9yIHRoYXQgYWRkcmVzcyAqLwotCXN0cnVjdCBzb2NrYWRkciAqYnJvYWRhZGRyOwkvKiBicm9hZGNhc3QgYWRkcmVzcyBmb3IgdGhhdCBhZGRyZXNzICovCi0Jc3RydWN0IHNvY2thZGRyICpkc3RhZGRyOwkvKiBQMlAgZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgdGhhdCBhZGRyZXNzICovCi19OwotCi10eXBlZGVmIHZvaWQgKCpwY2FwX2hhbmRsZXIpKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwKLQkJCSAgICAgY29uc3QgdV9jaGFyICopOwotCi1jaGFyCSpwY2FwX2xvb2t1cGRldihjaGFyICopOwotaW50CXBjYXBfbG9va3VwbmV0KGNvbnN0IGNoYXIgKiwgYnBmX3VfaW50MzIgKiwgYnBmX3VfaW50MzIgKiwgY2hhciAqKTsKLXBjYXBfdAkqcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50LCBjaGFyICopOwotcGNhcF90CSpwY2FwX29wZW5fZGVhZChpbnQsIGludCk7Ci1wY2FwX3QJKnBjYXBfb3Blbl9vZmZsaW5lKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKLXBjYXBfdAkqcGNhcF9mb3Blbl9vZmZsaW5lKEZJTEUgKiwgY2hhciAqKTsKLXZvaWQJcGNhcF9jbG9zZShwY2FwX3QgKik7Ci1pbnQJcGNhcF9sb29wKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOwotaW50CXBjYXBfZGlzcGF0Y2gocGNhcF90ICosIGludCwgcGNhcF9oYW5kbGVyLCB1X2NoYXIgKik7Ci1jb25zdCB1X2NoYXIqCi0JcGNhcF9uZXh0KHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKik7Ci1pbnQgCXBjYXBfbmV4dF9leChwY2FwX3QgKiwgc3RydWN0IHBjYXBfcGt0aGRyICoqLCBjb25zdCB1X2NoYXIgKiopOwotdm9pZAlwY2FwX2JyZWFrbG9vcChwY2FwX3QgKik7Ci1pbnQJcGNhcF9zdGF0cyhwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKLWludAlwY2FwX3NldGZpbHRlcihwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOwotaW50IAlwY2FwX3NldGRpcmVjdGlvbihwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7Ci1pbnQJcGNhcF9nZXRub25ibG9jayhwY2FwX3QgKiwgY2hhciAqKTsKLWludAlwY2FwX3NldG5vbmJsb2NrKHBjYXBfdCAqLCBpbnQsIGNoYXIgKik7Ci12b2lkCXBjYXBfcGVycm9yKHBjYXBfdCAqLCBjaGFyICopOwotaW50CXBjYXBfaW5qZWN0KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7Ci1pbnQJcGNhcF9zZW5kcGFja2V0KHBjYXBfdCAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKLWNvbnN0IGNoYXIgKnBjYXBfc3RyZXJyb3IoaW50KTsKLWNoYXIJKnBjYXBfZ2V0ZXJyKHBjYXBfdCAqKTsKLWludAlwY2FwX2NvbXBpbGUocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBjb25zdCBjaGFyICosIGludCwKLQkgICAgYnBmX3VfaW50MzIpOwotaW50CXBjYXBfY29tcGlsZV9ub3BjYXAoaW50LCBpbnQsIHN0cnVjdCBicGZfcHJvZ3JhbSAqLAotCSAgICBjb25zdCBjaGFyICosIGludCwgYnBmX3VfaW50MzIpOwotdm9pZAlwY2FwX2ZyZWVjb2RlKHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKLWludAlwY2FwX2RhdGFsaW5rKHBjYXBfdCAqKTsKLWludAlwY2FwX2xpc3RfZGF0YWxpbmtzKHBjYXBfdCAqLCBpbnQgKiopOwotaW50CXBjYXBfc2V0X2RhdGFsaW5rKHBjYXBfdCAqLCBpbnQpOwotaW50CXBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgKnBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoaW50KTsKLWNvbnN0IGNoYXIgKnBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKGludCk7Ci1pbnQJcGNhcF9zbmFwc2hvdChwY2FwX3QgKik7Ci1pbnQJcGNhcF9pc19zd2FwcGVkKHBjYXBfdCAqKTsKLWludAlwY2FwX21ham9yX3ZlcnNpb24ocGNhcF90ICopOwotaW50CXBjYXBfbWlub3JfdmVyc2lvbihwY2FwX3QgKik7Ci0KLS8qIFhYWCAqLwotRklMRQkqcGNhcF9maWxlKHBjYXBfdCAqKTsKLWludAlwY2FwX2ZpbGVubyhwY2FwX3QgKik7Ci0KLXBjYXBfZHVtcGVyX3QgKnBjYXBfZHVtcF9vcGVuKHBjYXBfdCAqLCBjb25zdCBjaGFyICopOwotcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX2ZvcGVuKHBjYXBfdCAqLCBGSUxFICpmcCk7Ci1GSUxFCSpwY2FwX2R1bXBfZmlsZShwY2FwX2R1bXBlcl90ICopOwotbG9uZwlwY2FwX2R1bXBfZnRlbGwocGNhcF9kdW1wZXJfdCAqKTsKLWludAlwY2FwX2R1bXBfZmx1c2gocGNhcF9kdW1wZXJfdCAqKTsKLXZvaWQJcGNhcF9kdW1wX2Nsb3NlKHBjYXBfZHVtcGVyX3QgKik7Ci12b2lkCXBjYXBfZHVtcCh1X2NoYXIgKiwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLQotaW50CXBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqLCBjaGFyICopOwotdm9pZAlwY2FwX2ZyZWVhbGxkZXZzKHBjYXBfaWZfdCAqKTsKLQotY29uc3QgY2hhciAqcGNhcF9saWJfdmVyc2lvbih2b2lkKTsKLQotLyogWFhYIHRoaXMgZ3V5IGxpdmVzIGluIHRoZSBicGYgdHJlZSAqLwotdV9pbnQJYnBmX2ZpbHRlcihzdHJ1Y3QgYnBmX2luc24gKiwgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1pbnQJYnBmX3ZhbGlkYXRlKHN0cnVjdCBicGZfaW5zbiAqZiwgaW50IGxlbik7Ci1jaGFyCSpicGZfaW1hZ2Uoc3RydWN0IGJwZl9pbnNuICosIGludCk7Ci12b2lkCWJwZl9kdW1wKHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBpbnQpOwotCi0jaWYgZGVmaW5lZChXSU4zMikKLQotLyoKLSAqIFdpbjMyIGRlZmluaXRpb25zCi0gKi8KLQotaW50IHBjYXBfc2V0YnVmZihwY2FwX3QgKnAsIGludCBkaW0pOwotaW50IHBjYXBfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKTsKLWludCBwY2FwX3NldG1pbnRvY29weShwY2FwX3QgKnAsIGludCBzaXplKTsKLQotI2lmZGVmIFdQQ0FQCi0vKiBJbmNsdWRlIGZpbGUgd2l0aCB0aGUgd3BjYXAtc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLwotI2luY2x1ZGUgPFdpbjMyLUV4dGVuc2lvbnMuaD4KLSNlbmRpZiAvKiBXUENBUCAqLwotCi0jZGVmaW5lIE1PREVfQ0FQVCAwCi0jZGVmaW5lIE1PREVfU1RBVCAxCi0jZGVmaW5lIE1PREVfTU9OIDIKLQotI2VsaWYgZGVmaW5lZChNU0RPUykKLQotLyoKLSAqIE1TLURPUyBkZWZpbml0aW9ucwotICovCi0KLWludCAgcGNhcF9zdGF0c19leCAocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXRfZXggKik7Ci12b2lkIHBjYXBfc2V0X3dhaXQgKHBjYXBfdCAqcCwgdm9pZCAoKnlpZWxkKSh2b2lkKSwgaW50IHdhaXQpOwotdV9sb25nIHBjYXBfbWFjX3BhY2tldHMgKHZvaWQpOwotCi0jZWxzZSAvKiBVTipYICovCi0KLS8qCi0gKiBVTipYIGRlZmluaXRpb25zCi0gKi8KLQotaW50CXBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGNhcF90ICopOwotCi0jZW5kaWYgLyogV0lOMzIvTVNET1MvVU4qWCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KZGlmZiAtLWdpdCBhL3BjYXAvYmx1ZXRvb3RoLmggYi9wY2FwL2JsdWV0b290aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2JlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwL2JsdWV0b290aC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGFvbG8gQWJlbmkgKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogYmx1ZXRvb3RoIGRhdGEgc3RydWN0CisgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL2JsdWV0b290aC5oLHYgMS4xIDIwMDctMDktMjIgMDI6MTA6MTcgZ3V5IEV4cCAkCisgKi8KKyAKKyNpZm5kZWYgX1BDQVBfQkxVRVRPT1RIX1NUUlVDVFNfSF9fCisjZGVmaW5lIF9QQ0FQX0JMVUVUT09USF9TVFJVQ1RTX0hfXworCisvKgorICogSGVhZGVyIHByZXBlbmRlZCBsaWJwY2FwIHRvIGVhY2ggYmx1ZXRvb3RoIGg6NCBmcmFtZS4KKyAqIGZpZWxkcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF9wY2FwX2JsdWV0b290aF9oNF9oZWFkZXIgeworCXVfaW50MzJfdCBkaXJlY3Rpb247IC8qIGlmIGZpcnN0IGJpdCBpcyBzZXQgZGlyZWN0aW9uIGlzIGluY29taW5nICovCit9IHBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlcjsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BjYXAvYnBmLmggYi9wY2FwL2JwZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzZlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwL2JwZi5oCkBAIC0wLDAgKzEsMTMzOCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIFN0YW5mb3JkL0NNVSBlbmV0IHBhY2tldCBmaWx0ZXIsCisgKiAobmV0L2VuZXQuYykgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiA0LjNCU0QsIGFuZCBjb2RlIGNvbnRyaWJ1dGVkCisgKiB0byBCZXJrZWxleSBieSBTdGV2ZW4gTWNDYW5uZSBhbmQgVmFuIEphY29ic29uIGJvdGggb2YgTGF3cmVuY2UgCisgKiBCZXJrZWxleSBMYWJvcmF0b3J5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICAgICAgQCgjKWJwZi5oICAgICAgIDcuMSAoQmVya2VsZXkpIDUvNy85MQorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC9icGYuaCx2IDEuMzIgMjAwOC0xMi0yMyAyMDoxMzoyOSBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogVGhpcyBpcyBsaWJwY2FwJ3MgY3V0LWRvd24gdmVyc2lvbiBvZiBicGYuaDsgaXQgaW5jbHVkZXMgb25seQorICogdGhlIHN0dWZmIG5lZWRlZCBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yIGFuZCB0aGUgdXNlcmxhbmQgQlBGCisgKiBpbnRlcnByZXRlciwgYW5kIHRoZSBsaWJwY2FwIEFQSXMgZm9yIHNldHRpbmcgZmlsdGVycywgZXRjLi4KKyAqCisgKiAicGNhcC1icGYuYyIgd2lsbCBpbmNsdWRlIHRoZSBuYXRpdmUgT1MgdmVyc2lvbiwgYXMgaXQgZGVhbHMgd2l0aAorICogdGhlIE9TJ3MgQlBGIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEF0IGxlYXN0IHR3byBwcm9ncmFtcyBmb3VuZCBieSBHb29nbGUgQ29kZSBTZWFyY2ggZXhwbGljaXRseSBpbmNsdWRlcworICogPHBjYXAvYnBmLmg+IChldmVuIHRob3VnaCA8cGNhcC5oPi88cGNhcC9wY2FwLmg+IGluY2x1ZGVzIGl0IGZvciB5b3UpLAorICogc28gbW92aW5nIHRoYXQgc3R1ZmYgdG8gPHBjYXAvcGNhcC5oPiB3b3VsZCBicmVhayB0aGUgYnVpbGQgZm9yIHNvbWUKKyAqIHByb2dyYW1zLgorICovCisKKy8qCisgKiBJZiB3ZSd2ZSBhbHJlYWR5IGluY2x1ZGVkIDxuZXQvYnBmLmg+LCBkb24ndCByZS1kZWZpbmUgdGhpcyBzdHVmZi4KKyAqIFdlIGFzc3VtZSBCU0Qtc3R5bGUgbXVsdGlwbGUtaW5jbHVkZSBwcm90ZWN0aW9uIGluIDxuZXQvYnBmLmg+LAorICogd2hpY2ggaXMgdHJ1ZSBvZiBhbGwgYnV0IHRoZSBvbGRlc3QgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgTmV0QlNELAorICogb3IgVHJ1NjQgVU5JWC1zdHlsZSBtdWx0aXBsZS1pbmNsdWRlIHByb3RlY3Rpb24gKG9yLCBhdCBsZWFzdCwKKyAqIFRydTY0IFVOSVggNS54LXN0eWxlOyBJIGRvbid0IGhhdmUgZWFybGllciB2ZXJzaW9ucyBhdmFpbGFibGUgdG8gY2hlY2spLAorICogb3IgQUlYLXN0eWxlIG11bHRpcGxlLWluY2x1ZGUgcHJvdGVjdGlvbiAob3IsIGF0IGxlYXN0LCBBSVggNS54LXN0eWxlOworICogSSBkb24ndCBoYXZlIGVhcmxpZXIgdmVyc2lvbnMgYXZhaWxhYmxlIHRvIGNoZWNrKS4KKyAqCisgKiBXZSBkbyBub3QgY2hlY2sgZm9yIEJQRl9NQUpPUl9WRVJTSU9OLCBhcyB0aGF0J3MgZGVmaW5lZCBieQorICogPGxpbnV4L2ZpbHRlci5oPiwgd2hpY2ggaXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiBzb21lCisgKiBwcm9ncmFtcyB0aGF0IGFsc28gaW5jbHVkZSBwY2FwLmgsIGFuZCA8bGludXgvZmlsdGVyLmg+IGRvZXNuJ3QKKyAqIGRlZmluZSBzdHVmZiB3ZSBuZWVkLgorICoKKyAqIFRoaXMgYWxzbyBwcm92aWRlcyBvdXIgb3duIG11bHRpcGxlLWluY2x1ZGUgcHJvdGVjdGlvbi4KKyAqLworI2lmICFkZWZpbmVkKF9ORVRfQlBGX0hfKSAmJiAhZGVmaW5lZChfQlBGX0hfKSAmJiAhZGVmaW5lZChfSF9CUEYpICYmICFkZWZpbmVkKGxpYl9wY2FwX2JwZl9oKQorI2RlZmluZSBsaWJfcGNhcF9icGZfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEJTRCBzdHlsZSByZWxlYXNlIGRhdGUgKi8KKyNkZWZpbmUgQlBGX1JFTEVBU0UgMTk5NjA2CisKKyNpZmRlZiBNU0RPUyAvKiBtdXN0IGJlIDMyLWJpdCAqLwordHlwZWRlZiBsb25nICAgICAgICAgIGJwZl9pbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBicGZfdV9pbnQzMjsKKyNlbHNlCit0eXBlZGVmCWludCBicGZfaW50MzI7Cit0eXBlZGVmCXVfaW50IGJwZl91X2ludDMyOworI2VuZGlmCisKKy8qCisgKiBBbGlnbm1lbnQgbWFjcm9zLiAgQlBGX1dPUkRBTElHTiByb3VuZHMgdXAgdG8gdGhlIG5leHQgCisgKiBldmVuIG11bHRpcGxlIG9mIEJQRl9BTElHTk1FTlQuCisgKgorICogVGNwZHVtcCdzIHByaW50LXBmbG9nLmMgdXNlcyB0aGlzLCBzbyB3ZSBkZWZpbmUgaXQgaGVyZS4KKyAqLworI2lmbmRlZiBfX05ldEJTRF9fCisjZGVmaW5lIEJQRl9BTElHTk1FTlQgc2l6ZW9mKGJwZl9pbnQzMikKKyNlbHNlCisjZGVmaW5lIEJQRl9BTElHTk1FTlQgc2l6ZW9mKGxvbmcpCisjZW5kaWYKKyNkZWZpbmUgQlBGX1dPUkRBTElHTih4KSAoKCh4KSsoQlBGX0FMSUdOTUVOVC0xKSkmfihCUEZfQUxJR05NRU5ULTEpKQorCisvKgorICogU3RydWN0dXJlIGZvciAicGNhcF9jb21waWxlKCkiLCAicGNhcF9zZXRmaWx0ZXIoKSIsIGV0Yy4uCisgKi8KK3N0cnVjdCBicGZfcHJvZ3JhbSB7CisJdV9pbnQgYmZfbGVuOworCXN0cnVjdCBicGZfaW5zbiAqYmZfaW5zbnM7Cit9OworIAorLyoKKyAqIExpbmstbGF5ZXIgaGVhZGVyIHR5cGUgY29kZXMuCisgKgorICogRG8gKk5PVCogYWRkIG5ldyB2YWx1ZXMgdG8gdGhpcyBsaXN0IHdpdGhvdXQgYXNraW5nCisgKiAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiBmb3IgYSB2YWx1ZS4gIE90aGVyd2lzZSwgeW91IHJ1bgorICogdGhlIHJpc2sgb2YgdXNpbmcgYSB2YWx1ZSB0aGF0J3MgYWxyZWFkeSBiZWluZyB1c2VkIGZvciBzb21lIG90aGVyCisgKiBwdXJwb3NlLCBhbmQgb2YgaGF2aW5nIHRvb2xzIHRoYXQgcmVhZCBsaWJwY2FwLWZvcm1hdCBjYXB0dXJlcyBub3QKKyAqIGJlaW5nIGFibGUgdG8gaGFuZGxlIGNhcHR1cmVzIHdpdGggeW91ciBuZXcgRExUXyB2YWx1ZSwgd2l0aCBubyBob3BlCisgKiB0aGF0IHRoZXkgd2lsbCBldmVyIGJlIGNoYW5nZWQgdG8gZG8gc28gKGFzIHRoYXQgd291bGQgZGVzdHJveSB0aGVpcgorICogYWJpbGl0eSB0byByZWFkIGNhcHR1cmVzIHVzaW5nIHRoYXQgdmFsdWUgZm9yIHRoYXQgb3RoZXIgcHVycG9zZSkuCisgKgorICogU2VlCisgKgorICoJaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbAorICoKKyAqIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGVzZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcy4KKyAqLworCisvKgorICogVGhlc2UgYXJlIHRoZSB0eXBlcyB0aGF0IGFyZSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgdGhhdAorICogaGF2ZSBiZWVuIGRlZmluZWQgYnkgPG5ldC9icGYuaD4gZm9yIGFnZXMuCisgKi8KKyNkZWZpbmUgRExUX05VTEwJMAkvKiBCU0QgbG9vcGJhY2sgZW5jYXBzdWxhdGlvbiAqLworI2RlZmluZSBETFRfRU4xME1CCTEJLyogRXRoZXJuZXQgKDEwTWIpICovCisjZGVmaW5lIERMVF9FTjNNQgkyCS8qIEV4cGVyaW1lbnRhbCBFdGhlcm5ldCAoM01iKSAqLworI2RlZmluZSBETFRfQVgyNQkzCS8qIEFtYXRldXIgUmFkaW8gQVguMjUgKi8KKyNkZWZpbmUgRExUX1BST05FVAk0CS8qIFByb3Rlb24gUHJvTkVUIFRva2VuIFJpbmcgKi8KKyNkZWZpbmUgRExUX0NIQU9TCTUJLyogQ2hhb3MgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDIJNgkvKiA4MDIuNSBUb2tlbiBSaW5nICovCisjZGVmaW5lIERMVF9BUkNORVQJNwkvKiBBUkNORVQsIHdpdGggQlNELXN0eWxlIGhlYWRlciAqLworI2RlZmluZSBETFRfU0xJUAk4CS8qIFNlcmlhbCBMaW5lIElQICovCisjZGVmaW5lIERMVF9QUFAJCTkJLyogUG9pbnQtdG8tcG9pbnQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgRExUX0ZEREkJMTAJLyogRkRESSAqLworCisvKgorICogVGhlc2UgYXJlIHR5cGVzIHRoYXQgYXJlIGRpZmZlcmVudCBvbiBzb21lIHBsYXRmb3JtcywgYW5kIHRoYXQKKyAqIGhhdmUgYmVlbiBkZWZpbmVkIGJ5IDxuZXQvYnBmLmg+IGZvciBhZ2VzLiAgV2UgdXNlICNpZmRlZnMgdG8KKyAqIGRldGVjdCB0aGUgQlNEcyB0aGF0IGRlZmluZSB0aGVtIGRpZmZlcmVudGx5IGZyb20gdGhlIHRyYWRpdGlvbmFsCisgKiBsaWJwY2FwIDxuZXQvYnBmLmg+CisgKgorICogWFhYIC0gRExUX0FUTV9SRkMxNDgzIGlzIDEzIGluIEJTRC9PUywgYW5kIERMVF9SQVcgaXMgMTQgaW4gQlNEL09TLAorICogYnV0IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSByaWdodCAjZGVmaW5lIGlzIGZvciBCU0QvT1MuCisgKi8KKyNkZWZpbmUgRExUX0FUTV9SRkMxNDgzCTExCS8qIExMQy1lbmNhcHN1bGF0ZWQgQVRNICovCisKKyNpZmRlZiBfX09wZW5CU0RfXworI2RlZmluZSBETFRfUkFXCQkxNAkvKiByYXcgSVAgKi8KKyNlbHNlCisjZGVmaW5lIERMVF9SQVcJCTEyCS8qIHJhdyBJUCAqLworI2VuZGlmCisKKy8qCisgKiBHaXZlbiB0aGF0IHRoZSBvbmx5IE9TIHRoYXQgY3VycmVudGx5IGdlbmVyYXRlcyBCU0QvT1MgU0xJUCBvciBQUFAKKyAqIGlzLCB3ZWxsLCBCU0QvT1MsIGFyZ3VhYmx5IGV2ZXJ5Ym9keSBzaG91bGQgaGF2ZSBjaG9zZW4gaXRzIHZhbHVlcworICogZm9yIERMVF9TTElQX0JTRE9TIGFuZCBETFRfUFBQX0JTRE9TLCB3aGljaCBhcmUgMTUgYW5kIDE2LCBidXQgdGhleQorICogZGlkbid0LiAgU28gaXQgZ29lcy4KKyAqLworI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpZm5kZWYgRExUX1NMSVBfQlNET1MKKyNkZWZpbmUgRExUX1NMSVBfQlNET1MJMTMJLyogQlNEL09TIFNlcmlhbCBMaW5lIElQICovCisjZGVmaW5lIERMVF9QUFBfQlNET1MJMTQJLyogQlNEL09TIFBvaW50LXRvLXBvaW50IFByb3RvY29sICovCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIERMVF9TTElQX0JTRE9TCTE1CS8qIEJTRC9PUyBTZXJpYWwgTGluZSBJUCAqLworI2RlZmluZSBETFRfUFBQX0JTRE9TCTE2CS8qIEJTRC9PUyBQb2ludC10by1wb2ludCBQcm90b2NvbCAqLworI2VuZGlmCisKKy8qCisgKiAxNyB3YXMgdXNlZCBmb3IgRExUX1BGTE9HIGluIE9wZW5CU0Q7IGl0IG5vIGxvbmdlciBpcy4KKyAqCisgKiBJdCB3YXMgRExUX0xBTkU4MDIzIGluIFN1U0UgNi4zLCBzbyB3ZSBkZWZpbmVkIExJTktUWVBFX1BGTE9HCisgKiBhcyAxMTcgc28gdGhhdCBwZmxvZyBjYXB0dXJlcyB3b3VsZCB1c2UgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisgKiB2YWx1ZSB0aGF0IGRpZG4ndCBjb2xsaWRlIHdpdGggYW55IG90aGVyIHZhbHVlcy4gIE9uIGFsbAorICogcGxhdGZvcm1zIG90aGVyIHRoYW4gT3BlbkJTRCwgd2UgZGVmaW5lZCBETFRfUEZMT0cgYXMgMTE3LAorICogYW5kIHdlIG1hcHBlZCBiZXR3ZWVuIExJTktUWVBFX1BGTE9HIGFuZCBETFRfUEZMT0cuCisgKgorICogT3BlbkJTRCBldmVudHVhbGx5IHN3aXRjaGVkIHRvIHVzaW5nIDExNyBmb3IgRExUX1BGTE9HIGFzIHdlbGwuCisgKgorICogRG9uJ3QgdXNlIDE3IGZvciBhbnl0aGluZyBlbHNlLgorICovCisKKy8qCisgKiAxOCBpcyB1c2VkIGZvciBETFRfUEZTWU5DIGluIE9wZW5CU0QsIE5ldEJTRCwgRHJhZ29uRmx5IEJTRCBhbmQKKyAqIE1hYyBPUyBYOyBkb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIGVsc2UuICAoRnJlZUJTRCB1c2VzIDEyMSwKKyAqIHdoaWNoIGNvbGxpZGVzIHdpdGggRExUX0hIRExDLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHVzZSAxOAorICogZm9yIGFueXRoaW5nIGFuZCBkb2Vzbid0IGFwcGVhciB0byBoYXZlIGV2ZXIgdXNlZCBpdCBmb3IgYW55dGhpbmcuKQorICoKKyAqIFdlIGRlZmluZSBpdCBhcyAxOCBvbiB0aG9zZSBwbGF0Zm9ybXM7IGl0IGlzLCB1bmZvcnR1bmF0ZWx5LCB1c2VkCisgKiBmb3IgRExUX0NJUCBpbiBTdXNlIDYuMywgc28gd2UgZG9uJ3QgZGVmaW5lIGl0IGFzIERMVF9QRlNZTkMKKyAqIGluIGdlbmVyYWwuICBBcyB0aGUgcGFja2V0IGZvcm1hdCBmb3IgaXQsIGxpa2UgdGhhdCBmb3IKKyAqIERMVF9QRkxPRywgaXMgbm90IG9ubHkgT1MtZGVwZW5kZW50IGJ1dCBPUy12ZXJzaW9uLWRlcGVuZGVudCwKKyAqIHdlIGRvbid0IHN1cHBvcnQgcHJpbnRpbmcgaXQgaW4gdGNwZHVtcCBleGNlcHQgb24gT1NlcyB0aGF0CisgKiBoYXZlIHRoZSByZWxldmFudCBoZWFkZXIgZmlsZXMsIHNvIGl0J3Mgbm90IHRoYXQgdXNlZnVsIG9uCisgKiBvdGhlciBwbGF0Zm9ybXMuCisgKi8KKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIERMVF9QRlNZTkMJMTgKKyNlbmRpZgorCisjZGVmaW5lIERMVF9BVE1fQ0xJUAkxOQkvKiBMaW51eCBDbGFzc2ljYWwtSVAgb3ZlciBBVE0gKi8KKworLyoKKyAqIEFwcGFyZW50bHkgUmVkYmFjayB1c2VzIHRoaXMgZm9yIGl0cyBTbWFydEVkZ2UgNDAwLzgwMC4gIEkgaG9wZQorICogbm9ib2R5IGVsc2UgZGVjaWRlZCB0byB1c2UgaXQsIHRvby4KKyAqLworI2RlZmluZSBETFRfUkVEQkFDS19TTUFSVEVER0UJMzIKKworLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgZGVmaW5lZCBieSBOZXRCU0Q7IG90aGVyIHBsYXRmb3JtcyBzaG91bGQgcmVmcmFpbiBmcm9tCisgKiB1c2luZyB0aGVtIGZvciBvdGhlciBwdXJwb3Nlcywgc28gdGhhdCBOZXRCU0Qgc2F2ZWZpbGVzIHdpdGggbGluaworICogdHlwZXMgb2YgNTAgb3IgNTEgY2FuIGJlIHJlYWQgYXMgdGhpcyB0eXBlIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKyNkZWZpbmUgRExUX1BQUF9TRVJJQUwJNTAJLyogUFBQIG92ZXIgc2VyaWFsIHdpdGggSERMQyBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIERMVF9QUFBfRVRIRVIJNTEJLyogUFBQIG92ZXIgRXRoZXJuZXQgKi8KKworLyoKKyAqIFRoZSBBeGVudCBSYXB0b3IgZmlyZXdhbGwgLSBub3cgdGhlIFN5bWFudGVjIEVudGVycHJpc2UgRmlyZXdhbGwgLSB1c2VzCisgKiBhIGxpbmstbGF5ZXIgdHlwZSBvZiA5OSBmb3IgdGhlIHRjcGR1bXAgaXQgc3VwcGxpZXMuICBUaGUgbGluay1sYXllcgorICogaGVhZGVyIGhhcyA2IGJ5dGVzIG9mIHVua25vd24gZGF0YSwgc29tZXRoaW5nIHRoYXQgYXBwZWFycyB0byBiZSBhbgorICogRXRoZXJuZXQgdHlwZSwgYW5kIDM2IGJ5dGVzIHRoYXQgYXBwZWFyIHRvIGJlIDAgaW4gYXQgbGVhc3Qgb25lIGNhcHR1cmUKKyAqIEkndmUgc2Vlbi4KKyAqLworI2RlZmluZSBETFRfU1lNQU5URUNfRklSRVdBTEwJOTkKKworLyoKKyAqIFZhbHVlcyBiZXR3ZWVuIDEwMCBhbmQgMTAzIGFyZSB1c2VkIGluIGNhcHR1cmUgZmlsZSBoZWFkZXJzIGFzCisgKiBsaW5rLWxheWVyIGhlYWRlciB0eXBlIExJTktUWVBFXyB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBETFRfIHR5cGVzCisgKiB0aGF0IGRpZmZlciBiZXR3ZWVuIHBsYXRmb3JtczsgZG9uJ3QgdXNlIHRob3NlIHZhbHVlcyBmb3IgbmV3IERMVF8KKyAqIG5ldyB0eXBlcy4KKyAqLworCisvKgorICogVmFsdWVzIHN0YXJ0aW5nIHdpdGggMTA0IGFyZSB1c2VkIGZvciBuZXdseS1hc3NpZ25lZCBsaW5rLWxheWVyCisgKiBoZWFkZXIgdHlwZSB2YWx1ZXM7IGZvciB0aG9zZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcywgdGhlIERMVF8KKyAqIHZhbHVlIHJldHVybmVkIGJ5IHBjYXBfZGF0YWxpbmsoKSBhbmQgcGFzc2VkIHRvIHBjYXBfb3Blbl9kZWFkKCksCisgKiBhbmQgdGhlIExJTktUWVBFXyB2YWx1ZSB0aGF0IGFwcGVhcnMgaW4gY2FwdHVyZSBmaWxlcywgYXJlIHRoZQorICogc2FtZS4KKyAqCisgKiBETFRfTUFUQ0hJTkdfTUlOIGlzIHRoZSBsb3dlc3Qgc3VjaCB2YWx1ZTsgRExUX01BVENISU5HX01BWCBpcworICogdGhlIGhpZ2hlc3Qgc3VjaCB2YWx1ZS4KKyAqLworI2RlZmluZSBETFRfTUFUQ0hJTkdfTUlOCTEwNAorCisvKgorICogVGhpcyB2YWx1ZSB3YXMgZGVmaW5lZCBieSBsaWJwY2FwIDAuNTsgcGxhdGZvcm1zIHRoYXQgaGF2ZSBkZWZpbmVkCisgKiBpdCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHNob3VsZCBkZWZpbmUgaXQgaGVyZSB3aXRoIHRoYXQgdmFsdWUgLQorICogYSBsaW5rIHR5cGUgb2YgMTA0IGluIGEgc2F2ZSBmaWxlIHdpbGwgYmUgbWFwcGVkIHRvIERMVF9DX0hETEMsCisgKiB3aGF0ZXZlciB2YWx1ZSB0aGF0IGhhcHBlbnMgdG8gYmUsIHNvIHByb2dyYW1zIHdpbGwgY29ycmVjdGx5CisgKiBoYW5kbGUgZmlsZXMgd2l0aCB0aGF0IGxpbmsgdHlwZSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZgorICogRExUX0NfSERMQy4KKyAqCisgKiBUaGUgbmFtZSBETFRfQ19IRExDIHdhcyB1c2VkIGJ5IEJTRC9PUzsgd2UgdXNlIHRoYXQgbmFtZSBmb3Igc291cmNlCisgKiBjb21wYXRpYmlsaXR5IHdpdGggcHJvZ3JhbXMgd3JpdHRlbiBmb3IgQlNEL09TLgorICoKKyAqIGxpYnBjYXAgMC41IGRlZmluZWQgaXQgYXMgRExUX0NIRExDOyB3ZSBkZWZpbmUgRExUX0NIRExDIGFzIHdlbGwsCisgKiBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBwcm9ncmFtcyB3cml0dGVuIGZvciBsaWJwY2FwIDAuNS4KKyAqLworI2RlZmluZSBETFRfQ19IRExDCTEwNAkvKiBDaXNjbyBIRExDICovCisjZGVmaW5lIERMVF9DSERMQwlETFRfQ19IRExDCisKKyNkZWZpbmUgRExUX0lFRUU4MDJfMTEJMTA1CS8qIElFRUUgODAyLjExIHdpcmVsZXNzICovCisKKy8qCisgKiAxMDYgaXMgcmVzZXJ2ZWQgZm9yIExpbnV4IENsYXNzaWNhbCBJUCBvdmVyIEFUTTsgaXQncyBsaWtlIERMVF9SQVcsCisgKiBleGNlcHQgd2hlbiBpdCBpc24ndC4gIChJLmUuLCBzb21ldGltZXMgaXQncyBqdXN0IHJhdyBJUCwgYW5kCisgKiBzb21ldGltZXMgaXQgaXNuJ3QuKSAgV2UgY3VycmVudGx5IGhhbmRsZSBpdCBhcyBETFRfTElOVVhfU0xMLAorICogc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBsaW5rLWxheWVyIGhlYWRlci4pCisgKi8KKworLyoKKyAqIEZyYW1lIFJlbGF5OyBCU0QvT1MgaGFzIGEgRExUX0ZSIHdpdGggYSB2YWx1ZSBvZiAxMSwgYnV0IHRoYXQgY29sbGlkZXMKKyAqIHdpdGggb3RoZXIgdmFsdWVzLgorICogRExUX0ZSIGFuZCBETFRfRlJFTEFZIHBhY2tldHMgc3RhcnQgd2l0aCB0aGUgUS45MjIgRnJhbWUgUmVsYXkgaGVhZGVyCisgKiAoRExDSSwgZXRjLikuCisgKi8KKyNkZWZpbmUgRExUX0ZSRUxBWQkxMDcKKworLyoKKyAqIE9wZW5CU0QgRExUX0xPT1AsIGZvciBsb29wYmFjayBkZXZpY2VzOyBpdCdzIGxpa2UgRExUX05VTEwsIGV4Y2VwdAorICogdGhhdCB0aGUgQUZfIHR5cGUgaW4gdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGlzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqCisgKiBETFRfTE9PUCBpcyAxMiBpbiBPcGVuQlNELCBidXQgdGhhdCdzIERMVF9SQVcgaW4gb3RoZXIgT1Nlcywgc28KKyAqIHdlIGRvbid0IHVzZSAxMiBmb3IgaXQgaW4gT1NlcyBvdGhlciB0aGFuIE9wZW5CU0QuCisgKi8KKyNpZmRlZiBfX09wZW5CU0RfXworI2RlZmluZSBETFRfTE9PUAkxMgorI2Vsc2UKKyNkZWZpbmUgRExUX0xPT1AJMTA4CisjZW5kaWYKKworLyoKKyAqIEVuY2Fwc3VsYXRlZCBwYWNrZXRzIGZvciBJUHNlYzsgRExUX0VOQyBpcyAxMyBpbiBPcGVuQlNELCBidXQgdGhhdCdzCisgKiBETFRfU0xJUF9CU0RPUyBpbiBOZXRCU0QsIHNvIHdlIGRvbid0IHVzZSAxMyBmb3IgaXQgaW4gT1NlcyBvdGhlcgorICogdGhhbiBPcGVuQlNELgorICovCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgRExUX0VOQwkJMTMKKyNlbHNlCisjZGVmaW5lIERMVF9FTkMJCTEwOQorI2VuZGlmCisKKy8qCisgKiBWYWx1ZXMgYmV0d2VlbiAxMTAgYW5kIDExMiBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBpbiBjYXB0dXJlIGZpbGUgaGVhZGVycworICogYXMgbGluay1sYXllciB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIERMVF8gdHlwZXMgdGhhdCBtaWdodCBkaWZmZXIKKyAqIGJldHdlZW4gcGxhdGZvcm1zOyBkb24ndCB1c2UgdGhvc2UgdmFsdWVzIGZvciBuZXcgRExUXyB0eXBlcworICogb3RoZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBETFRfIHR5cGVzLgorICovCisKKy8qCisgKiBUaGlzIGlzIGZvciBMaW51eCBjb29rZWQgc29ja2V0cy4KKyAqLworI2RlZmluZSBETFRfTElOVVhfU0xMCTExMworCisvKgorICogQXBwbGUgTG9jYWxUYWxrIGhhcmR3YXJlLgorICovCisjZGVmaW5lIERMVF9MVEFMSwkxMTQKKworLyoKKyAqIEFjb3JuIEVjb25ldC4KKyAqLworI2RlZmluZSBETFRfRUNPTkVUCTExNQorCisvKgorICogUmVzZXJ2ZWQgZm9yIHVzZSB3aXRoIE9wZW5CU0QgaXBmaWx0ZXIuCisgKi8KKyNkZWZpbmUgRExUX0lQRklMVEVSCTExNgorCisvKgorICogT3BlbkJTRCBETFRfUEZMT0cuCisgKi8KKyNkZWZpbmUgRExUX1BGTE9HCTExNworCisvKgorICogUmVnaXN0ZXJlZCBmb3IgQ2lzY28taW50ZXJuYWwgdXNlLgorICovCisjZGVmaW5lIERMVF9DSVNDT19JT1MJMTE4CisKKy8qCisgKiBGb3IgODAyLjExIGNhcmRzIHVzaW5nIHRoZSBQcmlzbSBJSSBjaGlwcywgd2l0aCBhIGxpbmstbGF5ZXIKKyAqIGhlYWRlciBpbmNsdWRpbmcgUHJpc20gbW9uaXRvciBtb2RlIGluZm9ybWF0aW9uIHBsdXMgYW4gODAyLjExCisgKiBoZWFkZXIuCisgKi8KKyNkZWZpbmUgRExUX1BSSVNNX0hFQURFUgkxMTkKKworLyoKKyAqIFJlc2VydmVkIGZvciBBaXJvbmV0IDgwMi4xMSBjYXJkcywgd2l0aCBhbiBBaXJvbmV0IGxpbmstbGF5ZXIgaGVhZGVyCisgKiAoc2VlIERvdWcgQW1icmlza28ncyBGcmVlQlNEIHBhdGNoZXMpLgorICovCisjZGVmaW5lIERMVF9BSVJPTkVUX0hFQURFUgkxMjAKKworLyoKKyAqIFNpZ2guCisgKgorICogVGhpcyB3YXMgcmVzZXJ2ZWQgZm9yIFNpZW1lbnMgSGlQYXRoIEhETEMgb24gMjAwMi0wMS0yNSwgYXMKKyAqIHJlcXVlc3RlZCBieSBUb21hcyBLdWtvc2EuCisgKgorICogT24gMjAwNC0wMi0yNSwgYSBGcmVlQlNEIGNoZWNraW4gdG8gc3lzL25ldC9icGYuaCB3YXMgbWFkZSB0aGF0CisgKiBhc3NpZ25lZCAxMjEgYXMgRExUX1BGU1lOQy4gIEl0cyBsaWJwY2FwIGRvZXMgRExUXyA8LT4gTElOS1RZUEVfCisgKiBtYXBwaW5nLCBzbyBpdCBwcm9iYWJseSBzdXBwb3J0cyBjYXB0dXJpbmcgb24gdGhlIHBmc3luYyBkZXZpY2UKKyAqIGJ1dCBub3Qgc2F2aW5nIHRoZSBjYXB0dXJlZCBkYXRhIHRvIGEgcGNhcCBmaWxlLgorICoKKyAqIE9wZW5CU0QsIGZyb20gd2hpY2ggcGYgY2FtZSwgaG93ZXZlciwgdXNlcyAxOCBmb3IgRExUX1BGU1lOQzsKKyAqIHRoZWlyIGxpYnBjYXAgZG9lcyBubyBETFRfIDwtPiBMSU5LVFlQRV8gbWFwcGluZywgc28gaXQgd291bGQKKyAqIHVzZSAxOCBpbiBwY2FwIGZpbGVzIGFzIHdlbGwuCisgKgorICogTmV0QlNEIGFuZCBEcmFnb25GbHkgQlNEIGFsc28gdXNlIDE4IGZvciBETFRfUEZTWU5DOyB0aGVpcgorICogbGlicGNhcHMgZG8gRExUXyA8LT4gTElOS1RZUEVfIG1hcHBpbmcsIGFuZCBuZWl0aGVyIGhhcyBhbiBlbnRyeQorICogZm9yIERMVF9QRlNZTkMsIHNvIGl0IG1pZ2h0IG5vdCBiZSBhYmxlIHRvIHdyaXRlIG91dCBkdW1wIGZpbGVzCisgKiB3aXRoIDE4IGFzIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlLiAgKEVhcmxpZXIgdmVyc2lvbnMgbWlnaHQKKyAqIG5vdCBoYXZlIGRvbmUgbWFwcGluZywgaW4gd2hpY2ggY2FzZSB0aGV5J2Qgd29yayB0aGUgc2FtZSB3YXkKKyAqIE9wZW5CU0QgZG9lcy4pCisgKgorICogTWFjIE9TIFggZGVmaW5lcyBpdCBhcyAxOCwgYnV0IGRvZXNuJ3QgYXBwZWFyIHRvIHVzZSBpdCBhcyBvZgorICogTWFjIE9TIFggMTAuNy4zLiAgSXRzIGxpYnBjYXAgZG9lcyBETFRfIDwtPiBMSU5LVFlQRV8gbWFwcGluZy4KKyAqCisgKiBXZSdsbCBkZWZpbmUgRExUX1BGU1lOQyBhcyAxMjEgb24gRnJlZUJTRCBhbmQgZGVmaW5lIGl0IGFzIDE4IG9uCisgKiBhbGwgb3RoZXIgcGxhdGZvcm1zLiAgV2UnbGwgZGVmaW5lIERMVF9ISERMQyBhcyAxMjEgb24gZXZlcnl0aGluZworICogZXhjZXB0IGZvciBGcmVlQlNEOyBhbnlib2R5IHdobyB3YW50cyB0byBjb21waWxlLCBvbiBGcmVlQlNELCBjb2RlCisgKiB0aGF0IHVzZXMgRExUX0hIRExDIGlzIG91dCBvZiBsdWNrLgorICoKKyAqIFdlJ2xsIGRlZmluZSBMSU5LVFlQRV9QRlNZTkMgYXMgMTgsICpldmVuIG9uIEZyZWVCU0QqLCBhbmQgbWFwCisgKiBpdCwgc28gdGhhdCBzYXZlZmlsZXMgd29uJ3QgdXNlIDEyMSBmb3IgUEZTWU5DIC0gdGhleSdsbCBhbGwKKyAqIHVzZSAxOC4gIENvZGUgdGhhdCB1c2VzIHBjYXBfZGF0YWxpbmsoKSB0byBkZXRlcm1pbmUgdGhlIGxpbmstbGF5ZXIKKyAqIGhlYWRlciB0eXBlIG9mIGEgc2F2ZWZpbGUgd29uJ3QsIHdoZW4gYnVpbHQgYW5kIHJ1biBvbiBGcmVlQlNELAorICogYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIExJTktUWVBFX1BGU1lOQyBhbmQgTElOS1RZUEVfSEhETEMKKyAqIGNhcHR1cmUgZmlsZXM7IGNvZGUgdGhhdCBkb2Vzbid0LCBzdWNoIGFzIHRoZSBjb2RlIGluIFdpcmVzaGFyaywKKyAqIHdpbGwgYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uCisgKi8KKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBETFRfUEZTWU5DCQkxMjEKKyNlbHNlCisjZGVmaW5lIERMVF9ISERMQwkJMTIxCisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgZm9yIFJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbC4KKyAqCisgKiBUaGlzIGlzIG5vdCBmb3IgdXNlIHdpdGggcmF3IEZpYnJlIENoYW5uZWwsIHdoZXJlIHRoZSBsaW5rLWxheWVyCisgKiBoZWFkZXIgc3RhcnRzIHdpdGggYSBGaWJyZSBDaGFubmVsIGZyYW1lIGhlYWRlcjsgaXQncyBmb3IgSVAtb3Zlci1GQywKKyAqIHdoZXJlIHRoZSBsaW5rLWxheWVyIGhlYWRlciBzdGFydHMgd2l0aCBhbiBSRkMgMjYyNSBOZXR3b3JrX0hlYWRlcgorICogZmllbGQuCisgKi8KKyNkZWZpbmUgRExUX0lQX09WRVJfRkMJCTEyMgorCisvKgorICogVGhpcyBpcyBmb3IgRnVsbCBGcm9udGFsIEFUTSBvbiBTb2xhcmlzIHdpdGggU3VuQVRNLCB3aXRoIGEKKyAqIHBzZXVkby1oZWFkZXIgZm9sbG93ZWQgYnkgYW4gQUFMbiBQRFUuCisgKgorICogVGhlcmUgbWF5IGJlIG90aGVyIGZvcm1zIG9mIEZ1bGwgRnJvbnRhbCBBVE0gb24gb3RoZXIgT1NlcywKKyAqIHdpdGggZGlmZmVyZW50IHBzZXVkby1oZWFkZXJzLgorICoKKyAqIElmIEFUTSBzb2Z0d2FyZSByZXR1cm5zIGEgcHNldWRvLWhlYWRlciB3aXRoIFZQSS9WQ0kgaW5mb3JtYXRpb24KKyAqIChhbmQsIGlkZWFsbHksIHBhY2tldCB0eXBlIGluZm9ybWF0aW9uLCBlLmcuIHNpZ25hbGxpbmcsIElMTUksCisgKiBMQU5FLCBMTEMtbXVsdGlwbGV4ZWQgdHJhZmZpYywgZXRjLiksIGl0IHNob3VsZCBub3QgdXNlCisgKiBETFRfQVRNX1JGQzE0ODMsIGJ1dCBzaG91bGQgZ2V0IGEgbmV3IERMVF8gdmFsdWUsIHNvIHRjcGR1bXAKKyAqIGFuZCB0aGUgbGlrZSBkb24ndCBoYXZlIHRvIGluZmVyIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEKKyAqIHBzZXVkby1oZWFkZXIgYW5kIHRoZSBmb3JtIG9mIHRoZSBwc2V1ZG8taGVhZGVyLgorICovCisjZGVmaW5lIERMVF9TVU5BVE0JCTEyMwkvKiBTb2xhcmlzK1N1bkFUTSAqLworCisvKiAKKyAqIFJlc2VydmVkIGFzIHBlciByZXF1ZXN0IGZyb20gS2VudCBEYWhsZ3JlbiA8a2VudEBwcmFlc3VtLmNvbT4KKyAqIGZvciBwcml2YXRlIHVzZS4KKyAqLworI2RlZmluZSBETFRfUklPICAgICAgICAgICAgICAgICAxMjQgICAgIC8qIFJhcGlkSU8gKi8KKyNkZWZpbmUgRExUX1BDSV9FWFAgICAgICAgICAgICAgMTI1ICAgICAvKiBQQ0kgRXhwcmVzcyAqLworI2RlZmluZSBETFRfQVVST1JBICAgICAgICAgICAgICAxMjYgICAgIC8qIFhpbGlueCBBdXJvcmEgbGluayBsYXllciAqLworCisvKgorICogSGVhZGVyIGZvciA4MDIuMTEgcGx1cyBhIG51bWJlciBvZiBiaXRzIG9mIGxpbmstbGF5ZXIgaW5mb3JtYXRpb24KKyAqIGluY2x1ZGluZyByYWRpbyBpbmZvcm1hdGlvbiwgdXNlZCBieSBzb21lIHJlY2VudCBCU0QgZHJpdmVycyBhcworICogd2VsbCBhcyB0aGUgbWFkd2lmaSBBdGhlcm9zIGRyaXZlciBmb3IgTGludXguCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTFfUkFESU8JMTI3CS8qIDgwMi4xMSBwbHVzIHJhZGlvdGFwIHJhZGlvIGhlYWRlciAqLworCisvKgorICogUmVzZXJ2ZWQgZm9yIHRoZSBUWlNQIGVuY2Fwc3VsYXRpb24sIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIENocmlzIFdhdGVycyA8Y2hyaXMud2F0ZXJzQG5ldHdvcmtjaGVtaXN0cnkuY29tPgorICogVFpTUCBpcyBhIGdlbmVyaWMgZW5jYXBzdWxhdGlvbiBmb3IgYW55IG90aGVyIGxpbmsgdHlwZSwKKyAqIHdoaWNoIGluY2x1ZGVzIGEgbWVhbnMgdG8gaW5jbHVkZSBtZXRhLWluZm9ybWF0aW9uCisgKiB3aXRoIHRoZSBwYWNrZXQsIGUuZy4gc2lnbmFsIHN0cmVuZ3RoIGFuZCBjaGFubmVsCisgKiBmb3IgODAyLjExIHBhY2tldHMuCisgKi8KKyNkZWZpbmUgRExUX1RaU1AgICAgICAgICAgICAgICAgMTI4ICAgICAvKiBUYXptZW4gU25pZmZlciBQcm90b2NvbCAqLworCisvKgorICogQlNEJ3MgQVJDTkVUIGhlYWRlcnMgaGF2ZSB0aGUgc291cmNlIGhvc3QsIGRlc3RpbmF0aW9uIGhvc3QsCisgKiBhbmQgdHlwZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQ7IHRoYXQncyB3aGF0J3MgaGFuZGVkCisgKiB1cCB0byB1c2VybGFuZCB2aWEgQlBGLgorICoKKyAqIExpbnV4J3MgQVJDTkVUIGhlYWRlcnMsIGhvd2V2ZXIsIGhhdmUgYSAyLWJ5dGUgb2Zmc2V0IGZpZWxkCisgKiBiZXR3ZWVuIHRoZSBob3N0IElEcyBhbmQgdGhlIHR5cGU7IHRoYXQncyB3aGF0J3MgaGFuZGVkIHVwCisgKiB0byB1c2VybGFuZCB2aWEgUEZfUEFDS0VUIHNvY2tldHMuCisgKgorICogV2UgdGhlcmVmb3JlIGhhdmUgdG8gaGF2ZSBzZXBhcmF0ZSBETFRfIHZhbHVlcyBmb3IgdGhlbS4KKyAqLworI2RlZmluZSBETFRfQVJDTkVUX0xJTlVYCTEyOQkvKiBBUkNORVQgKi8KKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZXMsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF9zIGFyZSB1c2VkCisgKiBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzCisgKiBRT1MgcHJvZmlsZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfTUxQUFAgICAgICAgMTMwCisjZGVmaW5lIERMVF9KVU5JUEVSX01MRlIgICAgICAgIDEzMQorI2RlZmluZSBETFRfSlVOSVBFUl9FUyAgICAgICAgICAxMzIKKyNkZWZpbmUgRExUX0pVTklQRVJfR0dTTiAgICAgICAgMTMzCisjZGVmaW5lIERMVF9KVU5JUEVSX01GUiAgICAgICAgIDEzNAorI2RlZmluZSBETFRfSlVOSVBFUl9BVE0yICAgICAgICAxMzUKKyNkZWZpbmUgRExUX0pVTklQRVJfU0VSVklDRVMgICAgMTM2CisjZGVmaW5lIERMVF9KVU5JUEVSX0FUTTEgICAgICAgIDEzNworCisvKgorICogQXBwbGUgSVAtb3Zlci1JRUVFIDEzOTQsIGFzIHBlciBhIHJlcXVlc3QgZnJvbSBEaWV0ZXIgU2llZ211bmQKKyAqIDxkaWV0ZXJAYXBwbGUuY29tPi4gIFRoZSBoZWFkZXIgdGhhdCdzIHByZXNlbnRlZCBpcyBhbiBFdGhlcm5ldC1saWtlCisgKiBoZWFkZXI6CisgKgorICoJI2RlZmluZSBGSVJFV0lSRV9FVUk2NF9MRU4JOAorICoJc3RydWN0IGZpcmV3aXJlX2hlYWRlciB7CisgKgkJdV9jaGFyICBmaXJld2lyZV9kaG9zdFtGSVJFV0lSRV9FVUk2NF9MRU5dOworICoJCXVfY2hhciAgZmlyZXdpcmVfc2hvc3RbRklSRVdJUkVfRVVJNjRfTEVOXTsKKyAqCQl1X3Nob3J0IGZpcmV3aXJlX3R5cGU7CisgKgl9OworICoKKyAqIHdpdGggImZpcmV3aXJlX3R5cGUiIGJlaW5nIGFuIEV0aGVybmV0IHR5cGUgdmFsdWUsIHJhdGhlciB0aGFuLAorICogZm9yIGV4YW1wbGUsIHJhdyBHQVNQIGZyYW1lcyBiZWluZyBoYW5kZWQgdXAuCisgKi8KKyNkZWZpbmUgRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQJMTM4CisKKy8qCisgKiBWYXJpb3VzIFNTNyBlbmNhcHN1bGF0aW9ucywgYXMgcGVyIGEgcmVxdWVzdCBmcm9tIEplZmYgTW9ycmlzcworICogPGplZmYubW9ycmlzc1tBVF11bHRpY29tLmNvbT4gYW5kIHN1YnNlcXVlbnQgZGlzY3Vzc2lvbnMuCisgKi8KKyNkZWZpbmUgRExUX01UUDJfV0lUSF9QSERSCTEzOQkvKiBwc2V1ZG8taGVhZGVyIHdpdGggdmFyaW91cyBpbmZvLCBmb2xsb3dlZCBieSBNVFAyICovCisjZGVmaW5lIERMVF9NVFAyCQkxNDAJLyogTVRQMiwgd2l0aG91dCBwc2V1ZG8taGVhZGVyICovCisjZGVmaW5lIERMVF9NVFAzCQkxNDEJLyogTVRQMywgd2l0aG91dCBwc2V1ZG8taGVhZGVyIG9yIE1UUDIgKi8KKyNkZWZpbmUgRExUX1NDQ1AJCTE0MgkvKiBTQ0NQLCB3aXRob3V0IHBzZXVkby1oZWFkZXIgb3IgTVRQMiBvciBNVFAzICovCisKKy8qCisgKiBET0NTSVMgTUFDIGZyYW1lcy4KKyAqLworI2RlZmluZSBETFRfRE9DU0lTCQkxNDMKKworLyoKKyAqIExpbnV4LUlyREEgcGFja2V0cy4gUHJvdG9jb2wgZGVmaW5lZCBhdCBodHRwOi8vd3d3LmlyZGEub3JnLgorICogVGhvc2UgcGFja2V0cyBpbmNsdWRlIElyTEFQIGhlYWRlcnMgYW5kIGFib3ZlIChJckxNUC4uLiksIGJ1dAorICogZG9uJ3QgaW5jbHVkZSBQaHkgZnJhbWluZyAoU09GL0VPRi9DUkMgJiBieXRlIHN0dWZmaW5nKSwgYmVjYXVzZSBQaHkKKyAqIGZyYW1pbmcgY2FuIGJlIGhhbmRsZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBkZXBlbmQgb24gdGhlIGJpdHJhdGUuCisgKiBUaGlzIGlzIGV4YWN0bHkgdGhlIGZvcm1hdCB5b3Ugd291bGQgZ2V0IGNhcHR1cmluZyBvbiBhIExpbnV4LUlyREEKKyAqIGludGVyZmFjZSAoaXJkYVgpLCBidXQgbm90IG9uIGEgcmF3IHNlcmlhbCBwb3J0LgorICogTm90ZSB0aGUgY2FwdHVyZSBpcyBkb25lIGluICJMaW51eC1jb29rZWQiIG1vZGUsIHNvIGVhY2ggcGFja2V0IGluY2x1ZGUKKyAqIGEgZmFrZSBwYWNrZXQgaGVhZGVyIChzdHJ1Y3Qgc2xsX2hlYWRlcikuIFRoaXMgaXMgYmVjYXVzZSBJckRBIHBhY2tldAorICogZGVjb2RpbmcgaXMgZGVwZW5kYW50IG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHBhY2tldCAoaW5jb21taW5nIG9yCisgKiBvdXRnb2luZykuCisgKiBXaGVuL2lmIG90aGVyIHBsYXRmb3JtIGltcGxlbWVudCBJckRBIGNhcHR1cmUsIHdlIG1heSByZXZpc2l0IHRoZQorICogaXNzdWUgYW5kIGRlZmluZSBhIHJlYWwgRExUX0lSREEuLi4KKyAqIEplYW4gSUkKKyAqLworI2RlZmluZSBETFRfTElOVVhfSVJEQQkJMTQ0CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgSUJNIFNQIHN3aXRjaCBhbmQgSUJNIE5leHQgRmVkZXJhdGlvbiBzd2l0Y2guCisgKi8KKyNkZWZpbmUgRExUX0lCTV9TUAkJMTQ1CisjZGVmaW5lIERMVF9JQk1fU04JCTE0NgorCisvKgorICogUmVzZXJ2ZWQgZm9yIHByaXZhdGUgdXNlLiAgSWYgeW91IGhhdmUgc29tZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisgKiB0aGF0IHlvdSB3YW50IHRvIHVzZSB3aXRoaW4geW91ciBvcmdhbml6YXRpb24sIHdpdGggdGhlIGNhcHR1cmUgZmlsZXMKKyAqIHVzaW5nIHRoYXQgbGluay1sYXllciBoZWFkZXIgdHlwZSBub3QgZXZlciBiZSBzZW50IG91dHNpZGUgeW91cgorICogb3JnYW5pemF0aW9uLCB5b3UgY2FuIHVzZSB0aGVzZSB2YWx1ZXMuCisgKgorICogTm8gbGlicGNhcCByZWxlYXNlIHdpbGwgdXNlIHRoZXNlIGZvciBhbnkgcHVycG9zZSwgbm9yIHdpbGwgYW55CisgKiB0Y3BkdW1wIHJlbGVhc2UgdXNlIHRoZW0sIGVpdGhlci4KKyAqCisgKiBEbyAqTk9UKiB1c2UgdGhlc2UgaW4gY2FwdHVyZSBmaWxlcyB0aGF0IHlvdSBleHBlY3QgYW55Ym9keSBub3QgdXNpbmcKKyAqIHlvdXIgcHJpdmF0ZSB2ZXJzaW9ucyBvZiBjYXB0dXJlLWZpbGUtcmVhZGluZyB0b29scyB0byByZWFkOyBpbgorICogcGFydGljdWxhciwgZG8gKk5PVCogdXNlIHRoZW0gaW4gcHJvZHVjdHMsIG90aGVyd2lzZSB5b3UgbWF5IGZpbmQgdGhhdAorICogcGVvcGxlIHdvbid0IGJlIGFibGUgdG8gdXNlIHRjcGR1bXAsIG9yIHNub3J0LCBvciBFdGhlcmVhbCwgb3IuLi4gdG8KKyAqIHJlYWQgY2FwdHVyZSBmaWxlcyBmcm9tIHlvdXIgZmlyZXdhbGwvaW50cnVzaW9uIGRldGVjdGlvbi90cmFmZmljCisgKiBtb25pdG9yaW5nL2V0Yy4gYXBwbGlhbmNlLCBvciB3aGF0ZXZlciBwcm9kdWN0IHVzZXMgdGhhdCBETFRfIHZhbHVlLAorICogYW5kIHlvdSBtYXkgYWxzbyBmaW5kIHRoYXQgdGhlIGRldmVsb3BlcnMgb2YgdGhvc2UgYXBwbGljYXRpb25zIHdpbGwKKyAqIG5vdCBhY2NlcHQgcGF0Y2hlcyB0byBsZXQgdGhlbSByZWFkIHRob3NlIGZpbGVzLgorICoKKyAqIEFsc28sIGRvIG5vdCB1c2UgdGhlbSBpZiBzb21lYm9keSBtaWdodCBzZW5kIHlvdSBhIGNhcHR1cmUgdXNpbmcgdGhlbQorICogZm9yICp0aGVpciogcHJpdmF0ZSB0eXBlIGFuZCB0b29scyB1c2luZyB0aGVtIGZvciAqeW91ciogcHJpdmF0ZSB0eXBlCisgKiB3b3VsZCBoYXZlIHRvIHJlYWQgdGhlbS4KKyAqCisgKiBJbnN0ZWFkLCBhc2sgInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIgZm9yIGEgbmV3IERMVF8gdmFsdWUsCisgKiBhcyBwZXIgdGhlIGNvbW1lbnQgYWJvdmUsIGFuZCB1c2UgdGhlIHR5cGUgeW91J3JlIGdpdmVuLgorICovCisjZGVmaW5lIERMVF9VU0VSMAkJMTQ3CisjZGVmaW5lIERMVF9VU0VSMQkJMTQ4CisjZGVmaW5lIERMVF9VU0VSMgkJMTQ5CisjZGVmaW5lIERMVF9VU0VSMwkJMTUwCisjZGVmaW5lIERMVF9VU0VSNAkJMTUxCisjZGVmaW5lIERMVF9VU0VSNQkJMTUyCisjZGVmaW5lIERMVF9VU0VSNgkJMTUzCisjZGVmaW5lIERMVF9VU0VSNwkJMTU0CisjZGVmaW5lIERMVF9VU0VSOAkJMTU1CisjZGVmaW5lIERMVF9VU0VSOQkJMTU2CisjZGVmaW5lIERMVF9VU0VSMTAJCTE1NworI2RlZmluZSBETFRfVVNFUjExCQkxNTgKKyNkZWZpbmUgRExUX1VTRVIxMgkJMTU5CisjZGVmaW5lIERMVF9VU0VSMTMJCTE2MAorI2RlZmluZSBETFRfVVNFUjE0CQkxNjEKKyNkZWZpbmUgRExUX1VTRVIxNQkJMTYyCisKKy8qCisgKiBGb3IgZnV0dXJlIHVzZSB3aXRoIDgwMi4xMSBjYXB0dXJlcyAtIGRlZmluZWQgYnkgQWJzb2x1dGVWYWx1ZQorICogU3lzdGVtcyB0byBzdG9yZSBhIG51bWJlciBvZiBiaXRzIG9mIGxpbmstbGF5ZXIgaW5mb3JtYXRpb24KKyAqIGluY2x1ZGluZyByYWRpbyBpbmZvcm1hdGlvbjoKKyAqCisgKglodHRwOi8vd3d3LnNoYWZ0bmV0Lm9yZy9+cGl6emEvc29mdHdhcmUvY2FwdHVyZWZybS50eHQKKyAqCisgKiBidXQgaXQgbWlnaHQgYmUgdXNlZCBieSBzb21lIG5vbi1BVlMgZHJpdmVycyBub3cgb3IgaW4gdGhlCisgKiBmdXR1cmUuCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTIDE2MwkvKiA4MDIuMTEgcGx1cyBBVlMgcmFkaW8gaGVhZGVyICovCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF9zIGFyZSB1c2VkCisgKiBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzCisgKiBRT1MgcHJvZmlsZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfTU9OSVRPUiAgICAgMTY0CisKKy8qCisgKiBCQUNuZXQgTVMvVFAgZnJhbWVzLgorICovCisjZGVmaW5lIERMVF9CQUNORVRfTVNfVFAJMTY1CisKKy8qCisgKiBBbm90aGVyIFBQUCB2YXJpYW50IGFzIHBlciByZXF1ZXN0IGZyb20gS2Fyc3RlbiBLZWlsIDxra2VpbEBzdXNlLmRlPi4KKyAqCisgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBPU2VzIHRvIGFsbG93IGEga2VybmVsIHNvY2tldCBmaWx0ZXIgdG8gZGlzdGluZ3Vpc2gKKyAqIGJldHdlZW4gaW5jb21pbmcgYW5kIG91dGdvaW5nIHBhY2tldHMsIG9uIGEgc29ja2V0IGludGVuZGVkIHRvCisgKiBzdXBwbHkgcHBwZCB3aXRoIG91dGdvaW5nIHBhY2tldHMgc28gaXQgY2FuIGRvIGRpYWwtb24tZGVtYW5kIGFuZAorICogaGFuZ3VwLW9uLWxhY2stb2YtZGVtYW5kOyBpbmNvbWluZyBwYWNrZXRzIGFyZSBmaWx0ZXJlZCBvdXQgc28gdGhleQorICogZG9uJ3QgY2F1c2UgcHBwZCB0byBob2xkIHRoZSBjb25uZWN0aW9uIHVwICh5b3UgZG9uJ3Qgd2FudCByYW5kb20KKyAqIGlucHV0IHBhY2tldHMgc3VjaCBhcyBwb3J0IHNjYW5zLCBwYWNrZXRzIGZyb20gb2xkIGxvc3QgY29ubmVjdGlvbnMsCisgKiBldGMuIHRvIGZvcmNlIHRoZSBjb25uZWN0aW9uIHRvIHN0YXkgdXApLgorICoKKyAqIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBQUFAgaGVhZGVyICgweGZmMDMpIGlzIG1vZGlmaWVkIHRvIGFjY29tb2RhdGUKKyAqIHRoZSBkaXJlY3Rpb24gLSAweDAwID0gSU4sIDB4MDEgPSBPVVQuCisgKi8KKyNkZWZpbmUgRExUX1BQUF9QUFBECQkxNjYKKworLyoKKyAqIE5hbWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHNvbWUgUFBQCisgKiBzb2Z0d2FyZTsgbmV3IHNvZnR3YXJlIHNob3VsZCB1c2UgRExUX1BQUF9QUFBELgorICovCisjZGVmaW5lIERMVF9QUFBfV0lUSF9ESVJFQ1RJT04JRExUX1BQUF9QUFBECisjZGVmaW5lIERMVF9MSU5VWF9QUFBfV0lUSERJUkVDVElPTglETFRfUFBQX1BQUEQKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKKyAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKKyAqIFFPUyBwcm9maWxlcywgY29va2llcywgZXRjLi4KKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9QUFBPRSAgICAgICAxNjcKKyNkZWZpbmUgRExUX0pVTklQRVJfUFBQT0VfQVRNICAgMTY4CisKKyNkZWZpbmUgRExUX0dQUlNfTExDCQkxNjkJLyogR1BSUyBMTEMgKi8KKyNkZWZpbmUgRExUX0dQRl9UCQkxNzAJLyogR1BGLVQgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCisjZGVmaW5lIERMVF9HUEZfRgkJMTcxCS8qIEdQRi1GIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLworCisvKgorICogUmVxdWVzdGVkIGJ5IE9vbGFuIFppbW1lciA8b3pAZ2NvbS5jb20+IGZvciB1c2UgaW4gR2NvbSdzIFQxL0UxIGxpbmUKKyAqIG1vbml0b3JpbmcgZXF1aXBtZW50LgorICovCisjZGVmaW5lIERMVF9HQ09NX1QxRTEJCTE3MgorI2RlZmluZSBETFRfR0NPTV9TRVJJQUwJCTE3MworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfIGlzIHVzZWQKKyAqIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHRvIFBoeXNpY2FsIEludGVyZmFjZSBDYXJkcyAoUElDKQorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1BJQ19QRUVSICAgIDE3NAorCisvKgorICogTGluayB0eXBlcyByZXF1ZXN0ZWQgYnkgR3JlZ29yIE1haWVyIDxncmVnb3JAZW5kYWNlLmNvbT4gb2YgRW5kYWNlCisgKiBNZWFzdXJlbWVudCBTeXN0ZW1zLiAgVGhleSBhZGQgYW4gRVJGIGhlYWRlciAoc2VlCisgKiBodHRwOi8vd3d3LmVuZGFjZS5jb20vc3VwcG9ydC9FbmRhY2VSZWNvcmRGb3JtYXQucGRmKSBpbiBmcm9udCBvZgorICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgorICovCisjZGVmaW5lIERMVF9FUkZfRVRICQkxNzUJLyogRXRoZXJuZXQgKi8KKyNkZWZpbmUgRExUX0VSRl9QT1MJCTE3NgkvKiBQYWNrZXQtb3Zlci1TT05FVCAqLworCisvKgorICogUmVxdWVzdGVkIGJ5IERhbmllbGUgT3JsYW5kaSA8ZGFuaWVsZUBvcmxhbmRpLmNvbT4gZm9yIHJhdyBMQVBECisgKiBmb3IgdklTRE4gKGh0dHA6Ly93d3cub3JsYW5kaS5jb20vdmlzZG4vKS4gIEl0cyBsaW5rLWxheWVyIGhlYWRlcgorICogaW5jbHVkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIExBUEQgaGVhZGVyLCBzbyBpdCdzCisgKiBub3QgbmVjZXNzYXJpbHkgYSBnZW5lcmljIExBUEQgaGVhZGVyLgorICovCisjZGVmaW5lIERMVF9MSU5VWF9MQVBECQkxNzcKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICogVGhlIERMVF8gYXJlIHVzZWQgZm9yIHByZXBlbmRpbmcgbWV0YS1pbmZvcm1hdGlvbgorICogbGlrZSBpbnRlcmZhY2UgaW5kZXgsIGludGVyZmFjZSBuYW1lCisgKiBiZWZvcmUgc3RhbmRhcmQgRXRoZXJuZXQsIFBQUCwgRnJlbGF5ICYgQy1IRExDIEZyYW1lcworICovCisjZGVmaW5lIERMVF9KVU5JUEVSX0VUSEVSICAgICAgIDE3OAorI2RlZmluZSBETFRfSlVOSVBFUl9QUFAgICAgICAgICAxNzkKKyNkZWZpbmUgRExUX0pVTklQRVJfRlJFTEFZICAgICAgMTgwCisjZGVmaW5lIERMVF9KVU5JUEVSX0NIRExDICAgICAgIDE4MQorCisvKgorICogTXVsdGkgTGluayBGcmFtZSBSZWxheSAoRlJGLjE2KQorICovCisjZGVmaW5lIERMVF9NRlIgICAgICAgICAgICAgICAgIDE4MgorCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogdm9pY2UgQWRhcHRlciBDYXJkIChQSUMpCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfVlAgICAgICAgICAgMTgzCisKKy8qCisgKiBBcmluYyA0MjkgZnJhbWVzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogRXZlcnkgZnJhbWUgY29udGFpbnMgYSAzMmJpdCBBNDI5IGxhYmVsLgorICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIEFyaW5jIDQyOSBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY29uZG9yZW5nLmNvbS9zdXBwb3J0L2Rvd25sb2Fkcy90dXRvcmlhbHMvQVJJTkNUdXRvcmlhbC5wZGYKKyAqLworI2RlZmluZSBETFRfQTQyOSAgICAgICAgICAgICAgICAxODQKKworLyoKKyAqIEFyaW5jIDY1MyBJbnRlcnBhcnRpdGlvbiBDb21tdW5pY2F0aW9uIG1lc3NhZ2VzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBBNjUzLTEgc3RhbmRhcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgRExUX0E2NTNfSUNNICAgICAgICAgICAgMTg1CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBVU0Igc2V0dXAgaGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uCisgKi8KKyNkZWZpbmUgRExUX1VTQgkJCTE4NgorCisvKgorICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pLgorICovCisjZGVmaW5lIERMVF9CTFVFVE9PVEhfSENJX0g0CTE4NworCisvKgorICogSUVFRSA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyOyByZXF1ZXN0ZWQgYnkgTWFyaWEgQ3J1egorICogPGNydXpfcGV0YWdheUBiYWguY29tPi4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTCTE4OAorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgTGludXggVVNCIGhlYWRlcjsgcmVxdWVzdGVkIGJ5CisgKiBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+LgorICovCisjZGVmaW5lIERMVF9VU0JfTElOVVgJCTE4OQorCisvKgorICogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgKENBTikgdi4gMi4wQiBwYWNrZXRzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogVXNlZCB0byBkdW1wIENBTiBwYWNrZXRzIGNvbWluZyBmcm9tIGEgQ0FOIFZlY3RvciBib2FyZC4KKyAqIE1vcmUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgQ0FOIHYyLjBCIGZyYW1lcyBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY2FuLWNpYS5vcmcvZG93bmxvYWRzLz8yNjkKKyAqLworI2RlZmluZSBETFRfQ0FOMjBCICAgICAgICAgICAgICAxOTAKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIHdpdGggYWRkcmVzcyBmaWVsZHMgcGFkZGVkLCBhcyBpcyBkb25lIGJ5IExpbnV4CisgKiBkcml2ZXJzOyByZXF1ZXN0ZWQgYnkgSnVlcmdlbiBTY2hpbW1lci4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNV80X0xJTlVYCTE5MQorCisvKgorICogUGVyIFBhY2tldCBJbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgcGFja2V0cy4KKyAqIERMVF8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqLworI2RlZmluZSBETFRfUFBJCQkJMTkyCisKKy8qCisgKiBIZWFkZXIgZm9yIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgcGx1cyBhIHJhZGlvdGFwIHJhZGlvIGhlYWRlcjsKKyAqIHJlcXVlc3RlZCBieSBDaGFybGVzIENsYW5jeS4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPCTE5MworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogaW50ZWdyYXRlZCBzZXJ2aWNlIG1vZHVsZSAoSVNNKS4KKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9JU00gICAgICAgICAxOTQKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpOyByZXF1ZXN0ZWQgYnkgTWlra28gU2Fhcm5pdmFsYSA8bWlra28uc2Fhcm5pdmFsYUBzZW5zaW5vZGUuY29tPi4KKyAqIEZvciB0aGlzIG9uZSwgd2UgZXhwZWN0IHRoZSBGQ1MgdG8gYmUgcHJlc2VudCBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZTsKKyAqIGlmIHRoZSBmcmFtZSBoYXMgbm8gRkNTLCBETFRfSUVFRTgwMl8xNV80X05PRkNTIHNob3VsZCBiZSB1c2VkLgorICovCisjZGVmaW5lIERMVF9JRUVFODAyXzE1XzQJMTk1CisKKy8qCisgKiBWYXJpb3VzIGxpbmstbGF5ZXIgdHlwZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyLCBmb3IgU0lUQQorICogKGh0dHA6Ly93d3cuc2l0YS5hZXJvLyk7IHJlcXVlc3RlZCBieSBGdWxrbyBIZXcgKGZ1bGtvLmhld0BnbWFpbC5jb20pLgorICovCisjZGVmaW5lIERMVF9TSVRBCQkxOTYKKworLyoKKyAqIFZhcmlvdXMgbGluay1sYXllciB0eXBlcywgd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBFbmRhY2UgREFHIGNhcmRzOworICogZW5jYXBzdWxhdGVzIEVuZGFjZSBFUkYgcmVjb3Jkcy4gIFJlcXVlc3RlZCBieSBTdGVwaGVuIERvbm5lbGx5CisgKiA8c3RlcGhlbkBlbmRhY2UuY29tPi4KKyAqLworI2RlZmluZSBETFRfRVJGCQkJMTk3CisKKy8qCisgKiBTcGVjaWFsIGhlYWRlciBwcmVwZW5kZWQgdG8gRXRoZXJuZXQgcGFja2V0cyB3aGVuIGNhcHR1cmluZyBmcm9tIGEKKyAqIHUxMCBOZXR3b3JrcyBib2FyZC4gIFJlcXVlc3RlZCBieSBQaGlsIE11bGhvbGxhbmQKKyAqIDxwaGlsQHUxMG5ldHdvcmtzLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX1JBSUYxCQkxOTgKKworLyoKKyAqIElQTUIgcGFja2V0IGZvciBJUE1JLCBiZWdpbm5pbmcgd2l0aCB0aGUgSTJDIHNsYXZlIGFkZHJlc3MsIGZvbGxvd2VkCisgKiBieSB0aGUgbmV0Rm4gYW5kIExVTiwgZXRjLi4gIFJlcXVlc3RlZCBieSBDaGFudGh5IFRvZXVuZworICogPGNoYW50aHkudG9ldW5nQGNhLmtvbnRyb24uY29tPi4KKyAqLworI2RlZmluZSBETFRfSVBNQgkJMTk5CisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKKyAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGNhcHR1cmluZyBkYXRhIG9uIGEgc2VjdXJlIHR1bm5lbCBpbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfU1QgICAgICAgICAgMjAwCisKKy8qCisgKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCksIHdpdGggcHNldWRvLWhlYWRlcgorICogdGhhdCBpbmNsdWRlcyBkaXJlY3Rpb24gaW5mb3JtYXRpb247IHJlcXVlc3RlZCBieSBQYW9sbyBBYmVuaS4KKyAqLworI2RlZmluZSBETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFIJMjAxCisKKy8qCisgKiBBWC4yNSBwYWNrZXQgd2l0aCBhIDEtYnl0ZSBLSVNTIGhlYWRlcjsgc2VlCisgKgorICoJaHR0cDovL3d3dy5heDI1Lm5ldC9raXNzLmh0bQorICoKKyAqIGFzIHBlciBSaWNoYXJkIFN0ZWFybiA8cmljaGFyZEBybnMtc3RlYXJuLmRlbW9uLmNvLnVrPi4KKyAqLworI2RlZmluZSBETFRfQVgyNV9LSVNTCQkyMDIKKworLyoKKyAqIExBUEQgcGFja2V0cyBmcm9tIGFuIElTRE4gY2hhbm5lbCwgc3RhcnRpbmcgd2l0aCB0aGUgYWRkcmVzcyBmaWVsZCwKKyAqIHdpdGggbm8gcHNldWRvLWhlYWRlci4KKyAqIFJlcXVlc3RlZCBieSBWYXJ1bmEgRGUgU2lsdmEgPHZhcnVuYXhAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBETFRfTEFQRAkJMjAzCisKKy8qCisgKiBWYXJpYW50cyBvZiB2YXJpb3VzIGxpbmstbGF5ZXIgaGVhZGVycywgd2l0aCBhIG9uZS1ieXRlIGRpcmVjdGlvbgorICogcHNldWRvLWhlYWRlciBwcmVwZW5kZWQgLSB6ZXJvIG1lYW5zICJyZWNlaXZlZCBieSB0aGlzIGhvc3QiLAorICogbm9uLXplcm8gKGFueSBub24temVybyB2YWx1ZSkgbWVhbnMgInNlbnQgYnkgdGhpcyBob3N0IiAtIGFzIHBlcgorICogV2lsbCBCYXJrZXIgPHcuYmFya2VyQHplbi5jby51az4uCisgKi8KKyNkZWZpbmUgRExUX1BQUF9XSVRIX0RJUgkyMDQJLyogUFBQIC0gZG9uJ3QgY29uZnVzZSB3aXRoIERMVF9QUFBfV0lUSF9ESVJFQ1RJT04gKi8KKyNkZWZpbmUgRExUX0NfSERMQ19XSVRIX0RJUgkyMDUJLyogQ2lzY28gSERMQyAqLworI2RlZmluZSBETFRfRlJFTEFZX1dJVEhfRElSCTIwNgkvKiBGcmFtZSBSZWxheSAqLworI2RlZmluZSBETFRfTEFQQl9XSVRIX0RJUgkyMDcJLyogTEFQQiAqLworCisvKgorICogMjA4IGlzIHJlc2VydmVkIGZvciBhbiBhcy15ZXQtdW5zcGVjaWZpZWQgcHJvcHJpZXRhcnkgbGluay1sYXllcgorICogdHlwZSwgYXMgcmVxdWVzdGVkIGJ5IFdpbGwgQmFya2VyLgorICovCisKKy8qCisgKiBJUE1CIHdpdGggYSBMaW51eC1zcGVjaWZpYyBwc2V1ZG8taGVhZGVyOyBhcyByZXF1ZXN0ZWQgYnkgQWxleGV5IE5leW1hbgorICogPGF2bkBwaWdlb25wb2ludC5jb20+LgorICovCisjZGVmaW5lIERMVF9JUE1CX0xJTlVYCQkyMDkKKworLyoKKyAqIEZsZXhSYXkgYXV0b21vdGl2ZSBidXMgLSBodHRwOi8vd3d3LmZsZXhyYXkuY29tLyAtIGFzIHJlcXVlc3RlZAorICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgRExUX0ZMRVhSQVkJCTIxMAorCisvKgorICogTWVkaWEgT3JpZW50ZWQgU3lzdGVtcyBUcmFuc3BvcnQgKE1PU1QpIGJ1cyBmb3IgbXVsdGltZWRpYQorICogdHJhbnNwb3J0IC0gaHR0cDovL3d3dy5tb3N0Y29vcGVyYXRpb24uY29tLyAtIGFzIHJlcXVlc3RlZAorICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgRExUX01PU1QJCTIxMQorCisvKgorICogTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgKExJTikgYnVzIGZvciB2ZWhpY2xlIG5ldHdvcmtzIC0KKyAqIGh0dHA6Ly93d3cubGluLXN1YmJ1cy5vcmcvIC0gYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyCisgKiA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBETFRfTElOCQkJMjEyCisKKy8qCisgKiBYMkUtcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSB1c2VkIGZvciBzZXJpYWwgbGluZSBjYXB0dXJlLAorICogYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIERMVF9YMkVfU0VSSUFMCQkyMTMKKworLyoKKyAqIFgyRS1wcml2YXRlIGRhdGEgbGluayB0eXBlIHVzZWQgZm9yIHRoZSBYb3JheWEgZGF0YSBsb2dnZXIKKyAqIGZhbWlseSwgYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIERMVF9YMkVfWE9SQVlBCQkyMTQKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpLCBidXQgd2l0aCB0aGUgUEhZLWxldmVsIGRhdGEgZm9yIG5vbi1BU0sgUEhZcyAoNCBvY3RldHMKKyAqIG9mIDAgYXMgcHJlYW1ibGUsIG9uZSBvY3RldCBvZiBTRkQsIG9uZSBvY3RldCBvZiBmcmFtZSBsZW5ndGgrCisgKiByZXNlcnZlZCBiaXQsIGFuZCB0aGVuIHRoZSBNQUMtbGF5ZXIgZGF0YSwgc3RhcnRpbmcgd2l0aCB0aGUKKyAqIGZyYW1lIGNvbnRyb2wgZmllbGQpLgorICoKKyAqIFJlcXVlc3RlZCBieSBNYXggRmlsaXBwb3YgPGpjbXZia2JjQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZCTIxNQorCisvKiAKKyAqIERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiByZXF1ZXN0ZWQgdGhpcyBmb3IKKyAqIGNhcHR1cmVzIGZyb20gdGhlIExpbnV4IGtlcm5lbCAvZGV2L2lucHV0L2V2ZW50TiBkZXZpY2VzLiBUaGlzCisgKiBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdmVtZW50cyBmcm9tIHRoZQorICogTGludXgga2VybmVsIHRvIGRpc3BsYXkgc3lzdGVtcywgc3VjaCBhcyBYb3JnLiAKKyAqLworI2RlZmluZSBETFRfTElOVVhfRVZERVYJCTIxNgorCisvKgorICogR1NNIFVtIGFuZCBBYmlzIGludGVyZmFjZXMsIHByZWNlZGVkIGJ5IGEgImdzbXRhcCIgaGVhZGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPi4KKyAqLworI2RlZmluZSBETFRfR1NNVEFQX1VNCQkyMTcKKyNkZWZpbmUgRExUX0dTTVRBUF9BQklTCQkyMTgKKworLyoKKyAqIE1QTFMsIHdpdGggYW4gTVBMUyBsYWJlbCBhcyB0aGUgbGluay1sYXllciBoZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgTWljaGVsZSBNYXJjaGV0dG8gPG1pY2hlbGVAb3BlbmJzZC5vcmc+IG9uIGJlaGFsZgorICogb2YgT3BlbkJTRC4KKyAqLworI2RlZmluZSBETFRfTVBMUwkJMjE5CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBMaW51eCBVU0IgaGVhZGVyLCB3aXRoIHRoZSBVU0IgaGVhZGVyCisgKiBwYWRkZWQgdG8gNjQgYnl0ZXM7IHJlcXVpcmVkIGZvciBtZW1vcnktbWFwcGVkIGFjY2Vzcy4KKyAqLworI2RlZmluZSBETFRfVVNCX0xJTlVYX01NQVBQRUQJMjIwCisKKy8qCisgKiBERUNUIHBhY2tldHMsIHdpdGggYSBwc2V1ZG8taGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIE1hdHRoaWFzIFdlbnplbCA8dGNwZHVtcEBtYXp6b28uZGU+LgorICovCisjZGVmaW5lIERMVF9ERUNUCQkyMjEKKworLyoKKyAqIEZyb206ICJMaWR3YSwgRXJpYyAoR1NGQy01ODIuMClbU0dUIElOQ10iIDxlcmljLmxpZHdhLTFAbmFzYS5nb3Y+CisgKiBEYXRlOiBNb24sIDExIE1heSAyMDA5IDExOjE4OjMwIC0wNTAwCisgKgorICogRExUX0FPUy4gV2UgbmVlZCBpdCBmb3IgQU9TIFNwYWNlIERhdGEgTGluayBQcm90b2NvbC4KKyAqICAgSSBoYXZlIGFscmVhZHkgd3JpdHRlbiBkaXNzZWN0b3JzIGZvciBidXQgbmVlZCBhbiBPSyBmcm9tCisgKiAgIGxlZ2FsIGJlZm9yZSBJIGNhbiBzdWJtaXQgYSBwYXRjaC4KKyAqCisgKi8KKyNkZWZpbmUgRExUX0FPUyAgICAgICAgICAgICAgICAgMjIyCisKKy8qCisgKiBXaXJlbGVzcyBIQVJUIChIaWdod2F5IEFkZHJlc3NhYmxlIFJlbW90ZSBUcmFuc2R1Y2VyKQorICogRnJvbSB0aGUgSEFSVCBDb21tdW5pY2F0aW9uIEZvdW5kYXRpb24KKyAqIElFUy9QQVMgNjI1OTEKKyAqCisgKiBSZXF1ZXN0ZWQgYnkgU2FtIFJvYmVydHMgPHZpZXV4dGVjaEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9XSUhBUlQJCTIyMworCisvKgorICogRmlicmUgQ2hhbm5lbCBGQy0yIGZyYW1lcywgYmVnaW5uaW5nIHdpdGggYSBGcmFtZV9IZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgS2Fob3UgTGVpIDxrYWhvdTgyQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0ZDXzIJCTIyNAorCisvKgorICogRmlicmUgQ2hhbm5lbCBGQy0yIGZyYW1lcywgYmVnaW5uaW5nIHdpdGggYW4gZW5jb2Rpbmcgb2YgdGhlCisgKiBTT0YsIGFuZCBlbmRpbmcgd2l0aCBhbiBlbmNvZGluZyBvZiB0aGUgRU9GLgorICoKKyAqIFRoZSBlbmNvZGluZ3MgcmVwcmVzZW50IHRoZSBmcmFtZSBkZWxpbWl0ZXJzIGFzIDQtYnl0ZSBzZXF1ZW5jZXMKKyAqIHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyBvcmRlcmVkIHNldHMsIHdpdGggSzI4LjUKKyAqIHJlcHJlc2VudGVkIGFzIDB4QkMsIGFuZCB0aGUgRCBzeW1ib2xzIGFzIHRoZSBjb3JyZXNwb25kaW5nCisgKiBieXRlIHZhbHVlczsgZm9yIGV4YW1wbGUsIFNPRmkyLCB3aGljaCBpcyBLMjguNSAtIEQyMS41IC0gRDEuMiAtIEQyMS4yLAorICogaXMgcmVwcmVzZW50ZWQgYXMgMHhCQyAweEI1IDB4NTUgMHg1NS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgS2Fob3UgTGVpIDxrYWhvdTgyQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0ZDXzJfV0lUSF9GUkFNRV9ERUxJTVMJMjI1CisKKy8qCisgKiBTb2xhcmlzIGlwbmV0IHBzZXVkby1oZWFkZXI7IHJlcXVlc3RlZCBieSBEYXJyZW4gUmVlZCA8RGFycmVuLlJlZWRAU3VuLkNPTT4uCisgKgorICogVGhlIHBzZXVkby1oZWFkZXIgc3RhcnRzIHdpdGggYSBvbmUtYnl0ZSB2ZXJzaW9uIG51bWJlcjsgZm9yIHZlcnNpb24gMiwKKyAqIHRoZSBwc2V1ZG8taGVhZGVyIGlzOgorICoKKyAqIHN0cnVjdCBkbF9pcG5ldGluZm8geworICogICAgIHVfaW50OF90ICAgZGxpX3ZlcnNpb247CisgKiAgICAgdV9pbnQ4X3QgICBkbGlfZmFtaWx5OworICogICAgIHVfaW50MTZfdCAgZGxpX2h0eXBlOworICogICAgIHVfaW50MzJfdCAgZGxpX3BrdGxlbjsKKyAqICAgICB1X2ludDMyX3QgIGRsaV9pZmluZGV4OworICogICAgIHVfaW50MzJfdCAgZGxpX2dyaWZpbmRleDsKKyAqICAgICB1X2ludDMyX3QgIGRsaV96c3JjOworICogICAgIHVfaW50MzJfdCAgZGxpX3pkc3Q7CisgKiB9OworICoKKyAqIGRsaV92ZXJzaW9uIGlzIDIgZm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBzZXVkby1oZWFkZXIuCisgKgorICogZGxpX2ZhbWlseSBpcyBhIFNvbGFyaXMgYWRkcmVzcyBmYW1pbHkgdmFsdWUsIHNvIGl0J3MgMiBmb3IgSVB2NAorICogYW5kIDI2IGZvciBJUHY2LgorICoKKyAqIGRsaV9odHlwZSBpcyBhICJob29rIHR5cGUiIC0gMCBmb3IgaW5jb21pbmcgcGFja2V0cywgMSBmb3Igb3V0Z29pbmcKKyAqIHBhY2tldHMsIGFuZCAyIGZvciBwYWNrZXRzIGFycml2aW5nIGZyb20gYW5vdGhlciB6b25lIG9uIHRoZSBzYW1lCisgKiBtYWNoaW5lLgorICoKKyAqIGRsaV9wa3RsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGRhdGEgZm9sbG93aW5nIHRoZSBwc2V1ZG8taGVhZGVyCisgKiAoc28gdGhlIGNhcHR1cmVkIGxlbmd0aCBtaW51cyBkbGlfcGt0bGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgKiBwc2V1ZG8taGVhZGVyLCBhc3N1bWluZyB0aGUgZW50aXJlIHBzZXVkby1oZWFkZXIgd2FzIGNhcHR1cmVkKS4KKyAqCisgKiBkbGlfaWZpbmRleCBpcyB0aGUgaW50ZXJmYWNlIGluZGV4IG9mIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlCisgKiBwYWNrZXQgYXJyaXZlZC4KKyAqCisgKiBkbGlfZ3JpZmluZGV4IGlzIHRoZSBncm91cCBpbnRlcmZhY2UgaW5kZXggbnVtYmVyIChmb3IgSVBNUCBpbnRlcmZhY2VzKS4KKyAqCisgKiBkbGlfenNyYyBpcyB0aGUgem9uZSBpZGVudGlmaWVyIGZvciB0aGUgc291cmNlIG9mIHRoZSBwYWNrZXQuCisgKgorICogZGxpX3pkc3QgaXMgdGhlIHpvbmUgaWRlbnRpZmllciBmb3IgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwYWNrZXQuCisgKgorICogQSB6b25lIG51bWJlciBvZiAwIGlzIHRoZSBnbG9iYWwgem9uZTsgYSB6b25lIG51bWJlciBvZiAweGZmZmZmZmZmCisgKiBtZWFucyB0aGF0IHRoZSBwYWNrZXQgYXJyaXZlZCBmcm9tIGFub3RoZXIgaG9zdCBvbiB0aGUgbmV0d29yaywgbm90CisgKiBmcm9tIGFub3RoZXIgem9uZSBvbiB0aGUgc2FtZSBtYWNoaW5lLgorICoKKyAqIEFuIElQdjQgb3IgSVB2NiBkYXRhZ3JhbSBmb2xsb3dzIHRoZSBwc2V1ZG8taGVhZGVyOyBkbGlfZmFtaWx5IGluZGljYXRlcworICogd2hpY2ggb2YgdGhvc2UgaXQgaXMuCisgKi8KKyNkZWZpbmUgRExUX0lQTkVUCQkyMjYKKworLyoKKyAqIENBTiAoQ29udHJvbGxlciBBcmVhIE5ldHdvcmspIGZyYW1lcywgd2l0aCBhIHBzZXVkby1oZWFkZXIgYXMgc3VwcGxpZWQKKyAqIGJ5IExpbnV4IFNvY2tldENBTi4gIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dCBpbiB0aGUgTGludXgKKyAqIHNvdXJjZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgRmVsaXggT2Jlbmh1YmVyIDxmZWxpeEBvYmVuaHViZXIuZGU+LgorICovCisjZGVmaW5lIERMVF9DQU5fU09DS0VUQ0FOCTIyNworCisvKgorICogUmF3IElQdjQvSVB2NjsgZGlmZmVyZW50IGZyb20gRExUX1JBVyBpbiB0aGF0IHRoZSBETFRfIHZhbHVlIHNwZWNpZmllcworICogd2hldGhlciBpdCdzIHY0IG9yIHY2LiAgUmVxdWVzdGVkIGJ5IERhcnJlbiBSZWVkIDxEYXJyZW4uUmVlZEBTdW4uQ09NPi4KKyAqLworI2RlZmluZSBETFRfSVBWNAkJMjI4CisjZGVmaW5lIERMVF9JUFY2CQkyMjkKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpLCBhbmQgd2l0aCBubyBGQ1MgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWU7IHJlcXVlc3RlZCBieQorICogSm9uIFNtaXJsIDxqb25zbWlybEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9JRUVFODAyXzE1XzRfTk9GQ1MJMjMwCisKKy8qCisgKiBSYXcgRC1CdXM6CisgKgorICoJaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9kYnVzCisgKgorICogbWVzc2FnZXM6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzCisgKgorICogc3RhcnRpbmcgd2l0aCB0aGUgZW5kaWFubmVzcyBmbGFnLCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSB0eXBlLCBldGMuLAorICogYnV0IHdpdGhvdXQgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRzaGFrZSBiZWZvcmUgdGhlIG1lc3NhZ2Ugc2VxdWVuY2U6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNhdXRoLXByb3RvY29sCisgKgorICogUmVxdWVzdGVkIGJ5IE1hcnRpbiBWaWRuZXIgPG1hcnRpbkB2aWRuZXIubmV0Pi4KKyAqLworI2RlZmluZSBETFRfREJVUwkJMjMxCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1ZTCQkJMjMyCisjZGVmaW5lIERMVF9KVU5JUEVSX1NSWF9FMkUJCTIzMworI2RlZmluZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUwJMjM0CisKKy8qCisgKiBEVkItQ0kgKERWQiBDb21tb24gSW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gYSBQQyBDYXJkCisgKiBtb2R1bGUgYW5kIGEgRFZCIHJlY2VpdmVyKS4gIFNlZQorICoKKyAqCWh0dHA6Ly93d3cua2Fpc2VyLmN4L3BjYXAtZHZiY2kuaHRtbAorICoKKyAqIGZvciB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgTWFydGluIEthaXNlciA8bWFydGluQGthaXNlci5jeD4uCisgKi8KKyNkZWZpbmUgRExUX0RWQl9DSQkJMjM1CisKKy8qCisgKiBWYXJpYW50IG9mIDNHUFAgVFMgMjcuMDEwIG11bHRpcGxleGluZyBwcm90b2NvbCAoc2ltaWxhciB0bywgYnV0CisgKiAqbm90KiB0aGUgc2FtZSBhcywgMjcuMDEwKS4gIFJlcXVlc3RlZCBieSBIYW5zLUNocmlzdG9waCBTY2hlbW1lbAorICogPGhhbnMtY2hyaXN0b3BoLnNjaGVtbWVsQGNpbnRlcmlvbi5jb20+LgorICovCisjZGVmaW5lIERMVF9NVVgyNzAxMAkJMjM2CisKKy8qCisgKiBTVEFOQUcgNTA2NiBEX1BEVXMuICBSZXF1ZXN0ZWQgYnkgTS4gQmFyaXMgRGVtaXJheQorICogPGJhcmlzZGVtaXJheUBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9TVEFOQUdfNTA2Nl9EX1BEVQkyMzcKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfQVRNX0NFTUlDCTIzOAorCisvKgorICogTmV0RmlsdGVyIExPRyBtZXNzYWdlcyAKKyAqIChwYXlsb2FkIG9mIG5ldGxpbmsgTkZOTF9TVUJTWVNfVUxPRy9ORlVMTkxfTVNHX1BBQ0tFVCBwYWNrZXRzKQorICoKKyAqIFJlcXVlc3RlZCBieSBKYWt1YiBaYXdhZHpraSA8ZGFya2phbWVzLXdzQGRhcmtqYW1lcy5wbD4KKyAqLworI2RlZmluZSBETFRfTkZMT0cJCTIzOQorCisvKgorICogSGlsc2NoZXIgR2VzZWxsc2NoYWZ0IGZ1ZXIgU3lzdGVtYXV0b21hdGlvbiBtYkggbGluay1sYXllciB0eXBlCisgKiBmb3IgRXRoZXJuZXQgcGFja2V0cyB3aXRoIGEgNC1ieXRlIHBzZXVkby1oZWFkZXIgYW5kIGFsd2F5cworICogd2l0aCB0aGUgcGF5bG9hZCBpbmNsdWRpbmcgdGhlIEZDUywgYXMgc3VwcGxpZWQgYnkgdGhlaXIKKyAqIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSG9sZ2VyIFAuIEZyb21tZXIgPEhQZnJvbW1lckBoaWxzY2hlci5jb20+CisgKi8KKyNkZWZpbmUgRExUX05FVEFOQUxZWkVSCQkyNDAKKworLyoKKyAqIEhpbHNjaGVyIEdlc2VsbHNjaGFmdCBmdWVyIFN5c3RlbWF1dG9tYXRpb24gbWJIIGxpbmstbGF5ZXIgdHlwZQorICogZm9yIEV0aGVybmV0IHBhY2tldHMgd2l0aCBhIDQtYnl0ZSBwc2V1ZG8taGVhZGVyIGFuZCBGQ1MgYW5kCisgKiB3aXRoIHRoZSBFdGhlcm5ldCBoZWFkZXIgcHJlY2VkZWQgYnkgNyBieXRlcyBvZiBwcmVhbWJsZSBhbmQKKyAqIDEgYnl0ZSBvZiBTRkQsIGFzIHN1cHBsaWVkIGJ5IHRoZWlyIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZAorICogc29mdHdhcmUuCisgKgorICogUmVxdWVzdGVkIGJ5IEhvbGdlciBQLiBGcm9tbWVyIDxIUGZyb21tZXJAaGlsc2NoZXIuY29tPgorICovCisjZGVmaW5lIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVAkyNDEKKworLyoKKyAqIElQLW92ZXItSW5maW5pQmFuZCwgYXMgc3BlY2lmaWVkIGJ5IFJGQyA0MzkxLgorICoKKyAqIFJlcXVlc3RlZCBieSBQZXRyIFN1bWJlcmEgPHBldHIuc3VtYmVyYUBvcmFjbGUuY29tPi4KKyAqLworI2RlZmluZSBETFRfSVBPSUIJCTI0MgorCisvKgorICogTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gKElTTyAxMzgxOC0xL0lUVS1UIEguMjIyLjApLgorICoKKyAqIFJlcXVlc3RlZCBieSBHdXkgTWFydGluIDxnbXNvZnRAdHV4aWNvbWFuLmJlPi4KKyAqLworI2RlZmluZSBETFRfTVBFR18yX1RTCQkyNDMKKworLyoKKyAqIG5nNFQgR21iSCdzIFVNVFMgSXViL0l1ci1vdmVyLUFUTSBhbmQgSXViL0l1ci1vdmVyLUlQIGZvcm1hdCBhcworICogdXNlZCBieSB0aGVpciBuZzQwIHByb3RvY29sIHRlc3Rlci4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSmVucyBHcmltbWVyIDxqZW5zLmdyaW1tZXJAbmc0dC5jb20+LgorICovCisjZGVmaW5lIERMVF9ORzQwCQkyNDQKKworLyoKKyAqIFBzZXVkby1oZWFkZXIgZ2l2aW5nIGFkYXB0ZXIgbnVtYmVyIGFuZCBmbGFncywgZm9sbG93ZWQgYnkgYW4gTkZDCisgKiAoTmVhci1GaWVsZCBDb21tdW5pY2F0aW9ucykgTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKExMQ1ApIFBEVSwKKyAqIGFzIHNwZWNpZmllZCBieSBORkMgRm9ydW0gTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgVGVjaG5pY2FsCisgKiBTcGVjaWZpY2F0aW9uIExMQ1AgMS4xLgorICoKKyAqIFJlcXVlc3RlZCBieSBNaWtlIFdha2VybHkgPG1pa2V5QGdvb2dsZS5jb20+LgorICovCisjZGVmaW5lIERMVF9ORkNfTExDUAkJMjQ1CisKKy8qCisgKiAyNDUgaXMgdXNlZCBhcyBMSU5LVFlQRV9QRlNZTkM7IGRvIG5vdCB1c2UgaXQgZm9yIGFueSBvdGhlciBwdXJwb3NlLgorICoKKyAqIERMVF9QRlNZTkMgaGFzIGRpZmZlcmVudCB2YWx1ZXMgb24gZGlmZmVyZW50IHBsYXRmb3JtcywgYW5kIGFsbCBvZgorICogdGhlbSBjb2xsaWRlIHdpdGggc29tZXRoaW5nIHVzZWQgZWxzZXdoZXJlLiAgT24gcGxhdGZvcm1zIHRoYXQKKyAqIGRvbid0IGFscmVhZHkgZGVmaW5lIGl0LCBkZWZpbmUgaXQgYXMgMjQ1LgorICovCisjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKSAmJiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIERMVF9QRlNZTkMJCTI0NgorI2VuZGlmCisKKy8qCisgKiBSYXcgSW5maW5pQmFuZCBwYWNrZXRzLCBzdGFydGluZyB3aXRoIHRoZSBMb2NhbCBSb3V0aW5nIEhlYWRlci4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgT3JlbiBLbGFkbml0c2t5IDxvcmVua0BtZWxsYW5veC5jb20+LgorICovCisjZGVmaW5lIERMVF9JTkZJTklCQU5ECQkyNDcKKworLyoKKyAqIFNDVFAsIHdpdGggbm8gbG93ZXItbGV2ZWwgcHJvdG9jb2xzIChpLmUuLCBubyBJUHY0IG9yIElQdjYpLgorICoKKyAqIFJlcXVlc3RlZCBieSBNaWNoYWVsIFR1ZXhlbiA8TWljaGFlbC5UdWV4ZW5AbHVyY2hpLmZyYW5rZW4uZGU+LgorICovCisjZGVmaW5lIERMVF9TQ1RQCQkyNDgKKworLyoKKyAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIFVTQlBjYXAgaGVhZGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBUb21hc3ogTW9uIDxkZXNvd2luQGdtYWlsLmNvbT4KKyAqLworI2RlZmluZSBETFRfVVNCUENBUAkJMjQ5CisKKy8qCisgKiBTY2h3ZWl0emVyIEVuZ2luZWVyaW5nIExhYm9yYXRvcmllcyAiUlRBQyIgcHJvZHVjdCBzZXJpYWwtbGluZQorICogcGFja2V0cy4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgQ2hyaXMgQm9udGplIDxjaHJpc19ib250amVAc2VsaW5jLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX1JUQUNfU0VSSUFMCQkyNTAKKworLyoKKyAqIEJsdWV0b290aCBMb3cgRW5lcmd5IGFpciBpbnRlcmZhY2UgbGluay1sYXllciBwYWNrZXRzLgorICoKKyAqIFJlcXVlc3RlZCBieSBNaWtlIEtlcnNoYXcgPGRyYWdvcm5Aa2lzbWV0d2lyZWxlc3MubmV0Pi4KKyAqLworI2RlZmluZSBETFRfQkxVRVRPT1RIX0xFX0xMCTI1MQorCisvKgorICogRExUIHR5cGUgZm9yIHVwcGVyLXByb3RvY29sIGxheWVyIFBEVSBzYXZlcyBmcm9tIHdpcmVzaGFyay4KKyAqIAorICogdGhlIGFjdHVhbCBjb250ZW50cyBhcmUgZGV0ZXJtaW5lZCBieSB0d28gVEFHcyBzdG9yZWQgd2l0aCBlYWNoCisgKiBwYWNrZXQ6CisgKiAgIEVYUF9QRFVfVEFHX0xJTktUWVBFICAgICAgICAgIHRoZSBsaW5rIHR5cGUgKExJTktUWVBFXyB2YWx1ZSkgb2YgdGhlCisgKgkJCQkgICBvcmlnaW5hbCBwYWNrZXQuCisgKgorICogICBFWFBfUERVX1RBR19QUk9UT19OQU1FICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd2lyZXNoYXJrIGRpc3NlY3RvcgorICogCQkJCSAgIHRoYXQgY2FuIG1ha2Ugc2Vuc2Ugb2YgdGhlIGRhdGEgc3RvcmVkLgorICovCisjZGVmaW5lIERMVF9XSVJFU0hBUktfVVBQRVJfUERVCTI1MgorCisjZGVmaW5lIERMVF9NQVRDSElOR19NQVgJMjUyCS8qIGhpZ2hlc3QgdmFsdWUgaW4gdGhlICJtYXRjaGluZyIgcmFuZ2UgKi8KKworLyoKKyAqIERMVCBhbmQgc2F2ZWZpbGUgbGluayB0eXBlIHZhbHVlcyBhcmUgc3BsaXQgaW50byBhIGNsYXNzIGFuZAorICogYSBtZW1iZXIgb2YgdGhhdCBjbGFzcy4gIEEgY2xhc3MgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgYSByZWd1bGFyCisgKiBETFRfL0xJTktUWVBFXyB2YWx1ZS4KKyAqLworI2RlZmluZSBETFRfQ0xBU1MoeCkJCSgoeCkgJiAweDAzZmYwMDAwKQorCisvKgorICogTmV0QlNELXNwZWNpZmljIGdlbmVyaWMgInJhdyIgbGluayB0eXBlLiAgVGhlIGNsYXNzIHZhbHVlIGluZGljYXRlcworICogdGhhdCB0aGlzIGlzIHRoZSBnZW5lcmljIHJhdyB0eXBlLCBhbmQgdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRoZQorICogYWRkcmVzcyBmYW1pbHkgd2UncmUgZGVhbGluZyB3aXRoLiAgVGhvc2UgdmFsdWVzIGFyZSBOZXRCU0Qtc3BlY2lmaWM7CisgKiBkbyBub3QgYXNzdW1lIHRoYXQgdGhleSBjb3JyZXNwb25kIHRvIEFGXyB2YWx1ZXMgZm9yIHlvdXIgb3BlcmF0aW5nCisgKiBzeXN0ZW0uCisgKi8KKyNkZWZpbmUJRExUX0NMQVNTX05FVEJTRF9SQVdBRgkweDAyMjQwMDAwCisjZGVmaW5lCURMVF9ORVRCU0RfUkFXQUYoYWYpCShETFRfQ0xBU1NfTkVUQlNEX1JBV0FGIHwgKGFmKSkKKyNkZWZpbmUJRExUX05FVEJTRF9SQVdBRl9BRih4KQkoKHgpICYgMHgwMDAwZmZmZikKKyNkZWZpbmUJRExUX0lTX05FVEJTRF9SQVdBRih4KQkoRExUX0NMQVNTKHgpID09IERMVF9DTEFTU19ORVRCU0RfUkFXQUYpCisKKworLyoKKyAqIFRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MuCisgKi8KKy8qIGluc3RydWN0aW9uIGNsYXNzZXMgKi8KKyNkZWZpbmUgQlBGX0NMQVNTKGNvZGUpICgoY29kZSkgJiAweDA3KQorI2RlZmluZQkJQlBGX0xECQkweDAwCisjZGVmaW5lCQlCUEZfTERYCQkweDAxCisjZGVmaW5lCQlCUEZfU1QJCTB4MDIKKyNkZWZpbmUJCUJQRl9TVFgJCTB4MDMKKyNkZWZpbmUJCUJQRl9BTFUJCTB4MDQKKyNkZWZpbmUJCUJQRl9KTVAJCTB4MDUKKyNkZWZpbmUJCUJQRl9SRVQJCTB4MDYKKyNkZWZpbmUJCUJQRl9NSVNDCTB4MDcKKworLyogbGQvbGR4IGZpZWxkcyAqLworI2RlZmluZSBCUEZfU0laRShjb2RlKQkoKGNvZGUpICYgMHgxOCkKKyNkZWZpbmUJCUJQRl9XCQkweDAwCisjZGVmaW5lCQlCUEZfSAkJMHgwOAorI2RlZmluZQkJQlBGX0IJCTB4MTAKKyNkZWZpbmUgQlBGX01PREUoY29kZSkJKChjb2RlKSAmIDB4ZTApCisjZGVmaW5lCQlCUEZfSU1NIAkweDAwCisjZGVmaW5lCQlCUEZfQUJTCQkweDIwCisjZGVmaW5lCQlCUEZfSU5ECQkweDQwCisjZGVmaW5lCQlCUEZfTUVNCQkweDYwCisjZGVmaW5lCQlCUEZfTEVOCQkweDgwCisjZGVmaW5lCQlCUEZfTVNICQkweGEwCisKKy8qIGFsdS9qbXAgZmllbGRzICovCisjZGVmaW5lIEJQRl9PUChjb2RlKQkoKGNvZGUpICYgMHhmMCkKKyNkZWZpbmUJCUJQRl9BREQJCTB4MDAKKyNkZWZpbmUJCUJQRl9TVUIJCTB4MTAKKyNkZWZpbmUJCUJQRl9NVUwJCTB4MjAKKyNkZWZpbmUJCUJQRl9ESVYJCTB4MzAKKyNkZWZpbmUJCUJQRl9PUgkJMHg0MAorI2RlZmluZQkJQlBGX0FORAkJMHg1MAorI2RlZmluZQkJQlBGX0xTSAkJMHg2MAorI2RlZmluZQkJQlBGX1JTSAkJMHg3MAorI2RlZmluZQkJQlBGX05FRwkJMHg4MAorI2RlZmluZQkJQlBGX0pBCQkweDAwCisjZGVmaW5lCQlCUEZfSkVRCQkweDEwCisjZGVmaW5lCQlCUEZfSkdUCQkweDIwCisjZGVmaW5lCQlCUEZfSkdFCQkweDMwCisjZGVmaW5lCQlCUEZfSlNFVAkweDQwCisjZGVmaW5lIEJQRl9TUkMoY29kZSkJKChjb2RlKSAmIDB4MDgpCisjZGVmaW5lCQlCUEZfSwkJMHgwMAorI2RlZmluZQkJQlBGX1gJCTB4MDgKKworLyogcmV0IC0gQlBGX0sgYW5kIEJQRl9YIGFsc28gYXBwbHkgKi8KKyNkZWZpbmUgQlBGX1JWQUwoY29kZSkJKChjb2RlKSAmIDB4MTgpCisjZGVmaW5lCQlCUEZfQQkJMHgxMAorCisvKiBtaXNjICovCisjZGVmaW5lIEJQRl9NSVNDT1AoY29kZSkgKChjb2RlKSAmIDB4ZjgpCisjZGVmaW5lCQlCUEZfVEFYCQkweDAwCisjZGVmaW5lCQlCUEZfVFhBCQkweDgwCisKKy8qCisgKiBUaGUgaW5zdHJ1Y3Rpb24gZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBicGZfaW5zbiB7CisJdV9zaG9ydAljb2RlOworCXVfY2hhciAJanQ7CisJdV9jaGFyIAlqZjsKKwlicGZfdV9pbnQzMiBrOworfTsKKworLyoKKyAqIE1hY3JvcyBmb3IgaW5zbiBhcnJheSBpbml0aWFsaXplcnMuCisgKi8KKyNkZWZpbmUgQlBGX1NUTVQoY29kZSwgaykgeyAodV9zaG9ydCkoY29kZSksIDAsIDAsIGsgfQorI2RlZmluZSBCUEZfSlVNUChjb2RlLCBrLCBqdCwgamYpIHsgKHVfc2hvcnQpKGNvZGUpLCBqdCwgamYsIGsgfQorCisjaWYgX19TVERDX18gfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiBpbnQgYnBmX3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqLCBpbnQpOworZXh0ZXJuIHVfaW50IGJwZl9maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOworI2Vsc2UKK2V4dGVybiBpbnQgYnBmX3ZhbGlkYXRlKCk7CitleHRlcm4gdV9pbnQgYnBmX2ZpbHRlcigpOworI2VuZGlmCisKKy8qCisgKiBOdW1iZXIgb2Ygc2NyYXRjaCBtZW1vcnkgd29yZHMgKGZvciBCUEZfTER8QlBGX01FTSBhbmQgQlBGX1NUKS4KKyAqLworI2RlZmluZSBCUEZfTUVNV09SRFMgMTYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFkZWZpbmVkKF9ORVRfQlBGX0hfKSAmJiAhZGVmaW5lZChfQlBGX0hfKSAmJiAhZGVmaW5lZChfSF9CUEYpICYmICFkZWZpbmVkKGxpYl9wY2FwX2JwZl9oKSAqLwpkaWZmIC0tZ2l0IGEvcGNhcC9pcG5ldC5oIGIvcGNhcC9pcG5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzA4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwL2lwbmV0LmgKQEAgLTAsMCArMSw0MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIFN0YW5mb3JkL0NNVSBlbmV0IHBhY2tldCBmaWx0ZXIsCisgKiAobmV0L2VuZXQuYykgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiA0LjNCU0QsIGFuZCBjb2RlIGNvbnRyaWJ1dGVkCisgKiB0byBCZXJrZWxleSBieSBTdGV2ZW4gTWNDYW5uZSBhbmQgVmFuIEphY29ic29uIGJvdGggb2YgTGF3cmVuY2UKKyAqIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZQlJUEhfQUZfSU5FVAkyCQkvKiBNYXRjaGVzIFNvbGFyaXMncyBBRl9JTkVUICovCisjZGVmaW5lCUlQSF9BRl9JTkVUNgkyNgkJLyogTWF0Y2hlcyBTb2xhcmlzJ3MgQUZfSU5FVDYgKi8KKworI2RlZmluZQlJUE5FVF9PVVRCT1VORAkJMQorI2RlZmluZQlJUE5FVF9JTkJPVU5ECQkyCmRpZmYgLS1naXQgYS9wY2FwL25hbWVkYi5oIGIvcGNhcC9uYW1lZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE0NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC9uYW1lZGIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL25hbWVkYi5oLHYgMS4xIDIwMDYtMTAtMDQgMTg6MDk6MjIgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworI2lmbmRlZiBsaWJfcGNhcF9uYW1lZGJfaAorI2RlZmluZSBsaWJfcGNhcF9uYW1lZGJfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBBcyByZXR1cm5lZCBieSB0aGUgcGNhcF9uZXh0X2V0aGVyZW50KCkKKyAqIFhYWCB0aGlzIHN0dWZmIGRvZXNuJ3QgYmVsb25nIGluIHRoaXMgaW50ZXJmYWNlLCBidXQgdGhpcworICogbGlicmFyeSBhbHJlYWR5IG11c3QgZG8gbmFtZSB0byBhZGRyZXNzIHRyYW5zbGF0aW9uLCBzbworICogb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgc3VwcG9ydCBmb3IgL2V0Yy9ldGhlcnMsIHdlCisgKiBleHBvcnQgdGhlc2UgaG9va3Mgc2luY2UgdGhleSdsbAorICovCitzdHJ1Y3QgcGNhcF9ldGhlcmVudCB7CisJdV9jaGFyIGFkZHJbNl07CisJY2hhciBuYW1lWzEyMl07Cit9OworI2lmbmRlZiBQQ0FQX0VUSEVSU19GSUxFCisjZGVmaW5lIFBDQVBfRVRIRVJTX0ZJTEUgIi9ldGMvZXRoZXJzIgorI2VuZGlmCitzdHJ1Y3QJcGNhcF9ldGhlcmVudCAqcGNhcF9uZXh0X2V0aGVyZW50KEZJTEUgKik7Cit1X2NoYXIgKnBjYXBfZXRoZXJfaG9zdHRvbihjb25zdCBjaGFyKik7Cit1X2NoYXIgKnBjYXBfZXRoZXJfYXRvbihjb25zdCBjaGFyICopOworCiticGZfdV9pbnQzMiAqKnBjYXBfbmFtZXRvYWRkcihjb25zdCBjaGFyICopOworI2lmZGVmIElORVQ2CitzdHJ1Y3QgYWRkcmluZm8gKnBjYXBfbmFtZXRvYWRkcmluZm8oY29uc3QgY2hhciAqKTsKKyNlbmRpZgorYnBmX3VfaW50MzIgcGNhcF9uYW1ldG9uZXRhZGRyKGNvbnN0IGNoYXIgKik7CisKK2ludAlwY2FwX25hbWV0b3BvcnQoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICopOworaW50CXBjYXBfbmFtZXRvcG9ydHJhbmdlKGNvbnN0IGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQJcGNhcF9uYW1ldG9wcm90byhjb25zdCBjaGFyICopOworaW50CXBjYXBfbmFtZXRvZXByb3RvKGNvbnN0IGNoYXIgKik7CitpbnQJcGNhcF9uYW1ldG9sbGMoY29uc3QgY2hhciAqKTsKKy8qCisgKiBJZiBhIHByb3RvY29sIGlzIHVua25vd24sIFBST1RPX1VOREVGIGlzIHJldHVybmVkLgorICogQWxzbywgcGNhcF9uYW1ldG9wb3J0KCkgcmV0dXJucyB0aGUgcHJvdG9jb2wgYWxvbmcgd2l0aCB0aGUgcG9ydCBudW1iZXIuCisgKiBJZiB0aGVyZSBhcmUgYW1iaWd1b3VzIGVudHJpZWQgaW4gL2V0Yy9zZXJ2aWNlcyAoaS5lLiBkb21haW4KKyAqIGNhbiBiZSBlaXRoZXIgdGNwIG9yIHVkcCkgUFJPVE9fVU5ERUYgaXMgcmV0dXJuZWQuCisgKi8KKyNkZWZpbmUgUFJPVE9fVU5ERUYJCS0xCisKKy8qIFhYWCBtb3ZlIHRoZXNlIHRvIHBjYXAtaW50Lmg/ICovCitpbnQgX19wY2FwX2F0b2RuKGNvbnN0IGNoYXIgKiwgYnBmX3VfaW50MzIgKik7CitpbnQgX19wY2FwX2F0b2luKGNvbnN0IGNoYXIgKiwgYnBmX3VfaW50MzIgKik7Cit1X3Nob3J0CV9fcGNhcF9uYW1ldG9kbmFkZHIoY29uc3QgY2hhciAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wY2FwL25mbG9nLmggYi9wY2FwL25mbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4ZGQwYwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAvbmZsb2cuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBQZXRhciBBbGlsb3ZpYywKKyAqIEZhY3VsdHkgb2YgRWxlY3RyaWNhbCBFbmdpbmVlcmluZyBhbmQgQ29tcHV0aW5nLCBVbml2ZXJzaXR5IG9mIFphZ3JlYgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKgkgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCSBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKgkgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICovCisKKyNpZm5kZWYgX1BDQVBfTkZMT0dfSF9fCisjZGVmaW5lIF9QQ0FQX05GTE9HX0hfXworCisvKgorICogU3RydWN0dXJlIG9mIGFuIE5GTE9HIGhlYWRlciBhbmQgVExWIHBhcnRzLCBhcyBkZXNjcmliZWQgYXQKKyAqIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvbGlua3R5cGVzL0xJTktUWVBFX05GTE9HLmh0bWwKKyAqCisgKiBUaGUgTkZMT0cgaGVhZGVyIGlzIGJpZy1lbmRpYW4uCisgKgorICogVGhlIFRMViBsZW5ndGggYW5kIHR5cGUgYXJlIGluIGhvc3QgYnl0ZSBvcmRlci4gIFRoZSB2YWx1ZSBpcyBlaXRoZXIKKyAqIGJpZy1lbmRpYW4gb3IgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgaW4gc29tZSBleHRlcm5hbGx5LXNwZWNpZmllZCBieXRlCisgKiBvcmRlciAodGV4dCBzdHJpbmcsIGxpbmstbGF5ZXIgYWRkcmVzcywgbGluay1sYXllciBoZWFkZXIsIHBhY2tldAorICogZGF0YSwgZXRjLikuCisgKi8KK3R5cGVkZWYgc3RydWN0IG5mbG9nX2hkciB7CisJdV9pbnQ4X3QJbmZsb2dfZmFtaWx5OwkJLyogYWRkcmVzcyBmYW1pbHkgKi8KKwl1X2ludDhfdAluZmxvZ192ZXJzaW9uOwkJLyogdmVyc2lvbiAqLworCXVfaW50MTZfdAluZmxvZ19yaWQ7CQkvKiByZXNvdXJjZSBJRCAqLworfSBuZmxvZ19oZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbmZsb2dfdGx2IHsKKwl1X2ludDE2X3QJdGx2X2xlbmd0aDsJCS8qIHRsdiBsZW5ndGggKi8KKwl1X2ludDE2X3QJdGx2X3R5cGU7CQkvKiB0bHYgdHlwZSAqLworCS8qIHZhbHVlIGZvbGxvd3MgdGhpcyAqLworfSBuZmxvZ190bHZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbmZsb2dfcGFja2V0X2hkciB7CisJdV9pbnQxNl90CWh3X3Byb3RvY29sOwkvKiBodyBwcm90b2NvbCAqLworCXVfaW50OF90CWhvb2s7CQkvKiBuZXRmaWx0ZXIgaG9vayAqLworCXVfaW50OF90CXBhZDsJCS8qIHBhZGRpbmcgdG8gMzIgYml0cyAqLworfSBuZmxvZ19wYWNrZXRfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IG5mbG9nX2h3YWRkciB7CisJdV9pbnQxNl90CWh3X2FkZHJsZW47CS8qIGFkZHJlc3MgbGVuZ3RoICovCisJdV9pbnQxNl90CXBhZDsJCS8qIHBhZGRpbmcgdG8gMzItYml0IGJvdW5kYXJ5ICovCisJdV9pbnQ4X3QJaHdfYWRkcls4XTsJLyogYWRkcmVzcywgdXAgdG8gOCBieXRlcyAqLworfSBuZmxvZ19od2FkZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbmZsb2dfdGltZXN0YW1wIHsKKwl1X2ludDY0X3QJc2VjOworCXVfaW50NjRfdAl1c2VjOworfSBuZmxvZ190aW1lc3RhbXBfdDsKKworLyoKKyAqIFRMViB0eXBlcy4KKyAqLworI2RlZmluZSBORlVMQV9QQUNLRVRfSERSCQkxCS8qIG5mbG9nX3BhY2tldF9oZHJfdCAqLworI2RlZmluZSBORlVMQV9NQVJLCQkJMgkvKiBwYWNrZXQgbWFyayBmcm9tIHNrYnVmZiAqLworI2RlZmluZSBORlVMQV9USU1FU1RBTVAJCQkzCS8qIG5mbG9nX3RpbWVzdGFtcF90IGZvciBza2J1ZmYncyB0aW1lIHN0YW1wICovCisjZGVmaW5lIE5GVUxBX0lGSU5ERVhfSU5ERVYJCTQJLyogaWZpbmRleCBvZiBkZXZpY2Ugb24gd2hpY2ggcGFja2V0IHJlY2VpdmVkIChwb3NzaWJseSBicmlkZ2UgZ3JvdXApICovCisjZGVmaW5lIE5GVUxBX0lGSU5ERVhfT1VUREVWCQk1CS8qIGlmaW5kZXggb2YgZGV2aWNlIG9uIHdoaWNoIHBhY2tldCB0cmFuc21pdHRlZCAocG9zc2libHkgYnJpZGdlIGdyb3VwKSAqLworI2RlZmluZSBORlVMQV9JRklOREVYX1BIWVNJTkRFVgkJNgkvKiBpZmluZGV4IG9mIHBoeXNpY2FsIGRldmljZSBvbiB3aGljaCBwYWNrZXQgcmVjZWl2ZWQgKG5vdCBicmlkZ2UgZ3JvdXApICovCisjZGVmaW5lIE5GVUxBX0lGSU5ERVhfUEhZU09VVERFVgk3CS8qIGlmaW5kZXggb2YgcGh5c2ljYWwgZGV2aWNlIG9uIHdoaWNoIHBhY2tldCB0cmFuc21pdHRlZCAobm90IGJyaWRnZSBncm91cCkgKi8KKyNkZWZpbmUgTkZVTEFfSFdBRERSCQkJOAkvKiBuZmxvZ19od2FkZHJfdCBmb3IgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBORlVMQV9QQVlMT0FECQkJOQkvKiBwYWNrZXQgcGF5bG9hZCAqLworI2RlZmluZSBORlVMQV9QUkVGSVgJCQkxMAkvKiB0ZXh0IHN0cmluZyAtIG51bGwtdGVybWluYXRlZCwgY291bnQgaW5jbHVkZXMgTlVMICovCisjZGVmaW5lIE5GVUxBX1VJRAkJCTExCS8qIFVJRCBvd25pbmcgc29ja2V0IG9uIHdoaWNoIHBhY2tldCB3YXMgc2VudC9yZWNlaXZlZCAqLworI2RlZmluZSBORlVMQV9TRVEJCQkxMgkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgcGFja2V0cyBvbiB0aGlzIE5GTE9HIHNvY2tldCAqLworI2RlZmluZSBORlVMQV9TRVFfR0xPQkFMCQkxMwkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgcGFrZXRzIG9uIGFsbCBORkxPRyBzb2NrZXRzICovCisjZGVmaW5lIE5GVUxBX0dJRAkJCTE0CS8qIEdJRCBvd25pbmcgc29ja2V0IG9uIHdoaWNoIHBhY2tldCB3YXMgc2VudC9yZWNlaXZlZCAqLworI2RlZmluZSBORlVMQV9IV1RZUEUJCQkxNQkvKiBBUlBIUkRfIHR5cGUgb2Ygc2tidWZmJ3MgZGV2aWNlICovCisjZGVmaW5lIE5GVUxBX0hXSEVBREVSCQkJMTYJLyogc2tidWZmJ3MgTUFDLWxheWVyIGhlYWRlciAqLworI2RlZmluZSBORlVMQV9IV0xFTgkJCTE3CS8qIGxlbmd0aCBvZiBza2J1ZmYncyBNQUMtbGF5ZXIgaGVhZGVyICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC9wY2FwLmggYi9wY2FwL3BjYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmRkMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC9wY2FwLmgKQEAgLTAsMCArMSw0ODQgQEAKKy8qIC0qLSBNb2RlOiBjOyB0YWItd2lkdGg6IDg7IGluZGVudC10YWJzLW1vZGU6IDE7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCisgKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAvcGNhcC5oLHYgMS4xNSAyMDA4LTEwLTA2IDE1OjI3OjMyIGdpYW5sdWNhIEV4cCAkIChMQkwpCisgKi8KKworI2lmbmRlZiBsaWJfcGNhcF9wY2FwX2gKKyNkZWZpbmUgbGliX3BjYXBfcGNhcF9oCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbGlmIGRlZmluZWQoTVNET1MpCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gIC8qIHVfaW50LCB1X2NoYXIgZXRjLiAqLworI2Vsc2UgLyogVU4qWCAqLworICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmIC8qIFdJTjMyL01TRE9TL1VOKlggKi8KKworI2lmbmRlZiBQQ0FQX0RPTlRfSU5DTFVERV9QQ0FQX0JQRl9ICisjaW5jbHVkZSA8cGNhcC9icGYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcGNhcCBmaWxlIGZvcm1hdC4KKyAqCisgKiBOT1RFOiB0aGlzIGlzICpOT1QqIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicGNhcCBsaWJyYXJ5LgorICogVG8gZmV0Y2ggdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSB2ZXJzaW9uIG9mIGxpYnBjYXAKKyAqIHlvdSdyZSB1c2luZywgdXNlIHBjYXBfbGliX3ZlcnNpb24oKS4KKyAqLworI2RlZmluZSBQQ0FQX1ZFUlNJT05fTUFKT1IgMgorI2RlZmluZSBQQ0FQX1ZFUlNJT05fTUlOT1IgNAorCisjZGVmaW5lIFBDQVBfRVJSQlVGX1NJWkUgMjU2CisKKy8qCisgKiBDb21wYXRpYmlsaXR5IGZvciBzeXN0ZW1zIHRoYXQgaGF2ZSBhIGJwZi5oIHRoYXQKKyAqIHByZWRhdGVzIHRoZSBicGYgdHlwZWRlZnMgZm9yIDY0LWJpdCBzdXBwb3J0LgorICovCisjaWYgQlBGX1JFTEVBU0UgLSAwIDwgMTk5NDA2Cit0eXBlZGVmCWludCBicGZfaW50MzI7Cit0eXBlZGVmCXVfaW50IGJwZl91X2ludDMyOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHBjYXAgcGNhcF90OwordHlwZWRlZiBzdHJ1Y3QgcGNhcF9kdW1wZXIgcGNhcF9kdW1wZXJfdDsKK3R5cGVkZWYgc3RydWN0IHBjYXBfaWYgcGNhcF9pZl90OwordHlwZWRlZiBzdHJ1Y3QgcGNhcF9hZGRyIHBjYXBfYWRkcl90OworCisvKgorICogVGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZmlsZSBjb250YWlucyBzYXZlZCB2YWx1ZXMgZm9yIHNvbWUKKyAqIG9mIHRoZSBmbGFncyB1c2VkIGluIHRoZSBwcmludG91dCBwaGFzZXMgb2YgdGNwZHVtcC4KKyAqIE1hbnkgZmllbGRzIGhlcmUgYXJlIDMyIGJpdCBpbnRzIHNvIGNvbXBpbGVycyB3b24ndCBpbnNlcnQgdW53YW50ZWQKKyAqIHBhZGRpbmc7IHRoZXNlIGZpbGVzIG5lZWQgdG8gYmUgaW50ZXJjaGFuZ2VhYmxlIGFjcm9zcyBhcmNoaXRlY3R1cmVzLgorICoKKyAqIERvIG5vdCBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gYW55IHdheSAodGhpcyBpbmNsdWRlcworICogY2hhbmdlcyB0aGF0IG9ubHkgYWZmZWN0IHRoZSBsZW5ndGggb2YgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlKS4KKyAqCisgKiBBbHNvLCBkbyBub3QgY2hhbmdlIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBhbnkgb2YgdGhlIG1lbWJlcnMgb2YgdGhpcworICogc3RydWN0dXJlLCBpbiBhbnkgd2F5ICh0aGlzIGluY2x1ZGVzIHVzaW5nIHZhbHVlcyBvdGhlciB0aGFuCisgKiBMSU5LVFlQRV8gdmFsdWVzLCBhcyBkZWZpbmVkIGluICJzYXZlZmlsZS5jIiwgaW4gdGhlICJsaW5rdHlwZSIKKyAqIGZpZWxkKS4KKyAqCisgKiBJbnN0ZWFkOgorICoKKyAqCWludHJvZHVjZSBhIG5ldyBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgZm9ybWF0LCBpZiB0aGUgbGF5b3V0CisgKglvZiB0aGUgc3RydWN0dXJlIGNoYW5nZWQ7CisgKgorICoJc2VuZCBtYWlsIHRvICJ0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmciLCByZXF1ZXN0aW5nCisgKglhIG5ldyBtYWdpYyBudW1iZXIgZm9yIHlvdXIgbmV3IGNhcHR1cmUgZmlsZSBmb3JtYXQsIGFuZCwgd2hlbgorICoJeW91IGdldCB0aGUgbmV3IG1hZ2ljIG51bWJlciwgcHV0IGl0IGluICJzYXZlZmlsZS5jIjsKKyAqCisgKgl1c2UgdGhhdCBtYWdpYyBudW1iZXIgZm9yIHNhdmUgZmlsZXMgd2l0aCB0aGUgY2hhbmdlZCBmaWxlCisgKgloZWFkZXI7CisgKgorICoJbWFrZSB0aGUgY29kZSBpbiAic2F2ZWZpbGUuYyIgY2FwYWJsZSBvZiByZWFkaW5nIGZpbGVzIHdpdGgKKyAqCXRoZSBvbGQgZmlsZSBoZWFkZXIgYXMgd2VsbCBhcyBmaWxlcyB3aXRoIHRoZSBuZXcgZmlsZSBoZWFkZXIKKyAqCSh1c2luZyB0aGUgbWFnaWMgbnVtYmVyIHRvIGRldGVybWluZSB0aGUgaGVhZGVyIGZvcm1hdCkuCisgKgorICogVGhlbiBzdXBwbHkgdGhlIGNoYW5nZXMgYnkgZm9ya2luZyB0aGUgYnJhbmNoIGF0CisgKgorICoJaHR0cHM6Ly9naXRodWIuY29tL3RoZS10Y3BkdW1wLWdyb3VwL2xpYnBjYXAvaXNzdWVzCisgKgorICogYW5kIGlzc3VpbmcgYSBwdWxsIHJlcXVlc3QsIHNvIHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIGxpYnBjYXAgYW5kCisgKiBwcm9ncmFtcyB0aGF0IHVzZSBpdCAoc3VjaCBhcyB0Y3BkdW1wKSB3aWxsIGJlIGFibGUgdG8gcmVhZCB5b3VyIG5ldworICogY2FwdHVyZSBmaWxlIGZvcm1hdC4KKyAqLworc3RydWN0IHBjYXBfZmlsZV9oZWFkZXIgeworCWJwZl91X2ludDMyIG1hZ2ljOworCXVfc2hvcnQgdmVyc2lvbl9tYWpvcjsKKwl1X3Nob3J0IHZlcnNpb25fbWlub3I7CisJYnBmX2ludDMyIHRoaXN6b25lOwkvKiBnbXQgdG8gbG9jYWwgY29ycmVjdGlvbiAqLworCWJwZl91X2ludDMyIHNpZ2ZpZ3M7CS8qIGFjY3VyYWN5IG9mIHRpbWVzdGFtcHMgKi8KKwlicGZfdV9pbnQzMiBzbmFwbGVuOwkvKiBtYXggbGVuZ3RoIHNhdmVkIHBvcnRpb24gb2YgZWFjaCBwa3QgKi8KKwlicGZfdV9pbnQzMiBsaW5rdHlwZTsJLyogZGF0YSBsaW5rIHR5cGUgKExJTktUWVBFXyopICovCit9OworCisvKgorICogTWFjcm9zIGZvciB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgcGNhcF9kYXRhbGlua19leHQoKS4KKyAqIAorICogSWYgTFRfRkNTX0xFTkdUSF9QUkVTRU5UKHgpIGlzIHRydWUsIHRoZSBMVF9GQ1NfTEVOR1RIKHgpIG1hY3JvCisgKiBnaXZlcyB0aGUgRkNTIGxlbmd0aCBvZiBwYWNrZXRzIGluIHRoZSBjYXB0dXJlLgorICovCisjZGVmaW5lIExUX0ZDU19MRU5HVEhfUFJFU0VOVCh4KQkoKHgpICYgMHgwNDAwMDAwMCkKKyNkZWZpbmUgTFRfRkNTX0xFTkdUSCh4KQkJKCgoeCkgJiAweEYwMDAwMDAwKSA+PiAyOCkKKyNkZWZpbmUgTFRfRkNTX0RBVEFMSU5LX0VYVCh4KQkJKCgoKHgpICYgMHhGKSA8PCAyOCkgfCAweDA0MDAwMDAwKQorCit0eXBlZGVmIGVudW0geworICAgICAgIFBDQVBfRF9JTk9VVCA9IDAsCisgICAgICAgUENBUF9EX0lOLAorICAgICAgIFBDQVBfRF9PVVQKK30gcGNhcF9kaXJlY3Rpb25fdDsKKworLyoKKyAqIEdlbmVyaWMgcGVyLXBhY2tldCBpbmZvcm1hdGlvbiwgYXMgc3VwcGxpZWQgYnkgbGlicGNhcC4KKyAqCisgKiBUaGUgdGltZSBzdGFtcCBjYW4gYW5kIHNob3VsZCBiZSBhICJzdHJ1Y3QgdGltZXZhbCIsIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoZXRoZXIgeW91ciBzeXN0ZW0gc3VwcG9ydHMgMzItYml0IHR2X3NlYyBpbiAic3RydWN0IHRpbWV2YWwiLAorICogNjQtYml0IHR2X3NlYyBpbiAic3RydWN0IHRpbWV2YWwiLCBvciBib3RoIGlmIGl0IHN1cHBvcnRzIGJvdGggMzItYml0CisgKiBhbmQgNjQtYml0IGFwcGxpY2F0aW9ucy4gIFRoZSBvbi1kaXNrIGZvcm1hdCBvZiBzYXZlZmlsZXMgdXNlcyAzMi1iaXQKKyAqIHR2X3NlYyAoYW5kIHR2X3VzZWMpOyB0aGlzIHN0cnVjdHVyZSBpcyBpcnJlbGV2YW50IHRvIHRoYXQuICAzMi1iaXQKKyAqIGFuZCA2NC1iaXQgdmVyc2lvbnMgb2YgbGlicGNhcCwgZXZlbiBpZiB0aGV5J3JlIG9uIHRoZSBzYW1lIHBsYXRmb3JtLAorICogc2hvdWxkIHN1cHBseSB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBvZiAic3RydWN0IHRpbWV2YWwiLCBldmVuIGlmCisgKiB0aGF0J3Mgbm90IHdoYXQgdGhlIHVuZGVybHlpbmcgcGFja2V0IGNhcHR1cmUgbWVjaGFuaXNtIHN1cHBsaWVzLgorICovCitzdHJ1Y3QgcGNhcF9wa3RoZHIgeworCXN0cnVjdCB0aW1ldmFsIHRzOwkvKiB0aW1lIHN0YW1wICovCisJYnBmX3VfaW50MzIgY2FwbGVuOwkvKiBsZW5ndGggb2YgcG9ydGlvbiBwcmVzZW50ICovCisJYnBmX3VfaW50MzIgbGVuOwkvKiBsZW5ndGggdGhpcyBwYWNrZXQgKG9mZiB3aXJlKSAqLworfTsKKworLyoKKyAqIEFzIHJldHVybmVkIGJ5IHRoZSBwY2FwX3N0YXRzKCkKKyAqLworc3RydWN0IHBjYXBfc3RhdCB7CisJdV9pbnQgcHNfcmVjdjsJCS8qIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkICovCisJdV9pbnQgcHNfZHJvcDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgKi8KKwl1X2ludCBwc19pZmRyb3A7CS8qIGRyb3BzIGJ5IGludGVyZmFjZSAtLSBvbmx5IHN1cHBvcnRlZCBvbiBzb21lIHBsYXRmb3JtcyAqLworI2lmZGVmIFdJTjMyCisJdV9pbnQgYnNfY2FwdDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgcmVhY2ggdGhlIGFwcGxpY2F0aW9uICovCisjZW5kaWYgLyogV0lOMzIgKi8KK307CisKKyNpZmRlZiBNU0RPUworLyoKKyAqIEFzIHJldHVybmVkIGJ5IHRoZSBwY2FwX3N0YXRzX2V4KCkKKyAqLworc3RydWN0IHBjYXBfc3RhdF9leCB7CisgICAgICAgdV9sb25nICByeF9wYWNrZXRzOyAgICAgICAgLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAgICAgICAqLworICAgICAgIHVfbG9uZyAgdHhfcGFja2V0czsgICAgICAgIC8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQgICAgKi8KKyAgICAgICB1X2xvbmcgIHJ4X2J5dGVzOyAgICAgICAgICAvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgICAgICAgICovCisgICAgICAgdV9sb25nICB0eF9ieXRlczsgICAgICAgICAgLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgICAgICAqLworICAgICAgIHVfbG9uZyAgcnhfZXJyb3JzOyAgICAgICAgIC8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICAgKi8KKyAgICAgICB1X2xvbmcgIHR4X2Vycm9yczsgICAgICAgICAvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMgICAgICovCisgICAgICAgdV9sb25nICByeF9kcm9wcGVkOyAgICAgICAgLyogbm8gc3BhY2UgaW4gUnggYnVmZmVycyAgICAgICAqLworICAgICAgIHVfbG9uZyAgdHhfZHJvcHBlZDsgICAgICAgIC8qIG5vIHNwYWNlIGF2YWlsYWJsZSBmb3IgVHggICAgKi8KKyAgICAgICB1X2xvbmcgIG11bHRpY2FzdDsgICAgICAgICAvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAgICovCisgICAgICAgdV9sb25nICBjb2xsaXNpb25zOworCisgICAgICAgLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworICAgICAgIHVfbG9uZyAgcnhfbGVuZ3RoX2Vycm9yczsKKyAgICAgICB1X2xvbmcgIHJ4X292ZXJfZXJyb3JzOyAgICAvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgICovCisgICAgICAgdV9sb25nICByeF9jcmNfZXJyb3JzOyAgICAgLyogcmVjdidkIHBrdCB3aXRoIGNyYyBlcnJvciAgICAqLworICAgICAgIHVfbG9uZyAgcnhfZnJhbWVfZXJyb3JzOyAgIC8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICAgICB1X2xvbmcgIHJ4X2ZpZm9fZXJyb3JzOyAgICAvKiByZWN2J3IgZmlmbyBvdmVycnVuICAgICAgICAgICovCisgICAgICAgdV9sb25nICByeF9taXNzZWRfZXJyb3JzOyAgLyogcmVjdidyIG1pc3NlZCBwYWNrZXQgICAgICAgICAqLworCisgICAgICAgLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisgICAgICAgdV9sb25nICB0eF9hYm9ydGVkX2Vycm9yczsKKyAgICAgICB1X2xvbmcgIHR4X2NhcnJpZXJfZXJyb3JzOworICAgICAgIHVfbG9uZyAgdHhfZmlmb19lcnJvcnM7CisgICAgICAgdV9sb25nICB0eF9oZWFydGJlYXRfZXJyb3JzOworICAgICAgIHVfbG9uZyAgdHhfd2luZG93X2Vycm9yczsKKyAgICAgfTsKKyNlbmRpZgorCisvKgorICogSXRlbSBpbiBhIGxpc3Qgb2YgaW50ZXJmYWNlcy4KKyAqLworc3RydWN0IHBjYXBfaWYgeworCXN0cnVjdCBwY2FwX2lmICpuZXh0OworCWNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIGhhbmQgdG8gInBjYXBfb3Blbl9saXZlKCkiICovCisJY2hhciAqZGVzY3JpcHRpb247CS8qIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgaW50ZXJmYWNlLCBvciBOVUxMICovCisJc3RydWN0IHBjYXBfYWRkciAqYWRkcmVzc2VzOworCWJwZl91X2ludDMyIGZsYWdzOwkvKiBQQ0FQX0lGXyBpbnRlcmZhY2UgZmxhZ3MgKi8KK307CisKKyNkZWZpbmUgUENBUF9JRl9MT09QQkFDSwkweDAwMDAwMDAxCS8qIGludGVyZmFjZSBpcyBsb29wYmFjayAqLworCisvKgorICogUmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZXJmYWNlIGFkZHJlc3MuCisgKi8KK3N0cnVjdCBwY2FwX2FkZHIgeworCXN0cnVjdCBwY2FwX2FkZHIgKm5leHQ7CisJc3RydWN0IHNvY2thZGRyICphZGRyOwkJLyogYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkciAqbmV0bWFzazsJLyogbmV0bWFzayBmb3IgdGhhdCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyICpicm9hZGFkZHI7CS8qIGJyb2FkY2FzdCBhZGRyZXNzIGZvciB0aGF0IGFkZHJlc3MgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKmRzdGFkZHI7CS8qIFAyUCBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB0aGF0IGFkZHJlc3MgKi8KK307CisKK3R5cGVkZWYgdm9pZCAoKnBjYXBfaGFuZGxlcikodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLAorCQkJICAgICBjb25zdCB1X2NoYXIgKik7CisKKy8qCisgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHBjYXAgQVBJLgorICogVGhlc2Ugd2lsbCBhbGwgYmUgbmVnYXRpdmUsIHNvIHlvdSBjYW4gY2hlY2sgZm9yIHRoZSBzdWNjZXNzIG9yCisgKiBmYWlsdXJlIG9mIGEgY2FsbCB0aGF0IHJldHVybnMgdGhlc2UgY29kZXMgYnkgY2hlY2tpbmcgZm9yIGEKKyAqIG5lZ2F0aXZlIHZhbHVlLgorICovCisjZGVmaW5lIFBDQVBfRVJST1IJCQktMQkvKiBnZW5lcmljIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9CUkVBSwkJLTIJLyogbG9vcCB0ZXJtaW5hdGVkIGJ5IHBjYXBfYnJlYWtsb29wICovCisjZGVmaW5lIFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRAktMwkvKiB0aGUgY2FwdHVyZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9BQ1RJVkFURUQJCS00CS8qIHRoZSBvcGVyYXRpb24gY2FuJ3QgYmUgcGVyZm9ybWVkIG9uIGFscmVhZHkgYWN0aXZhdGVkIGNhcHR1cmVzICovCisjZGVmaW5lIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UJLTUJLyogbm8gc3VjaCBkZXZpY2UgZXhpc3RzICovCisjZGVmaW5lIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQCQktNgkvKiB0aGlzIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcmZtb24gKG1vbml0b3IpIG1vZGUgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9OT1RfUkZNT04JCS03CS8qIG9wZXJhdGlvbiBzdXBwb3J0ZWQgb25seSBpbiBtb25pdG9yIG1vZGUgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9QRVJNX0RFTklFRAkJLTgJLyogbm8gcGVybWlzc2lvbiB0byBvcGVuIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAJCS05CS8qIGludGVyZmFjZSBpc24ndCB1cCAqLworI2RlZmluZSBQQ0FQX0VSUk9SX0NBTlRTRVRfVFNUQU1QX1RZUEUJLTEwCS8qIHRoaXMgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSB0aW1lIHN0YW1wIHR5cGUgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9QUk9NSVNDX1BFUk1fREVOSUVECS0xMQkvKiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMgbW9kZSAqLworI2RlZmluZSBQQ0FQX0VSUk9SX1RTVEFNUF9QUkVDSVNJT05fTk9UU1VQIC0xMiAgLyogdGhlIHJlcXVlc3RlZCB0aW1lIHN0YW1wIHByZWNpc2lvbiBpcyBub3Qgc3VwcG9ydGVkICovCisKKy8qCisgKiBXYXJuaW5nIGNvZGVzIGZvciB0aGUgcGNhcCBBUEkuCisgKiBUaGVzZSB3aWxsIGFsbCBiZSBwb3NpdGl2ZSBhbmQgbm9uLXplcm8sIHNvIHRoZXkgd29uJ3QgbG9vayBsaWtlCisgKiBlcnJvcnMuCisgKi8KKyNkZWZpbmUgUENBUF9XQVJOSU5HCQkJMQkvKiBnZW5lcmljIHdhcm5pbmcgY29kZSAqLworI2RlZmluZSBQQ0FQX1dBUk5JTkdfUFJPTUlTQ19OT1RTVVAJMgkvKiB0aGlzIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcHJvbWlzY3VvdXMgbW9kZSAqLworI2RlZmluZSBQQ0FQX1dBUk5JTkdfVFNUQU1QX1RZUEVfTk9UU1VQCTMJLyogdGhlIHJlcXVlc3RlZCB0aW1lIHN0YW1wIHR5cGUgaXMgbm90IHN1cHBvcnRlZCAqLworCisvKgorICogVmFsdWUgdG8gcGFzcyB0byBwY2FwX2NvbXBpbGUoKSBhcyB0aGUgbmV0bWFzayBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0CisgKiB0aGUgbmV0bWFzayBpcy4KKyAqLworI2RlZmluZSBQQ0FQX05FVE1BU0tfVU5LTk9XTgkweGZmZmZmZmZmCisKK2NoYXIJKnBjYXBfbG9va3VwZGV2KGNoYXIgKik7CitpbnQJcGNhcF9sb29rdXBuZXQoY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiAqLCBicGZfdV9pbnQzMiAqLCBjaGFyICopOworCitwY2FwX3QJKnBjYXBfY3JlYXRlKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK2ludAlwY2FwX3NldF9zbmFwbGVuKHBjYXBfdCAqLCBpbnQpOworaW50CXBjYXBfc2V0X3Byb21pc2MocGNhcF90ICosIGludCk7CitpbnQJcGNhcF9jYW5fc2V0X3JmbW9uKHBjYXBfdCAqKTsKK2ludAlwY2FwX3NldF9yZm1vbihwY2FwX3QgKiwgaW50KTsKK2ludAlwY2FwX3NldF90aW1lb3V0KHBjYXBfdCAqLCBpbnQpOworaW50CXBjYXBfc2V0X3RzdGFtcF90eXBlKHBjYXBfdCAqLCBpbnQpOworaW50CXBjYXBfc2V0X2ltbWVkaWF0ZV9tb2RlKHBjYXBfdCAqLCBpbnQpOworaW50CXBjYXBfc2V0X2J1ZmZlcl9zaXplKHBjYXBfdCAqLCBpbnQpOworaW50CXBjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24ocGNhcF90ICosIGludCk7CitpbnQJcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbihwY2FwX3QgKik7CitpbnQJcGNhcF9hY3RpdmF0ZShwY2FwX3QgKik7CisKK2ludAlwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKHBjYXBfdCAqLCBpbnQgKiopOwordm9pZAlwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKGludCAqKTsKK2ludAlwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICpwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKGludCk7Citjb25zdCBjaGFyICpwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19kZXNjcmlwdGlvbihpbnQpOworCisvKgorICogVGltZSBzdGFtcCB0eXBlcy4KKyAqIE5vdCBhbGwgc3lzdGVtcyBhbmQgaW50ZXJmYWNlcyB3aWxsIG5lY2Vzc2FyaWx5IHN1cHBvcnQgYWxsIG9mIHRoZXNlLgorICoKKyAqIEEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgUENBUF9UU1RBTVBfSE9TVCBpcyBvZmZlcmluZyB0aW1lIHN0YW1wcworICogcHJvdmlkZWQgYnkgdGhlIGhvc3QgbWFjaGluZSwgcmF0aGVyIHRoYW4gYnkgdGhlIGNhcHR1cmUgZGV2aWNlLAorICogYnV0IG5vdCBjb21taXR0aW5nIHRvIGFueSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHRpbWUgc3RhbXA7CisgKiBpdCB3aWxsIG5vdCBvZmZlciBhbnkgb2YgdGhlIFBDQVBfVFNUQU1QX0hPU1RfIHN1YnR5cGVzLgorICoKKyAqIFBDQVBfVFNUQU1QX0hPU1RfTE9XUFJFQyBpcyBhIHRpbWUgc3RhbXAsIHByb3ZpZGVkIGJ5IHRoZSBob3N0IG1hY2hpbmUsCisgKiB0aGF0J3MgbG93LXByZWNpc2lvbiBidXQgcmVsYXRpdmVseSBjaGVhcCB0byBmZXRjaDsgaXQncyBub3JtYWxseSBkb25lCisgKiB1c2luZyB0aGUgc3lzdGVtIGNsb2NrLCBzbyBpdCdzIG5vcm1hbGx5IHN5bmNocm9uaXplZCB3aXRoIHRpbWVzIHlvdSdkCisgKiBmZXRjaCBmcm9tIHN5c3RlbSBjYWxscy4KKyAqCisgKiBQQ0FQX1RTVEFNUF9IT1NUX0hJUFJFQyBpcyBhIHRpbWUgc3RhbXAsIHByb3ZpZGVkIGJ5IHRoZSBob3N0IG1hY2hpbmUsCisgKiB0aGF0J3MgaGlnaC1wcmVjaXNpb247IGl0IG1pZ2h0IGJlIG1vcmUgZXhwZW5zaXZlIHRvIGZldGNoLiAgSXQgbWlnaHQKKyAqIG9yIG1pZ2h0IG5vdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrLCBhbmQgbWlnaHQgaGF2ZQorICogcHJvYmxlbXMgd2l0aCB0aW1lIHN0YW1wcyBmb3IgcGFja2V0cyByZWNlaXZlZCBvbiBkaWZmZXJlbnQgQ1BVcywKKyAqIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisgKgorICogUENBUF9UU1RBTVBfQURBUFRFUiBpcyBhIGhpZ2gtcHJlY2lzaW9uIHRpbWUgc3RhbXAgc3VwcGxpZWQgYnkgdGhlCisgKiBjYXB0dXJlIGRldmljZTsgaXQncyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrLgorICoKKyAqIFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQgaXMgYSBoaWdoLXByZWNpc2lvbiB0aW1lIHN0YW1wIHN1cHBsaWVkIGJ5CisgKiB0aGUgY2FwdHVyZSBkZXZpY2U7IGl0J3Mgbm90IHN5bmNocm9uaXplZCB3aXRoIHRoZSBzeXN0ZW0gY2xvY2suCisgKgorICogTm90ZSB0aGF0IHRpbWUgc3RhbXBzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBzeXN0ZW0gY2xvY2sgY2FuIGdvCisgKiBiYWNrd2FyZHMsIGFzIHRoZSBzeXN0ZW0gY2xvY2sgY2FuIGdvIGJhY2t3YXJkcy4gIElmIGEgY2xvY2sgaXMKKyAqIG5vdCBpbiBzeW5jIHdpdGggdGhlIHN5c3RlbSBjbG9jaywgdGhhdCBjb3VsZCBiZSBiZWNhdXNlIHRoZQorICogc3lzdGVtIGNsb2NrIGlzbid0IGtlZXBpbmcgYWNjdXJhdGUgdGltZSwgYmVjYXVzZSB0aGUgb3RoZXIKKyAqIGNsb2NrIGlzbid0IGtlZXBpbmcgYWNjdXJhdGUgdGltZSwgb3IgYm90aC4KKyAqCisgKiBOb3RlIHRoYXQgaG9zdC1wcm92aWRlZCB0aW1lIHN0YW1wcyBnZW5lcmFsbHkgY29ycmVzcG9uZCB0byB0aGUKKyAqIHRpbWUgd2hlbiB0aGUgdGltZS1zdGFtcGluZyBjb2RlIHNlZXMgdGhlIHBhY2tldDsgdGhpcyBjb3VsZAorICogYmUgc29tZSB1bmtub3duIGFtb3VudCBvZiB0aW1lIGFmdGVyIHRoZSBmaXJzdCBvciBsYXN0IGJpdCBvZgorICogdGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSB0aGUgbmV0d29yayBhZGFwdGVyLCBkdWUgdG8gYmF0Y2hpbmcKKyAqIG9mIGludGVycnVwdHMgZm9yIHBhY2tldCBhcnJpdmFsLCBxdWV1ZWluZyBkZWxheXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgUENBUF9UU1RBTVBfSE9TVAkJMAkvKiBob3N0LXByb3ZpZGVkLCB1bmtub3duIGNoYXJhY3RlcmlzdGljcyAqLworI2RlZmluZSBQQ0FQX1RTVEFNUF9IT1NUX0xPV1BSRUMJMQkvKiBob3N0LXByb3ZpZGVkLCBsb3cgcHJlY2lzaW9uICovCisjZGVmaW5lIFBDQVBfVFNUQU1QX0hPU1RfSElQUkVDCQkyCS8qIGhvc3QtcHJvdmlkZWQsIGhpZ2ggcHJlY2lzaW9uICovCisjZGVmaW5lIFBDQVBfVFNUQU1QX0FEQVBURVIJCTMJLyogZGV2aWNlLXByb3ZpZGVkLCBzeW5jZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQJNAkvKiBkZXZpY2UtcHJvdmlkZWQsIG5vdCBzeW5jZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrICovCisKKy8qCisgKiBUaW1lIHN0YW1wIHJlc29sdXRpb24gdHlwZXMuCisgKiBOb3QgYWxsIHN5c3RlbXMgYW5kIGludGVyZmFjZXMgd2lsbCBuZWNlc3NhcmlseSBzdXBwb3J0IGFsbCBvZiB0aGVzZQorICogcmVzb2x1dGlvbnMgd2hlbiBkb2luZyBsaXZlIGNhcHR1cmVzOyBhbGwgb2YgdGhlbSBjYW4gYmUgcmVxdWVzdGVkCisgKiB3aGVuIHJlYWRpbmcgYSBzYXZlZmlsZS4KKyAqLworI2RlZmluZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8JMAkvKiB1c2UgdGltZXN0YW1wcyB3aXRoIG1pY3Jvc2Vjb25kIHByZWNpc2lvbiwgZGVmYXVsdCAqLworI2RlZmluZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTwkxCS8qIHVzZSB0aW1lc3RhbXBzIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24gKi8KKworcGNhcF90CSpwY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGNoYXIgKik7CitwY2FwX3QJKnBjYXBfb3Blbl9kZWFkKGludCwgaW50KTsKK3BjYXBfdAkqcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGludCwgaW50LCB1X2ludCk7CitwY2FwX3QJKnBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihjb25zdCBjaGFyICosIHVfaW50LCBjaGFyICopOworcGNhcF90CSpwY2FwX29wZW5fb2ZmbGluZShjb25zdCBjaGFyICosIGNoYXIgKik7CisjaWYgZGVmaW5lZChXSU4zMikKK3BjYXBfdCAgKnBjYXBfaG9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oaW50cHRyX3QsIHVfaW50LCBjaGFyICopOworcGNhcF90ICAqcGNhcF9ob3Blbl9vZmZsaW5lKGludHB0cl90LCBjaGFyICopOworI2lmICFkZWZpbmVkKExJQlBDQVBfRVhQT1JUUykKKyNkZWZpbmUgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihmLHAsYikgXAorCXBjYXBfaG9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oX2dldF9vc2ZoYW5kbGUoX2ZpbGVubyhmKSksIHAsIGIpCisjZGVmaW5lIHBjYXBfZm9wZW5fb2ZmbGluZShmLGIpIFwKKwlwY2FwX2hvcGVuX29mZmxpbmUoX2dldF9vc2ZoYW5kbGUoX2ZpbGVubyhmKSksIGIpCisjZWxzZSAvKkxJQlBDQVBfRVhQT1JUUyovCitzdGF0aWMgcGNhcF90ICpwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKEZJTEUgKiwgdV9pbnQsIGNoYXIgKik7CitzdGF0aWMgcGNhcF90ICpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqLCBjaGFyICopOworI2VuZGlmCisjZWxzZSAvKldJTjMyKi8KK3BjYXBfdAkqcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihGSUxFICosIHVfaW50LCBjaGFyICopOworcGNhcF90CSpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqLCBjaGFyICopOworI2VuZGlmIC8qV0lOMzIqLworCit2b2lkCXBjYXBfY2xvc2UocGNhcF90ICopOworaW50CXBjYXBfbG9vcChwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKK2ludAlwY2FwX2Rpc3BhdGNoKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOworY29uc3QgdV9jaGFyKgorCXBjYXBfbmV4dChwY2FwX3QgKiwgc3RydWN0IHBjYXBfcGt0aGRyICopOworaW50IAlwY2FwX25leHRfZXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3BrdGhkciAqKiwgY29uc3QgdV9jaGFyICoqKTsKK3ZvaWQJcGNhcF9icmVha2xvb3AocGNhcF90ICopOworaW50CXBjYXBfc3RhdHMocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CitpbnQJcGNhcF9zZXRmaWx0ZXIocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK2ludCAJcGNhcF9zZXRkaXJlY3Rpb24ocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworaW50CXBjYXBfZ2V0bm9uYmxvY2socGNhcF90ICosIGNoYXIgKik7CitpbnQJcGNhcF9zZXRub25ibG9jayhwY2FwX3QgKiwgaW50LCBjaGFyICopOworaW50CXBjYXBfaW5qZWN0KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitpbnQJcGNhcF9zZW5kcGFja2V0KHBjYXBfdCAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK2NvbnN0IGNoYXIgKnBjYXBfc3RhdHVzdG9zdHIoaW50KTsKK2NvbnN0IGNoYXIgKnBjYXBfc3RyZXJyb3IoaW50KTsKK2NoYXIJKnBjYXBfZ2V0ZXJyKHBjYXBfdCAqKTsKK3ZvaWQJcGNhcF9wZXJyb3IocGNhcF90ICosIGNoYXIgKik7CitpbnQJcGNhcF9jb21waWxlKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwgY29uc3QgY2hhciAqLCBpbnQsCisJICAgIGJwZl91X2ludDMyKTsKK2ludAlwY2FwX2NvbXBpbGVfbm9wY2FwKGludCwgaW50LCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKKwkgICAgY29uc3QgY2hhciAqLCBpbnQsIGJwZl91X2ludDMyKTsKK3ZvaWQJcGNhcF9mcmVlY29kZShzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CitpbnQJcGNhcF9vZmZsaW5lX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKKwkgICAgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2ludAlwY2FwX2RhdGFsaW5rKHBjYXBfdCAqKTsKK2ludAlwY2FwX2RhdGFsaW5rX2V4dChwY2FwX3QgKik7CitpbnQJcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKiwgaW50ICoqKTsKK2ludAlwY2FwX3NldF9kYXRhbGluayhwY2FwX3QgKiwgaW50KTsKK3ZvaWQJcGNhcF9mcmVlX2RhdGFsaW5rcyhpbnQgKik7CitpbnQJcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICopOworY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShpbnQpOworY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oaW50KTsKK2ludAlwY2FwX3NuYXBzaG90KHBjYXBfdCAqKTsKK2ludAlwY2FwX2lzX3N3YXBwZWQocGNhcF90ICopOworaW50CXBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKik7CitpbnQJcGNhcF9taW5vcl92ZXJzaW9uKHBjYXBfdCAqKTsKKworLyogWFhYICovCitGSUxFCSpwY2FwX2ZpbGUocGNhcF90ICopOworaW50CXBjYXBfZmlsZW5vKHBjYXBfdCAqKTsKKworcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW4ocGNhcF90ICosIGNvbnN0IGNoYXIgKik7CitwY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICosIEZJTEUgKmZwKTsKK0ZJTEUJKnBjYXBfZHVtcF9maWxlKHBjYXBfZHVtcGVyX3QgKik7Citsb25nCXBjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICopOworaW50CXBjYXBfZHVtcF9mbHVzaChwY2FwX2R1bXBlcl90ICopOwordm9pZAlwY2FwX2R1bXBfY2xvc2UocGNhcF9kdW1wZXJfdCAqKTsKK3ZvaWQJcGNhcF9kdW1wKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworCitpbnQJcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiosIGNoYXIgKik7Cit2b2lkCXBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICopOworCitjb25zdCBjaGFyICpwY2FwX2xpYl92ZXJzaW9uKHZvaWQpOworCisvKgorICogT24gYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBOZXRCU0QsIHdlIGRvbid0IHdhbnQgdG8gZGVjbGFyZQorICogYnBmX2ZpbHRlcigpIGhlcmUsIGFzIGl0J3MgYWxzbyBiZSBkZWNsYXJlZCBpbiA8bmV0L2JwZi5oPiwgd2l0aCBhCisgKiBkaWZmZXJlbnQgc2lnbmF0dXJlLCBidXQsIG9uIG90aGVyIEJTRC1mbGF2b3JlZCBVTipYZXMsIGl0J3Mgbm90CisgKiBkZWNsYXJlZCBpbiA8bmV0L2JwZi5oPiwgc28gd2UgKmRvKiB3YW50IHRvIGRlY2xhcmUgaXQgaGVyZSwgc28gaXQncworICogZGVjbGFyZWQgd2hlbiB3ZSBidWlsZCBwY2FwLWJwZi5jLgorICovCisjaWZuZGVmIF9fTmV0QlNEX18KK3VfaW50CWJwZl9maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOworI2VuZGlmCitpbnQJYnBmX3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqZiwgaW50IGxlbik7CitjaGFyCSpicGZfaW1hZ2UoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGludCk7Cit2b2lkCWJwZl9kdW1wKGNvbnN0IHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBpbnQpOworCisjaWYgZGVmaW5lZChXSU4zMikKKworLyoKKyAqIFdpbjMyIGRlZmluaXRpb25zCisgKi8KKworaW50IHBjYXBfc2V0YnVmZihwY2FwX3QgKnAsIGludCBkaW0pOworaW50IHBjYXBfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKTsKK2ludCBwY2FwX3NldG1pbnRvY29weShwY2FwX3QgKnAsIGludCBzaXplKTsKK0FkYXB0ZXIgKnBjYXBfZ2V0X2FkYXB0ZXIocGNhcF90ICpwKTsKKworI2lmZGVmIFdQQ0FQCisvKiBJbmNsdWRlIGZpbGUgd2l0aCB0aGUgd3BjYXAtc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLworI2luY2x1ZGUgPFdpbjMyLUV4dGVuc2lvbnMuaD4KKyNlbmRpZiAvKiBXUENBUCAqLworCisjZGVmaW5lIE1PREVfQ0FQVCAwCisjZGVmaW5lIE1PREVfU1RBVCAxCisjZGVmaW5lIE1PREVfTU9OIDIKKworI2VsaWYgZGVmaW5lZChNU0RPUykKKworLyoKKyAqIE1TLURPUyBkZWZpbml0aW9ucworICovCisKK2ludCAgcGNhcF9zdGF0c19leCAocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXRfZXggKik7Cit2b2lkIHBjYXBfc2V0X3dhaXQgKHBjYXBfdCAqcCwgdm9pZCAoKnlpZWxkKSh2b2lkKSwgaW50IHdhaXQpOwordV9sb25nIHBjYXBfbWFjX3BhY2tldHMgKHZvaWQpOworCisjZWxzZSAvKiBVTipYICovCisKKy8qCisgKiBVTipYIGRlZmluaXRpb25zCisgKi8KKworaW50CXBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGNhcF90ICopOworCisjZW5kaWYgLyogV0lOMzIvTVNET1MvVU4qWCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbGliX3BjYXBfcGNhcF9oICovCmRpZmYgLS1naXQgYS9zbGwuaCBiL3BjYXAvc2xsLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gc2xsLmgKcmVuYW1lIHRvIHBjYXAvc2xsLmgKaW5kZXggODVhM2E5ZC4uN2FkODExZCAxMDA2NDQKLS0tIGEvc2xsLmgKKysrIGIvcGNhcC9zbGwuaApAQCAtMzUsNyArMzUsNyBAQAogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9zbGwuaCx2IDEuNyAyMDAyLzA2LzExIDE3OjA0OjQ4IGl0b2p1biBFeHAgJCAoTEJMKQorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL3NsbC5oLHYgMS4zIDIwMDgtMDUtMzAgMDE6MzU6MzMgZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAogLyoKQEAgLTY0LDggKzY0LDggQEAKICAqIERPIE5PVCBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZSwgb3IgY2hhbmdlIGFueSBvZiB0aGUKICAqIExJTlVYX1NMTF8gdmFsdWVzIGJlbG93LiAgSWYgeW91IG11c3QgY2hhbmdlIHRoZSBsaW5rLWxheWVyIGhlYWRlcgogICogZm9yIGEgImNvb2tlZCIgTGludXggY2FwdHVyZSwgaW50cm9kdWNlIGEgbmV3IERMVF8gdHlwZSAoYXNrCi0gKiAidGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnIiBmb3Igb25lLCBzbyB0aGF0IHlvdSBkb24ndCBnaXZlIGl0IGEKLSAqIHZhbHVlIHRoYXQgY29sbGlkZXMgd2l0aCBhIHZhbHVlIGFscmVhZHkgYmVpbmcgdXNlZCksIGFuZCB1c2UgdGhlCisgKiAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiBmb3Igb25lLCBzbyB0aGF0IHlvdSBkb24ndCBnaXZlIGl0CisgKiBhIHZhbHVlIHRoYXQgY29sbGlkZXMgd2l0aCBhIHZhbHVlIGFscmVhZHkgYmVpbmcgdXNlZCksIGFuZCB1c2UgdGhlCiAgKiBuZXcgaGVhZGVyIGluIGNhcHR1cmVzIG9mIHRoYXQgdHlwZSwgc28gdGhhdCBwcm9ncmFtcyB0aGF0IGNhbgogICogaGFuZGxlIERMVF9MSU5VWF9TTEwgY2FwdHVyZXMgd2lsbCBjb250aW51ZSB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkKICAqIHdpdGhvdXQgYW55IGNoYW5nZSwgYW5kIHNvIHRoYXQgY2FwdHVyZSBmaWxlcyB3aXRoIGRpZmZlcmVudCBoZWFkZXJzCkBAIC03Myw2ICs3Myw5IEBACiAgKiBwYWNrZXRzIGluIHRoZW0uCiAgKi8KIAorI2lmbmRlZiBsaWJfcGNhcF9zbGxfaAorI2RlZmluZSBsaWJfcGNhcF9zbGxfaAorCiAvKgogICogQSBETFRfTElOVVhfU0xMIGZha2UgbGluay1sYXllciBoZWFkZXIuCiAgKi8KQEAgLTEyMiwzICsxMjUsNSBAQAogICovCiAjZGVmaW5lIExJTlVYX1NMTF9QXzgwMl8zCTB4MDAwMQkvKiBOb3ZlbGwgODAyLjMgZnJhbWVzIHdpdGhvdXQgODAyLjIgTExDIGhlYWRlciAqLwogI2RlZmluZSBMSU5VWF9TTExfUF84MDJfMgkweDAwMDQJLyogODAyLjIgZnJhbWVzIChub3QgRC9JL1ggRXRoZXJuZXQpICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC91c2IuaCBiL3BjYXAvdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzNTEyMgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAvdXNiLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGFvbG8gQWJlbmkgKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogQmFzaWMgVVNCIGRhdGEgc3RydWN0CisgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL3VzYi5oLHYgMS45IDIwMDgtMTItMjMgMjA6MTM6MjkgZ3V5IEV4cCAkCisgKi8KKyAKKyNpZm5kZWYgX1BDQVBfVVNCX1NUUlVDVFNfSF9fCisjZGVmaW5lIF9QQ0FQX1VTQl9TVFJVQ1RTX0hfXworCisvKiAKKyAqIHBvc3NpYmxlIHRyYW5zZmVyIG1vZGUKKyAqLworI2RlZmluZSBVUkJfVFJBTlNGRVJfSU4gICAweDgwCisjZGVmaW5lIFVSQl9JU09DSFJPTk9VUyAgIDB4MAorI2RlZmluZSBVUkJfSU5URVJSVVBUICAgICAweDEKKyNkZWZpbmUgVVJCX0NPTlRST0wgICAgICAgMHgyCisjZGVmaW5lIFVSQl9CVUxLICAgICAgICAgIDB4MworCisvKgorICogcG9zc2libGUgZXZlbnQgdHlwZQorICovCisjZGVmaW5lIFVSQl9TVUJNSVQgICAgICAgICdTJworI2RlZmluZSBVUkJfQ09NUExFVEUgICAgICAnQycKKyNkZWZpbmUgVVJCX0VSUk9SICAgICAgICAgJ0UnCisKKy8qCisgKiBVU0Igc2V0dXAgaGVhZGVyIGFzIGRlZmluZWQgaW4gVVNCIHNwZWNpZmljYXRpb24uCisgKiBBcHBlYXJzIGF0IHRoZSBmcm9udCBvZiBlYWNoIENvbnRyb2wgUy10eXBlIHBhY2tldCBpbiBETFRfVVNCIGNhcHR1cmVzLgorICovCit0eXBlZGVmIHN0cnVjdCBfdXNiX3NldHVwIHsKKwl1X2ludDhfdCBibVJlcXVlc3RUeXBlOworCXVfaW50OF90IGJSZXF1ZXN0OworCXVfaW50MTZfdCB3VmFsdWU7CisJdV9pbnQxNl90IHdJbmRleDsKKwl1X2ludDE2X3Qgd0xlbmd0aDsKK30gcGNhcF91c2Jfc2V0dXA7CisKKy8qCisgKiBJbmZvcm1hdGlvbiBmcm9tIHRoZSBVUkIgZm9yIElzb2Nocm9ub3VzIHRyYW5zZmVycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2lzb19yZWMgeworCWludDMyX3QJZXJyb3JfY291bnQ7CisJaW50MzJfdAludW1kZXNjOworfSBpc29fcmVjOworCisvKgorICogSGVhZGVyIHByZXBlbmRlZCBieSBsaW51eCBrZXJuZWwgdG8gZWFjaCBldmVudC4KKyAqIEFwcGVhcnMgYXQgdGhlIGZyb250IG9mIGVhY2ggcGFja2V0IGluIERMVF9VU0JfTElOVVggY2FwdHVyZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF91c2JfaGVhZGVyIHsKKwl1X2ludDY0X3QgaWQ7CisJdV9pbnQ4X3QgZXZlbnRfdHlwZTsKKwl1X2ludDhfdCB0cmFuc2Zlcl90eXBlOworCXVfaW50OF90IGVuZHBvaW50X251bWJlcjsKKwl1X2ludDhfdCBkZXZpY2VfYWRkcmVzczsKKwl1X2ludDE2X3QgYnVzX2lkOworCWNoYXIgc2V0dXBfZmxhZzsvKmlmICE9MCB0aGUgdXJiIHNldHVwIGhlYWRlciBpcyBub3QgcHJlc2VudCovCisJY2hhciBkYXRhX2ZsYWc7IC8qaWYgIT0wIG5vIHVyYiBkYXRhIGlzIHByZXNlbnQqLworCWludDY0X3QgdHNfc2VjOworCWludDMyX3QgdHNfdXNlYzsKKwlpbnQzMl90IHN0YXR1czsKKwl1X2ludDMyX3QgdXJiX2xlbjsKKwl1X2ludDMyX3QgZGF0YV9sZW47IC8qIGFtb3VudCBvZiB1cmIgZGF0YSByZWFsbHkgcHJlc2VudCBpbiB0aGlzIGV2ZW50Ki8KKwlwY2FwX3VzYl9zZXR1cCBzZXR1cDsKK30gcGNhcF91c2JfaGVhZGVyOworCisvKgorICogSGVhZGVyIHByZXBlbmRlZCBieSBsaW51eCBrZXJuZWwgdG8gZWFjaCBldmVudCBmb3IgdGhlIDIuNi4zMQorICogYW5kIGxhdGVyIGtlcm5lbHM7IGZvciB0aGUgMi42LjIxIHRocm91Z2ggMi42LjMwIGtlcm5lbHMsIHRoZQorICogImlzb19yZWMiIGluZm9ybWF0aW9uLCBhbmQgdGhlIGZpZWxkcyBzdGFydGluZyB3aXRoICJpbnRlcnZhbCIKKyAqIGFyZSB6ZXJvZWQtb3V0IHBhZGRpbmcgZmllbGRzLgorICoKKyAqIEFwcGVhcnMgYXQgdGhlIGZyb250IG9mIGVhY2ggcGFja2V0IGluIERMVF9VU0JfTElOVVhfTU1BUFBFRCBjYXB0dXJlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3VzYl9oZWFkZXJfbW1hcHBlZCB7CisJdV9pbnQ2NF90IGlkOworCXVfaW50OF90IGV2ZW50X3R5cGU7CisJdV9pbnQ4X3QgdHJhbnNmZXJfdHlwZTsKKwl1X2ludDhfdCBlbmRwb2ludF9udW1iZXI7CisJdV9pbnQ4X3QgZGV2aWNlX2FkZHJlc3M7CisJdV9pbnQxNl90IGJ1c19pZDsKKwljaGFyIHNldHVwX2ZsYWc7LyppZiAhPTAgdGhlIHVyYiBzZXR1cCBoZWFkZXIgaXMgbm90IHByZXNlbnQqLworCWNoYXIgZGF0YV9mbGFnOyAvKmlmICE9MCBubyB1cmIgZGF0YSBpcyBwcmVzZW50Ki8KKwlpbnQ2NF90IHRzX3NlYzsKKwlpbnQzMl90IHRzX3VzZWM7CisJaW50MzJfdCBzdGF0dXM7CisJdV9pbnQzMl90IHVyYl9sZW47CisJdV9pbnQzMl90IGRhdGFfbGVuOyAvKiBhbW91bnQgb2YgdXJiIGRhdGEgcmVhbGx5IHByZXNlbnQgaW4gdGhpcyBldmVudCovCisJdW5pb24geworCQlwY2FwX3VzYl9zZXR1cCBzZXR1cDsKKwkJaXNvX3JlYyBpc287CisJfSBzOworCWludDMyX3QJaW50ZXJ2YWw7CS8qIGZvciBJbnRlcnJ1cHQgYW5kIElzb2Nocm9ub3VzIGV2ZW50cyAqLworCWludDMyX3Qgc3RhcnRfZnJhbWU7CS8qIGZvciBJc29jaHJvbm91cyBldmVudHMgKi8KKwl1X2ludDMyX3QgeGZlcl9mbGFnczsJLyogY29weSBvZiBVUkIncyB0cmFuc2ZlciBmbGFncyAqLworCXVfaW50MzJfdCBuZGVzYzsJLyogbnVtYmVyIG9mIGlzb2Nocm9ub3VzIGRlc2NyaXB0b3JzICovCit9IHBjYXBfdXNiX2hlYWRlcl9tbWFwcGVkOworCisvKgorICogSXNvY2hyb25vdXMgZGVzY3JpcHRvcnM7IGZvciBpc29jaHJvbm91cyB0cmFuc2ZlcnMgdGhlcmUgbWlnaHQgYmUKKyAqIG9uZSBvciBtb3JlIG9mIHRoZXNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCBkYXRhLiAgVGhlCisgKiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaXMgZ2l2ZW4gYnkgdGhlICJuZGVzYyIgZmllbGQgaW4gdGhlIGhlYWRlcjsKKyAqIGFzIGluZGljYXRlZCwgaW4gb2xkZXIga2VybmVscyB0aGF0IGRvbid0IHB1dCB0aGUgZGVzY3JpcHRvcnMgYXQKKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCwgdGhhdCBmaWVsZCBpcyB6ZXJvZWQgb3V0LCBzbyB0aGF0IGZpZWxkCisgKiBjYW4gYmUgdHJ1c3RlZCBldmVuIGluIGNhcHR1cmVzIGZyb20gb2xkZXIga2VybmVscy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3VzYl9pc29kZXNjIHsKKwlpbnQzMl90CQlzdGF0dXM7CisJdV9pbnQzMl90CW9mZnNldDsKKwl1X2ludDMyX3QJbGVuOworCXVfaW50OF90CXBhZFs0XTsKK30gdXNiX2lzb2Rlc2M7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC92bGFuLmggYi9wY2FwL3ZsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFhOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC92bGFuLmgKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC92bGFuLmgsdiAxLjEgMjAwOC0wOC0wNiAwNzo0NTowMCBndXkgRXhwICQKKyAqLworCisjaWZuZGVmIGxpYl9wY2FwX3ZsYW5faAorI2RlZmluZSBsaWJfcGNhcF92bGFuX2gKKworc3RydWN0IHZsYW5fdGFnIHsKKwl1X2ludDE2X3QJdmxhbl90cGlkOwkJLyogRVRIX1BfODAyMVEgKi8KKwl1X2ludDE2X3QJdmxhbl90Y2k7CQkvKiBWTEFOIFRDSSAqLworfTsKKworI2RlZmluZSBWTEFOX1RBR19MRU4JNAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BjYXAxLmggYi9wY2FwMS5oCmluZGV4IDA4ZDBjNWEuLjJjYjUzMmYgMTAwNjQ0Ci0tLSBhL3BjYXAxLmgKKysrIGIvcGNhcDEuaApAQCAtMzEsNyArMzEsNyBAQAogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCiAgKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwMS5oLHYgMS4yIDIwMDQvMDMvMzAgMTQ6NDI6NTAgbWNyIEV4cCAkIChMQkwpCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAxLmgsdiAxLjUgMjAwOC0wNS0zMCAwMTo0MzoyMSBndXkgRXhwICQgKExCTCkKICAqLwogCiAjaWZuZGVmIGxpYl9wY2FwX2gKQEAgLTQ1LDcgKzQ1LDcgQEAKICNlbmRpZiAvKiBXSU4zMiAqLwogCiAjaWZuZGVmIFBDQVBfRE9OVF9JTkNMVURFX1BDQVBfQlBGX0gKLSNpbmNsdWRlIDxwY2FwLWJwZi5oPgorI2luY2x1ZGUgPHBjYXAvYnBmLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC05Miw4ICs5Miw4IEBACiAgKglpbnRyb2R1Y2UgYSBuZXcgc3RydWN0dXJlIGZvciB0aGUgbmV3IGZvcm1hdCwgaWYgdGhlIGxheW91dAogICoJb2YgdGhlIHN0cnVjdHVyZSBjaGFuZ2VkOwogICoKLSAqCXNlbmQgbWFpbCB0byAidGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnIiwgcmVxdWVzdGluZyBhIG5ldwotICoJbWFnaWMgbnVtYmVyIGZvciB5b3VyIG5ldyBjYXB0dXJlIGZpbGUgZm9ybWF0LCBhbmQsIHdoZW4KKyAqCXNlbmQgbWFpbCB0byAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiwgcmVxdWVzdGluZworICoJYSBuZXcgbWFnaWMgbnVtYmVyIGZvciB5b3VyIG5ldyBjYXB0dXJlIGZpbGUgZm9ybWF0LCBhbmQsIHdoZW4KICAqCXlvdSBnZXQgdGhlIG5ldyBtYWdpYyBudW1iZXIsIHB1dCBpdCBpbiAic2F2ZWZpbGUuYyI7CiAgKgogICoJdXNlIHRoYXQgbWFnaWMgbnVtYmVyIGZvciBzYXZlIGZpbGVzIHdpdGggdGhlIGNoYW5nZWQgZmlsZQpAQCAtMTAzLDkgKzEwMywxMyBAQAogICoJdGhlIG9sZCBmaWxlIGhlYWRlciBhcyB3ZWxsIGFzIGZpbGVzIHdpdGggdGhlIG5ldyBmaWxlIGhlYWRlcgogICoJKHVzaW5nIHRoZSBtYWdpYyBudW1iZXIgdG8gZGV0ZXJtaW5lIHRoZSBoZWFkZXIgZm9ybWF0KS4KICAqCi0gKiBUaGVuIHN1cHBseSB0aGUgY2hhbmdlcyB0byAicGF0Y2hlc0B0Y3BkdW1wLm9yZyIsIHNvIHRoYXQgZnV0dXJlCi0gKiB2ZXJzaW9ucyBvZiBsaWJwY2FwIGFuZCBwcm9ncmFtcyB0aGF0IHVzZSBpdCAoc3VjaCBhcyB0Y3BkdW1wKSB3aWxsCi0gKiBiZSBhYmxlIHRvIHJlYWQgeW91ciBuZXcgY2FwdHVyZSBmaWxlIGZvcm1hdC4KKyAqIFRoZW4gc3VwcGx5IHRoZSBjaGFuZ2VzIGJ5IGZvcmtpbmcgdGhlIGJyYW5jaCBhdAorICoKKyAqCWh0dHBzOi8vZ2l0aHViLmNvbS90aGUtdGNwZHVtcC1ncm91cC9saWJwY2FwL2lzc3VlcworICoKKyAqIGFuZCBpc3N1aW5nIGEgcHVsbCByZXF1ZXN0LCBzbyB0aGF0IGZ1dHVyZSB2ZXJzaW9ucyBvZiBsaWJwY2FwIGFuZAorICogcHJvZ3JhbXMgdGhhdCB1c2UgaXQgKHN1Y2ggYXMgdGNwZHVtcCkgd2lsbCBiZSBhYmxlIHRvIHJlYWQgeW91ciBuZXcKKyAqIGNhcHR1cmUgZmlsZSBmb3JtYXQuCiAgKi8KIAogZW51bSBwY2FwMV9pbmZvX3R5cGVzIHsKZGlmZiAtLWdpdCBhL3BjYXBfYWN0aXZhdGUuM3BjYXAgYi9wY2FwX2FjdGl2YXRlLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjNkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2FjdGl2YXRlLjNwY2FwCkBAIC0wLDAgKzEsOTcgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfYWN0aXZhdGUuM3BjYXAsdiAxLjUgMjAwOC0wNy0wMSAwODowMjozMyBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0FDVElWQVRFIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9hY3RpdmF0ZSBcLSBhY3RpdmF0ZSBhIGNhcHR1cmUgaGFuZGxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfYWN0aXZhdGUocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfYWN0aXZhdGUoKQoraXMgdXNlZCB0byBhY3RpdmF0ZSBhIHBhY2tldCBjYXB0dXJlIGhhbmRsZSB0byBsb29rCithdCBwYWNrZXRzIG9uIHRoZSBuZXR3b3JrLCB3aXRoIHRoZSBvcHRpb25zIHRoYXQgd2VyZSBzZXQgb24gdGhlIGhhbmRsZQorYmVpbmcgaW4gZWZmZWN0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9hY3RpdmF0ZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyB3aXRob3V0IHdhcm5pbmdzLAorLkIgUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQCitvbiBzdWNjZXNzIG9uIGEgZGV2aWNlIHRoYXQgZG9lc24ndCBzdXBwb3J0IHByb21pc2N1b3VzIG1vZGUgaWYKK3Byb21pc2N1b3VzIG1vZGUgd2FzIHJlcXVlc3RlZCwKKy5CIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVAKK29uIHN1Y2Nlc3MgaWYgdGhlIHRpbWUgc3RhbXAgdHlwZSBzcGVjaWZpZWQgaW4gYSBwcmV2aW91cworLkIgcGNhcF9zZXRfdHN0YW1wX3R5cGUoKQorY2FsbCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGNhcHR1cmUgc291cmNlICh0aGUgdGltZSBzdGFtcCB0eXBlIGlzCitsZWZ0IGFzIHRoZSBkZWZhdWx0KSwKKy5CIFBDQVBfV0FSTklORworb24gc3VjY2VzcyB3aXRoIGFueSBvdGhlciB3YXJuaW5nLAorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIHRoZSBoYW5kbGUgaGFzIGFscmVhZHkgYmVlbiBhY3RpdmF0ZWQsCisuQiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFCitpZiB0aGUgY2FwdHVyZSBzb3VyY2Ugc3BlY2lmaWVkIHdoZW4gdGhlIGhhbmRsZSB3YXMgY3JlYXRlZCBkb2Vzbid0CitleGlzdCwKKy5CIFBDQVBfRVJST1JfUEVSTV9ERU5JRUQKK2lmIHRoZSBwcm9jZXNzIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gdGhlIGNhcHR1cmUgc291cmNlLAorLkIgUENBUF9FUlJPUl9QUk9NSVNDX1BFUk1fREVOSUVECitpZiB0aGUgcHJvY2VzcyBoYXMgcGVybWlzc2lvbiB0byBvcGVuIHRoZSBjYXB0dXJlIHNvdXJjZSBidXQgZG9lc24ndAoraGF2ZSBwZXJtaXNzaW9uIHRvIHB1dCBpdCBpbnRvIHByb21pc2N1b3VzIG1vZGUsCisuQiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUAoraWYgbW9uaXRvciBtb2RlIHdhcyBzcGVjaWZpZWQgYnV0IHRoZSBjYXB0dXJlIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQKK21vbml0b3IgbW9kZSwKKy5CIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQCitpZiB0aGUgY2FwdHVyZSBzb3VyY2UgaXMgbm90IHVwLCBhbmQKKy5CIFBDQVBfRVJST1IKK2lmIGFub3RoZXIgZXJyb3Igb2NjdXJyZWQuCitJZgorLkIgUENBUF9XQVJOSU5HCitvcgorLkIgUENBUF9FUlJPUgoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSB3YXJuaW5nIG9yCitlcnJvci4KK0lmCisuQlIgUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQICwKKy5CUiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFICwKK29yCisuQiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVECitpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgYW4gbWVzc2FnZSBnaXZpbmcgYWRkaXRpb25hbCBkZXRhaWxzCithYm91dCB0aGUgcHJvYmxlbSB0aGF0IG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRoZSBwcm9ibGVtIGlmIGl0J3MKK3VuZXhwZWN0ZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2JyZWFrbG9vcC4zcGNhcCBiL3BjYXBfYnJlYWtsb29wLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzdhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2JyZWFrbG9vcC4zcGNhcApAQCAtMCwwICsxLDEwMCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9icmVha2xvb3AuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0JSRUFLTE9PUCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfYnJlYWtsb29wIFwtIGZvcmNlIGEgcGNhcF9kaXNwYXRjaCgpIG9yIHBjYXBfbG9vcCgpIGNhbGwgdG8gcmV0dXJuCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgordm9pZCBwY2FwX2JyZWFrbG9vcChwY2FwX3QgKik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2JyZWFrbG9vcCgpCitzZXRzIGEgZmxhZyB0aGF0IHdpbGwgZm9yY2UKKy5CIHBjYXBfZGlzcGF0Y2goKQorb3IKKy5CIHBjYXBfbG9vcCgpCit0byByZXR1cm4gcmF0aGVyIHRoYW4gbG9vcGluZzsgdGhleSB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMKK3RoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZCBzbyBmYXIsIG9yIFwtMiBpZiBubyBwYWNrZXRzIGhhdmUgYmVlbgorcHJvY2Vzc2VkIHNvIGZhci4KKy5QUAorVGhpcyByb3V0aW5lIGlzIHNhZmUgdG8gdXNlIGluc2lkZSBhIHNpZ25hbCBoYW5kbGVyIG9uIFVOSVggb3IgYSBjb25zb2xlCitjb250cm9sIGhhbmRsZXIgb24gV2luZG93cywgYXMgaXQgbWVyZWx5IHNldHMgYSBmbGFnIHRoYXQgaXMgY2hlY2tlZAord2l0aGluIHRoZSBsb29wLgorLlBQCitUaGUgZmxhZyBpcyBjaGVja2VkIGluIGxvb3BzIHJlYWRpbmcgcGFja2V0cyBmcm9tIHRoZSBPUyAtIGEgc2lnbmFsIGJ5CitpdHNlbGYgd2lsbCBub3QgbmVjZXNzYXJpbHkgdGVybWluYXRlIHRob3NlIGxvb3BzIC0gYXMgd2VsbCBhcyBpbiBsb29wcworcHJvY2Vzc2luZyBhIHNldCBvZiBwYWNrZXRzIHJldHVybmVkIGJ5IHRoZSBPUy4KKy5mdCBCCitOb3RlIHRoYXQgaWYgeW91IGFyZSBjYXRjaGluZyBzaWduYWxzIG9uIFVOSVggc3lzdGVtcyB0aGF0IHN1cHBvcnQKK3Jlc3RhcnRpbmcgc3lzdGVtIGNhbGxzIGFmdGVyIGEgc2lnbmFsLCBhbmQgY2FsbGluZyBwY2FwX2JyZWFrbG9vcCgpCitpbiB0aGUgc2lnbmFsIGhhbmRsZXIsIHlvdSBtdXN0IHNwZWNpZnksIHdoZW4gY2F0Y2hpbmcgdGhvc2Ugc2lnbmFscywKK3RoYXQgc3lzdGVtIGNhbGxzIHNob3VsZCBOT1QgYmUgcmVzdGFydGVkIGJ5IHRoYXQgc2lnbmFsLiAgT3RoZXJ3aXNlLAoraWYgdGhlIHNpZ25hbCBpbnRlcnJ1cHRlZCBhIGNhbGwgcmVhZGluZyBwYWNrZXRzIGluIGEgbGl2ZSBjYXB0dXJlLAord2hlbiB5b3VyIHNpZ25hbCBoYW5kbGVyIHJldHVybnMgYWZ0ZXIgY2FsbGluZyBwY2FwX2JyZWFrbG9vcCgpLCB0aGUKK2NhbGwgd2lsbCBiZSByZXN0YXJ0ZWQsIGFuZCB0aGUgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUgdW50aWwgbW9yZQorcGFja2V0cyBhcnJpdmUgYW5kIHRoZSBjYWxsIGNvbXBsZXRlcy4KKy5mdCBSCisuUFAKKy5mdCBCCitOb3RlIGFsc28gdGhhdCwgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgaWYgb25lIHRocmVhZCBpcworYmxvY2tlZCBpbiBwY2FwX2Rpc3BhdGNoKCksIHBjYXBfbG9vcCgpLCBwY2FwX25leHQoKSwgb3IgcGNhcF9uZXh0X2V4KCksCithIGNhbGwgdG8gcGNhcF9icmVha2xvb3AoKSBpbiBhIGRpZmZlcmVudCB0aHJlYWQgd2lsbCBub3QgdW5ibG9jayB0aGF0Cit0aHJlYWQ7IHlvdSB3aWxsIG5lZWQgdG8gdXNlIHdoYXRldmVyIG1lY2hhbmlzbSB0aGUgT1MgcHJvdmlkZXMgZm9yCiticmVha2luZyBhIHRocmVhZCBvdXQgb2YgYmxvY2tpbmcgY2FsbHMgaW4gb3JkZXIgdG8gdW5ibG9jayB0aGUgdGhyZWFkLAorc3VjaCBhcyB0aHJlYWQgY2FuY2VsbGF0aW9uIGluIHN5c3RlbXMgdGhhdCBzdXBwb3J0IFBPU0lYIHRocmVhZHMuCisuZnQgUgorLlBQCitOb3RlIHRoYXQKKy5CIHBjYXBfbmV4dCgpCithbmQKKy5CIHBjYXBfbmV4dF9leCgpCit3aWxsLCBvbiBzb21lIHBsYXRmb3JtcywgbG9vcCByZWFkaW5nIHBhY2tldHMgZnJvbSB0aGUgT1M7IHRoYXQgbG9vcAord2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdGVybWluYXRlZCBieSBhIHNpZ25hbCwgc28KKy5CIHBjYXBfYnJlYWtsb29wKCkKK3Nob3VsZCBiZSB1c2VkIHRvIHRlcm1pbmF0ZSBwYWNrZXQgcHJvY2Vzc2luZyBldmVuIGlmCisuQiBwY2FwX25leHQoKQorb3IKKy5CIHBjYXBfbmV4dF9leCgpCitpcyBiZWluZyB1c2VkLgorLlBQCisuQiBwY2FwX2JyZWFrbG9vcCgpCitkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBubyBmdXJ0aGVyIHBhY2tldHMgd2lsbCBiZSBwcm9jZXNzZWQgYnkKKy5CIHBjYXBfZGlzcGF0Y2goKQorb3IKKy5CIHBjYXBfbG9vcCgpCithZnRlciBpdCBpcyBjYWxsZWQ7IGF0IG1vc3Qgb25lIG1vcmUgcGFja2V0IG1pZ2h0IGJlIHByb2Nlc3NlZC4KKy5QUAorSWYgXC0yIGlzIHJldHVybmVkIGZyb20KKy5CIHBjYXBfZGlzcGF0Y2goKQorb3IKKy5CUiBwY2FwX2xvb3AoKSAsCit0aGUgZmxhZyBpcyBjbGVhcmVkLCBzbyBhIHN1YnNlcXVlbnQgY2FsbCB3aWxsIHJlc3VtZSByZWFkaW5nIHBhY2tldHMuIAorSWYgYSBwb3NpdGl2ZSBudW1iZXIgaXMgcmV0dXJuZWQsIHRoZSBmbGFnIGlzIG5vdCBjbGVhcmVkLCBzbyBhCitzdWJzZXF1ZW50IGNhbGwgd2lsbCByZXR1cm4gXC0yIGFuZCBjbGVhciB0aGUgZmxhZy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfbG9vcCgzUENBUCksIHBjYXBfbmV4dF9leCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfY2FuX3NldF9yZm1vbi4zcGNhcCBiL3BjYXBfY2FuX3NldF9yZm1vbi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI5MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9jYW5fc2V0X3JmbW9uLjNwY2FwCkBAIC0wLDAgKzEsNjQgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfY2FuX3NldF9yZm1vbi4zcGNhcCx2IDEuMSAyMDA4LTA0LTA2IDAyOjUzOjIxIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfQ0FOX1NFVF9SRk1PTiAzUENBUCAiMTggTWF5IDIwMTAiCisuU0ggTkFNRQorcGNhcF9jYW5fc2V0X3JmbW9uIFwtIGNoZWNrIHdoZXRoZXIgbW9uaXRvciBtb2RlIGNhbiBiZSBzZXQgZm9yIGEKK25vdC15ZXQtYWN0aXZhdGVkIGNhcHR1cmUgaGFuZGxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5MUAorLmZ0IEIKK2ludCBwY2FwX2Nhbl9zZXRfcmZtb24ocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfY2FuX3NldF9yZm1vbigpCitjaGVja3Mgd2hldGhlciBtb25pdG9yIG1vZGUgY291bGQgYmUgc2V0IG9uIGEgY2FwdHVyZSBoYW5kbGUgd2hlbgordGhlIGhhbmRsZSBpcyBhY3RpdmF0ZWQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2Nhbl9zZXRfcmZtb24oKQorcmV0dXJucyAwIGlmIG1vbml0b3IgbW9kZSBjb3VsZCBub3QgYmUgc2V0LAorMSBpZiBtb25pdG9yIG1vZGUgY291bGQgYmUgc2V0LAorLkIgUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRQoraWYgdGhlIGNhcHR1cmUgc291cmNlIHNwZWNpZmllZCB3aGVuIHRoZSBoYW5kbGUgd2FzIGNyZWF0ZWQgZG9lc24ndAorZXhpc3QsCisuQiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVECitpZiB0aGUgcHJvY2VzcyBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbiB0byBjaGVjayB3aGV0aGVyIG1vbml0b3IgbW9kZQorY291bGQgYmUgc3VwcG9ydGVkLAorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLCBvcgorLkIgUENBUF9FUlJPUgoraWYgYW4gZXJyb3Igb2NjdXJyZWQuCitJZgorLkIgUENBUF9FUlJPUgoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfc2V0X3JmbW9uKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9jbG9zZS4zcGNhcCBiL3BjYXBfY2xvc2UuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwNjY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfY2xvc2UuM3BjYXAKQEAgLTAsMCArMSw0MSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9jbG9zZS4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIxIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfQ0xPU0UgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2Nsb3NlIFwtIGNsb3NlIGEgY2FwdHVyZSBkZXZpY2Ugb3Igc2F2ZWZpbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCit2b2lkIHBjYXBfY2xvc2UocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfY2xvc2UoKQorY2xvc2VzIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGgKKy5JIHAKK2FuZCBkZWFsbG9jYXRlcyByZXNvdXJjZXMuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2NvbXBpbGUuM3BjYXAuaW4gYi9wY2FwX2NvbXBpbGUuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiZGFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfY29tcGlsZS4zcGNhcC5pbgpAQCAtMCwwICsxLDcyIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2NvbXBpbGUuM3BjYXAuaW4sdiAxLjEgMjAwOC0xMC0yMSAwNzozMzowMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0NPTVBJTEUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2NvbXBpbGUgXC0gY29tcGlsZSBhIGZpbHRlciBleHByZXNzaW9uCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfY29tcGlsZShwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnAsCisudGkgKzgKK2NvbnN0IGNoYXIgKnN0ciwgaW50IG9wdGltaXplLCBicGZfdV9pbnQzMiBuZXRtYXNrKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfY29tcGlsZSgpCitpcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHN0cmluZworLkkgc3RyCitpbnRvIGEgZmlsdGVyIHByb2dyYW0uICBTZWUKKy5CUiBwY2FwLWZpbHRlciAoQE1BTl9NSVNDX0lORk9AKQorZm9yIHRoZSBzeW50YXggb2YgdGhhdCBzdHJpbmcuCisuSSBwcm9ncmFtCitpcyBhIHBvaW50ZXIgdG8gYQorLkkgYnBmX3Byb2dyYW0KK3N0cnVjdCBhbmQgaXMgZmlsbGVkIGluIGJ5CisuQlIgcGNhcF9jb21waWxlKCkgLgorLkkgb3B0aW1pemUKK2NvbnRyb2xzIHdoZXRoZXIgb3B0aW1pemF0aW9uIG9uIHRoZSByZXN1bHRpbmcgY29kZSBpcyBwZXJmb3JtZWQuCisuSSBuZXRtYXNrCitzcGVjaWZpZXMgdGhlIElQdjQgbmV0bWFzayBvZiB0aGUgbmV0d29yayBvbiB3aGljaCBwYWNrZXRzIGFyZSBiZWluZworY2FwdHVyZWQ7IGl0IGlzIHVzZWQgb25seSB3aGVuIGNoZWNraW5nIGZvciBJUHY0IGJyb2FkY2FzdCBhZGRyZXNzZXMgaW4KK3RoZSBmaWx0ZXIgcHJvZ3JhbS4gIElmIHRoZSBuZXRtYXNrIG9mIHRoZSBuZXR3b3JrIG9uIHdoaWNoIHBhY2tldHMgYXJlCitiZWluZyBjYXB0dXJlZCBpc24ndCBrbm93biB0byB0aGUgcHJvZ3JhbSwgb3IgaWYgcGFja2V0cyBhcmUgYmVpbmcKK2NhcHR1cmVkIG9uIHRoZSBMaW51eCAiYW55IiBwc2V1ZG8taW50ZXJmYWNlIHRoYXQgY2FuIGNhcHR1cmUgb24gbW9yZQordGhhbiBvbmUgbmV0d29yaywgYSB2YWx1ZSBvZiBQQ0FQX05FVE1BU0tfVU5LTk9XTiBjYW4gYmUgc3VwcGxpZWQ7IHRlc3RzCitmb3IgSVB2NCBicm9hZGNhc3QgYWRkcmVzc2VzIHdpbGwgZmFpbCB0byBjb21waWxlLCBidXQgYWxsIG90aGVyIHRlc3RzIGluCit0aGUgZmlsdGVyIHByb2dyYW0gd2lsbCBiZSBPSy4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfY29tcGlsZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9zZXRmaWx0ZXIoM1BDQVApLCBwY2FwX2ZyZWVjb2RlKDNQQ0FQKSwKK3BjYXBfZ2V0ZXJyKDNQQ0FQKSwgcGNhcC1maWx0ZXIoQE1BTl9NSVNDX0lORk9AKQpkaWZmIC0tZ2l0IGEvcGNhcF9jcmVhdGUuM3BjYXAgYi9wY2FwX2NyZWF0ZS4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNmOWZkCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9jcmVhdGUuM3BjYXAKQEAgLTAsMCArMSw3NCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9jcmVhdGUuM3BjYXAsdiAxLjEgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0NSRUFURSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfY3JlYXRlIFwtIGNyZWF0ZSBhIGxpdmUgY2FwdHVyZSBoYW5kbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5uZgorLmZ0IEIKK2NoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworLmZ0CisuTFAKKy5mdCBCCitwY2FwX3QgKnBjYXBfY3JlYXRlKGNvbnN0IGNoYXIgKnNvdXJjZSwgY2hhciAqZXJyYnVmKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfY3JlYXRlKCkKK2lzIHVzZWQgdG8gY3JlYXRlIGEgcGFja2V0IGNhcHR1cmUgaGFuZGxlIHRvIGxvb2sKK2F0IHBhY2tldHMgb24gdGhlIG5ldHdvcmsuCisuSSBzb3VyY2UKK2lzIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXR3b3JrIGRldmljZSB0byBvcGVuOyBvbiBMaW51eCBzeXN0ZW1zCit3aXRoIDIuMiBvciBsYXRlciBrZXJuZWxzLCBhCisuSSBzb3VyY2UKK2FyZ3VtZW50IG9mICJhbnkiIG9yCisuQiBOVUxMCitjYW4gYmUgdXNlZCB0byBjYXB0dXJlIHBhY2tldHMgZnJvbSBhbGwgaW50ZXJmYWNlcy4KKy5QUAorVGhlIHJldHVybmVkIGhhbmRsZSBtdXN0IGJlIGFjdGl2YXRlZCB3aXRoCisuQiBwY2FwX2FjdGl2YXRlKCkKK2JlZm9yZSBwYWNrZXRzIGNhbiBiZSBjYXB0dXJlZAord2l0aCBpdDsgb3B0aW9ucyBmb3IgdGhlIGNhcHR1cmUsIHN1Y2ggYXMgcHJvbWlzY3VvdXMgbW9kZSwgY2FuIGJlIHNldAorb24gdGhlIGhhbmRsZSBiZWZvcmUgYWN0aXZhdGluZyBpdC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfY3JlYXRlKCkKK3JldHVybnMgYQorLkkgcGNhcF90ICoKK29uIHN1Y2Nlc3MgYW5kCisuQiBOVUxMCitvbiBmYWlsdXJlLgorSWYKKy5CIE5VTEwKK2lzIHJldHVybmVkLAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgorLkkgZXJyYnVmCitpcyBhc3N1bWVkIHRvIGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdAorLkIgUENBUF9FUlJCVUZfU0laRQorY2hhcnMuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9kYXRhbGluay4zcGNhcC5pbiBiL3BjYXBfZGF0YWxpbmsuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNWQ2NgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZGF0YWxpbmsuM3BjYXAuaW4KQEAgLTAsMCArMSw3MCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9kYXRhbGluay4zcGNhcC5pbix2IDEuMSAyMDA4LTEwLTIxIDA3OjMzOjAyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfREFUQUxJTksgM1BDQVAgIjIyIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXBfZGF0YWxpbmsgXC0gZ2V0IHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZGF0YWxpbmsocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZGF0YWxpbmsoKQorcmV0dXJucyB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgdGhlIGxpdmUgY2FwdHVyZSBvciBgYHNhdmVmaWxlJycKK3NwZWNpZmllZCBieQorLklSIHAgLgorLlBQCitJdCBtdXN0IG5vdCBiZSBjYWxsZWQgb24gYSBwY2FwIGRlc2NyaXB0b3IgY3JlYXRlZCBieQorLkIgcGNhcF9jcmVhdGUoKQordGhhdCBoYXMgbm90IHlldCBiZWVuIGFjdGl2YXRlZCBieQorLkJSIHBjYXBfYWN0aXZhdGUoKSAuCisuUFAKKy5JIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvbGlua3R5cGVzLmh0bWwKK2xpc3RzIHRoZSB2YWx1ZXMKKy5CIHBjYXBfZGF0YWxpbmsoKQorY2FuIHJldHVybiBhbmQgZGVzY3JpYmVzIHRoZSBwYWNrZXQgZm9ybWF0cyB0aGF0Citjb3JyZXNwb25kIHRvIHRob3NlIHZhbHVlcy4KKy5QUAorRG8KKy5CIE5PVAorYXNzdW1lIHRoYXQgdGhlIHBhY2tldHMgZm9yIGEgZ2l2ZW4gY2FwdHVyZSBvciBgYHNhdmVmaWxlYGAgd2lsbCBoYXZlCithbnkgZ2l2ZW4gbGluay1sYXllciBoZWFkZXIgdHlwZSwgc3VjaCBhcworLkIgRExUX0VOMTBNQgorZm9yIEV0aGVybmV0LiAgRm9yIGV4YW1wbGUsIHRoZSAiYW55IiBkZXZpY2Ugb24gTGludXggd2lsbCBoYXZlIGEKK2xpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb2YKKy5CIERMVF9MSU5VWF9TTEwKK2V2ZW4gaWYgYWxsIGRldmljZXMgb24gdGhlIHN5c3RlbSBhdCB0aGUgdGltZSB0aGUgImFueSIgZGV2aWNlIGlzIG9wZW5lZAoraGF2ZSBzb21lIG90aGVyIGRhdGEgbGluayB0eXBlLCBzdWNoIGFzCisuQiBETFRfRU4xME1CCitmb3IgRXRoZXJuZXQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2RhdGFsaW5rKCkKK3JldHVybnMgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb24gc3VjY2VzcyBhbmQKKy5CIFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCBub3QgYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcC1saW5rdHlwZShATUFOX01JU0NfSU5GT0ApCmRpZmYgLS1naXQgYS9wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLjNwY2FwIGIvcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhlMThhCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4zcGNhcApAQCAtMCwwICsxLDQ4IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTCAzUENBUCAiMjIgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCBcLSBnZXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUKK2NvcnJlc3BvbmRpbmcgdG8gYSBoZWFkZXIgdHlwZSBuYW1lCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKCkKK3RyYW5zbGF0ZXMgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG5hbWUsIHdoaWNoIGlzIGEKKy5CIERMVF8KK25hbWUgd2l0aCB0aGUKKy5CIERMVF8KK3JlbW92ZWQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUuICBUaGUKK3RyYW5zbGF0aW9uIGlzIGNhc2UtaW5zZW5zaXRpdmUuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBcLTEgb24gZmFpbHVyZS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUuM3BjYXAgYi9wY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2JhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLjNwY2FwCkBAIC0wLDAgKzEsNDggQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUuM3BjYXAsdiAxLjMgMjAwOC0xMi0yNCAyMTo0NToyNSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RBVEFMSU5LX1ZBTF9UT19OQU1FIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLCBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiBcLSBnZXQgYQorbmFtZSBvciBkZXNjcmlwdGlvbiBmb3IgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHZhbHVlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2NvbnN0IGNoYXIgKnBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoaW50IGRsdCk7Citjb25zdCBjaGFyICpwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihpbnQgZGx0KTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoKQordHJhbnNsYXRlcyBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcKK2xpbmstbGF5ZXIgaGVhZGVyIHR5cGUgbmFtZS4KKy5CIE5VTEwKK2lzIHJldHVybmVkIG9uIGZhaWx1cmUuCisuUFAKKy5CIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKCkKK3RyYW5zbGF0ZXMgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHZhbHVlIHRvIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhhdAorbGluay1sYXllciBoZWFkZXIgdHlwZS4KKy5CIE5VTEwKK2lzIHJldHVybmVkIG9uIGZhaWx1cmUuCmRpZmYgLS1naXQgYS9wY2FwX2R1bXAuM3BjYXAgYi9wY2FwX2R1bXAuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjZDgyYQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZHVtcC4zcGNhcApAQCAtMCwwICsxLDUzIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2R1bXAuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVAgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2R1bXAgXC0gd3JpdGUgYSBwYWNrZXQgdG8gYSBjYXB0dXJlIGZpbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCit2b2lkIHBjYXBfZHVtcCh1X2NoYXIgKnVzZXIsIHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKKy50aSArOAordV9jaGFyICpzcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2R1bXAoKQorb3V0cHV0cyBhIHBhY2tldCB0byB0aGUgYGBzYXZlZmlsZScnIG9wZW5lZCB3aXRoCisuQlIgcGNhcF9kdW1wX29wZW4oKSAuCitOb3RlIHRoYXQgaXRzIGNhbGxpbmcgYXJndW1lbnRzIGFyZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGgKKy5CIHBjYXBfZGlzcGF0Y2goKQorb3IKKy5CUiBwY2FwX2xvb3AoKSAuCitJZiBjYWxsZWQgZGlyZWN0bHksIHRoZSAKKy5JIHVzZXIKK3BhcmFtZXRlciBpcyBvZiB0eXBlIAorLkIgcGNhcF9kdW1wZXJfdAorYXMgcmV0dXJuZWQgYnkKKy5CUiBwY2FwX2R1bXBfb3BlbigpIC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZHVtcF9vcGVuKDNQQ0FQKSwgcGNhcF9kaXNwYXRjaCgzUENBUCksCitwY2FwX2xvb3AoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2R1bXBfY2xvc2UuM3BjYXAgYi9wY2FwX2R1bXBfY2xvc2UuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkODIwYgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZHVtcF9jbG9zZS4zcGNhcApAQCAtMCwwICsxLDM5IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2R1bXBfY2xvc2UuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVBfQ0xPU0UgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2R1bXBfY2xvc2UgXC0gY2xvc2UgYSBzYXZlZmlsZSBiZWluZyB3cml0dGVuIHRvCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgordm9pZCBwY2FwX2R1bXBfY2xvc2UocGNhcF9kdW1wZXJfdCAqcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2R1bXBfY2xvc2UoKQorY2xvc2VzIHRoZSBgYHNhdmVmaWxlLicnCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2R1bXBfb3BlbigzUENBUCksIHBjYXBfZHVtcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfZHVtcF9maWxlLjNwY2FwIGIvcGNhcF9kdW1wX2ZpbGUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1MWEyYQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZHVtcF9maWxlLjNwY2FwCkBAIC0wLDAgKzEsNDAgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZHVtcF9maWxlLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EVU1QX0ZJTEUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2R1bXBfZmlsZSBcLSBnZXQgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gZm9yIGEgc2F2ZWZpbGUgYmVpbmcgd3JpdHRlbgorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK0ZJTEUgKnBjYXBfZHVtcF9maWxlKHBjYXBfZHVtcGVyX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX2ZpbGUoKQorcmV0dXJucyB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbSBvZiB0aGUgYGBzYXZlZmlsZScnIG9wZW5lZCBieQorLkJSIHBjYXBfZHVtcF9vcGVuKCkgLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9kdW1wX2ZsdXNoLjNwY2FwIGIvcGNhcF9kdW1wX2ZsdXNoLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2R1bXBfZmx1c2guM3BjYXAKQEAgLTAsMCArMSw0NSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9kdW1wX2ZsdXNoLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EVU1QX0ZMVVNIIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9kdW1wX2ZsdXNoIFwtIGZsdXNoIHRvIGEgc2F2ZWZpbGUgcGFja2V0cyBkdW1wZWQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9kdW1wX2ZsdXNoKHBjYXBfZHVtcGVyX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX2ZsdXNoKCkKK2ZsdXNoZXMgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIGBgc2F2ZWZpbGUsJycgc28gdGhhdCBhbnkgcGFja2V0cword3JpdHRlbiB3aXRoCisuQiBwY2FwX2R1bXAoKQorYnV0IG5vdCB5ZXQgd3JpdHRlbiB0byB0aGUgYGBzYXZlZmlsZScnIHdpbGwgYmUgd3JpdHRlbi4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfZHVtcF9mbHVzaCgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2R1bXBfb3BlbigzUENBUCksIHBjYXBfZHVtcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfZHVtcF9mdGVsbC4zcGNhcCBiL3BjYXBfZHVtcF9mdGVsbC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBmOTZmCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9kdW1wX2Z0ZWxsLjNwY2FwCkBAIC0wLDAgKzEsNDQgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZHVtcF9mdGVsbC4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIxIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfRFVNUF9GVEVMTCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZHVtcF9mdGVsbCBcLSBnZXQgdGhlIGN1cnJlbnQgZmlsZSBvZmZzZXQgZm9yIGEgc2F2ZWZpbGUgYmVpbmcgd3JpdHRlbgorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2xvbmcgcGNhcF9kdW1wX2Z0ZWxsKHBjYXBfZHVtcGVyX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX2Z0ZWxsKCkKK3JldHVybnMgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBmb3IgdGhlIGBgc2F2ZWZpbGUnJywgcmVwcmVzZW50aW5nIHRoZQorbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYnkKKy5CIHBjYXBfZHVtcF9vcGVuKCkKK2FuZAorLkJSIHBjYXBfZHVtcCgpIC4KK1wtMSBpcyByZXR1cm5lZCBvbiBlcnJvci4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZHVtcF9vcGVuKDNQQ0FQKSwgcGNhcF9kdW1wKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4gYi9wY2FwX2R1bXBfb3Blbi4zcGNhcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVkYzlkCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4KQEAgLTAsMCArMSw4NyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4sdiAxLjEgMjAwOC0xMC0yMyAwNTo1Njo1OSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVBfT1BFTiAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZHVtcF9vcGVuLCBwY2FwX2R1bXBfZm9wZW4gXC0gb3BlbiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgcGFja2V0cworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5uZgorLkxQCisuZnQgQgorcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW4ocGNhcF90ICpwLCBjb25zdCBjaGFyICpmbmFtZSk7CitwY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICpwLCBGSUxFICpmcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2R1bXBfb3BlbigpCitpcyBjYWxsZWQgdG8gb3BlbiBhIGBgc2F2ZWZpbGUnJyBmb3Igd3JpdGluZy4KKy5JIGZuYW1lCitzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3Blbi4gVGhlIGZpbGUgd2lsbCBoYXZlCit0aGUgc2FtZSBmb3JtYXQgYXMgdGhvc2UgdXNlZCBieQorLkJSIHRjcGR1bXAgKDEpCithbmQKKy5CUiB0Y3BzbGljZSAoMSkuCitUaGUgbmFtZSAiLSIgaW4gYSBzeW5vbnltCitmb3IKKy5CUiBzdGRvdXQgLgorLlBQCisuQiBwY2FwX2R1bXBfZm9wZW4oKQoraXMgY2FsbGVkIHRvIHdyaXRlIGRhdGEgdG8gYW4gZXhpc3Rpbmcgb3BlbiBzdHJlYW0KKy5JUiBmcCAuCitOb3RlIHRoYXQgb24gV2luZG93cywgdGhhdCBzdHJlYW0gc2hvdWxkIGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KKy5QUAorLkkgcAoraXMgYSBjYXB0dXJlIG9yIGBgc2F2ZWZpbGUnJyBoYW5kbGUgcmV0dXJuZWQgYnkgYW4gZWFybGllciBjYWxsIHRvCisuQiBwY2FwX2NyZWF0ZSgpCithbmQgYWN0aXZhdGVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0bworLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciByZXR1cm5lZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8KKy5CUiBwY2FwX29wZW5fb2ZmbGluZSgpICwKKy5CUiBwY2FwX29wZW5fbGl2ZSgpICwKK29yCisuQlIgcGNhcF9vcGVuX2RlYWQoKSAuCitUaGUgbGluay1sYXllciB0eXBlIGFuZCBzbmFwc2hvdCBsZW5ndGggZnJvbQorLkkgcAorYXJlIHVzZWQgYXMgdGhlIGxpbmstbGF5ZXIgdHlwZSBhbmQgc25hcHNob3QgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgZmlsZS4KKy5TSCBSRVRVUk4gVkFMVUVTCitBIHBvaW50ZXIgdG8gYQorLkIgcGNhcF9kdW1wZXJfdAorc3RydWN0dXJlIHRvIHVzZSBpbiBzdWJzZXF1ZW50CisuQiBwY2FwX2R1bXAoKQorYW5kCisuQiBwY2FwX2R1bXBfY2xvc2UoKQorY2FsbHMgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KKy5CIE5VTEwKK2lzIHJldHVybmVkIG9uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycihcZklwXGZCKQorY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKSwgcGNhcF9vcGVuX2xpdmUoM1BDQVApLCBwY2FwX29wZW5fZGVhZCgzUENBUCksCitwY2FwX2R1bXAoM1BDQVApLCBwY2FwX2R1bXBfY2xvc2UoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksCitwY2FwLXNhdmVmaWxlKEBNQU5fRklMRV9GT1JNQVRTQCkKZGlmZiAtLWdpdCBhL3BjYXBfZmlsZS4zcGNhcCBiL3BjYXBfZmlsZS4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDcxYWI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9maWxlLjNwY2FwCkBAIC0wLDAgKzEsNTkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZmlsZS4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfRklMRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZmlsZSBcLSBnZXQgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gZm9yIGEgc2F2ZWZpbGUgYmVpbmcgcmVhZAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK0ZJTEUgKnBjYXBfZmlsZShwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9maWxlKCkKK3JldHVybnMgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gb2YgdGhlIGBgc2F2ZWZpbGUsJycgaWYgYSBgYHNhdmVmaWxlJycKK3dhcyBvcGVuZWQgd2l0aAorLkJSIHBjYXBfb3Blbl9vZmZsaW5lKCkgLAorb3IgTlVMTCwgaWYgYSBuZXR3b3JrIGRldmljZSB3YXMgb3BlbmVkIHdpdGgKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB3aXRoCisuQlIgcGNhcF9vcGVuX2xpdmUoKSAuCisuUFAKK05vdGUgdGhhdCB0aGUgUGFja2V0IENhcHR1cmUgbGlicmFyeSBpcyB1c3VhbGx5IGJ1aWx0IHdpdGggbGFyZ2UgZmlsZQorc3VwcG9ydCwgc28gdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gb2YgdGhlIGBgc2F2ZWZpbGUnJyBtaWdodCByZWZlciB0bworYSBmaWxlIGxhcmdlciB0aGFuIDIgZ2lnYWJ5dGVzOyBhcHBsaWNhdGlvbnMgdGhhdCB1c2UKKy5CIHBjYXBfZmlsZSgpCitzaG91bGQsIGlmIHBvc3NpYmxlLCB1c2UgY2FsbHMgdGhhdCBzdXBwb3J0IGxhcmdlIGZpbGVzIG9uIHRoZSByZXR1cm4KK3ZhbHVlIG9mCisuQiBwY2FwX2ZpbGUoKQorb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisuQiBmaWxlbm8oKQord2hlbiBwYXNzZWQgdGhlIHJldHVybiB2YWx1ZSBvZgorLkJSIHBjYXBfZmlsZSgpIC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9maWxlbm8uM3BjYXAgYi9wY2FwX2ZpbGVuby4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM3MzNlCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9maWxlbm8uM3BjYXAKQEAgLTAsMCArMSw2OCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9maWxlbm8uM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0ZJTEVOTyAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZmlsZW5vIFwtIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGxpdmUgY2FwdHVyZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2ZpbGVubyhwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorSWYKKy5JIHAKK3JlZmVycyB0byBhIG5ldHdvcmsgZGV2aWNlIHRoYXQgd2FzIG9wZW5lZCBmb3IgYSBsaXZlIGNhcHR1cmUgdXNpbmcKK2EgY29tYmluYXRpb24gb2YKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB1c2luZworLkJSIHBjYXBfb3Blbl9saXZlKCkgLAorLkIgcGNhcF9maWxlbm8oKQorcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gd2hpY2ggY2FwdHVyZWQgcGFja2V0cyBhcmUgcmVhZC4KKy5MUAorSWYKKy5JIHAKK3JlZmVycyB0byBhIGBgc2F2ZWZpbGUnJyB0aGF0IHdhcyBvcGVuZWQgdXNpbmcgZnVuY3Rpb25zIHN1Y2ggYXMKKy5CUiBwY2FwX29wZW5fb2ZmbGluZSgpCitvcgorLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSgpICwKK2EgYGBkZWFkJycKKy5CIHBjYXBfdAorb3BlbmVkIHVzaW5nCisuQlIgcGNhcF9vcGVuX2RlYWQoKSAsCitvciBhCisuQiBwY2FwX3QKK3RoYXQgd2FzIGNyZWF0ZWQgd2l0aAorLkIgcGNhcF9jcmVhdGUoKQorYnV0IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgd2l0aAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitpdCByZXR1cm5zIFwtMS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCksCitwY2FwX29wZW5fbGl2ZSgzUENBUCksIHBjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKSwKK3BjYXBfZm9wZW5fb2ZmbGluZSgzUENBUCksIHBjYXBfb3Blbl9kZWFkKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9maW5kYWxsZGV2cy4zcGNhcCBiL3BjYXBfZmluZGFsbGRldnMuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1NmQwOQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZmluZGFsbGRldnMuM3BjYXAKQEAgLTAsMCArMSwxODYgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZmluZGFsbGRldnMuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0ZJTkRBTExERVZTIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2ZpbmRhbGxkZXZzLCBwY2FwX2ZyZWVhbGxkZXZzIFwtIGdldCBhIGxpc3Qgb2YgY2FwdHVyZSBkZXZpY2VzLCBhbmQKK2ZyZWUgdGhhdCBsaXN0CisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisubmYKKy5mdCBCCitjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1Zik7Cit2b2lkIHBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICphbGxkZXZzKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZmluZGFsbGRldnMoKQorY29uc3RydWN0cyBhIGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCB3aXRoCisuQiBwY2FwX2NyZWF0ZSgpCithbmQKKy5CIHBjYXBfYWN0aXZhdGUoKQorb3Igd2l0aAorLkJSIHBjYXBfb3Blbl9saXZlKCkgLgorKE5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgbmV0d29yayBkZXZpY2VzIHRoYXQgY2Fubm90IGJlIG9wZW5lZCBieSB0aGUKK3Byb2Nlc3MgY2FsbGluZworLkJSIHBjYXBfZmluZGFsbGRldnMoKSAsCitiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhhdCBwcm9jZXNzIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBwcml2aWxlZ2VzCit0byBvcGVuIHRoZW0gZm9yIGNhcHR1cmluZzsgaWYgc28sIHRob3NlIGRldmljZXMgd2lsbCBub3QgYXBwZWFyIG9uIHRoZQorbGlzdC4pCitJZgorLkIgcGNhcF9maW5kYWxsZGV2cygpCitzdWNjZWVkcywgdGhlIHBvaW50ZXIgcG9pbnRlZCB0byBieQorLkkgYWxsZGV2c3AKK2lzIHNldCB0byBwb2ludCB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCwgb3IgdG8KKy5CIE5VTEwKK2lmIG5vIGRldmljZXMgd2VyZSBmb3VuZCAodGhpcyBpcyBjb25zaWRlcmVkIHN1Y2Nlc3MpLgorRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0IGlzIG9mIHR5cGUKKy5CUiBwY2FwX2lmX3QgLAorYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisuUlMKKy5UUAorLkIgbmV4dAoraWYgbm90CisuQlIgTlVMTCAsCithIHBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdDsKKy5CIE5VTEwKK2ZvciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsaXN0CisuVFAKKy5CIG5hbWUKK2EgcG9pbnRlciB0byBhIHN0cmluZyBnaXZpbmcgYSBuYW1lIGZvciB0aGUgZGV2aWNlIHRvIHBhc3MgdG8KKy5CIHBjYXBfb3Blbl9saXZlKCkKKy5UUAorLkIgZGVzY3JpcHRpb24KK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEgc3RyaW5nIGdpdmluZyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXZpY2UKKy5UUAorLkIgYWRkcmVzc2VzCithIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBsaXN0IG9mIG5ldHdvcmsgYWRkcmVzc2VzIGZvciB0aGUKK2RldmljZSwKK29yCisuQiBOVUxMCitpZiB0aGUgZGV2aWNlIGhhcyBubyBhZGRyZXNzZXMKKy5UUAorLkIgZmxhZ3MKK2RldmljZSBmbGFnczoKKy5SUworLlRQCisuQiBQQ0FQX0lGX0xPT1BCQUNLCitzZXQgaWYgdGhlIGRldmljZSBpcyBhIGxvb3BiYWNrIGludGVyZmFjZQorLlJFCisuUkUKKy5QUAorRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBpcyBvZiB0eXBlCisuQlIgcGNhcF9hZGRyX3QgLAorYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisuUlMKKy5UUAorLkIgbmV4dAoraWYgbm90CisuQlIgTlVMTCAsCithIHBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdDsKKy5CIE5VTEwKK2ZvciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsaXN0CisuVFAKKy5CIGFkZHIKK2EgcG9pbnRlciB0byBhCisuQiAic3RydWN0IHNvY2thZGRyIgorY29udGFpbmluZyBhbiBhZGRyZXNzCisuVFAKKy5CIG5ldG1hc2sKK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEKKy5CICJzdHJ1Y3Qgc29ja2FkZHIiCit0aGF0IGNvbnRhaW5zIHRoZSBuZXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgcG9pbnRlZCB0byBieQorLkIgYWRkcgorLlRQCisuQiBicm9hZGFkZHIKK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEKKy5CICJzdHJ1Y3Qgc29ja2FkZHIiCit0aGF0IGNvbnRhaW5zIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhZGRyZXNzIHBvaW50ZWQKK3RvIGJ5CisuQlIgYWRkciA7CittYXkgYmUgbnVsbCBpZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBicm9hZGNhc3RzCisuVFAKKy5CIGRzdGFkZHIKK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEKKy5CICJzdHJ1Y3Qgc29ja2FkZHIiCit0aGF0IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgcG9pbnRlZAordG8gYnkKKy5CUiBhZGRyIDsKK21heSBiZSBudWxsIGlmIHRoZSBkZXZpY2UgaXNuJ3QgYSBwb2ludC10by1wb2ludCBpbnRlcmZhY2UKKy5SRQorLlBQCitOb3RlIHRoYXQgdGhlIGFkZHJlc3NlcyBpbiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgbWlnaHQgYmUgSVB2NAorYWRkcmVzc2VzLCBJUHY2IGFkZHJlc3Nlcywgb3Igc29tZSBvdGhlciB0eXBlIG9mIGFkZHJlc3Nlcywgc28geW91IG11c3QKK2NoZWNrIHRoZQorLkIgc2FfZmFtaWx5CittZW1iZXIgb2YgdGhlCisuQiAic3RydWN0IHNvY2thZGRyIgorYmVmb3JlIGludGVycHJldGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFkZHJlc3M7IGRvIG5vdCBhc3N1bWUgdGhhdCB0aGUKK2FkZHJlc3NlcyBhcmUgYWxsIElQdjQgYWRkcmVzc2VzLCBvciBldmVuIGFsbCBJUHY0IG9yIElQdjYgYWRkcmVzc2VzLgorSVB2NCBhZGRyZXNzZXMgaGF2ZSB0aGUgdmFsdWUKKy5CUiBBRl9JTkVUICwKK0lQdjYgYWRkcmVzc2VzIGhhdmUgdGhlIHZhbHVlCisuQiBBRl9JTkVUNgorKHdoaWNoIG9sZGVyIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBJUHY2IG1pZ2h0IG5vdAorZGVmaW5lKSwgYW5kIG90aGVyIGFkZHJlc3NlcyBoYXZlIG90aGVyIHZhbHVlcy4gIFdoZXRoZXIgb3RoZXIgYWRkcmVzc2VzCithcmUgcmV0dXJuZWQsIGFuZCB3aGF0IHR5cGVzIHRoZXkgbWlnaHQgaGF2ZSBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuCitGb3IgSVB2NCBhZGRyZXNzZXMsIHRoZQorLkIgInN0cnVjdCBzb2NrYWRkciIKK3BvaW50ZXIgY2FuIGJlIGludGVycHJldGVkIGFzIGlmIGl0IHBvaW50ZWQgdG8gYQorLkJSICJzdHJ1Y3Qgc29ja2FkZHJfaW4iIDsKK2ZvciBJUHY2IGFkZHJlc3NlcywgaXQgY2FuIGJlIGludGVycHJldGVkIGFzIGlmIGl0IHBvaW50ZWQgdG8gYQorLkJSICJzdHJ1Y3Qgc29ja2FkZHJfaW42Ii4KKy5QUAorVGhlIGxpc3Qgb2YgZGV2aWNlcyBtdXN0IGJlIGZyZWVkIHdpdGgKKy5CUiBwY2FwX2ZyZWVhbGxkZXZzKCkgLAord2hjaCBmcmVlcyB0aGUgbGlzdCBwb2ludGVkIHRvIGJ5CisuSVIgYWxsZGV2cyAuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2ZpbmRhbGxkZXZzKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBcLTEgb24gZmFpbHVyZTsgYXMgaW5kaWNhdGVkLCBmaW5kaW5nIG5vCitkZXZpY2VzIGlzIGNvbnNpZGVyZWQgc3VjY2VzcywgcmF0aGVyIHRoYW4gZmFpbHVyZSwgc28gMCB3aWxsIGJlCityZXR1cm5lZCBpbiB0aGF0IGNhc2UuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCksCitwY2FwX29wZW5fbGl2ZSgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfZnJlZWNvZGUuM3BjYXAgYi9wY2FwX2ZyZWVjb2RlLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjRmODkKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2ZyZWVjb2RlLjNwY2FwCkBAIC0wLDAgKzEsNDUgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZnJlZWNvZGUuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0ZSRUVDT0RFIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9mcmVlY29kZSBcLSBmcmVlIGEgQlBGIHByb2dyYW0KKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCit2b2lkIHBjYXBfZnJlZWNvZGUoc3RydWN0IGJwZl9wcm9ncmFtICopOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9mcmVlY29kZSgpCitpcyB1c2VkIHRvIGZyZWUgdXAgYWxsb2NhdGVkIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGEKKy5JIGJwZl9wcm9ncmFtCitzdHJ1Y3QgZ2VuZXJhdGVkIGJ5CisuQiBwY2FwX2NvbXBpbGUoKQord2hlbiB0aGF0IEJQRiBwcm9ncmFtIGlzIG5vIGxvbmdlciBuZWVkZWQsIGZvciBleGFtcGxlIGFmdGVyIGl0CitoYXMgYmVlbiBtYWRlIHRoZSBmaWx0ZXIgcHJvZ3JhbSBmb3IgYSBwY2FwIHN0cnVjdHVyZSBieSBhIGNhbGwgdG8KKy5CUiBwY2FwX3NldGZpbHRlcigpIC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY29tcGlsZSgzUENBUCksIHBjYXBfc2V0ZmlsdGVyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9nZXRfc2VsZWN0YWJsZV9mZC4zcGNhcCBiL3BjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzM2RiYgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAKQEAgLTAsMCArMSwxMjkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0dFVF9TRUxFQ1RBQkxFX0ZEIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCBcLSBnZXQgYSBmaWxlIGRlc2NyaXB0b3Igb24gd2hpY2ggYSBzZWxlY3QoKSBjYW4KK2JlIGRvbmUgZm9yIGEgbGl2ZSBjYXB0dXJlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQorcmV0dXJucywgb24gVU5JWCwgYSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGZvciBhIGZpbGUgZGVzY3JpcHRvciBvbgord2hpY2ggb25lIGNhbgorZG8gYQorLkIgc2VsZWN0KCkKK29yCisuQiBwb2xsKCkKK3RvIHdhaXQgZm9yIGl0IHRvIGJlIHBvc3NpYmxlIHRvIHJlYWQgcGFja2V0cyB3aXRob3V0IGJsb2NraW5nLCBpZiBzdWNoCithIGRlc2NyaXB0b3IgZXhpc3RzLCBvciBcLTEsIGlmIG5vIHN1Y2ggZGVzY3JpcHRvciBleGlzdHMuICBTb21lIG5ldHdvcmsKK2RldmljZXMgb3BlbmVkIHdpdGgKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB3aXRoCisuQlIgcGNhcF9vcGVuX2xpdmUoKSAsCitkbyBub3Qgc3VwcG9ydAorLkIgc2VsZWN0KCkKK29yCisuQiBwb2xsKCkKKyhmb3IgZXhhbXBsZSwgcmVndWxhciBuZXR3b3JrIGRldmljZXMgb24gRnJlZUJTRCA0LjMgYW5kIDQuNCwgYW5kIEVuZGFjZQorREFHIGRldmljZXMpLCBzbyBcLTEgaXMgcmV0dXJuZWQgZm9yIHRob3NlIGRldmljZXMuCisuUFAKK05vdGUgdGhhdCBpbjoKKy5JUAorRnJlZUJTRCBwcmlvciB0byBGcmVlQlNEIDQuNjsKKy5JUAorTmV0QlNEIHByaW9yIHRvIE5ldEJTRCAzLjA7CisuSVAKK09wZW5CU0QgcHJpb3IgdG8gT3BlbkJTRCAyLjQ7CisuSVAKK01hYyBPUyBYIHByaW9yIHRvIE1hYyBPUyBYIDEwLjc7CisuUFAKKy5CIHNlbGVjdCgpCithbmQKKy5CIHBvbGwoKQorZG8gbm90IHdvcmsgY29ycmVjdGx5IG9uIEJQRiBkZXZpY2VzOworLkIgcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCgpCit3aWxsIHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvbiBtb3N0IG9mIHRob3NlIHZlcnNpb25zICh0aGUgZXhjZXB0aW9ucworYmVpbmcgRnJlZUJTRCA0LjMgYW5kIDQuNCksIGJ1dCBhIHNpbXBsZQorLkIgc2VsZWN0KCkKK29yCisuQiBwb2xsKCkKK3dpbGwgbm90IGluZGljYXRlIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXMgcmVhZGFibGUgdW50aWwgYSBmdWxsIGJ1ZmZlcidzCit3b3J0aCBvZiBwYWNrZXRzIGlzIHJlY2VpdmVkLCBldmVuIGlmIHRoZSByZWFkIHRpbWVvdXQgZXhwaXJlcyBiZWZvcmUKK3RoZW4uICBUbyB3b3JrIGFyb3VuZCB0aGlzLCBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMKKy5CIHNlbGVjdCgpCitvcgorLkIgcG9sbCgpCit0byB3YWl0IGZvciBwYWNrZXRzIHRvIGFycml2ZSBtdXN0IHB1dCB0aGUKKy5CIHBjYXBfdAoraW4gbm9uLWJsb2NraW5nIG1vZGUsIGFuZCBtdXN0IGFycmFuZ2UgdGhhdCB0aGUKKy5CIHNlbGVjdCgpCitvcgorLkIgcG9sbCgpCitoYXZlIGEgdGltZW91dCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWQgdGltZW91dCwKK2FuZCBtdXN0IHRyeSB0byByZWFkIHBhY2tldHMgYWZ0ZXIgdGhhdCB0aW1lb3V0IGV4cGlyZXMsIHJlZ2FyZGxlc3Mgb2YKK3doZXRoZXIKKy5CIHNlbGVjdCgpCitvcgorLkIgcG9sbCgpCitpbmRpY2F0ZWQgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUKKy5CIHBjYXBfdAoraXMgcmVhZHkgdG8gYmUgcmVhZCBvciBub3QuICAoVGhhdCB3b3JrYXJvdW5kIHdpbGwgbm90IHdvcmsgaW4gRnJlZUJTRAorNC4zIGFuZCBsYXRlcjsgaG93ZXZlciwgaW4gRnJlZUJTRCA0LjYgYW5kIGxhdGVyLAorLkIgc2VsZWN0KCkKK2FuZAorLkIgcG9sbCgpCit3b3JrIGNvcnJlY3RseSBvbiBCUEYgZGV2aWNlcywgc28gdGhlIHdvcmthcm91bmQgaXNuJ3QgbmVjZXNzYXJ5LAorYWx0aG91Z2ggaXQgZG9lcyBubyBoYXJtLikKKy5QUAorTm90ZSBhbHNvIHRoYXQKKy5CIHBvbGwoKQorZG9lc24ndCB3b3JrIG9uIGNoYXJhY3RlciBzcGVjaWFsIGZpbGVzLCBpbmNsdWRpbmcgQlBGIGRldmljZXMsIGluIE1hYworT1MgWCAxMC40IGFuZCAxMC41LCBzbywgd2hpbGUKKy5CIHNlbGVjdCgpCitjYW4gYmUgdXNlZCBvbiB0aGUgZGVzY3JpcHRvciByZXR1cm5lZCBieQorLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKSAsCisuQiBwb2xsKCkKK2Nhbm5vdCBiZSB1c2VkIG9uIGl0IHRob3NlIHZlcnNpb25zIG9mIE1hYyBPUyBYLiAgS3F1ZXVlcyBhbHNvIGRvbid0Cit3b3JrIG9uIHRoYXQgZGVzY3JpcHRvci4KKy5CUiBwb2xsKCkgLAorYnV0IG5vdCBrcXVldWVzLCB3b3JrIG9uIHRoYXQgZGVzY3JpcHRvciBpbiBNYWMgT1MgWCByZWxlYXNlcyBwcmlvciB0bworMTAuNDsKKy5CIHBvbGwoKQorYW5kIGtxdWV1ZXMgd29yayBvbiB0aGF0IGRlc2NyaXB0b3IgaW4gTWFjIE9TIFggMTAuNiBhbmQgbGF0ZXIuCisuUFAKKy5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQoraXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorLlNIIFJFVFVSTiBWQUxVRQorQSBzZWxlY3RhYmxlIGZpbGUgZGVzY3JpcHRvciBpcyByZXR1cm5lZCBpZiBvbmUgZXhpc3RzOyBvdGhlcndpc2UsIFwtMQoraXMgcmV0dXJuZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBzZWxlY3QoMiksIHBvbGwoMikKZGlmZiAtLWdpdCBhL3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAuaW4gYi9wY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmMxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluCkBAIC0wLDAgKzEsNTIgQEAKKy5cIkNvcHlyaWdodCAoYykgMjAxMywgTWljaGFsIFNla2xldGFyCisuXCJBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCJSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiYXJlIG1ldDoKKy5cIgorLlwiICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorLlwiICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisuXCIgICAgIGRpc3RyaWJ1dGlvbi4KKy5cIiAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKy5cIiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIlRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisuXCJJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorLlwiV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisuVEggUENBUF9HRVRfVFNUQU1QX1BSRUNJU0lPTiAzUENBUCAiMjcgQXVndXN0IDIwMTMiCisuU0ggTkFNRQorcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbiBcLSBnZXQgdGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uIHJldHVybmVkIGluCitjYXB0dXJlcworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uKHBjYXBfdCAqcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uKCkKK3JldHVybnMgdGhlIHByZWNpc2lvbiBvZiB0aGUgdGltZSBzdGFtcCByZXR1cm5lZCBpbiBwYWNrZXQgY2FwdHVyZXMgb24gdGhlIHBjYXAKK2Rlc2NyaXB0b3IuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uKCkKK3JldHVybnMKKy5CIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTworb3IKKy5CUiBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTyAsCit3aGljaCBpbmRpY2F0ZXMKK3RoYXQgcGNhcCBjYXB0dXJlcyBjb250YWlucyB0aW1lIHN0YW1wcyBpbiBtaWNyb3NlY29uZHMgb3IgbmFub3NlY29uZHMKK3Jlc3BlY3RpdmVseS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksCitwY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uKDNQQ0FQKSwKK3BjYXAtdHN0YW1wKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL3BjYXBfZ2V0ZXJyLjNwY2FwIGIvcGNhcF9nZXRlcnIuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0ZWEzNAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZ2V0ZXJyLjNwY2FwCkBAIC0wLDAgKzEsNTMgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZ2V0ZXJyLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9HRVRFUlIgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2dldGVyciwgcGNhcF9wZXJyb3IgXC0gZ2V0IG9yIHByaW50IGxpYnBjYXAgZXJyb3IgbWVzc2FnZSB0ZXh0CisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorY2hhciAqcGNhcF9nZXRlcnIocGNhcF90ICpwKTsKK3ZvaWQgcGNhcF9wZXJyb3IocGNhcF90ICpwLCBjaGFyICpwcmVmaXgpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9nZXRlcnIoKQorcmV0dXJucyB0aGUgZXJyb3IgdGV4dCBwZXJ0YWluaW5nIHRvIHRoZSBsYXN0IHBjYXAgbGlicmFyeSBlcnJvci4KKy5CUiBOT1RFIDoKK3RoZSBwb2ludGVyIGl0IHJldHVybnMgd2lsbCBubyBsb25nZXIgcG9pbnQgdG8gYSB2YWxpZCBlcnJvciBtZXNzYWdlCitzdHJpbmcgYWZ0ZXIgdGhlCisuQiBwY2FwX3QKK3Bhc3NlZCB0byBpdCBpcyBjbG9zZWQ7IHlvdSBtdXN0IHVzZSBvciBjb3B5IHRoZSBzdHJpbmcgYmVmb3JlIGNsb3NpbmcKK3RoZQorLkJSIHBjYXBfdCAuCisuUFAKKy5CIHBjYXBfcGVycm9yKCkKK3ByaW50cyB0aGUgdGV4dCBvZiB0aGUgbGFzdCBwY2FwIGxpYnJhcnkgZXJyb3Igb24KKy5CUiBzdGRlcnIgLAorcHJlZml4ZWQgYnkKKy5JUiBwcmVmaXggLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9pbmplY3QuM3BjYXAgYi9wY2FwX2luamVjdC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWEzZWVhCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9pbmplY3QuM3BjYXAKQEAgLTAsMCArMSw5MCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9pbmplY3QuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0lOSkVDVCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfaW5qZWN0LCBwY2FwX3NlbmRwYWNrZXQgXC0gdHJhbnNtaXQgYSBwYWNrZXQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9pbmplY3QocGNhcF90ICpwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKK2ludCBwY2FwX3NlbmRwYWNrZXQocGNhcF90ICpwLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IHNpemUpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9pbmplY3QoKQorc2VuZHMgYSByYXcgcGFja2V0IHRocm91Z2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlOworLkkgYnVmCitwb2ludHMgdG8gdGhlIGRhdGEgb2YgdGhlIHBhY2tldCwgaW5jbHVkaW5nIHRoZSBsaW5rLWxheWVyIGhlYWRlciwgYW5kCisuSSBzaXplCitpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBwYWNrZXQuCisuUFAKK05vdGUgdGhhdCwgZXZlbiBpZiB5b3Ugc3VjY2Vzc2Z1bGx5IG9wZW4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLCB5b3UKK21pZ2h0IG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gc2VuZCBwYWNrZXRzIG9uIGl0LCBvciBpdCBtaWdodCBub3Qgc3VwcG9ydAorc2VuZGluZyBwYWNrZXRzOyBhcworLkkgcGNhcF9vcGVuX2xpdmUoKQorZG9lc24ndCBoYXZlIGEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIG9wZW4gZm9yIGNhcHR1cmluZywgc2VuZGluZywKK29yIGNhcHR1cmluZyBhbmQgc2VuZGluZywgeW91IGNhbm5vdCByZXF1ZXN0IGFuIG9wZW4gdGhhdCBzdXBwb3J0cworc2VuZGluZyBhbmQgYmUgbm90aWZpZWQgYXQgb3BlbiB0aW1lIHdoZXRoZXIgc2VuZGluZyB3aWxsIGJlIHBvc3NpYmxlLgorTm90ZSBhbHNvIHRoYXQgc29tZSBkZXZpY2VzIG1pZ2h0IG5vdCBzdXBwb3J0IHNlbmRpbmcgcGFja2V0cy4KKy5QUAorTm90ZSB0aGF0LCBvbiBzb21lIHBsYXRmb3JtcywgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIG9mIHRoZSBwYWNrZXQgdGhhdCdzCitzZW50IG1pZ2h0IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbGluay1sYXllciBoZWFkZXIgb2YgdGhlIHBhY2tldAorc3VwcGxpZWQgdG8KKy5CUiBwY2FwX2luamVjdCgpICwKK2FzIHRoZSBzb3VyY2UgbGluay1sYXllciBhZGRyZXNzLCBpZiB0aGUgaGVhZGVyIGNvbnRhaW5zIHN1Y2ggYW4KK2FkZHJlc3MsIG1pZ2h0IGJlIGNoYW5nZWQgdG8gYmUgdGhlIGFkZHJlc3MgYXNzaWduZWQgdG8gdGhlIGludGVyZmFjZSBvbgord2hpY2ggdGhlIHBhY2tldCBpdCBzZW50LCBpZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcKK2NvbXBsZXRlbHkgcmF3IGFuZCB1bmNoYW5nZWQgcGFja2V0cy4gIEV2ZW4gd29yc2UsIHNvbWUgZHJpdmVycyBvbiBzb21lCitwbGF0Zm9ybXMgbWlnaHQgY2hhbmdlIHRoZSBsaW5rLWxheWVyIHR5cGUgZmllbGQgdG8gd2hhdGV2ZXIgdmFsdWUKK2xpYnBjYXAgdXNlZCB3aGVuIGF0dGFjaGluZyB0byB0aGUgZGV2aWNlLCBldmVuIG9uIHBsYXRmb3JtcyB0aGF0CisuSSBkbworbm9taW5hbGx5IHN1cHBvcnQgc2VuZGluZyBjb21wbGV0ZWx5IHJhdyBhbmQgdW5jaGFuZ2VkIHBhY2tldHMuCisuUFAKKy5CIHBjYXBfc2VuZHBhY2tldCgpCitpcyBsaWtlCisuQlIgcGNhcF9pbmplY3QoKSAsCitidXQgaXQgcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIHJhdGhlciB0aGFuIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzCit3cml0dGVuLgorLlJCICggcGNhcF9pbmplY3QoKQorY29tZXMgZnJvbSBPcGVuQlNEOworLkIgcGNhcF9zZW5kcGFja2V0KCkKK2NvbWVzIGZyb20gV2luUGNhcC4gIEJvdGggYXJlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5LikKKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfaW5qZWN0KCkKK3JldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorLlBQCisuQiBwY2FwX3NlbmRwYWNrZXQoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorLlBQCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2lzX3N3YXBwZWQuM3BjYXAgYi9wY2FwX2lzX3N3YXBwZWQuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2NDZkMQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfaXNfc3dhcHBlZC4zcGNhcApAQCAtMCwwICsxLDUzIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2lzX3N3YXBwZWQuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0lTX1NXQVBQRUQgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2lzX3N3YXBwZWQgXC0gZmluZCBvdXQgd2hldGhlciBhIHNhdmVmaWxlIGhhcyB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9pc19zd2FwcGVkKHBjYXBfdCAqcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2lzX3N3YXBwZWQoKQorcmV0dXJucyB0cnVlICgxKSBpZgorLkkgcAorcmVmZXJzIHRvIGEgYGBzYXZlZmlsZScnIHRoYXQgdXNlcyBhIGRpZmZlcmVudCBieXRlIG9yZGVyCit0aGFuIHRoZSBjdXJyZW50IHN5c3RlbS4gIEZvciBhIGxpdmUgY2FwdHVyZSwgaXQgYWx3YXlzIHJldHVybnMgZmFsc2UKKygwKS4KKy5QUAorSXQgbXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgcGNhcCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkKKy5CIHBjYXBfY3JlYXRlKCkKK3RoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9kYXRhbGluaygpCityZXR1cm5zIHRydWUgKDEpIG9yIGZhbHNlICgwKSBvbiBzdWNjZXNzIGFuZAorLkIgUENBUF9FUlJPUl9OT1RfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IG5vdCBhY3RpdmF0ZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2xpYl92ZXJzaW9uLjNwY2FwIGIvcGNhcF9saWJfdmVyc2lvbi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM5YmUxCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9saWJfdmVyc2lvbi4zcGNhcApAQCAtMCwwICsxLDQxIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2xpYl92ZXJzaW9uLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9MSUJfVkVSU0lPTiAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfbGliX3ZlcnNpb24gXC0gZ2V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBsaWJwY2FwCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorY29uc3QgY2hhciAqcGNhcF9saWJfdmVyc2lvbih2b2lkKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfbGliX3ZlcnNpb24oKQorcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgZ2l2aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mCit0aGUgbGlicGNhcCBsaWJyYXJ5IGJlaW5nIHVzZWQ7IG5vdGUgdGhhdCBpdCBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uCit0aGFuIGp1c3QgYSB2ZXJzaW9uIG51bWJlci4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAuaW4gYi9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmIzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwLmluCkBAIC0wLDAgKzEsNzUgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAuaW4sdiAxLjEgMjAwOC0xMC0yMSAwNzozMzowMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0xJU1RfREFUQUxJTktTIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2xpc3RfZGF0YWxpbmtzLCBwY2FwX2ZyZWVfZGF0YWxpbmtzIFwtIGdldCBhIGxpc3Qgb2YgbGluay1sYXllciBoZWFkZXIKK3R5cGVzIHN1cHBvcnRlZCBieSBhIGNhcHR1cmUgZGV2aWNlLCBhbmQgZnJlZSB0aGF0IGxpc3QKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKnAsIGludCAqKmRsdF9idWYpOwordm9pZCBwY2FwX2ZyZWVfZGF0YWxpbmtzKGludCAqZGx0X2xpc3QpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9saXN0X2RhdGFsaW5rcygpCitpcyB1c2VkIHRvIGdldCBhIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBvZiB0aGUKK2ludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBjYXAgZGVzY3JpcHRvci4KKy5CIHBjYXBfbGlzdF9kYXRhbGlua3MoKQorYWxsb2NhdGVzIGFuIGFycmF5IHRvIGhvbGQgdGhlIGxpc3QgYW5kIHNldHMKKy5JUiAqZGx0X2J1ZiAKK3RvIHBvaW50IHRvIHRoYXQgYXJyYXkuCisuTFAKK1RoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGFycmF5IHdpdGgKKy5CUiBwY2FwX2ZyZWVfZGF0YWxpbmtzKCkgLAord2hpY2ggZnJlZXMgdGhlIGxpc3Qgb2YgbGluay1sYXllciBoZWFkZXIgdHlwZXMgcG9pbnRlZCB0byBieQorLklSIGRsdF9saXN0IC4KKy5MUAorSXQgbXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgcGNhcCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkKKy5CIHBjYXBfY3JlYXRlKCkKK3RoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9saXN0X2RhdGFsaW5rcygpCityZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluay1sYXllciBoZWFkZXIgdHlwZXMgaW4gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsCisuQiBQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBidXQgbm90IGFjdGl2YXRlZCwKK2FuZAorLkIgUENBUF9FUlJPUgorKFwtMSkgb24gb3RoZXIgZXJyb3JzLgorSWYKKy5CIFBDQVBfRVJST1IKK2lzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKSwKK3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoM1BDQVApLAorcGNhcC1saW5rdHlwZShATUFOX01JU0NfSU5GT0ApCmRpZmYgLS1naXQgYS9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwLmluIGIvcGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQzZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcC5pbgpAQCAtMCwwICsxLDcwIEBACisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9MSVNUX1RTVEFNUF9UWVBFUyAzUENBUCAiMjEgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcF9saXN0X3RzdGFtcF90eXBlcywgcGNhcF9mcmVlX3RzdGFtcF90eXBlcyBcLSBnZXQgYSBsaXN0IG9mIHRpbWUKK3N0YW1wIHR5cGVzIHN1cHBvcnRlZCBieSBhIGNhcHR1cmUgZGV2aWNlLCBhbmQgZnJlZSB0aGF0IGxpc3QKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9saXN0X3RzdGFtcF90eXBlcyhwY2FwX3QgKnAsIGludCAqKnRzdGFtcF90eXBlc3ApOwordm9pZCBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKGludCAqdHN0YW1wX3R5cGVzKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMoKQoraXMgdXNlZCB0byBnZXQgYSBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgdGltZSBzdGFtcCB0eXBlcyBvZiB0aGUgaW50ZXJmYWNlCithc3NvY2lhdGVkIHdpdGggdGhlIHBjYXAgZGVzY3JpcHRvci4KKy5CIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMoKQorYWxsb2NhdGVzIGFuIGFycmF5IHRvIGhvbGQgdGhlIGxpc3QgYW5kIHNldHMKKy5JICp0c3RhbXBfdHlwZXNwCit0byBwb2ludCB0byB0aGUgYXJyYXkuCitTZWUKKy5CUiBwY2FwLXRzdGFtcCAoQE1BTl9NSVNDX0lORk9AKQorZm9yIGEgbGlzdCBvZiBhbGwgdGhlIHRpbWUgc3RhbXAgdHlwZXMuCisuUFAKK1RoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGFycmF5IHdpdGgKKy5CUiBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKCkgLAord2hpY2ggZnJlZXMgdGhlIGxpc3QgcG9pbnRlZCB0byBieQorLklSIHRzdGFtcF90eXBlcyAuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKCkKK3JldHVybnMgdGhlIG51bWJlciBvZiB0aW1lIHN0YW1wIHR5cGVzIGluIHRoZSBhcnJheSBvbiBzdWNjZXNzIGFuZAorLkIgUENBUF9FUlJPUgorb24gZmFpbHVyZS4KK0EgcmV0dXJuIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhhdCB5b3UgY2Fubm90IHNwZWNpZnkgYSB0aW1lIHN0YW1wIHR5cGU7Cit5b3UgYXJlIGxpbWl0ZWQgdG8gdGhlIGNhcHR1cmUgZGV2aWNlJ3MgZGVmYXVsdCB0aW1lIHN0YW1wIHR5cGUuCitJZgorLkIgUENBUF9FUlJPUgoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApLCBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKDNQQ0FQKSwKK3BjYXAtdHN0YW1wKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL3BjYXBfbG9va3VwZGV2LjNwY2FwIGIvcGNhcF9sb29rdXBkZXYuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyM2NiOAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfbG9va3VwZGV2LjNwY2FwCkBAIC0wLDAgKzEsNjIgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfbG9va3VwZGV2LjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9MT09LVVBERVYgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2xvb2t1cGRldiBcLSBmaW5kIHRoZSBkZWZhdWx0IGRldmljZSBvbiB3aGljaCB0byBjYXB0dXJlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisubmYKKy5mdCBCCitjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKy5mdAorLkxQCisuZnQgQgorY2hhciAqcGNhcF9sb29rdXBkZXYoY2hhciAqZXJyYnVmKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfbG9va3VwZGV2KCkKK3JldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGdpdmluZyB0aGUgbmFtZSBvZiBhIG5ldHdvcmsgZGV2aWNlCitzdWl0YWJsZSBmb3IgdXNlIHdpdGgKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB3aXRoCisuQlIgcGNhcF9vcGVuX2xpdmUoKSAsCithbmQgd2l0aAorLkJSIHBjYXBfbG9va3VwbmV0KCkgLgorSWYgdGhlcmUgaXMgYW4gZXJyb3IsCisuQiBOVUxMCitpcyByZXR1cm5lZCBhbmQKKy5JIGVycmJ1ZgoraXMgZmlsbGVkIGluIHdpdGggYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS4KKy5JIGVycmJ1ZgoraXMgYXNzdW1lZCB0byBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QKKy5CIFBDQVBfRVJSQlVGX1NJWkUKK2NoYXJzLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfb3Blbl9saXZlKDNQQ0FQKSwgcGNhcF9sb29rdXBuZXQoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2xvb2t1cG5ldC4zcGNhcCBiL3BjYXBfbG9va3VwbmV0LjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzgyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2xvb2t1cG5ldC4zcGNhcApAQCAtMCwwICsxLDY1IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2xvb2t1cG5ldC4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfTE9PS1VQTkVUIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9sb29rdXBuZXQgXC0gZmluZCB0aGUgSVB2NCBuZXR3b3JrIG51bWJlciBhbmQgbmV0bWFzayBmb3IgYSBkZXZpY2UKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5uZgorLmZ0IEIKK2NoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9sb29rdXBuZXQoY29uc3QgY2hhciAqZGV2aWNlLCBicGZfdV9pbnQzMiAqbmV0cCwKKy50aSArOAorYnBmX3VfaW50MzIgKm1hc2twLCBjaGFyICplcnJidWYpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9sb29rdXBuZXQoKQoraXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIElQdjQgbmV0d29yayBudW1iZXIgYW5kIG1hc2sKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yayBkZXZpY2UKKy5JUiBkZXZpY2UgLgorQm90aAorLkkgbmV0cAorYW5kCisuSSBtYXNrcAorYXJlCisuSSBicGZfdV9pbnQzMgorcG9pbnRlcnMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2xvb2t1cG5ldCgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfbG9vcC4zcGNhcCBiL3BjYXBfbG9vcC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmJhMzNjCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9sb29wLjNwY2FwCkBAIC0wLDAgKzEsMTk0IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2xvb3AuM3BjYXAsdiAxLjQgMjAwOC0xMi0yNSAwMjowMTozMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0xPT1AgM1BDQVAgIjI0IERlY2VtYmVyIDIwMDgiCisuU0ggTkFNRQorcGNhcF9sb29wLCBwY2FwX2Rpc3BhdGNoIFwtIHByb2Nlc3MgcGFja2V0cyBmcm9tIGEgbGl2ZSBjYXB0dXJlIG9yIHNhdmVmaWxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgordHlwZWRlZiB2b2lkICgqcGNhcF9oYW5kbGVyKSh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKKy50aSArOAorCQkJICAgICBjb25zdCB1X2NoYXIgKmJ5dGVzKTsKKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfbG9vcChwY2FwX3QgKnAsIGludCBjbnQsCisudGkgKzgKK3BjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKTsKK2ludCBwY2FwX2Rpc3BhdGNoKHBjYXBfdCAqcCwgaW50IGNudCwKKy50aSArOAorcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9sb29wKCkKK3Byb2Nlc3NlcyBwYWNrZXRzIGZyb20gYSBsaXZlIGNhcHR1cmUgb3IgYGBzYXZlZmlsZScnIHVudGlsCisuSSBjbnQKK3BhY2tldHMgYXJlIHByb2Nlc3NlZCwgdGhlIGVuZCBvZiB0aGUgYGBzYXZlZmlsZScnIGlzCityZWFjaGVkIHdoZW4gcmVhZGluZyBmcm9tIGEgYGBzYXZlZmlsZScnLAorLkIgcGNhcF9icmVha2xvb3AoKQoraXMgY2FsbGVkLCBvciBhbiBlcnJvciBvY2N1cnMuCitJdCBkb2VzCisuQiBub3QKK3JldHVybiB3aGVuIGxpdmUgcmVhZCB0aW1lb3V0cyBvY2N1ci4KK0EgdmFsdWUgb2YgXC0xIG9yIDAgZm9yCisuSSBjbnQKK2lzIGVxdWl2YWxlbnQgdG8gaW5maW5pdHksIHNvIHRoYXQgcGFja2V0cyBhcmUgcHJvY2Vzc2VkIHVudGlsIGFub3RoZXIKK2VuZGluZyBjb25kaXRpb24gb2NjdXJzLgorLlBQCisuQiBwY2FwX2Rpc3BhdGNoKCkKK3Byb2Nlc3NlcyBwYWNrZXRzIGZyb20gYSBsaXZlIGNhcHR1cmUgb3IgYGBzYXZlZmlsZScnIHVudGlsCisuSSBjbnQKK3BhY2tldHMgYXJlIHByb2Nlc3NlZCwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXJmdWwgb2YgcGFja2V0cyBpcworcmVhY2hlZCB3aGVuIGRvaW5nIGEgbGl2ZSBjYXB0dXJlLCB0aGUgZW5kIG9mIHRoZSBgYHNhdmVmaWxlJycgaXMKK3JlYWNoZWQgd2hlbiByZWFkaW5nIGZyb20gYSBgYHNhdmVmaWxlJycsCisuQiBwY2FwX2JyZWFrbG9vcCgpCitpcyBjYWxsZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4KK1RodXMsIHdoZW4gZG9pbmcgYSBsaXZlIGNhcHR1cmUsCisuSSBjbnQKK2lzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIHByb2Nlc3MgYmVmb3JlIHJldHVybmluZywgYnV0IGlzIG5vdAorYSBtaW5pbXVtIG51bWJlcjsgd2hlbiByZWFkaW5nIGEgbGl2ZSBjYXB0dXJlLCBvbmx5IG9uZQorYnVmZmVyZnVsIG9mIHBhY2tldHMgaXMgcmVhZCBhdCBhIHRpbWUsIHNvIGZld2VyIHRoYW4KKy5JIGNudAorcGFja2V0cyBtYXkgYmUgcHJvY2Vzc2VkLiBBIHZhbHVlIG9mIFwtMSBvciAwIGZvcgorLkkgY250CitjYXVzZXMgYWxsIHRoZSBwYWNrZXRzIHJlY2VpdmVkIGluIG9uZSBidWZmZXIgdG8gYmUgcHJvY2Vzc2VkIHdoZW4KK3JlYWRpbmcgYSBsaXZlIGNhcHR1cmUsIGFuZCBjYXVzZXMgYWxsIHRoZSBwYWNrZXRzIGluIHRoZSBmaWxlIHRvIGJlCitwcm9jZXNzZWQgd2hlbiByZWFkaW5nIGEgYGBzYXZlZmlsZScnLgorLlBQCisuZnQgQgorKEluIG9sZGVyIHZlcnNpb25zIG9mIGxpYnBjYXAsIHRoZSBiZWhhdmlvciB3aGVuCitcZkljbnRcZlAKK3dhcyAwIHdhcyB1bmRlZmluZWQ7IGRpZmZlcmVudCBwbGF0Zm9ybXMgYW5kIGRldmljZXMgYmVoYXZlZAorZGlmZmVyZW50bHksIHNvIGNvZGUgdGhhdCBtdXN0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBsaWJwY2FwCitzaG91bGQgdXNlIFwtMSwgbm90IDAsIGFzIHRoZSB2YWx1ZSBvZgorXGZJY250XGZQLikKKy5mdCBSCisuUFAKKy5JIGNhbGxiYWNrCitzcGVjaWZpZXMgYQorLkkgcGNhcF9oYW5kbGVyCityb3V0aW5lIHRvIGJlIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKK2EKKy5JIHVfY2hhcgorcG9pbnRlciB3aGljaCBpcyBwYXNzZWQgaW4gdGhlCisuSSB1c2VyCithcmd1bWVudCB0bworLkIgcGNhcF9sb29wKCkKK29yCisuQlIgcGNhcF9kaXNwYXRjaCgpICwKK2EKKy5JIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkcgorcG9pbnRlciBwb2ludGluZyB0byB0aGUgcGFja2V0IHRpbWUgc3RhbXAgYW5kIGxlbmd0aHMsIGFuZCBhCisuSSBjb25zdCB1X2NoYXIKK3BvaW50ZXIgdG8gdGhlIGZpcnN0CisuQiBjYXBsZW4KKyhhcyBnaXZlbiBpbiB0aGUKKy5JIHN0cnVjdCBwY2FwX3BrdGhkcgorYSBwb2ludGVyIHRvIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgcm91dGluZSkKK2J5dGVzIG9mIGRhdGEgZnJvbSB0aGUgcGFja2V0LiAgVGhlCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK2FuZCB0aGUgcGFja2V0IGRhdGEgYXJlIG5vdCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGJhY2sgcm91dGluZSwgYW5kIGFyZQorbm90IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIHJvdXRpbmUgcmV0dXJuczsgaWYgdGhlCitjb2RlIG5lZWRzIHRoZW0gdG8gYmUgdmFsaWQgYWZ0ZXIgdGhlIGNhbGxiYWNrLCBpdCBtdXN0IG1ha2UgYSBjb3B5IG9mCit0aGVtLgorLlBQCitUaGUgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBwYWNrZXQgYmVnaW4gd2l0aCBhIGxpbmstbGF5ZXIgaGVhZGVyLiAgVGhlCitmb3JtYXQgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGlzIGluZGljYXRlZCBieSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQorLkIgcGNhcF9kYXRhbGluaygpCityb3V0aW5lIHdoZW4gaGFuZGVkIHRoZQorLkIgcGNhcF90Cit2YWx1ZSBhbHNvIHBhc3NlZCB0bworLkIgcGNhcF9sb29wKCkKK29yCisuQlIgcGNhcF9kaXNwYXRjaCgpIC4KKy5JIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvbGlua3R5cGVzLmh0bWwKK2xpc3RzIHRoZSB2YWx1ZXMKKy5CIHBjYXBfZGF0YWxpbmsoKQorY2FuIHJldHVybiBhbmQgZGVzY3JpYmVzIHRoZSBwYWNrZXQgZm9ybWF0cyB0aGF0Citjb3JyZXNwb25kIHRvIHRob3NlIHZhbHVlcy4gIFRoZSB2YWx1ZSBpdCByZXR1cm5zIHdpbGwgYmUgdmFsaWQgZm9yIGFsbAorcGFja2V0cyByZWNlaXZlZCB1bmxlc3MgYW5kIHVudGlsCisuQiBwY2FwX3NldF9kYXRhbGluaygpCitpcyBjYWxsZWQ7IGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCisuQlIgcGNhcF9zZXRfZGF0YWxpbmsoKSAsCithbGwgc3Vic2VxdWVudCBwYWNrZXRzIHdpbGwgaGF2ZSBhIGxpbmstbGF5ZXIgaGVhZGVyIG9mIHRoZSB0eXBlCitzcGVjaWZpZWQgYnkgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUgcGFzc2VkIHRvCisuQlIgcGNhcF9zZXRfZGF0YWxpbmsoKSAuCisuUFAKK0RvCisuQiBOT1QKK2Fzc3VtZSB0aGF0IHRoZSBwYWNrZXRzIGZvciBhIGdpdmVuIGNhcHR1cmUgb3IgYGBzYXZlZmlsZWBgIHdpbGwgaGF2ZQorYW55IGdpdmVuIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUsIHN1Y2ggYXMKKy5CIERMVF9FTjEwTUIKK2ZvciBFdGhlcm5ldC4gIEZvciBleGFtcGxlLCB0aGUgImFueSIgZGV2aWNlIG9uIExpbnV4IHdpbGwgaGF2ZSBhCitsaW5rLWxheWVyIGhlYWRlciB0eXBlIG9mCisuQiBETFRfTElOVVhfU0xMCitldmVuIGlmIGFsbCBkZXZpY2VzIG9uIHRoZSBzeXN0ZW0gYXQgdGhlIHRpbWUgdGhlICJhbnkiIGRldmljZSBpcyBvcGVuZWQKK2hhdmUgc29tZSBvdGhlciBkYXRhIGxpbmsgdHlwZSwgc3VjaCBhcworLkIgRExUX0VOMTBNQgorZm9yIEV0aGVybmV0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9sb29wKCkKK3JldHVybnMgMCBpZgorLkkgY250CitpcyBleGhhdXN0ZWQgb3IgaWYsIHdoZW4gcmVhZGluZyBmcm9tIGEgYGBzYXZlZmlsZScnLCBubyBtb3JlIHBhY2tldHMKK2FyZSBhdmFpbGFibGUuICBJdCByZXR1cm5zIFwtMSBpZiBhbiBlcnJvciBvY2N1cnMgb3IgXC0yIGlmIHRoZSBsb29wCit0ZXJtaW5hdGVkIGR1ZSB0byBhIGNhbGwgdG8KKy5CIHBjYXBfYnJlYWtsb29wKCkKK2JlZm9yZSBhbnkgcGFja2V0cyB3ZXJlIHByb2Nlc3NlZC4KK0l0IGRvZXMKKy5CIG5vdAorcmV0dXJuIHdoZW4gbGl2ZSByZWFkIHRpbWVvdXRzIG9jY3VyOyBpbnN0ZWFkLCBpdCBhdHRlbXB0cyB0byByZWFkIG1vcmUKK3BhY2tldHMuCisuUFAKKy5CIHBjYXBfZGlzcGF0Y2goKQorcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcHJvY2Vzc2VkIG9uIHN1Y2Nlc3M7IHRoaXMgY2FuIGJlIDAgaWYgbm8KK3BhY2tldHMgd2VyZSByZWFkIGZyb20gYSBsaXZlIGNhcHR1cmUgKGlmLCBmb3IgZXhhbXBsZSwgdGhleSB3ZXJlCitkaXNjYXJkZWQgYmVjYXVzZSB0aGV5IGRpZG4ndCBwYXNzIHRoZSBwYWNrZXQgZmlsdGVyLCBvciBpZiwgb24KK3BsYXRmb3JtcyB0aGF0IHN1cHBvcnQgYSByZWFkIHRpbWVvdXQgdGhhdCBzdGFydHMgYmVmb3JlIGFueSBwYWNrZXRzCithcnJpdmUsIHRoZSB0aW1lb3V0IGV4cGlyZXMgYmVmb3JlIGFueSBwYWNrZXRzIGFycml2ZSwgb3IgaWYgdGhlIGZpbGUKK2Rlc2NyaXB0b3IgZm9yIHRoZSBjYXB0dXJlIGRldmljZSBpcyBpbiBub24tYmxvY2tpbmcgbW9kZSBhbmQgbm8gcGFja2V0cword2VyZSBhdmFpbGFibGUgdG8gYmUgcmVhZCkgb3IgaWYgbm8gbW9yZSBwYWNrZXRzIGFyZSBhdmFpbGFibGUgaW4gYQorYGBzYXZlZmlsZS4nJyAgSXQgcmV0dXJucyBcLTEgaWYgYW4gZXJyb3Igb2NjdXJzIG9yIFwtMiBpZiB0aGUgbG9vcAordGVybWluYXRlZCBkdWUgdG8gYSBjYWxsIHRvCisuQiBwY2FwX2JyZWFrbG9vcCgpCitiZWZvcmUgYW55IHBhY2tldHMgd2VyZSBwcm9jZXNzZWQuCisuZnQgQgorSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHBjYXBfYnJlYWtsb29wKCksCittYWtlIHN1cmUgdGhhdCB5b3UgZXhwbGljaXRseSBjaGVjayBmb3IgXC0xIGFuZCBcLTIsIHJhdGhlciB0aGFuIGp1c3QKK2NoZWNraW5nIGZvciBhIHJldHVybiB2YWx1ZSA8IDAuCisuZnQgUgorLlBQCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApLCBwY2FwX2JyZWFrbG9vcCgzUENBUCksCitwY2FwX2RhdGFsaW5rKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9tYWpvcl92ZXJzaW9uLjNwY2FwIGIvcGNhcF9tYWpvcl92ZXJzaW9uLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTAzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX21ham9yX3ZlcnNpb24uM3BjYXAKQEAgLTAsMCArMSw1NiBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9tYWpvcl92ZXJzaW9uLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9NQUpPUl9WRVJTSU9OIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9tYWpvcl92ZXJzaW9uLCBwY2FwX21pbm9yX3ZlcnNpb24gXC0gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIHNhdmVmaWxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKnApOworaW50IHBjYXBfbWlub3JfdmVyc2lvbihwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorSWYKKy5JIHAKK3JlZmVycyB0byBhIGBgc2F2ZWZpbGUnJywKKy5CIHBjYXBfbWFqb3JfdmVyc2lvbigpCityZXR1cm5zIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0IG9mIHRoZSBgYHNhdmVmaWxlJycgYW5kCisuQiBwY2FwX21pbm9yX3ZlcnNpb24oKQorcmV0dXJucyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgYGBzYXZlZmlsZScnLiAgVGhlCit2ZXJzaW9uIG51bWJlciBpcyBzdG9yZWQgaW4gdGhlIGBgc2F2ZWZpbGUnJzsgbm90ZSB0aGF0IHRoZSBtZWFuaW5nIG9mCitpdHMgdmFsdWVzIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgYGBzYXZlZmlsZScnIChmb3IgZXhhbXBsZSwgcGNhcCBvcgorcGNhcC1ORykuCisuUFAKK0lmCisuSSBwCityZWZlcnMgdG8gYSBsaXZlIGNhcHR1cmUsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKKy5CIHBjYXBfbWFqb3JfdmVyc2lvbigpCithbmQKKy5CIHBjYXBfbWlub3JfdmVyc2lvbigpCithcmUgbm90IG1lYW5pbmdmdWwuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX25leHRfZXguM3BjYXAgYi9wY2FwX25leHRfZXguM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlNDY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfbmV4dF9leC4zcGNhcApAQCAtMCwwICsxLDE0MyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9uZXh0X2V4LjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9ORVhUX0VYIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9uZXh0X2V4LCBwY2FwX25leHQgXC0gcmVhZCB0aGUgbmV4dCBwYWNrZXQgZnJvbSBhIHBjYXBfdAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX25leHRfZXgocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKipwa3RfaGVhZGVyLAorLnRpICs4Citjb25zdCB1X2NoYXIgKipwa3RfZGF0YSk7Citjb25zdCB1X2NoYXIgKnBjYXBfbmV4dChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3BrdGhkciAqaCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX25leHRfZXgoKQorcmVhZHMgdGhlIG5leHQgcGFja2V0IGFuZCByZXR1cm5zIGEgc3VjY2Vzcy9mYWlsdXJlIGluZGljYXRpb24uCitJZiB0aGUgcGFja2V0IHdhcyByZWFkIHdpdGhvdXQgcHJvYmxlbXMsIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlCisuSSBwa3RfaGVhZGVyCithcmd1bWVudCBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlCisuSSBwY2FwX3BrdGhkcgorc3RydWN0IGZvciB0aGUgcGFja2V0LCBhbmQgdGhlCitwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlCisuSSBwa3RfZGF0YQorYXJndW1lbnQgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBkYXRhIGluIHRoZSBwYWNrZXQuICBUaGUKKy5JIHN0cnVjdCBwY2FwX3BrdGhkcgorYW5kIHRoZSBwYWNrZXQgZGF0YSBhcmUgbm90IHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBhcmUgbm90CitndWFyYW50ZWVkIHRvIGJlIHZhbGlkIGFmdGVyIHRoZSBuZXh0IGNhbGwgdG8KKy5CUiBwY2FwX25leHRfZXgoKSAsCisuQlIgcGNhcF9uZXh0KCkgLAorLkJSIHBjYXBfbG9vcCgpICwKK29yCisuQlIgcGNhcF9kaXNwYXRjaCgpIDsKK2lmIHRoZSBjb2RlIG5lZWRzIHRoZW0gdG8gcmVtYWluIHZhbGlkLCBpdCBtdXN0IG1ha2UgYSBjb3B5IG9mIHRoZW0uCisuUFAKKy5CIHBjYXBfbmV4dCgpCityZWFkcyB0aGUgbmV4dCBwYWNrZXQgKGJ5IGNhbGxpbmcKKy5CIHBjYXBfZGlzcGF0Y2goKQord2l0aCBhCisuSSBjbnQKK29mIDEpIGFuZCByZXR1cm5zIGEKKy5JIHVfY2hhcgorcG9pbnRlciB0byB0aGUgZGF0YSBpbiB0aGF0IHBhY2tldC4gIFRoZQorcGFja2V0IGRhdGEgaXMgbm90IHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBpcyBub3QKK2d1YXJhbnRlZWQgdG8gYmUgdmFsaWQgYWZ0ZXIgdGhlIG5leHQgY2FsbCB0bworLkJSIHBjYXBfbmV4dF9leCgpICwKKy5CUiBwY2FwX25leHQoKSAsCisuQlIgcGNhcF9sb29wKCkgLAorb3IKKy5CUiBwY2FwX2Rpc3BhdGNoKCkgOworaWYgdGhlIGNvZGUgbmVlZHMgaXQgdG8gcmVtYWluIHZhbGlkLCBpdCBtdXN0IG1ha2UgYSBjb3B5IG9mIGl0LgorVGhlCisuSSBwY2FwX3BrdGhkcgorc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkKKy5JIGgKK2lzIGZpbGxlZCBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBwYWNrZXQuCisuUFAKK1RoZSBieXRlcyBvZiBkYXRhIGZyb20gdGhlIHBhY2tldCBiZWdpbiB3aXRoIGEgbGluay1sYXllciBoZWFkZXIuICBUaGUKK2Zvcm1hdCBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgaW5kaWNhdGVkIGJ5IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCisuQiBwY2FwX2RhdGFsaW5rKCkKK3JvdXRpbmUgd2hlbiBoYW5kZWQgdGhlCisuQiBwY2FwX3QKK3ZhbHVlIGFsc28gcGFzc2VkIHRvCisuQiBwY2FwX2xvb3AoKQorb3IKKy5CUiBwY2FwX2Rpc3BhdGNoKCkgLgorLkkgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbAorbGlzdHMgdGhlIHZhbHVlcworLkIgcGNhcF9kYXRhbGluaygpCitjYW4gcmV0dXJuIGFuZCBkZXNjcmliZXMgdGhlIHBhY2tldCBmb3JtYXRzIHRoYXQKK2NvcnJlc3BvbmQgdG8gdGhvc2UgdmFsdWVzLiAgVGhlIHZhbHVlIGl0IHJldHVybnMgd2lsbCBiZSB2YWxpZCBmb3IgYWxsCitwYWNrZXRzIHJlY2VpdmVkIHVubGVzcyBhbmQgdW50aWwKKy5CIHBjYXBfc2V0X2RhdGFsaW5rKCkKK2lzIGNhbGxlZDsgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8KKy5CUiBwY2FwX3NldF9kYXRhbGluaygpICwKK2FsbCBzdWJzZXF1ZW50IHBhY2tldHMgd2lsbCBoYXZlIGEgbGluay1sYXllciBoZWFkZXIgb2YgdGhlIHR5cGUKK3NwZWNpZmllZCBieSB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSB2YWx1ZSBwYXNzZWQgdG8KKy5CUiBwY2FwX3NldF9kYXRhbGluaygpIC4KKy5QUAorRG8KKy5CIE5PVAorYXNzdW1lIHRoYXQgdGhlIHBhY2tldHMgZm9yIGEgZ2l2ZW4gY2FwdHVyZSBvciBgYHNhdmVmaWxlYGAgd2lsbCBoYXZlCithbnkgZ2l2ZW4gbGluay1sYXllciBoZWFkZXIgdHlwZSwgc3VjaCBhcworLkIgRExUX0VOMTBNQgorZm9yIEV0aGVybmV0LiAgRm9yIGV4YW1wbGUsIHRoZSAiYW55IiBkZXZpY2Ugb24gTGludXggd2lsbCBoYXZlIGEKK2xpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb2YKKy5CIERMVF9MSU5VWF9TTEwKK2V2ZW4gaWYgYWxsIGRldmljZXMgb24gdGhlIHN5c3RlbSBhdCB0aGUgdGltZSB0aGUgImFueSIgZGV2aWNlIGlzIG9wZW5lZAoraGF2ZSBzb21lIG90aGVyIGRhdGEgbGluayB0eXBlLCBzdWNoIGFzCisuQiBETFRfRU4xME1CCitmb3IgRXRoZXJuZXQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX25leHRfZXgoKQorcmV0dXJucyAxIGlmIHRoZSBwYWNrZXQgd2FzIHJlYWQgd2l0aG91dCBwcm9ibGVtcywgMAoraWYgcGFja2V0cyBhcmUgYmVpbmcgcmVhZCBmcm9tIGEgbGl2ZSBjYXB0dXJlIGFuZCB0aGUgdGltZW91dCBleHBpcmVkLAorXC0xIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIHBhY2tldCwgYW5kIFwtMiBpZgorcGFja2V0cyBhcmUgYmVpbmcgcmVhZCBmcm9tIGEgYGBzYXZlZmlsZScnIGFuZCB0aGVyZSBhcmUgbm8gbW9yZQorcGFja2V0cyB0byByZWFkIGZyb20gdGhlIHNhdmVmaWxlLgorSWYgXC0xIGlzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5QUAorLkIgcGNhcF9uZXh0KCkKK3JldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQgZGF0YSBvbiBzdWNjZXNzLCBhbmQgcmV0dXJucworLkIgTlVMTAoraWYgYW4gZXJyb3Igb2NjdXJyZWQsIG9yIGlmIG5vIHBhY2tldHMgd2VyZSByZWFkIGZyb20gYSBsaXZlCitjYXB0dXJlIChpZiwgZm9yIGV4YW1wbGUsIHRoZXkgd2VyZSBkaXNjYXJkZWQgYmVjYXVzZSB0aGV5IGRpZG4ndCBwYXNzCit0aGUgcGFja2V0IGZpbHRlciwgb3IgaWYsIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgYSByZWFkIHRpbWVvdXQgdGhhdAorc3RhcnRzIGJlZm9yZSBhbnkgcGFja2V0cyBhcnJpdmUsIHRoZSB0aW1lb3V0IGV4cGlyZXMgYmVmb3JlIGFueSBwYWNrZXRzCithcnJpdmUsIG9yIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjYXB0dXJlIGRldmljZSBpcyBpbgorbm9uLWJsb2NraW5nIG1vZGUgYW5kIG5vIHBhY2tldHMgd2VyZSBhdmFpbGFibGUgdG8gYmUgcmVhZCksIG9yIGlmIG5vCittb3JlIHBhY2tldHMgYXJlIGF2YWlsYWJsZSBpbiBhIGBgc2F2ZWZpbGUuJycgIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzCitubyB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJyZWQgb3Igbm90LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApLCBwY2FwX2Rpc3BhdGNoKDNQQ0FQKSwKK3BjYXBfZGF0YWxpbmsoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX29mZmxpbmVfZmlsdGVyLjNwY2FwIGIvcGNhcF9vZmZsaW5lX2ZpbHRlci4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjExMDIyCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9vZmZsaW5lX2ZpbHRlci4zcGNhcApAQCAtMCwwICsxLDU3IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX29mZmxpbmVfZmlsdGVyLjNwY2FwLHYgMS4xIDIwMDgtMDUtMTMgMTU6MTk6NTYgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9PRkZMSU5FX0ZJTFRFUiAzUENBUCAiMTMgTWF5IDIwMDgiCisuU0ggTkFNRQorcGNhcF9vZmZsaW5lX2ZpbHRlciBcLSBjaGVjayB3aGV0aGVyIGEgZmlsdGVyIG1hdGNoZXMgYSBwYWNrZXQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9vZmZsaW5lX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwLAorLnRpICs4Citjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcGt0KQorLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9vZmZsaW5lX2ZpbHRlcigpCitjaGVja3Mgd2hldGhlciBhIGZpbHRlciBtYXRjaGVzIGEgcGFja2V0LgorLkkgZnAKK2lzIGEgcG9pbnRlciB0byBhCisuSSBicGZfcHJvZ3JhbQorc3RydWN0LCB1c3VhbGx5IHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCisuQlIgcGNhcF9jb21waWxlKCkgLgorLkkgaAorcG9pbnRzIHRvIHRoZQorLkkgcGNhcF9wa3RoZHIKK3N0cnVjdHVyZSBmb3IgdGhlIHBhY2tldCwgYW5kCisuSSBwa3QKK3BvaW50cyB0byB0aGUgZGF0YSBpbiB0aGUgcGFja2V0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9vZmZsaW5lX2ZpbHRlcigpCityZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpbHRlciBwcm9ncmFtLiAgVGhpcyB3aWxsIGJlIHplcm8gaWYKK3RoZSBwYWNrZXQgZG9lc24ndCBtYXRjaCB0aGUgZmlsdGVyIGFuZCBub24temVybyBpZiB0aGUgcGFja2V0IG1hdGNoZXMKK3RoZSBmaWx0ZXIuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2NvbXBpbGUoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbiBiL3BjYXBfb3Blbl9kZWFkLjNwY2FwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjk0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbgpAQCAtMCwwICsxLDgxIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbix2IDEuMSAyMDA4LTEwLTIxIDA3OjMzOjAyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfT1BFTl9ERUFEIDNQQ0FQICIxIEp1bHkgMjAxMyIKKy5TSCBOQU1FCitwY2FwX29wZW5fZGVhZCwgcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uIFwtIG9wZW4gYSBmYWtlCitwY2FwX3QgZm9yIGNvbXBpbGluZyBmaWx0ZXJzIG9yIG9wZW5pbmcgYSBjYXB0dXJlIGZvciBvdXRwdXQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitwY2FwX3QgKnBjYXBfb3Blbl9kZWFkKGludCBsaW5rdHlwZSwgaW50IHNuYXBsZW4pOworcGNhcF90ICpwY2FwX29wZW5fZGVhZF93aXRoX3RzdGFtcF9wcmVjaXNpb24oaW50IGxpbmt0eXBlLCBpbnQgc25hcGxlbiwKKyAgICB1X2ludCBwcmVjaXNpb24pOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLlBQCisuQiBwY2FwX29wZW5fZGVhZCgpCithbmQKKy5CIHBjYXBfb3Blbl9kZWFkX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpCithcmUgdXNlZCBmb3IgY3JlYXRpbmcgYQorLkIgcGNhcF90CitzdHJ1Y3R1cmUgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgb3RoZXIgZnVuY3Rpb25zIGluIGxpYnBjYXAuICBJdCBpcwordHlwaWNhbGx5IHVzZWQgd2hlbiBqdXN0IHVzaW5nIGxpYnBjYXAgZm9yIGNvbXBpbGluZyBCUEYgY29kZTsgaXQgY2FuCithbHNvIGJlIHVzZWQgaWYgdXNpbmcKKy5CUiBwY2FwX2R1bXBfb3BlbigpICwKKy5CUiBwY2FwX2R1bXAoKSAsCithbmQKKy5CIHBjYXBfZHVtcF9jbG9zZSgpCit0byB3cml0ZSBhIHNhdmVmaWxlIGlmIHRoZXJlIGlzIG5vCisuQiBwY2FwX3QKK3RoYXQgc3VwcGxpZXMgdGhlIHBhY2tldHMgdG8gYmUgd3JpdHRlbi4KKy5QUAorLkkgbGlua3R5cGUKK3NwZWNpZmllcyB0aGUgbGluay1sYXllciB0eXBlIGZvciB0aGUKKy5CUiBwY2FwX3QgLgorLlBQCisuSSBzbmFwbGVuCitzcGVjaWZpZXMgdGhlIHNuYXBzaG90IGxlbmd0aCBmb3IgdGhlCisuQlIgcGNhcF90IC4KKy5QUAorV2hlbgorLkJSIHBjYXBfb3Blbl9kZWFkX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpICwKK2lzIHVzZWQgdG8gY3JlYXRlIGEKKy5CIHBjYXBfdAorZm9yIHVzZSB3aXRoCisuQlIgcGNhcF9kdW1wX29wZW4oKSAsCisuSSBwcmVjaXNpb24KK3NwZWNpZmllcyB0aGUgdGltZSBzdGFtcCBwcmVjaXNpb24gZm9yIHBhY2tldHM7CisuQiBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8KK3Nob3VsZCBiZSBzcGVjaWZpZWQgaWYgdGhlIHBhY2tldHMgdG8gYmUgd3JpdHRlbiBoYXZlIHRpbWUgc3RhbXBzIGluCitzZWNvbmRzIGFuZCBtaWNyb3NlY29uZHMsIGFuZAorLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8KK3Nob3VsZCBiZSBzcGVjaWZpZWQgaWYgdGhlIHBhY2tldHMgdG8gYmUgd3JpdHRlbiBoYXZlIHRpbWUgc3RhbXBzIGluCitzZWNvbmRzIGFuZCBuYW5vc2Vjb25kcy4gIEl0cyB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QKKy5CUiBwY2FwX2NvbXBpbGUoKSAuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2NvbXBpbGUoM1BDQVApLCBwY2FwX2R1bXBfb3BlbigzUENBUCksCitwY2FwLWxpbmt0eXBlKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL3BjYXBfb3Blbl9saXZlLjNwY2FwIGIvcGNhcF9vcGVuX2xpdmUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4OWEyYQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfb3Blbl9saXZlLjNwY2FwCkBAIC0wLDAgKzEsODkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfb3Blbl9saXZlLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9PUEVOX0xJVkUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX29wZW5fbGl2ZSBcLSBvcGVuIGEgZGV2aWNlIGZvciBjYXB0dXJpbmcKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5uZgorLmZ0IEIKK2NoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworLmZ0CisuTFAKKy5mdCBCCitwY2FwX3QgKnBjYXBfb3Blbl9saXZlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHNuYXBsZW4sCisudGkgKzgKK2ludCBwcm9taXNjLCBpbnQgdG9fbXMsIGNoYXIgKmVycmJ1Zik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX29wZW5fbGl2ZSgpCitpcyB1c2VkIHRvIG9idGFpbiBhIHBhY2tldCBjYXB0dXJlIGhhbmRsZSB0byBsb29rCithdCBwYWNrZXRzIG9uIHRoZSBuZXR3b3JrLgorLkkgZGV2aWNlCitpcyBhIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdG8gb3Blbjsgb24gTGludXggc3lzdGVtcword2l0aCAyLjIgb3IgbGF0ZXIga2VybmVscywgYQorLkkgZGV2aWNlCithcmd1bWVudCBvZiAiYW55IiBvcgorLkIgTlVMTAorY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSBwYWNrZXRzIGZyb20gYWxsIGludGVyZmFjZXMuCisuUFAKKy5JIHNuYXBsZW4KK3NwZWNpZmllcyB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIGJlIHNldCBvbiB0aGUgaGFuZGxlLgorLlBQCisuSSBwcm9taXNjCitzcGVjaWZpZXMgaWYgdGhlIGludGVyZmFjZSBpcyB0byBiZSBwdXQgaW50byBwcm9taXNjdW91cyBtb2RlLgorLlBQCisuSSB0b19tcworc3BlY2lmaWVzIHRoZSByZWFkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9vcGVuX2xpdmUoKQorcmV0dXJucyBhCisuSSBwY2FwX3QgKgorb24gc3VjY2VzcyBhbmQKKy5CIE5VTEwKK29uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK21heSBhbHNvIGJlIHNldCB0byB3YXJuaW5nIHRleHQgd2hlbgorLkIgcGNhcF9vcGVuX2xpdmUoKQorc3VjY2VlZHM7IHRvIGRldGVjdCB0aGlzIGNhc2UgdGhlIGNhbGxlciBzaG91bGQgc3RvcmUgYSB6ZXJvLWxlbmd0aCBzdHJpbmcgaW4KKy5JIGVycmJ1ZgorYmVmb3JlIGNhbGxpbmcKKy5CIHBjYXBfb3Blbl9saXZlKCkKK2FuZCBkaXNwbGF5IHRoZSB3YXJuaW5nIHRvIHRoZSB1c2VyIGlmCisuSSBlcnJidWYKK2lzIG5vIGxvbmdlciBhIHplcm8tbGVuZ3RoIHN0cmluZy4KKy5JIGVycmJ1ZgoraXMgYXNzdW1lZCB0byBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QKKy5CIFBDQVBfRVJSQlVGX1NJWkUKK2NoYXJzLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAuaW4gYi9wY2FwX29wZW5fb2ZmbGluZS4zcGNhcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzg2MDhkCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAuaW4KQEAgLTAsMCArMSwxMTEgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwLmluLHYgMS4xIDIwMDgtMTAtMjMgMDU6NTY6NTkgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9PUEVOX09GRkxJTkUgM1BDQVAgIjEgSnVseSAyMDEzIgorLlNIIE5BTUUKK3BjYXBfb3Blbl9vZmZsaW5lLCBwY2FwX29wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24sCitwY2FwX2ZvcGVuX29mZmxpbmUsIHBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24gXC0gb3BlbiBhIHNhdmVkIGNhcHR1cmUgZmlsZSBmb3IgcmVhZGluZworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLm5mCisuZnQgQgorY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07CisuZnQKKy5MUAorLmZ0IEIKK3BjYXBfdCAqcGNhcF9vcGVuX29mZmxpbmUoY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKmVycmJ1Zik7CitwY2FwX3QgKnBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihjb25zdCBjaGFyICpmbmFtZSwKKyAgICB1X2ludCBwcmVjaXNpb24sIGNoYXIgKmVycmJ1Zik7CitwY2FwX3QgKnBjYXBfZm9wZW5fb2ZmbGluZShGSUxFICpmcCwgY2hhciAqZXJyYnVmKTsKK3BjYXBfdCAqcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihGSUxFICpmcCwKKyAgICB1X2ludCBwcmVjaXNpb24sIGNoYXIgKmVycmJ1Zik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX29wZW5fb2ZmbGluZSgpCithbmQKKy5CIHBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpCithcmUgY2FsbGVkIHRvIG9wZW4gYSBgYHNhdmVmaWxlJycgZm9yIHJlYWRpbmcuCisuUFAKKy5JIGZuYW1lCitzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3Blbi4gVGhlIGZpbGUgY2FuIGhhdmUgdGhlIHBjYXAgZmlsZQorZm9ybWF0IGFzIGRlc2NyaWJlZCBpbgorLkJSIHBjYXAtc2F2ZWZpbGUgKEBNQU5fRklMRV9GT1JNQVRTQCksCit3aGljaCBpcyB0aGUgZmlsZSBmb3JtYXQgdXNlZCBieSwgYW1vbmcgb3RoZXIgcHJvZ3JhbXMsCisuQlIgdGNwZHVtcCAoMSkKK2FuZAorLkJSIHRjcHNsaWNlICgxKSwKK29yIGNhbiBoYXZlIHRoZSBwY2FwLW5nIGZpbGUgZm9ybWF0LCBhbHRob3VnaCBub3QgYWxsIHBjYXAtbmcgZmlsZXMgY2FuCitiZSByZWFkLgorVGhlIG5hbWUgIi0iIGluIGEgc3lub255bSBmb3IKKy5CUiBzdGRpbiAuCisuUFAKKy5CIHBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpCit0YWtlcyBhbiBhZGRpdGlvbmFsCisuSSBwcmVjaXNpb24KK2FyZ3VtZW50IHNwZWNpZnlpbmcgdGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uIGRlc2lyZWQ7CitpZgorLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPCitpcyBzcGVjaWZpZWQsIHBhY2tldCB0aW1lIHN0YW1wcyB3aWxsIGJlIHN1cHBsaWVkIGluIHNlY29uZHMgYW5kCittaWNyb3NlY29uZHMsCithbmQgaWYKKy5CIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5PCitpcyBzcGVjaWZpZWQsIHBhY2tldCB0aW1lIHN0YW1wcyB3aWxsIGJlIHN1cHBsaWVkIGluIHNlY29uZHMgYW5kCituYW5vc2Vjb25kcy4gIElmIHRoZSB0aW1lIHN0YW1wcyBpbiB0aGUgZmlsZSBkbyBub3QgaGF2ZSB0aGUgc2FtZQorcHJlY2lzaW9uIGFzIHRoZSByZXF1ZXN0ZWQgcHJlY2lzaW9uLCB0aGV5IHdpbGwgYmUgc2NhbGVkIHVwIG9yIGRvd24gYXMKK25lY2Vzc2FyeSBiZWZvcmUgYmVpbmcgc3VwcGxpZWQuCisuUFAKK0FsdGVybmF0aXZlbHksIHlvdSBtYXkgY2FsbAorLkIgcGNhcF9mb3Blbl9vZmZsaW5lKCkKK29yCisuQiBwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKCkKK3RvIHJlYWQgZHVtcGVkIGRhdGEgZnJvbSBhbiBleGlzdGluZyBvcGVuIHN0cmVhbQorLklSIGZwIC4KKy5CIHBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oKSB0YWtlcyBhbiBhZGRpdGlvbmFsCisuSSBwcmVjaXNpb24KK2FyZ3VtZW50IGFzIGRlc2NyaWJlZCBhYm92ZS4KK05vdGUgdGhhdCBvbiBXaW5kb3dzLCB0aGF0IHN0cmVhbSBzaG91bGQgYmUgb3BlbmVkIGluIGJpbmFyeSBtb2RlLgorLlNIIFJFVFVSTiBWQUxVRQorLkJSIHBjYXBfb3Blbl9vZmZsaW5lKCkgLAorLkJSIHBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpICwKKy5CUiBwY2FwX2ZvcGVuX29mZmxpbmUoKSAsCithbmQKKy5CIHBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oKQorcmV0dXJuIGEKKy5JIHBjYXBfdCAqCitvbiBzdWNjZXNzIGFuZAorLkIgTlVMTAorb24gZmFpbHVyZS4KK0lmCisuQiBOVUxMCitpcyByZXR1cm5lZCwKKy5JIGVycmJ1ZgoraXMgZmlsbGVkIGluIHdpdGggYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS4KKy5JIGVycmJ1ZgoraXMgYXNzdW1lZCB0byBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QKKy5CIFBDQVBfRVJSQlVGX1NJWkUKK2NoYXJzLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcC1zYXZlZmlsZShATUFOX0ZJTEVfRk9STUFUU0ApCmRpZmYgLS1naXQgYS9wY2FwX3NldF9idWZmZXJfc2l6ZS4zcGNhcCBiL3BjYXBfc2V0X2J1ZmZlcl9zaXplLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGU5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF9idWZmZXJfc2l6ZS4zcGNhcApAQCAtMCwwICsxLDQ3IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX3NldF9idWZmZXJfc2l6ZS4zcGNhcCx2IDEuMSAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX0JVRkZFUl9TSVpFIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zZXRfYnVmZmVyX3NpemUgXC0gc2V0IHRoZSBidWZmZXIgc2l6ZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorY2FwdHVyZSBoYW5kbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0X2J1ZmZlcl9zaXplKHBjYXBfdCAqcCwgaW50IGJ1ZmZlcl9zaXplKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0X2J1ZmZlcl9zaXplKCkKK3NldHMgdGhlIGJ1ZmZlciBzaXplIHRoYXQgd2lsbCBiZSB1c2VkIG9uIGEgY2FwdHVyZSBoYW5kbGUgd2hlbgordGhlIGhhbmRsZSBpcyBhY3RpdmF0ZWQgdG8KKy5JUiBidWZmZXJfc2l6ZSAsCit3aGljaCBpcyBpbiB1bml0cyBvZiBieXRlcy4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfc2V0X2J1ZmZlcl9zaXplKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIG9yCisuQiBQQ0FQX0VSUk9SX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBhY3RpdmF0ZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2NyZWF0ZSgzUENBUCksIHBjYXBfYWN0aXZhdGUoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX3NldF9kYXRhbGluay4zcGNhcCBiL3BjYXBfc2V0X2RhdGFsaW5rLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjMyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF9kYXRhbGluay4zcGNhcApAQCAtMCwwICsxLDUzIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX3NldF9kYXRhbGluay4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX0RBVEFMSU5LIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX3NldF9kYXRhbGluayBcLSBzZXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdG8gYmUgdXNlZCBieSBhCitjYXB0dXJlIGRldmljZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX3NldF9kYXRhbGluayhwY2FwX3QgKnAsIGludCBkbHQpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfZGF0YWxpbmsoKQoraXMgdXNlZCB0byBzZXQgdGhlIGN1cnJlbnQgbGluay1sYXllciBoZWFkZXIgdHlwZSBvZiB0aGUgcGNhcCBkZXNjcmlwdG9yCit0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKKy5JUiBkbHQgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRfZGF0YWxpbmsoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorSWYgXC0xIGlzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKSwKK3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX3NldF9pbW1lZGlhdGVfbW9kZS4zcGNhcCBiL3BjYXBfc2V0X2ltbWVkaWF0ZV9tb2RlLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWM5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF9pbW1lZGlhdGVfbW9kZS4zcGNhcApAQCAtMCwwICsxLDQ3IEBACisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9TRVRfSU1NRURJQVRFX01PREUgM1BDQVAgIjggTWF5IDIwMTMiCisuU0ggTkFNRQorcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUgXC0gc2V0IGltbWVkaWF0ZSBtb2RlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkIGNhcHR1cmUKK2hhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUocGNhcF90ICpwLCBpbnQgaW1tZWRpYXRlX21vZGUpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUoKQorc2V0cyB3aGV0aGVyIGltbWVkaWF0ZSBtb2RlIHNob3VsZCBiZSBzZXQgb24gYSBjYXB0dXJlIGhhbmRsZSB3aGVuCit0aGUgaGFuZGxlIGlzIGFjdGl2YXRlZC4KK0lmCisuSSBpbW1lZGlhdGVfbW9kZQoraXMgbm9uLXplcm8sIGltbWVkaWF0ZSBtb2RlIHdpbGwgYmUgc2V0LCBvdGhlcndpc2UgaXQgd2lsbCBub3QgYmUgc2V0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGFjdGl2YXRlZC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3Byb21pc2MuM3BjYXAgYi9wY2FwX3NldF9wcm9taXNjLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjI2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF9wcm9taXNjLjNwY2FwCkBAIC0wLDAgKzEsNDggQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc2V0X3Byb21pc2MuM3BjYXAsdiAxLjEgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9QUk9NSVNDIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zZXRfcHJvbWlzYyBcLSBzZXQgcHJvbWlzY3VvdXMgbW9kZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorY2FwdHVyZSBoYW5kbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0X3Byb21pc2MocGNhcF90ICpwLCBpbnQgcHJvbWlzYyk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldF9wcm9taXNjKCkKK3NldHMgd2hldGhlciBwcm9taXNjdW91cyBtb2RlIHNob3VsZCBiZSBzZXQgb24gYSBjYXB0dXJlIGhhbmRsZSB3aGVuCit0aGUgaGFuZGxlIGlzIGFjdGl2YXRlZC4KK0lmCisuSSBwcm9taXNjCitpcyBub24temVybywgcHJvbWlzY3VvdXMgbW9kZSB3aWxsIGJlIHNldCwgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIHNldC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfc2V0X3Byb21pc2MoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGFjdGl2YXRlZC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3JmbW9uLjNwY2FwIGIvcGNhcF9zZXRfcmZtb24uM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3MzU1NgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc2V0X3JmbW9uLjNwY2FwCkBAIC0wLDAgKzEsNDkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc2V0X3JmbW9uLjNwY2FwLHYgMS4xIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9TRVRfUkZNT04gM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldF9yZm1vbiBcLSBzZXQgbW9uaXRvciBtb2RlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkIGNhcHR1cmUKK2hhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfcmZtb24ocGNhcF90ICpwLCBpbnQgcmZtb24pOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfcmZtb24oKQorc2V0cyB3aGV0aGVyIG1vbml0b3IgbW9kZSBzaG91bGQgYmUgc2V0IG9uIGEgY2FwdHVyZSBoYW5kbGUgd2hlbgordGhlIGhhbmRsZSBpcyBhY3RpdmF0ZWQuCitJZgorLkkgcmZtb24KK2lzIG5vbi16ZXJvLCBtb25pdG9yIG1vZGUgd2lsbCBiZSBzZXQsIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBiZSBzZXQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF9yZm1vbigpCityZXR1cm5zIDAgb24gc3VjY2VzcyBvcgorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfY2FuX3NldF9yZm1vbigzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3NuYXBsZW4uM3BjYXAgYi9wY2FwX3NldF9zbmFwbGVuLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTk1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF9zbmFwbGVuLjNwY2FwCkBAIC0wLDAgKzEsNDYgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc2V0X3NuYXBsZW4uM3BjYXAsdiAxLjEgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9TTkFQTEVOIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zZXRfc25hcGxlbiBcLSBzZXQgdGhlIHNuYXBzaG90IGxlbmd0aCBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorY2FwdHVyZSBoYW5kbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0X3NuYXBsZW4ocGNhcF90ICpwLCBpbnQgc25hcGxlbik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldF9zbmFwbGVuKCkKK3NldHMgdGhlIHNuYXBzaG90IGxlbmd0aCB0byBiZSB1c2VkIG9uIGEgY2FwdHVyZSBoYW5kbGUgd2hlbiB0aGUgaGFuZGxlCitpcyBhY3RpdmF0ZWQgdG8KKy5JUiBzbmFwbGVuIC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfc2V0X3NuYXBsZW4oKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGFjdGl2YXRlZC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3RpbWVvdXQuM3BjYXAgYi9wY2FwX3NldF90aW1lb3V0LjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjZmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF90aW1lb3V0LjNwY2FwCkBAIC0wLDAgKzEsNTAgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc2V0X3RpbWVvdXQuM3BjYXAsdiAxLjEgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9USU1FT1VUIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zZXRfdGltZW91dCBcLSBzZXQgdGhlIHJlYWQgdGltZW91dCBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorY2FwdHVyZSBoYW5kbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0X3RpbWVvdXQocGNhcF90ICpwLCBpbnQgdG9fbXMpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfdGltZW91dCgpCitzZXRzIHRoZSByZWFkIHRpbWVvdXQgdGhhdCB3aWxsIGJlIHVzZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB3aGVuCit0aGUgaGFuZGxlIGlzIGFjdGl2YXRlZCB0bworLklSIHRvX21zICwKK3doaWNoIGlzIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcy4KKy5MUAorVGhlIGJlaGF2aW9yLCBpZiB0aGUgdGltZW91dCBpc24ndCBzcGVjaWZpZWQsIGlzIHVuZGVmaW5lZC4gIFdlCityZWNvbW1lbmQgYWx3YXlzIHNldHRpbmcgdGhlIHRpbWVvdXQgdG8gYSBub24temVybyB2YWx1ZS4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfc2V0X3RpbWVvdXQoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGFjdGl2YXRlZC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAuaW4gYi9wY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2E0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluCkBAIC0wLDAgKzEsNjEgQEAKKy5cIkNvcHlyaWdodCAoYykgMjAxMywgTWljaGFsIFNla2xldGFyCisuXCJBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCJSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiYXJlIG1ldDoKKy5cIgorLlwiICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorLlwiICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisuXCIgICAgIGRpc3RyaWJ1dGlvbi4KKy5cIiAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKy5cIiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIlRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisuXCJJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorLlwiV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisuVEggUENBUF9TRVRfVFNUQU1QX1BSRUNJU0lPTiAzUENBUCAiMjcgQXVndXN0IDIwMTMiCisuU0ggTkFNRQorcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbiBcLSBzZXQgdGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uIHJldHVybmVkIGluCitjYXB0dXJlcworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uKHBjYXBfdCAqcCwgaW50IHRzdGFtcF9wcmVjaXNpb24pOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbigpCitzZXRzIHRoZSBwcmVjaXNpb24gb2YgdGhlIHRpbWUgc3RhbXAgZGVzaXJlZCBmb3IgcGFja2V0cyBjYXB0dXJlZCBvbiB0aGUgcGNhcAorZGVzY3JpcHRvciB0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKKy5JUiB0c3RhbXBfcHJlY2lzaW9uIC4KK0l0IG11c3QgYmUgY2FsbGVkIG9uIGEgcGNhcCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkKKy5CIHBjYXBfY3JlYXRlKCkKK3RoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLgorVHdvIHRpbWUgc3RhbXAgcHJlY2lzaW9ucyBhcmUgc3VwcG9ydGVkLCBtaWNyb3NlY29uZHMgYW5kIG5hbm9zZWNvbmRzLiBPbmUgY2FuCit1c2Ugb3B0aW9ucworLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPIGFuZAorLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8KK3RvIHJlcXVlc3QgZGVzaXJlZCBwcmVjaXNpb24uIEJ5IGRlZmF1bHQsIHRpbWUgc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF90c3RhbXBfdHlwZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBpZiB0aGUgc3BlY2lmaWVkIHRpbWUgc3RhbXAgcHJlY2lzaW9uIGlzIGV4cGVjdGVkIHRvIGJlCitzdXBwb3J0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisuQiBQQ0FQX0VSUk9SX1RTVEFNUF9QUkVDSVNJT05fTk9UU1VQCitpZiBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgcmVxdWVzdGVkIHRpbWUgc3RhbXAgcHJlY2lzaW9uLAorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwKK3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24oM1BDQVApLAorcGNhcC10c3RhbXAoQE1BTl9NSVNDX0lORk9AKQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAuaW4gYi9wY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFjMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAuaW4KQEAgLTAsMCArMSw2NSBAQAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX1RTVEFNUF9UWVBFIDNQQ0FQICIyMSBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX3NldF90c3RhbXBfdHlwZSBcLSBzZXQgdGhlIHRpbWUgc3RhbXAgdHlwZSB0byBiZSB1c2VkIGJ5IGEKK2NhcHR1cmUgZGV2aWNlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0X3RzdGFtcF90eXBlKHBjYXBfdCAqcCwgaW50IHRzdGFtcF90eXBlKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0X3RzdGFtcF90eXBlKCkKK3NldHMgdGhlIHRoZSB0eXBlIG9mIHRpbWUgc3RhbXAgZGVzaXJlZCBmb3IgcGFja2V0cyBjYXB0dXJlZCBvbiB0aGUgcGNhcAorZGVzY3JpcHRvciB0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKKy5JUiB0c3RhbXBfdHlwZSAuCitJdCBtdXN0IGJlIGNhbGxlZCBvbiBhIHBjYXAgZGVzY3JpcHRvciBjcmVhdGVkIGJ5CisuQiBwY2FwX2NyZWF0ZSgpCit0aGF0IGhhcyBub3QgeWV0IGJlZW4gYWN0aXZhdGVkIGJ5CisuQlIgcGNhcF9hY3RpdmF0ZSgpIC4KKy5CIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMoKQord2lsbCBnaXZlIGEgbGlzdCBvZiB0aGUgdGltZSBzdGFtcCB0eXBlcyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBjYXB0dXJlCitkZXZpY2UuCitTZWUKKy5CUiBwY2FwLXRzdGFtcCAoQE1BTl9NSVNDX0lORk9AKQorZm9yIGEgbGlzdCBvZiBhbGwgdGhlIHRpbWUgc3RhbXAgdHlwZXMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF90c3RhbXBfdHlwZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBpZiB0aGUgc3BlY2lmaWVkIHRpbWUgc3RhbXAgdHlwZSBpcyBleHBlY3RlZCB0byBiZQorc3VwcG9ydGVkIGJ5IHRoZSBjYXB0dXJlIGRldmljZSwKKy5CIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVAKK29uIHN1Y2Nlc3MgaWYgdGhlIHNwZWNpZmllZCB0aW1lIHN0YW1wIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKK2NhcHR1cmUgZGV2aWNlLAorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLCBhbmQKKy5CIFBDQVBfRVJST1JfQ0FOVFNFVF9UU1RBTVBfVFlQRQoraWYgdGhlIGNhcHR1cmUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSB0aW1lIHN0YW1wIHR5cGUuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLAorcGNhcF9saXN0X3RzdGFtcF90eXBlcygzUENBUCksCitwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKDNQQ0FQKSwKK3BjYXAtdHN0YW1wKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwIGIvcGNhcF9zZXRkaXJlY3Rpb24uM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZmIyNQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwCkBAIC0wLDAgKzEsNzEgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9TRVRESVJFQ1RJT04gM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldGRpcmVjdGlvbiBcLSBzZXQgdGhlIGRpcmVjdGlvbiBmb3Igd2hpY2ggcGFja2V0cyB3aWxsIGJlIGNhcHR1cmVkCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0ZGlyZWN0aW9uKHBjYXBfdCAqcCwgcGNhcF9kaXJlY3Rpb25fdCBkKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0ZGlyZWN0aW9uKCkKK2lzIHVzZWQgdG8gc3BlY2lmeSBhIGRpcmVjdGlvbiB0aGF0IHBhY2tldHMgd2lsbCBiZSBjYXB0dXJlZC4KKy5JIGQKK2lzIG9uZSBvZiB0aGUgY29uc3RhbnRzCisuQlIgUENBUF9EX0lOICwKKy5CIFBDQVBfRF9PVVQKK29yIAorLkJSIFBDQVBfRF9JTk9VVCAuCisuQiBQQ0FQX0RfSU4KK3dpbGwgb25seSBjYXB0dXJlIHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIGRldmljZSwKKy5CIFBDQVBfRF9PVVQKK3dpbGwgb25seSBjYXB0dXJlIHBhY2tldHMgc2VudCBieSB0aGUgZGV2aWNlIGFuZAorLkIgUENBUF9EX0lOT1VUCit3aWxsIGNhcHR1cmUgcGFja2V0cyByZWNlaXZlZCBieSBvciBzZW50IGJ5IHRoZSBkZXZpY2UuCisuQiBQQ0FQX0RfSU5PVVQKK2lzIHRoZSBkZWZhdWx0IHNldHRpbmcgaWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLgorLlBQCisuQiBwY2FwX3NldGRpcmVjdGlvbigpCitpc24ndCBuZWNlc3NhcmlseSBmdWxseSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtczsgc29tZSBwbGF0Zm9ybXMgbWlnaHQKK3JldHVybiBhbiBlcnJvciBmb3IgYWxsIHZhbHVlcywgYW5kIHNvbWUgb3RoZXIgcGxhdGZvcm1zIG1pZ2h0IG5vdAorc3VwcG9ydAorLkJSIFBDQVBfRF9PVVQgLgorLlBQCitUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGlmIGEgYGBzYXZlZmlsZScnIGlzIGJlaW5nIHJlYWQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldGRpcmVjdGlvbigpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX3NldGZpbHRlci4zcGNhcCBiL3BjYXBfc2V0ZmlsdGVyLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3NldGZpbHRlci4zcGNhcApAQCAtMCwwICsxLDU0IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX3NldGZpbHRlci4zcGNhcCx2IDEuNCAyMDA4LTA1LTEzIDE1OjE5OjU2IGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VURklMVEVSIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zZXRmaWx0ZXIgXC0gc2V0IHRoZSBmaWx0ZXIKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRmaWx0ZXIocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0ZmlsdGVyKCkKK2lzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbHRlciBwcm9ncmFtLgorLkkgZnAKK2lzIGEgcG9pbnRlciB0byBhCisuSSBicGZfcHJvZ3JhbQorc3RydWN0LCB1c3VhbGx5IHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCisuQlIgcGNhcF9jb21waWxlKCkgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRmaWx0ZXIoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorSWYgXC0xIGlzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY29tcGlsZSgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRub25ibG9jay4zcGNhcCBiL3BjYXBfc2V0bm9uYmxvY2suM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwZmNlMQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc2V0bm9uYmxvY2suM3BjYXAKQEAgLTAsMCArMSw3NSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRub25ibG9jay4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUTk9OQkxPQ0sgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldG5vbmJsb2NrLCBwY2FwX2dldG5vbmJsb2NrIFwtIHNldCBvciBnZXQgdGhlIHN0YXRlIG9mCitub24tYmxvY2tpbmcgbW9kZSBvbiBhIGNhcHR1cmUgZGV2aWNlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisubmYKKy5mdCBCCitjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1Zik7CitpbnQgcGNhcF9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1Zik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldG5vbmJsb2NrKCkKK3B1dHMgYSBjYXB0dXJlIGhhbmRsZSBpbnRvIGBgbm9uLWJsb2NraW5nJycgbW9kZSwgb3IgdGFrZXMgaXQgb3V0CitvZiBgYG5vbi1ibG9ja2luZycnIG1vZGUsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorLkkgbm9uYmxvY2sKK2FyZ3VtZW50IGlzIG5vbi16ZXJvIG9yIHplcm8uICBJdCBoYXMgbm8gZWZmZWN0IG9uIGBgc2F2ZWZpbGVzJycuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgXC0xIGlzIHJldHVybmVkIGFuZAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlOyBvdGhlcndpc2UsIDAgaXMKK3JldHVybmVkLgorSW4KK2Bgbm9uLWJsb2NraW5nJycgbW9kZSwgYW4gYXR0ZW1wdCB0byByZWFkIGZyb20gdGhlIGNhcHR1cmUgZGVzY3JpcHRvcgord2l0aAorLkIgcGNhcF9kaXNwYXRjaCgpCit3aWxsLCBpZiBubyBwYWNrZXRzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIHRvIGJlIHJlYWQsIHJldHVybiAwCitpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBibG9ja2luZyB3YWl0aW5nIGZvciBwYWNrZXRzIHRvIGFycml2ZS4KKy5CIHBjYXBfbG9vcCgpCithbmQKKy5CIHBjYXBfbmV4dCgpCit3aWxsIG5vdCB3b3JrIGluIGBgbm9uLWJsb2NraW5nJycgbW9kZS4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfZ2V0bm9uYmxvY2soKQorcmV0dXJucyB0aGUgY3VycmVudCBgYG5vbi1ibG9ja2luZycnIHN0YXRlIG9mIHRoZSBjYXB0dXJlIGRlc2NyaXB0b3I7IGl0CithbHdheXMgcmV0dXJucyAwIG9uIGBgc2F2ZWZpbGVzJycuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgXC0xIGlzIHJldHVybmVkIGFuZAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgorLlBQCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfbG9vcCgzUENBUCksIHBjYXBfbmV4dF9leCgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9zbmFwc2hvdC4zcGNhcCBiL3BjYXBfc25hcHNob3QuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlNDA5NwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc25hcHNob3QuM3BjYXAKQEAgLTAsMCArMSw1NCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zbmFwc2hvdC4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU05BUFNIT1QgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NuYXBzaG90IFwtIGdldCB0aGUgc25hcHNob3QgbGVuZ3RoCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc25hcHNob3QocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc25hcHNob3QoKQorcmV0dXJucyB0aGUgc25hcHNob3QgbGVuZ3RoIHNwZWNpZmllZCB3aGVuCisuQiBwY2FwX3NldF9zbmFwc2hvdCgpCitvcgorLkIgcGNhcF9vcGVuX2xpdmUoKQord2FzIGNhbGxlZCwgZm9yIGEgbGl2ZSBjYXB0dXJlLCBvciB0aGUgc25hcHNob3QgbGVuZ3RoIGZyb20gdGhlIGNhcHR1cmUKK2ZpbGUsIGZvciBhIGBgc2F2ZWZpbGUnJy4KKy5QUAorSXQgbXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgcGNhcCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkKKy5CIHBjYXBfY3JlYXRlKCkKK3RoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zbmFwc2hvdCgpCityZXR1cm5zIHRoZSBzbmFwc2hvdCBsZW5ndGggb24gc3VjY2VzcyBhbmQKKy5CIFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCBub3QgYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9zdGF0cy4zcGNhcCBiL3BjYXBfc3RhdHMuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1M2UyMQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc3RhdHMuM3BjYXAKQEAgLTAsMCArMSw5OSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zdGF0cy4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU1RBVFMgM1BDQVAgIjcgU2VwdGVtYmVyIDIwMDkiCisuU0ggTkFNRQorcGNhcF9zdGF0cyBcLSBnZXQgY2FwdHVyZSBzdGF0aXN0aWNzCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc3RhdHMocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcyk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3N0YXRzKCkKK2ZpbGxzIGluIHRoZQorLkIgc3RydWN0IHBjYXBfc3RhdAorcG9pbnRlZCB0byBieSBpdHMgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIHZhbHVlcyByZXByZXNlbnQKK3BhY2tldCBzdGF0aXN0aWNzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIHRpbWUgb2YgdGhlIGNhbGwuCisuUFAKKy5CIHBjYXBfc3RhdHMoKQoraXMgc3VwcG9ydGVkIG9ubHkgb24gbGl2ZSBjYXB0dXJlcywgbm90IG9uIGBgc2F2ZWZpbGVzJyc7IG5vIHN0YXRpc3RpY3MKK2FyZSBzdG9yZWQgaW4gYGBzYXZlZmlsZXMnJywgc28gbm8gc3RhdGlzdGljcyBhcmUgYXZhaWxhYmxlIHdoZW4gcmVhZGluZworZnJvbSBhIGBgc2F2ZWZpbGUnJy4KKy5QUAorQQorLkIgc3RydWN0IHBjYXBfc3RhdAoraGFzIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKy5SUworLlRQCisuQiBwc19yZWN2CitudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZDsKKy5UUAorLkIgcHNfZHJvcAorbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyByb29tIGluIHRoZSBvcGVyYXRpbmcKK3N5c3RlbSdzIGJ1ZmZlciB3aGVuIHRoZXkgYXJyaXZlZCwgYmVjYXVzZSBwYWNrZXRzIHdlcmVuJ3QgYmVpbmcgcmVhZAorZmFzdCBlbm91Z2g7CisuVFAKKy5CIHBzX2lmZHJvcAorbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2Ugb3IgaXRzIGRyaXZlci4KKy5SRQorLlBQCitUaGUgc3RhdGlzdGljcyBkbyBub3QgYmVoYXZlIHRoZSBzYW1lIHdheSBvbiBhbGwgcGxhdGZvcm1zLgorLkIgcHNfcmVjdgorbWlnaHQgY291bnQgcGFja2V0cyB3aGV0aGVyIHRoZXkgcGFzc2VkIGFueSBmaWx0ZXIgc2V0IHdpdGgKKy5CUiBwY2FwX3NldGZpbHRlciAoM1BDQVApCitvciBub3QsIG9yIGl0IG1pZ2h0IGNvdW50IG9ubHkgcGFja2V0cyB0aGF0IHBhc3MgdGhlIGZpbHRlci4KK0l0IGFsc28gbWlnaHQsIG9yIG1pZ2h0IG5vdCwgY291bnQgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2UgdGhlcmUgd2FzIG5vCityb29tIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgYnVmZmVyIHdoZW4gdGhleSBhcnJpdmVkLgorLkIgcHNfZHJvcAoraXMgbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zOyBpdCBpcyB6ZXJvIG9uIHBsYXRmb3JtcyB3aGVyZSBpdCdzCitub3QgYXZhaWxhYmxlLiAgSWYgcGFja2V0IGZpbHRlcmluZyBpcyBkb25lIGluIGxpYnBjYXAsIHJhdGhlciB0aGFuIGluCit0aGUgb3BlcmF0aW5nIHN5c3RlbSwgaXQgd291bGQgY291bnQgcGFja2V0cyB0aGF0IGRvbid0IHBhc3MgdGhlIGZpbHRlci4KK0JvdGgKKy5CIHBzX3JlY3YKK2FuZAorLkIgcHNfZHJvcAorbWlnaHQsIG9yIG1pZ2h0IG5vdCwgY291bnQgcGFja2V0cyBub3QgeWV0IHJlYWQgZnJvbSB0aGUgb3BlcmF0aW5nCitzeXN0ZW0gYW5kIHRodXMgbm90IHlldCBzZWVuIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKy5CIHBzX2lmZHJvcAorbWlnaHQsIG9yIG1pZ2h0IG5vdCwgYmUgaW1wbGVtZW50ZWQ7IGlmIGl0J3MgemVybywgdGhhdCBtaWdodCBtZWFuIHRoYXQKK25vIHBhY2tldHMgd2VyZSBkcm9wcGVkIGJ5IHRoZSBpbnRlcmZhY2UsIG9yIGl0IG1pZ2h0IG1lYW4gdGhhdCB0aGUKK3N0YXRpc3RpYyBpcyB1bmF2YWlsYWJsZSwgc28gaXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGFuIGluZGljYXRpb24KK3RoYXQgdGhlIGludGVyZmFjZSBkaWQgbm90IGRyb3AgYW55IHBhY2tldHMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3N0YXRzKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCByZXR1cm5zIFwtMSBpZiB0aGVyZSBpcyBhbiBlcnJvciBvciBpZgorLkkgcAorZG9lc24ndCBzdXBwb3J0IHBhY2tldCBzdGF0aXN0aWNzLgorSWYgXC0xIGlzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9zdGF0dXN0b3N0ci4zcGNhcCBiL3BjYXBfc3RhdHVzdG9zdHIuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExOGY2OQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc3RhdHVzdG9zdHIuM3BjYXAKQEAgLTAsMCArMSw0MyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zdGF0dXN0b3N0ci4zcGNhcCx2IDEuMSAyMDA4LTA0LTA5IDIxOjM5OjIxIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU1RBVFVTVE9TVFIgM1BDQVAgIjkgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3N0YXR1c3Rvc3RyIFwtIGNvbnZlcnQgYSBQQ0FQX0VSUk9SXyBvciBQQ0FQX1dBUk5JTkdfIHZhbHVlIHRvIGEgc3RyaW5nCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorY29uc3QgY2hhciAqcGNhcF9zdGF0dXN0b3N0cihpbnQgZXJyb3IpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zdGF0dXN0b3N0cigpCitjb252ZXJ0cyBhCisuQiBQQ0FQX0VSUk9SXworb3IKKy5CIFBDQVBfV0FSTklOR18KK3ZhbHVlIHJldHVybmVkIGJ5IGEgbGlicGNhcCByb3V0aW5lIHRvIGFuIGVycm9yIHN0cmluZy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfc3RyZXJyb3IuM3BjYXAgYi9wY2FwX3N0cmVycm9yLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjMxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3N0cmVycm9yLjNwY2FwCkBAIC0wLDAgKzEsNDIgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc3RyZXJyb3IuM3BjYXAsdiAxLjIgMjAwOC0wNC0wNSAyMDoyNjo1NiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NUUkVSUk9SIDNQQ0FQICI0IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zdHJlcnJvciBcLSBjb252ZXJ0IGFuIGVycm5vIHZhbHVlIHRvIGEgc3RyaW5nCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorY29uc3QgY2hhciAqcGNhcF9zdHJlcnJvcihpbnQgZXJyb3IpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zdHJlcnJvcigpCitpcyBwcm92aWRlZCBpbiBjYXNlCisuQlIgc3RyZXJyb3IgKDMpCitpc24ndCBhdmFpbGFibGUuICBJdCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8KKy5JUiBlcnJvciAuCisuU0ggU0VFIEFMU08KK3N0cmVycm9yKDMpCmRpZmYgLS1naXQgYS9wY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsLjNwY2FwIGIvcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmNjNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbC4zcGNhcApAQCAtMCwwICsxLDQ1IEBACisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9UU1RBTVBfVFlQRV9OQU1FX1RPX1ZBTCAzUENBUCAiMjEgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbCBcLSBnZXQgdGhlIHRpbWUgc3RhbXAgdHlwZSB2YWx1ZQorY29ycmVzcG9uZGluZyB0byBhIHRpbWUgc3RhbXAgdHlwZSBuYW1lCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKCkKK3RyYW5zbGF0ZXMgYSB0aW1lIHN0YW1wIHR5cGUgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyB0aW1lIHN0YW1wIHR5cGUKK3ZhbHVlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGNhc2UtaW5zZW5zaXRpdmUuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZAorLkIgUENBUF9FUlJPUgorb24gZmFpbHVyZS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lLjNwY2FwIGIvcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZS4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNjZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZS4zcGNhcApAQCAtMCwwICsxLDQ5IEBACisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9UU1RBTVBfVFlQRV9WQUxfVE9fTkFNRSAzUENBUCAiMjEgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZSwgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24gXC0gZ2V0CithIG5hbWUgb3IgZGVzY3JpcHRpb24gZm9yIGEgdGltZSBzdGFtcCB0eXBlIHZhbHVlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2NvbnN0IGNoYXIgKnBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUoaW50IHRzdGFtcF90eXBlKTsKK2NvbnN0IGNoYXIgKnBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX2Rlc2NyaXB0aW9uKGludCB0c3RhbXBfdHlwZSk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKCkKK3RyYW5zbGF0ZXMgYSB0aW1lIHN0YW1wIHR5cGUgdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGltZSBzdGFtcCB0eXBlCituYW1lLgorLkIgTlVMTAoraXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KKy5QUAorLkIgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24oKQordHJhbnNsYXRlcyBhIHRpbWUgc3RhbXAgdHlwZSB2YWx1ZSB0byBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoYXQgdGltZQorc3RhbXAgdHlwZS4KKy5CIE5VTEwKK2lzIHJldHVybmVkIG9uIGZhaWx1cmUuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcHBwLmggYi9wcHAuaAppbmRleCA4MGE2ODUxLi40ZTFkMDhkIDEwMDY0NAotLS0gYS9wcHAuaAorKysgYi9wcHAuaApAQCAtMSw0ICsxLDQgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcHBwLmgsdiAxLjEyIDIwMDUvMDIvMDggMTk6NTI6MTkgZ3V5IEV4cCAkIChMQkwpICovCisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BwcC5oLHYgMS4xMiAyMDA1LTAyLTA4IDE5OjUyOjE5IGd1eSBFeHAgJCAoTEJMKSAqLwogLyoKICAqIFBvaW50IHRvIFBvaW50IFByb3RvY29sIChQUFApIFJGQzEzMzEKICAqCmRpZmYgLS1naXQgYS9ydW5sZXguc2ggYi9ydW5sZXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRmMjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3J1bmxleC5zaApAQCAtMCwwICsxLDIzNSBAQAorIyEgL2Jpbi9zaAorCisjCisjIHJ1bmxleC5zaAorIyBTY3JpcHQgdG8gcnVuIExleC9GbGV4LgorIyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgKHF1b3RlZCkgbmFtZSBvZiB0aGUgY29tbWFuZDsgaWYgaXQncyBudWxsLCB0aGF0CisjIG1lYW5zIHRoYXQgbmVpdGhlciBGbGV4IG5vciBMZXggd2FzIGZvdW5kLCBzbyB3ZSByZXBvcnQgYW4gZXJyb3IgYW5kCisjIHF1aXQuCisjCisjIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcnVubGV4LnNoLHYgMS40IDIwMDctMTItMzEgMDM6Mzg6MzkgZ3V5IEV4cCAkCisjCisKKyMKKyMgR2V0IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIHJ1biwgYW5kIHRoZW4gc2hpZnQgdG8gZ2V0IHRoZSBhcmd1bWVudHMuCisjCitpZiBbICQjIC1lcSAwIF0KK3RoZW4KKwllY2hvICJVc2FnZTogcnVubGV4IDxsZXgvZmxleCBjb21tYW5kIHRvIHJ1bj4gWyBhcmd1bWVudHMgXSIgMT4mMgorCWV4aXQgMQorZmkKK0xFWD0iJDEiCitzaGlmdAorCisjCisjIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBMZXggb3IgRmxleC4KKyMKK2lmIFsgLXogIiR7TEVYfSIgXQordGhlbgorCWVjaG8gIk5laXRoZXIgbGV4IG5vciBmbGV4IHdhcyBmb3VuZCIgMT4mMgorCWV4aXQgMQorZmkKKworIworIyBQcm9jZXNzIHRoZSBmbGFncy4gIFdlIGRvbid0IHVzZSBnZXRvcHQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCisjIGVtYmVkIGNvbXBsZXRlIGtub3dsZWRnZSBvZiB3aGF0IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBMZXgvRmxleC4KKyMKK2ZsYWdzPSIiCitvdXRmaWxlPWxleC55eS5jCit3aGlsZSBbICQjIC1uZSAwIF0KK2RvCisJY2FzZSAiJDEiIGluCisKKwktbyopCisJCSMKKwkJIyBTZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUuCisJCSMKKwkJb3V0ZmlsZT1gZWNobyAiJDEiIHwgc2VkICdzLy1vXCguKlwpL1wxLydgCisJCTs7CisKKwktKikKKwkJIworCQkjIEFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIGZsYWdzLgorCQkjCisJCWZsYWdzPSIkZmxhZ3MgJDEiCisJCTs7CisKKwktLXwqKQorCQkjCisJCSMgRW5kIG9mIGZsYWdzLgorCQkjCisJCWJyZWFrCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKKyMKKyMgSXMgaXQgTGV4LCBvciBpcyBpdCBGbGV4PworIworaWYgWyAiJHtMRVh9IiA9IGZsZXggXQordGhlbgorCSMKKwkjIEl0J3MgRmxleC4KKwkjCisJaGF2ZV9mbGV4PXllcworCisJIworCSMgRG9lcyBpdCBzdXBwb3J0IHRoZSAtLW5vRlVOQ1RJT04gb3B0aW9ucz8gIElmIHNvLCB3ZSBwYXNzCisJIyAtLW5vdW5wdXQsIGFzIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IHRob3NlCisJIyBvcHRpb25zIGRvbid0IHN1cHBvcnQgZGlzYWJsaW5nIHl5dW5wdXQgYnkgZGVmaW5pbmcKKwkjIFlZX05PX1VOUFVULgorCSMKKwlpZiBmbGV4IC0taGVscCB8IGVncmVwIG5vRlVOQ1RJT04gPi9kZXYvbnVsbAorCXRoZW4KKwkJZmxhZ3M9IiRmbGFncyAtLW5vdW5wdXQiCisKKwkJIworCQkjIERvZXMgaXQgc3VwcG9ydCAtUiwgZm9yIGdlbmVyYXRpbmcgcmVlbnRyYW50IHNjYW5uZXJzPworCQkjIElmIHNvLCB3ZSdyZSBub3QgY3VycmVudGx5IHVzaW5nIHRoYXQgZmVhdHVyZSwgYnV0CisJCSMgaXQnbGwgZ2VuZXJhdGUgc29tZSB1bnVzZWQgZnVuY3Rpb25zIGFueXdheSAtIGFuZCB0aGVyZQorCQkjIHdvbid0IGJlIGFueSBoZWFkZXIgZmlsZSBkZWNsYXJpbmcgdGhlbSwgc28gdGhlcmUnbGwgYmUKKwkJIyBkZWZpbmVkLWJ1dC1ub3QtZGVjbGFyZWQgd2FybmluZ3MuICBUaGVyZWZvcmUsIHdlIHVzZQorCQkjIC0tbm9GVU5DVElPTiBvcHRpb25zIHRvIHN1cHByZXNzIGdlbmVyYXRpbmcgdGhvc2UKKwkJIyBmdW5jdGlvbnMuCisJCSMKKwkJaWYgZmxleCAtLWhlbHAgfCBlZ3JlcCByZWVudHJhbnQgPi9kZXYvbnVsbAorCQl0aGVuCisJCQlmbGFncz0iJGZsYWdzIC0tbm95eWdldF9saW5lbm8gLS1ub3l5Z2V0X2luIC0tbm95eWdldF9vdXQgLS1ub3l5Z2V0X2xlbmcgLS1ub3l5Z2V0X3RleHQgLS1ub3l5c2V0X2xpbmVubyAtLW5veXlzZXRfaW4gLS1ub3l5c2V0X291dCIKKwkJZmkKKwlmaQorZWxzZQorCSMKKwkjIEl0J3MgTGV4LgorCSMKKwloYXZlX2ZsZXg9bm8KK2ZpCisKKyMKKyMgT0ssIHJ1biBpdC4KKyMgSWYgaXQncyBsZXgsIGl0IGRvZXNuJ3Qgc3VwcG9ydCAtbywgc28gd2UganVzdCB3cml0ZSB0bworIyBsZXgueXkuYyBhbmQsIGlmIGl0IHN1Y2NlZWRzLCByZW5hbWUgaXQgdG8gdGhlIHJpZ2h0IG5hbWUsCisjIG90aGVyd2lzZSB3ZSByZW1vdmUgbGV4Lnl5LmMuCisjIElmIGl0J3MgZmxleCwgaXQgc3VwcG9ydHMgLW8sIHNvIHdlIHVzZSB0aGF0IC0gZmxleCB3aXRoIC1QIGRvZXNuJ3QKKyMgd3JpdGUgdG8gbGV4Lnl5LmMsIGl0IHdyaXRlcyB0byBhIGxleC57cHJlZml4IGZyb20gLVB9LmMuCisjCitpZiBbICRoYXZlX2ZsZXggPSB5ZXMgXQordGhlbgorCSR7TEVYfSAkZmxhZ3MgLW8iJG91dGZpbGUiICIkQCIKKworCSMKKwkjIERpZCBpdCBzdWNjZWVkPworCSMKKwlzdGF0dXM9JD8KKwlpZiBbICRzdGF0dXMgLW5lIDAgXQorCXRoZW4KKwkJIworCQkjIE5vLiAgRXhpdCB3aXRoIHRoZSBmYWlsaW5nIGV4aXQgc3RhdHVzLgorCQkjCisJCWV4aXQgJHN0YXR1cworCWZpCisKKwkjCisJIyBGbGV4IGhhcyB0aGUgYW5ub3lpbmcgaGFiaXQgb2Ygc3RyaXBwaW5nIGFsbCBidXQgdGhlIGxhc3QKKwkjIGNvbXBvbmVudCBvZiB0aGUgIi1vIiBmbGFnIGFyZ3VtZW50IGFuZCB1c2luZyB0aGF0IGFzIHRoZQorCSMgcGxhY2UgdG8gcHV0IHRoZSBvdXRwdXQuICBUaGlzIGdldHMgaW4gdGhlIHdheSBvZiBidWlsZGluZworCSMgaW4gYSBkaXJlY3RvcnkgZGlmZmVyZW50IGZyb20gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBUcnkKKwkjIHRvIHdvcmsgYXJvdW5kIHRoaXMuCisJIworCSMgSXMgdGhlIG91dGZpbGUgd2hlcmUgd2UgdGhpbmsgaXQgaXM/CisJIworCW91dGZpbGVfYmFzZT1gYmFzZW5hbWUgIiRvdXRmaWxlImAKKwlpZiBbICIkb3V0ZmlsZV9iYXNlIiAhPSAiJG91dGZpbGUiIC1hIFwoICEgLXIgIiRvdXRmaWxlIiBcKSAtYSAtciAiJG91dGZpbGVfYmFzZSIgXQorCXRoZW4KKwkJIworCQkjIE5vLCBpdCdzIG5vdCwgYnV0IGl0IGlzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFB1dCBpdAorCQkjIHdoZXJlIGl0J3Mgc3VwcG9zZWQgdG8gYmUuCisJCSMKKwkJbXYgIiRvdXRmaWxlX2Jhc2UiICIkb3V0ZmlsZSIKKworCQkjCisJCSMgRGlkIHRoYXQgc3VjY2VlZD8KKwkJIworCQlzdGF0dXM9JD8KKwkJaWYgWyAkc3RhdHVzIC1uZSAwIF0KKwkJdGhlbgorCQkJIworCQkJIyBOby4gIEV4aXQgd2l0aCB0aGUgZmFpbGluZyBleGl0IHN0YXR1cy4KKwkJCSMKKwkJCWV4aXQgJHN0YXR1cworCQlmaQorCWZpCitlbHNlCisJJHtMRVh9ICRmbGFncyAiJEAiCisKKwkjCisJIyBEaWQgaXQgc3VjY2VlZD8KKwkjCisJc3RhdHVzPSQ/CisJaWYgWyAkc3RhdHVzIC1uZSAwIF0KKwl0aGVuCisJCSMKKwkJIyBOby4gIEdldCByaWQgb2YgYW55IGxleC55eS5jIGZpbGUgd2UgZ2VuZXJhdGVkLCBhbmQKKwkJIyBleGl0IHdpdGggdGhlIGZhaWxpbmcgZXhpdCBzdGF0dXMuCisJCSMKKwkJcm0gLWYgbGV4Lnl5LmMKKwkJZXhpdCAkc3RhdHVzCisJZmkKKworCSMKKwkjIE9LLCByZW5hbWUgbGV4Lnl5LmMgdG8gdGhlIHJpZ2h0IG91dHB1dCBmaWxlLgorCSMKKwltdiBsZXgueXkuYyAiJG91dGZpbGUiIAorCisJIworCSMgRGlkIHRoYXQgc3VjY2VlZD8KKwkjCisJc3RhdHVzPSQ/CisJaWYgWyAkc3RhdHVzIC1uZSAwIF0KKwl0aGVuCisJCSMKKwkJIyBOby4gIEdldCByaWQgb2YgYW55IGxleC55eS5jIGZpbGUgd2UgZ2VuZXJhdGVkLCBhbmQKKwkJIyBleGl0IHdpdGggdGhlIGZhaWxpbmcgZXhpdCBzdGF0dXMuCisJCSMKKwkJcm0gLWYgbGV4Lnl5LmMKKwkJZXhpdCAkc3RhdHVzCisJZmkKK2ZpCisKKyMKKyMgT0ssIG5vdyBsZXQncyBnZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGRlY2xhcmluZyB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zCisjIGRlZmluZWQgYnkgdGhlIC5jIGZpbGU7IGlmIHRoZSAuYyBmaWxlIGlzIC4uLi9mb28uYywgdGhlIGhlYWRlciBmaWxlCisjIHdpbGwgYmUgLi4uL2Zvby5oLgorIworIyBUaGlzIHdvcmtzIGFyb3VuZCBzb21lIG90aGVyIEZsZXggc3Vja2FnZSwgd2hlcmVpbiBpdCBkb2Vzbid0IGRlY2xhcmUKKyMgdGhlIGxleCByb3V0aW5lIGJlZm9yZSBkZWZpbmluZyBpdCwgY2F1c2luZyBjb21waWxlciB3YXJuaW5ncy4KKyMgWFhYIC0gbmV3ZXIgdmVyc2lvbnMgb2YgRmxleCBzdXBwb3J0IC0taGVhZGVyLWZpbGU9LCB0byBnZW5lcmF0ZSB0aGUKKyMgYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGUuICBXaXRoIHRob3NlIHZlcnNpb25zLCB3ZSBzaG91bGQgdXNlIHRoYXQgb3B0aW9uLgorIworCisjCisjIEdldCB0aGUgbmFtZSBvZiB0aGUgcHJlZml4OyBzY2FuIHRoZSBzb3VyY2UgZmlsZXMgZm9yIGEgJW9wdGlvbiBwcmVmaXgKKyMgbGluZS4gIFdlIHVzZSB0aGUgbGFzdCBvbmUuCisjCitwcmVmaXg9YHNlZCAtbiAncy8lb3B0aW9uWyAJXVsgCV0qcHJlZml4PSJcKC4qXCkiLiovXDEvcCcgIiRAIiB8IHRhaWwgLTFgCitpZiBbICEgLXogIiRwcmVmaXgiIF0KK3RoZW4KKwlwcmVmaXhsaW5lPSIjZGVmaW5lIHl5bGV4ICR7cHJlZml4fWxleCIKK2ZpCisKKyMKKyMgQ29uc3RydWN0IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZS4KKyMKK2hlYWRlcl9maWxlPWBkaXJuYW1lICIkb3V0ZmlsZSJgL2BiYXNlbmFtZSAiJG91dGZpbGUiIC5jYC5oCisKKyMKKyMgU3BldyBvdXQgdGhlIGRlY2xhcmF0aW9uLgorIworY2F0IDw8RU9GID4kaGVhZGVyX2ZpbGUKKy8qIFRoaXMgaXMgZ2VuZXJhdGVkIGJ5IHJ1bmxleC5zaC4gIERvIG5vdCBlZGl0IGl0LiAqLworJHByZWZpeGxpbmUKKyNpZm5kZWYgWVlfREVDTAorI2RlZmluZSBZWV9ERUNMIGludCB5eWxleCh2b2lkKQorI2VuZGlmICAKK1lZX0RFQ0w7CitFT0YKZGlmZiAtLWdpdCBhL3NhdmVmaWxlLmMgYi9zYXZlZmlsZS5jCmluZGV4IGU1YTU0MDMuLjczZTNlYTkgMTAwNjQ0Ci0tLSBhL3NhdmVmaWxlLmMKKysrIGIvc2F2ZWZpbGUuYwpAQCAtMzAsMTMgKzMwLDI3IEBACiAKICNpZm5kZWYgbGludAogc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3NhdmVmaWxlLmMsdiAxLjEyNi4yLjMwIDIwMDcvMDgvMTQgMjA6NTc6NDkgZ3V5IEV4cCAkIChMQkwpIjsKKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9zYXZlZmlsZS5jLHYgMS4xODMgMjAwOC0xMi0yMyAyMDoxMzoyOSBndXkgRXhwICQgKExCTCkiOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAorI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbHNlIC8qIFdJTjMyICovCisjaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBXSU4zMiAqLworCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxtZW1vcnkuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNDQsNjEgKzU4LDE0IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgInBjYXAvdXNiLmgiCiAKICNpZmRlZiBIQVZFX09TX1BST1RPX0gKICNpbmNsdWRlICJvcy1wcm90by5oIgogI2VuZGlmCiAKLS8qCi0gKiBTdGFuZGFyZCBsaWJwY2FwIGZvcm1hdC4KLSAqLwotI2RlZmluZSBUQ1BEVU1QX01BR0lDCQkweGExYjJjM2Q0Ci0KLS8qCi0gKiBBbGV4ZXkgS3V6bmV0em92J3MgbW9kaWZpZWQgbGlicGNhcCBmb3JtYXQuCi0gKi8KLSNkZWZpbmUgS1VaTkVUWk9WX1RDUERVTVBfTUFHSUMJMHhhMWIyY2QzNAotCi0vKgotICogUmVzZXJ2ZWQgZm9yIEZyYW5jaXNjbyBNZXNxdWl0YSA8ZnJhbmNpc2NvLm1lc3F1aXRhQHJhZGlvbW92ZWwucHQ+Ci0gKiBmb3IgYW5vdGhlciBtb2RpZmllZCBmb3JtYXQuCi0gKi8KLSNkZWZpbmUgRk1FU1FVSVRBX1RDUERVTVBfTUFHSUMJMHhhMWIyMzRjZAotCi0vKgotICogTmF2dGVsIENvbW11bmNhdGlvbnMnIGZvcm1hdCwgd2l0aCBuYW5vc2Vjb25kIHRpbWVzdGFtcHMsCi0gKiBhcyBwZXIgYSByZXF1ZXN0IGZyb20gRHVtYXMgSHdhbmcgPGR1bWFzLmh3YW5nQG5hdnRlbGNvbS5jb20+LgotICovCi0jZGVmaW5lIE5BVlRFTF9UQ1BEVU1QX01BR0lDCTB4YTEyYjNjNGQKLQotLyoKLSAqIE5vcm1hbCBsaWJwY2FwIGZvcm1hdCwgZXhjZXB0IGZvciBzZWNvbmRzL25hbm9zZWNvbmRzIHRpbWVzdGFtcHMsCi0gKiBhcyBwZXIgYSByZXF1ZXN0IGJ5IFVsZiBMYW1waW5nIDx1bGYubGFtcGluZ0B3ZWIuZGU+Ci0gKi8KLSNkZWZpbmUgTlNFQ19UQ1BEVU1QX01BR0lDCTB4YTFiMjNjNGQKLQotLyoKLSAqIFdlIHVzZSB0aGUgInJlY2VpdmVyLW1ha2VzLXJpZ2h0IiBhcHByb2FjaCB0byBieXRlIG9yZGVyLAotICogYmVjYXVzZSB0aW1lIGlzIGF0IGEgcHJlbWl1bSB3aGVuIHdlIGFyZSB3cml0aW5nIHRoZSBmaWxlLgotICogSW4gb3RoZXIgd29yZHMsIHRoZSBwY2FwX2ZpbGVfaGVhZGVyIGFuZCBwY2FwX3BrdGhkciwKLSAqIHJlY29yZHMgYXJlIHdyaXR0ZW4gaW4gaG9zdCBieXRlIG9yZGVyLgotICogTm90ZSB0aGF0IHRoZSBieXRlcyBvZiBwYWNrZXQgZGF0YSBhcmUgd3JpdHRlbiBvdXQgaW4gdGhlIG9yZGVyIGluCi0gKiB3aGljaCB0aGV5IHdlcmUgcmVjZWl2ZWQsIHNvIG11bHRpLWJ5dGUgZmllbGRzIGluIHBhY2tldHMgYXJlIG5vdAotICogd3JpdHRlbiBpbiBob3N0IGJ5dGUgb3JkZXIsIHRoZXkncmUgd3JpdHRlbiBpbiB3aGF0ZXZlciBvcmRlciB0aGUKLSAqIHNlbmRpbmcgbWFjaGluZSBwdXQgdGhlbSBpbi4KLSAqCi0gKiBudG9oW2xzXSBhcmVuJ3Qgc3VmZmljaWVudCBiZWNhdXNlIHdlIG1pZ2h0IG5lZWQgdG8gc3dhcCBvbiBhIGJpZy1lbmRpYW4KLSAqIG1hY2hpbmUgKGlmIHRoZSBmaWxlIHdhcyB3cml0dGVuIGluIGxpdHRsZS1lbmQgb3JkZXIpLgotICovCi0jZGVmaW5lCVNXQVBMT05HKHkpIFwKLSgoKCh5KSYweGZmKTw8MjQpIHwgKCgoeSkmMHhmZjAwKTw8OCkgfCAoKCh5KSYweGZmMDAwMCk+PjgpIHwgKCgoeSk+PjI0KSYweGZmKSkKLSNkZWZpbmUJU1dBUFNIT1JUKHkpIFwKLQkoICgoKHkpJjB4ZmYpPDw4KSB8ICgodV9zaG9ydCkoKHkpJjB4ZmYwMCk+PjgpICkKLQotI2RlZmluZSBTRkVSUl9UUlVOQwkJMQotI2RlZmluZSBTRkVSUl9CQURWRVJTSU9OCTIKLSNkZWZpbmUgU0ZFUlJfQkFERgkJMwotI2RlZmluZSBTRkVSUl9FT0YJCTQgLyogbm90IHJlYWxseSBhbiBlcnJvciwganVzdCBhIHN0YXR1cyAqLworI2luY2x1ZGUgInNmLXBjYXAuaCIKKyNpbmNsdWRlICJzZi1wY2FwLW5nLmgiCiAKIC8qCiAgKiBTZXR0aW5nIE9fQklOQVJZIG9uIERPUy9XaW5kb3dzIGlzIGEgYml0IHRyaWNreQpAQCAtMTEzLDc3NCArODAsNiBAQAogICAjZW5kaWYKICNlbmRpZgogCi0vKgotICogV2UgZG9uJ3Qgd3JpdGUgRExUXyogdmFsdWVzIHRvIHRoZSBjYXB0dXJlIGZpbGUgaGVhZGVyLCBiZWNhdXNlCi0gKiB0aGV5J3JlIG5vdCB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zLgotICoKLSAqIFVuZm9ydHVuYXRlbHksIHRoZSB2YXJpb3VzIGZsYXZvcnMgb2YgQlNEIGhhdmUgbm90IGFsd2F5cyB1c2VkIHRoZSBzYW1lCi0gKiBudW1lcmljYWwgdmFsdWVzIGZvciB0aGUgc2FtZSBkYXRhIHR5cGVzLCBhbmQgdmFyaW91cyBwYXRjaGVzIHRvCi0gKiBsaWJwY2FwIGZvciBub24tQlNEIE9TZXMgaGF2ZSBhZGRlZCB0aGVpciBvd24gRExUXyogY29kZXMgZm9yIGxpbmsKLSAqIGxheWVyIGVuY2Fwc3VsYXRpb24gdHlwZXMgc2VlbiBvbiB0aG9zZSBPU2VzLCBhbmQgdGhvc2UgY29kZXMgaGF2ZSBoYWQsCi0gKiBpbiBzb21lIGNhc2VzLCB2YWx1ZXMgdGhhdCB3ZXJlIGFsc28gdXNlZCwgb24gb3RoZXIgcGxhdGZvcm1zLCBmb3Igb3RoZXIKLSAqIGxpbmsgbGF5ZXIgZW5jYXBzdWxhdGlvbiB0eXBlcy4KLSAqCi0gKiBUaGlzIG1lYW5zIHRoYXQgY2FwdHVyZSBmaWxlcyBvZiBhIHR5cGUgd2hvc2UgbnVtZXJpY2FsIERMVF8qIGNvZGUKLSAqIG1lYW5zIGRpZmZlcmVudCB0aGluZ3Mgb24gZGlmZmVyZW50IEJTRHMsIG9yIHdpdGggZGlmZmVyZW50IHZlcnNpb25zCi0gKiBvZiBsaWJwY2FwLCBjYW4ndCBhbHdheXMgYmUgcmVhZCBvbiBzeXN0ZW1zIG90aGVyIHRoYW4gdGhvc2UgbGlrZQotICogdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBtYWNoaW5lIG9uIHdoaWNoIHRoZSBjYXB0dXJlIHdhcyBtYWRlLgotICoKLSAqIEluc3RlYWQsIHdlIGRlZmluZSBoZXJlIGEgc2V0IG9mIExJTktUWVBFXyogY29kZXMsIGFuZCBtYXAgRExUXyogY29kZXMKLSAqIHRvIExJTktUWVBFXyogY29kZXMgd2hlbiB3cml0aW5nIGEgc2F2ZWZpbGUgaGVhZGVyLCBhbmQgbWFwIExJTktUWVBFXyoKLSAqIGNvZGVzIHRvIERMVF8qIGNvZGVzIHdoZW4gcmVhZGluZyBhIHNhdmVmaWxlIGhlYWRlci4KLSAqCi0gKiBGb3IgdGhvc2UgRExUXyogY29kZXMgdGhhdCBoYXZlLCBhcyBmYXIgYXMgd2Uga25vdywgdGhlIHNhbWUgdmFsdWVzIG9uCi0gKiBhbGwgcGxhdGZvcm1zIChETFRfTlVMTCB0aHJvdWdoIERMVF9GRERJKSwgd2UgZGVmaW5lIExJTktUWVBFX3h4eCBhcwotICogRExUX3h4eDsgdGhhdCB3YXksIGNhcHR1cmVzIG9mIHRob3NlIHR5cGVzIGNhbiBzdGlsbCBiZSByZWFkIGJ5Ci0gKiB2ZXJzaW9ucyBvZiBsaWJwY2FwIHRoYXQgbWFwIExJTktUWVBFXyogdmFsdWVzIHRvIERMVF8qIHZhbHVlcywgYW5kCi0gKiBjYXB0dXJlcyBvZiB0aG9zZSB0eXBlcyB3cml0dGVuIGJ5IHZlcnNpb25zIG9mIGxpYnBjYXAgdGhhdCBtYXAgRExUXwotICogdmFsdWVzIHRvIExJTktUWVBFXyB2YWx1ZXMgY2FuIHN0aWxsIGJlIHJlYWQgYnkgb2xkZXIgdmVyc2lvbnMKLSAqIG9mIGxpYnBjYXAuCi0gKgotICogVGhlIG90aGVyIExJTktUWVBFXyogY29kZXMgYXJlIGdpdmVuIHZhbHVlcyBzdGFydGluZyBhdCAxMDAsIGluIHRoZQotICogaG9wZXMgdGhhdCBubyBETFRfKiBjb2RlIHdpbGwgYmUgZ2l2ZW4gb25lIG9mIHRob3NlIHZhbHVlcy4KLSAqCi0gKiBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhIGdpdmVuIExJTktUWVBFXyogY29kZSdzIHZhbHVlIHdpbGwgcmVmZXIgdG8KLSAqIHRoZSBzYW1lIGVuY2Fwc3VsYXRpb24gdHlwZSBvbiBhbGwgcGxhdGZvcm1zLCB5b3Ugc2hvdWxkIG5vdCBhbGxvY2F0ZQotICogYSBuZXcgTElOS1RZUEVfKiB2YWx1ZSB3aXRob3V0IGNvbnN1bHRpbmcgInRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZyIuCi0gKiBUaGUgdGNwZHVtcCBkZXZlbG9wZXJzIHdpbGwgYWxsb2NhdGUgYSB2YWx1ZSBmb3IgeW91LCBhbmQgd2lsbCBub3QKLSAqIHN1YnNlcXVlbnRseSBhbGxvY2F0ZSBpdCB0byBhbnlib2R5IGVsc2U7IHRoYXQgdmFsdWUgd2lsbCBiZSBhZGRlZCB0bwotICogdGhlICJwY2FwLmgiIGluIHRoZSB0Y3BkdW1wLm9yZyBDVlMgcmVwb3NpdG9yeSwgc28gdGhhdCBhIGZ1dHVyZQotICogbGlicGNhcCByZWxlYXNlIHdpbGwgaW5jbHVkZSBpdC4KLSAqCi0gKiBZb3Ugc2hvdWxkLCBpZiBwb3NzaWJsZSwgYWxzbyBjb250cmlidXRlIHBhdGNoZXMgdG8gbGlicGNhcCBhbmQgdGNwZHVtcAotICogdG8gaGFuZGxlIHRoZSBuZXcgZW5jYXBzdWxhdGlvbiB0eXBlLCBzbyB0aGF0IHRoZXkgY2FuIGFsc28gYmUgY2hlY2tlZAotICogaW50byB0aGUgdGNwZHVtcC5vcmcgQ1ZTIHJlcG9zaXRvcnkgYW5kIHNvIHRoYXQgdGhleSB3aWxsIGFwcGVhciBpbgotICogZnV0dXJlIGxpYnBjYXAgYW5kIHRjcGR1bXAgcmVsZWFzZXMuCi0gKgotICogRG8gKk5PVCogYXNzdW1lIHRoYXQgYW55IHZhbHVlcyBhZnRlciB0aGUgbGFyZ2VzdCB2YWx1ZSBpbiB0aGlzIGZpbGUKLSAqIGFyZSBhdmFpbGFibGU7IHlvdSBtaWdodCBub3QgaGF2ZSB0aGUgbW9zdCB1cC10by1kYXRlIHZlcnNpb24gb2YgdGhpcwotICogZmlsZSwgYW5kIG5ldyB2YWx1ZXMgYWZ0ZXIgdGhhdCBvbmUgbWlnaHQgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgQWxzbywKLSAqIGRvICpOT1QqIHVzZSBhbnkgdmFsdWVzIGJlbG93IDEwMCAtIHRob3NlIG1pZ2h0IGFscmVhZHkgaGF2ZSBiZWVuCi0gKiB0YWtlbiBieSBvbmUgKG9yIG1vcmUhKSBvcmdhbml6YXRpb25zLgotICovCi0jZGVmaW5lIExJTktUWVBFX05VTEwJCURMVF9OVUxMCi0jZGVmaW5lIExJTktUWVBFX0VUSEVSTkVUCURMVF9FTjEwTUIJLyogYWxzbyBmb3IgMTAwTWIgYW5kIHVwICovCi0jZGVmaW5lIExJTktUWVBFX0VYUF9FVEhFUk5FVAlETFRfRU4zTUIJLyogM01iIGV4cGVyaW1lbnRhbCBFdGhlcm5ldCAqLwotI2RlZmluZSBMSU5LVFlQRV9BWDI1CQlETFRfQVgyNQotI2RlZmluZSBMSU5LVFlQRV9QUk9ORVQJCURMVF9QUk9ORVQKLSNkZWZpbmUgTElOS1RZUEVfQ0hBT1MJCURMVF9DSEFPUwotI2RlZmluZSBMSU5LVFlQRV9UT0tFTl9SSU5HCURMVF9JRUVFODAyCS8qIERMVF9JRUVFODAyIGlzIHVzZWQgZm9yIFRva2VuIFJpbmcgKi8KLSNkZWZpbmUgTElOS1RZUEVfQVJDTkVUCQlETFRfQVJDTkVUCS8qIEJTRC1zdHlsZSBoZWFkZXJzICovCi0jZGVmaW5lIExJTktUWVBFX1NMSVAJCURMVF9TTElQCi0jZGVmaW5lIExJTktUWVBFX1BQUAkJRExUX1BQUAotI2RlZmluZSBMSU5LVFlQRV9GRERJCQlETFRfRkRESQotCi0vKgotICogTElOS1RZUEVfUFBQIGlzIGZvciB1c2Ugd2hlbiB0aGVyZSBtaWdodCwgb3IgbWlnaHQgbm90LCBiZSBhbiBSRkMgMTY2MgotICogUFBQIGluIEhETEMtbGlrZSBmcmFtaW5nIGhlYWRlciAod2l0aCAweGZmIDB4MDMgYmVmb3JlIHRoZSBQUFAgcHJvdG9jb2wKLSAqIGZpZWxkKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQuCi0gKgotICogVGhpcyBpcyBmb3IgdXNlIHdoZW4gdGhlcmUgaXMgYWx3YXlzIHN1Y2ggYSBoZWFkZXI7IHRoZSBhZGRyZXNzIGZpZWxkCi0gKiBtaWdodCBiZSAweGZmLCBmb3IgcmVndWxhciBQUFAsIG9yIGl0IG1pZ2h0IGJlIGFuIGFkZHJlc3MgZmllbGQgZm9yIENpc2NvCi0gKiBwb2ludC10by1wb2ludCB3aXRoIEhETEMgZnJhbWluZyBhcyBwZXIgc2VjdGlvbiA0LjMuMSBvZiBSRkMgMTU0NyAoIkNpc2NvCi0gKiBIRExDIikuICBUaGlzIGlzLCBmb3IgZXhhbXBsZSwgd2hhdCB5b3UgZ2V0IHdpdGggTmV0QlNEJ3MgRExUX1BQUF9TRVJJQUwuCi0gKgotICogV2UgZ2l2ZSBpdCB0aGUgc2FtZSB2YWx1ZSBhcyBOZXRCU0QncyBETFRfUFBQX1NFUklBTCwgaW4gdGhlIGhvcGVzIHRoYXQKLSAqIG5vYm9keSBlbHNlIHdpbGwgY2hvb3NlIGEgRExUXyB2YWx1ZSBvZiA1MCwgYW5kIHNvIHRoYXQgRExUX1BQUF9TRVJJQUwKLSAqIGNhcHR1cmVzIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2l0aCBhIGxpbmsgdHlwZSB0aGF0IE5ldEJTRCdzIHRjcGR1bXAKLSAqIGNhbiByZWFkLgotICovCi0jZGVmaW5lIExJTktUWVBFX1BQUF9IRExDCTUwCQkvKiBQUFAgaW4gSERMQy1saWtlIGZyYW1pbmcgKi8KLQotI2RlZmluZSBMSU5LVFlQRV9QUFBfRVRIRVIJNTEJCS8qIE5ldEJTRCBQUFAtb3Zlci1FdGhlcm5ldCAqLwotCi0jZGVmaW5lIExJTktUWVBFX1NZTUFOVEVDX0ZJUkVXQUxMIDk5CQkvKiBTeW1hbnRlYyBFbnRlcnByaXNlIEZpcmV3YWxsICovCi0KLSNkZWZpbmUgTElOS1RZUEVfQVRNX1JGQzE0ODMJMTAwCQkvKiBMTEMvU05BUC1lbmNhcHN1bGF0ZWQgQVRNICovCi0jZGVmaW5lIExJTktUWVBFX1JBVwkJMTAxCQkvKiByYXcgSVAgKi8KLSNkZWZpbmUgTElOS1RZUEVfU0xJUF9CU0RPUwkxMDIJCS8qIEJTRC9PUyBTTElQIEJQRiBoZWFkZXIgKi8KLSNkZWZpbmUgTElOS1RZUEVfUFBQX0JTRE9TCTEwMwkJLyogQlNEL09TIFBQUCBCUEYgaGVhZGVyICovCi0jZGVmaW5lIExJTktUWVBFX0NfSERMQwkJMTA0CQkvKiBDaXNjbyBIRExDICovCi0jZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTEJMTA1CQkvKiBJRUVFIDgwMi4xMSAod2lyZWxlc3MpICovCi0jZGVmaW5lIExJTktUWVBFX0FUTV9DTElQCTEwNgkJLyogTGludXggQ2xhc3NpY2FsIElQIG92ZXIgQVRNICovCi0jZGVmaW5lIExJTktUWVBFX0ZSRUxBWQkJMTA3CQkvKiBGcmFtZSBSZWxheSAqLwotI2RlZmluZSBMSU5LVFlQRV9MT09QCQkxMDgJCS8qIE9wZW5CU0QgbG9vcGJhY2sgKi8KLSNkZWZpbmUgTElOS1RZUEVfRU5DCQkxMDkJCS8qIE9wZW5CU0QgSVBTRUMgZW5jICovCi0KLS8qCi0gKiBUaGVzZSB0aHJlZSB0eXBlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfTEFORTgwMjMJMTEwCQkvKiBBVE0gTEFORSArIDgwMi4zICovCi0jZGVmaW5lIExJTktUWVBFX0hJUFBJCQkxMTEJCS8qIE5ldEJTRCBISVBQSSAqLwotI2RlZmluZSBMSU5LVFlQRV9IRExDCQkxMTIJCS8qIE5ldEJTRCBIRExDIGZyYW1pbmcgKi8KLQotI2RlZmluZSBMSU5LVFlQRV9MSU5VWF9TTEwJMTEzCQkvKiBMaW51eCBjb29rZWQgc29ja2V0IGNhcHR1cmUgKi8KLSNkZWZpbmUgTElOS1RZUEVfTFRBTEsJCTExNAkJLyogQXBwbGUgTG9jYWxUYWxrIGhhcmR3YXJlICovCi0jZGVmaW5lIExJTktUWVBFX0VDT05FVAkJMTE1CQkvKiBBY29ybiBFY29uZXQgKi8KLQotLyoKLSAqIFJlc2VydmVkIGZvciB1c2Ugd2l0aCBPcGVuQlNEIGlwZmlsdGVyLgotICovCi0jZGVmaW5lIExJTktUWVBFX0lQRklMVEVSCTExNgotCi0jZGVmaW5lIExJTktUWVBFX1BGTE9HCQkxMTcJCS8qIE9wZW5CU0QgRExUX1BGTE9HICovCi0jZGVmaW5lIExJTktUWVBFX0NJU0NPX0lPUwkxMTgJCS8qIEZvciBDaXNjby1pbnRlcm5hbCB1c2UgKi8KLSNkZWZpbmUgTElOS1RZUEVfUFJJU01fSEVBREVSCTExOQkJLyogODAyLjExK1ByaXNtIElJIG1vbml0b3IgbW9kZSAqLwotI2RlZmluZSBMSU5LVFlQRV9BSVJPTkVUX0hFQURFUgkxMjAJCS8qIEZyZWVCU0QgQWlyb25ldCBkcml2ZXIgc3R1ZmYgKi8KLQotLyoKLSAqIFJlc2VydmVkIGZvciBTaWVtZW5zIEhpUGF0aCBIRExDLgotICovCi0jZGVmaW5lIExJTktUWVBFX0hIRExDCQkxMjEKLQotI2RlZmluZSBMSU5LVFlQRV9JUF9PVkVSX0ZDCTEyMgkJLyogUkZDIDI2MjUgSVAtb3Zlci1GaWJyZSBDaGFubmVsICovCi0jZGVmaW5lIExJTktUWVBFX1NVTkFUTQkJMTIzCQkvKiBTb2xhcmlzK1N1bkFUTSAqLwotCi0vKgotICogUmVzZXJ2ZWQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLZW50IERhaGxncmVuIDxrZW50QHByYWVzdW0uY29tPgotICogZm9yIHByaXZhdGUgdXNlLgotICovCi0jZGVmaW5lIExJTktUWVBFX1JJTwkJMTI0CQkvKiBSYXBpZElPICovCi0jZGVmaW5lIExJTktUWVBFX1BDSV9FWFAJMTI1CQkvKiBQQ0kgRXhwcmVzcyAqLwotI2RlZmluZSBMSU5LVFlQRV9BVVJPUkEJCTEyNgkJLyogWGlsaW54IEF1cm9yYSBsaW5rIGxheWVyICovCi0KLSNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xMV9SQURJTyAxMjcJCS8qIDgwMi4xMSBwbHVzIEJTRCByYWRpbyBoZWFkZXIgKi8KLQotLyoKLSAqIFJlc2VydmVkIGZvciB0aGUgVFpTUCBlbmNhcHN1bGF0aW9uLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBDaHJpcyBXYXRlcnMgPGNocmlzLndhdGVyc0BuZXR3b3JrY2hlbWlzdHJ5LmNvbT4KLSAqIFRaU1AgaXMgYSBnZW5lcmljIGVuY2Fwc3VsYXRpb24gZm9yIGFueSBvdGhlciBsaW5rIHR5cGUsCi0gKiB3aGljaCBpbmNsdWRlcyBhIG1lYW5zIHRvIGluY2x1ZGUgbWV0YS1pbmZvcm1hdGlvbgotICogd2l0aCB0aGUgcGFja2V0LCBlLmcuIHNpZ25hbCBzdHJlbmd0aCBhbmQgY2hhbm5lbAotICogZm9yIDgwMi4xMSBwYWNrZXRzLgotICovCi0jZGVmaW5lIExJTktUWVBFX1RaU1AJCTEyOAkJLyogVGF6bWVuIFNuaWZmZXIgUHJvdG9jb2wgKi8KLQotI2RlZmluZSBMSU5LVFlQRV9BUkNORVRfTElOVVgJMTI5CQkvKiBMaW51eC1zdHlsZSBoZWFkZXJzICovCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGVzLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBjb3JyZXNwb25kaW5nCi0gKiBETFRfcyBhcmUgdXNlZCBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsCi0gKiBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcyBRT1MgcHJvZmlsZXMsIGV0Yy4uCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9NTFBQUCAgMTMwCi0jZGVmaW5lIExJTktUWVBFX0pVTklQRVJfTUxGUiAgIDEzMQotI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0VTICAgICAxMzIKLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9HR1NOICAgMTMzCi0jZGVmaW5lIExJTktUWVBFX0pVTklQRVJfTUZSICAgIDEzNAotI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0FUTTIgICAxMzUKLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9TRVJWSUNFUyAxMzYKLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9BVE0xICAgMTM3Ci0KLSNkZWZpbmUgTElOS1RZUEVfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCAxMzgJLyogQXBwbGUgSVAtb3Zlci1JRUVFIDEzOTQgY29va2VkIGhlYWRlciAqLwotCi0jZGVmaW5lIExJTktUWVBFX01UUDJfV0lUSF9QSERSCTEzOQotI2RlZmluZSBMSU5LVFlQRV9NVFAyCQkxNDAKLSNkZWZpbmUgTElOS1RZUEVfTVRQMwkJMTQxCi0jZGVmaW5lIExJTktUWVBFX1NDQ1AJCTE0MgotCi0jZGVmaW5lIExJTktUWVBFX0RPQ1NJUwkJMTQzCQkvKiBET0NTSVMgTUFDIGZyYW1lcyAqLwotCi0jZGVmaW5lIExJTktUWVBFX0xJTlVYX0lSREEJMTQ0CQkvKiBMaW51eC1JckRBICovCi0KLS8qCi0gKiBSZXNlcnZlZCBmb3IgSUJNIFNQIHN3aXRjaCBhbmQgSUJNIE5leHQgRmVkZXJhdGlvbiBzd2l0Y2guCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfSUJNX1NQCQkxNDUKLSNkZWZpbmUgTElOS1RZUEVfSUJNX1NOCQkxNDYKLQotLyoKLSAqIFJlc2VydmVkIGZvciBwcml2YXRlIHVzZS4gIElmIHlvdSBoYXZlIHNvbWUgbGluay1sYXllciBoZWFkZXIgdHlwZQotICogdGhhdCB5b3Ugd2FudCB0byB1c2Ugd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLCB3aXRoIHRoZSBjYXB0dXJlIGZpbGVzCi0gKiB1c2luZyB0aGF0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgbm90IGV2ZXIgYmUgc2VudCBvdXRzaWRlIHlvdXIKLSAqIG9yZ2FuaXphdGlvbiwgeW91IGNhbiB1c2UgdGhlc2UgdmFsdWVzLgotICoKLSAqIE5vIGxpYnBjYXAgcmVsZWFzZSB3aWxsIHVzZSB0aGVzZSBmb3IgYW55IHB1cnBvc2UsIG5vciB3aWxsIGFueQotICogdGNwZHVtcCByZWxlYXNlIHVzZSB0aGVtLCBlaXRoZXIuCi0gKgotICogRG8gKk5PVCogdXNlIHRoZXNlIGluIGNhcHR1cmUgZmlsZXMgdGhhdCB5b3UgZXhwZWN0IGFueWJvZHkgbm90IHVzaW5nCi0gKiB5b3VyIHByaXZhdGUgdmVyc2lvbnMgb2YgY2FwdHVyZS1maWxlLXJlYWRpbmcgdG9vbHMgdG8gcmVhZDsgaW4KLSAqIHBhcnRpY3VsYXIsIGRvICpOT1QqIHVzZSB0aGVtIGluIHByb2R1Y3RzLCBvdGhlcndpc2UgeW91IG1heSBmaW5kIHRoYXQKLSAqIHBlb3BsZSB3b24ndCBiZSBhYmxlIHRvIHVzZSB0Y3BkdW1wLCBvciBzbm9ydCwgb3IgRXRoZXJlYWwsIG9yLi4uIHRvCi0gKiByZWFkIGNhcHR1cmUgZmlsZXMgZnJvbSB5b3VyIGZpcmV3YWxsL2ludHJ1c2lvbiBkZXRlY3Rpb24vdHJhZmZpYwotICogbW9uaXRvcmluZy9ldGMuIGFwcGxpYW5jZSwgb3Igd2hhdGV2ZXIgcHJvZHVjdCB1c2VzIHRoYXQgTElOS1RZUEVfIHZhbHVlLAotICogYW5kIHlvdSBtYXkgYWxzbyBmaW5kIHRoYXQgdGhlIGRldmVsb3BlcnMgb2YgdGhvc2UgYXBwbGljYXRpb25zIHdpbGwKLSAqIG5vdCBhY2NlcHQgcGF0Y2hlcyB0byBsZXQgdGhlbSByZWFkIHRob3NlIGZpbGVzLgotICoKLSAqIEFsc28sIGRvIG5vdCB1c2UgdGhlbSBpZiBzb21lYm9keSBtaWdodCBzZW5kIHlvdSBhIGNhcHR1cmUgdXNpbmcgdGhlbQotICogZm9yICp0aGVpciogcHJpdmF0ZSB0eXBlIGFuZCB0b29scyB1c2luZyB0aGVtIGZvciAqeW91ciogcHJpdmF0ZSB0eXBlCi0gKiB3b3VsZCBoYXZlIHRvIHJlYWQgdGhlbS4KLSAqCi0gKiBJbnN0ZWFkLCBpbiB0aG9zZSBjYXNlcywgYXNrICJ0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmciIGZvciBhIG5ldyBETFRfCi0gKiBhbmQgTElOS1RZUEVfIHZhbHVlLCBhcyBwZXIgdGhlIGNvbW1lbnQgaW4gcGNhcC1icGYuaCwgYW5kIHVzZSB0aGUgdHlwZQotICogeW91J3JlIGdpdmVuLgotICovCi0jZGVmaW5lIExJTktUWVBFX1VTRVIwCQkxNDcKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjEJCTE0OAotI2RlZmluZSBMSU5LVFlQRV9VU0VSMgkJMTQ5Ci0jZGVmaW5lIExJTktUWVBFX1VTRVIzCQkxNTAKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjQJCTE1MQotI2RlZmluZSBMSU5LVFlQRV9VU0VSNQkJMTUyCi0jZGVmaW5lIExJTktUWVBFX1VTRVI2CQkxNTMKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjcJCTE1NAotI2RlZmluZSBMSU5LVFlQRV9VU0VSOAkJMTU1Ci0jZGVmaW5lIExJTktUWVBFX1VTRVI5CQkxNTYKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjEwCQkxNTcKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjExCQkxNTgKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjEyCQkxNTkKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjEzCQkxNjAKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjE0CQkxNjEKLSNkZWZpbmUgTElOS1RZUEVfVVNFUjE1CQkxNjIKLQotLyoKLSAqIEZvciBmdXR1cmUgdXNlIHdpdGggODAyLjExIGNhcHR1cmVzIC0gZGVmaW5lZCBieSBBYnNvbHV0ZVZhbHVlCi0gKiBTeXN0ZW1zIHRvIHN0b3JlIGEgbnVtYmVyIG9mIGJpdHMgb2YgbGluay1sYXllciBpbmZvcm1hdGlvbgotICogaW5jbHVkaW5nIHJhZGlvIGluZm9ybWF0aW9uOgotICoKLSAqCWh0dHA6Ly93d3cuc2hhZnRuZXQub3JnL35waXp6YS9zb2Z0d2FyZS9jYXB0dXJlZnJtLnR4dAotICoKLSAqIGJ1dCBjb3VsZCBhbmQgYXJndWFibHkgc2hvdWxkIGFsc28gYmUgdXNlZCBieSBub24tQVZTIExpbnV4Ci0gKiA4MDIuMTEgZHJpdmVyczsgdGhhdCBtYXkgaGFwcGVuIGluIHRoZSBmdXR1cmUuCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xMV9SQURJT19BVlMgMTYzCS8qIDgwMi4xMSBwbHVzIEFWUyByYWRpbyBoZWFkZXIgKi8KLQotLyoKLSAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQotICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgY29ycmVzcG9uZGluZwotICogRExUX3MgYXJlIHVzZWQgZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbAotICogbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMgUU9TIHByb2ZpbGVzLCBldGMuLgotICovCi0jZGVmaW5lIExJTktUWVBFX0pVTklQRVJfTU9OSVRPUiAxNjQKLQotLyoKLSAqIFJlc2VydmVkIGZvciBCQUNuZXQgTVMvVFAuCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfQkFDTkVUX01TX1RQCTE2NQotCi0vKgotICogQW5vdGhlciBQUFAgdmFyaWFudCBhcyBwZXIgcmVxdWVzdCBmcm9tIEthcnN0ZW4gS2VpbCA8a2tlaWxAc3VzZS5kZT4uCi0gKgotICogVGhpcyBpcyB1c2VkIGluIHNvbWUgT1NlcyB0byBhbGxvdyBhIGtlcm5lbCBzb2NrZXQgZmlsdGVyIHRvIGRpc3Rpbmd1aXNoCi0gKiBiZXR3ZWVuIGluY29taW5nIGFuZCBvdXRnb2luZyBwYWNrZXRzLCBvbiBhIHNvY2tldCBpbnRlbmRlZCB0bwotICogc3VwcGx5IHBwcGQgd2l0aCBvdXRnb2luZyBwYWNrZXRzIHNvIGl0IGNhbiBkbyBkaWFsLW9uLWRlbWFuZCBhbmQKLSAqIGhhbmd1cC1vbi1sYWNrLW9mLWRlbWFuZDsgaW5jb21pbmcgcGFja2V0cyBhcmUgZmlsdGVyZWQgb3V0IHNvIHRoZXkKLSAqIGRvbid0IGNhdXNlIHBwcGQgdG8gaG9sZCB0aGUgY29ubmVjdGlvbiB1cCAoeW91IGRvbid0IHdhbnQgcmFuZG9tCi0gKiBpbnB1dCBwYWNrZXRzIHN1Y2ggYXMgcG9ydCBzY2FucywgcGFja2V0cyBmcm9tIG9sZCBsb3N0IGNvbm5lY3Rpb25zLAotICogZXRjLiB0byBmb3JjZSB0aGUgY29ubmVjdGlvbiB0byBzdGF5IHVwKS4KLSAqCi0gKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgUFBQIGhlYWRlciAoMHhmZjAzKSBpcyBtb2RpZmllZCB0byBhY2NvbW9kYXRlCi0gKiB0aGUgZGlyZWN0aW9uIC0gMHgwMCA9IElOLCAweDAxID0gT1VULgotICovCi0jZGVmaW5lIExJTktUWVBFX1BQUF9QUFBECTE2NgotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfcyBhcmUgdXNlZAotICogZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcwotICogUU9TIHByb2ZpbGVzLCBjb29raWVzLCBldGMuLgotICovCi0jZGVmaW5lIExJTktUWVBFX0pVTklQRVJfUFBQT0UgICAgIDE2NwotI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1BQUE9FX0FUTSAxNjgKLQotI2RlZmluZSBMSU5LVFlQRV9HUFJTX0xMQwkxNjkJCS8qIEdQUlMgTExDICovCi0jZGVmaW5lIExJTktUWVBFX0dQRl9UCQkxNzAJCS8qIEdQRi1UIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLwotI2RlZmluZSBMSU5LVFlQRV9HUEZfRgkJMTcxCQkvKiBHUEYtVCAoSVRVLVQgRy43MDQxL1kuMTMwMykgKi8KLQotLyoKLSAqIFJlcXVlc3RlZCBieSBPb2xhbiBaaW1tZXIgPG96QGdjb20uY29tPiBmb3IgdXNlIGluIEdjb20ncyBUMS9FMSBsaW5lCi0gKiBtb25pdG9yaW5nIGVxdWlwbWVudC4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9HQ09NX1QxRTEJMTcyCi0jZGVmaW5lIExJTktUWVBFX0dDT01fU0VSSUFMCTE3MwotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfIGlzIHVzZWQKLSAqIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHRvIFBoeXNpY2FsIEludGVyZmFjZSBDYXJkcyAoUElDKQotICovCi0jZGVmaW5lIExJTktUWVBFX0pVTklQRVJfUElDX1BFRVIgICAgMTc0Ci0KLS8qCi0gKiBMaW5rIHR5cGVzIHJlcXVlc3RlZCBieSBHcmVnb3IgTWFpZXIgPGdyZWdvckBlbmRhY2UuY29tPiBvZiBFbmRhY2UKLSAqIE1lYXN1cmVtZW50IFN5c3RlbXMuICBUaGV5IGFkZCBhbiBFUkYgaGVhZGVyIChzZWUKLSAqIGh0dHA6Ly93d3cuZW5kYWNlLmNvbS9zdXBwb3J0L0VuZGFjZVJlY29yZEZvcm1hdC5wZGYpIGluIGZyb250IG9mCi0gKiB0aGUgbGluay1sYXllciBoZWFkZXIuCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfRVJGX0VUSAkxNzUJLyogRXRoZXJuZXQgKi8KLSNkZWZpbmUgTElOS1RZUEVfRVJGX1BPUwkxNzYJLyogUGFja2V0LW92ZXItU09ORVQgKi8KLQotLyoKLSAqIFJlcXVlc3RlZCBieSBEYW5pZWxlIE9ybGFuZGkgPGRhbmllbGVAb3JsYW5kaS5jb20+IGZvciByYXcgTEFQRAotICogZm9yIHZJU0ROIChodHRwOi8vd3d3Lm9ybGFuZGkuY29tL3Zpc2RuLykuICBJdHMgbGluay1sYXllciBoZWFkZXIKLSAqIGluY2x1ZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBMQVBEIGhlYWRlciwgc28gaXQncwotICogbm90IG5lY2Vzc2FyaWx5IGEgZ2VuZXJpYyBMQVBEIGhlYWRlci4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9MSU5VWF9MQVBECTE3NwotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCi0gKiBUaGUgTGluayBUeXBlcyBhcmUgdXNlZCBmb3IgcHJlcGVuZGluZyBtZXRhLWluZm9ybWF0aW9uCi0gKiBsaWtlIGludGVyZmFjZSBpbmRleCwgaW50ZXJmYWNlIG5hbWUKLSAqIGJlZm9yZSBzdGFuZGFyZCBFdGhlcm5ldCwgUFBQLCBGcmVsYXkgJiBDLUhETEMgRnJhbWVzCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9FVEhFUiAgMTc4Ci0jZGVmaW5lIExJTktUWVBFX0pVTklQRVJfUFBQICAgIDE3OQotI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0ZSRUxBWSAxODAKLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9DSERMQyAgMTgxCi0KLS8qCi0gKiBNdWx0aSBMaW5rIEZyYW1lIFJlbGF5IChGUkYuMTYpCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfTUZSICAgICAgICAgICAgMTgyCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKLSAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gd2l0aCBhCi0gKiB2b2ljZSBBZGFwdGVyIENhcmQgKFBJQykKLSAqLwotI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1ZQICAgICAxODMKLQotLyoKLSAqIEFyaW5jIDQyOSBmcmFtZXMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBFdmVyeSBmcmFtZSBjb250YWlucyBhIDMyYml0IEE0MjkgbGFiZWwuCi0gKiBNb3JlIGRvY3VtZW50YXRpb24gb24gQXJpbmMgNDI5IGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5jb25kb3JlbmcuY29tL3N1cHBvcnQvZG93bmxvYWRzL3R1dG9yaWFscy9BUklOQ1R1dG9yaWFsLnBkZgotICovCi0jZGVmaW5lIExJTktUWVBFX0E0MjkgICAgICAgICAgIDE4NAotCi0vKgotICogQXJpbmMgNjUzIEludGVycGFydGl0aW9uIENvbW11bmljYXRpb24gbWVzc2FnZXMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBQbGVhc2UgcmVmZXIgdG8gdGhlIEE2NTMtMSBzdGFuZGFyZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9BNjUzX0lDTSAgICAgICAxODUKLQotLyoKLSAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIFVTQiBzZXR1cCBoZWFkZXI7IHJlcXVlc3RlZCBieQotICogUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0Pi4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9VU0IJCTE4NgotCi0vKgotICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpOyByZXF1ZXN0ZWQgYnkKLSAqIFBhb2xvIEFiZW5pLgotICovCi0jZGVmaW5lIExJTktUWVBFX0JMVUVUT09USF9IQ0lfSDQJMTg3Ci0KLS8qCi0gKiBJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXI7IHJlcXVlc3RlZCBieSBNYXJpYSBDcnV6Ci0gKiA8Y3J1el9wZXRhZ2F5QGJhaC5jb20+LgotICovCi0jZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTZfTUFDX0NQUwkxODgKLQotLyoKLSAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIExpbnV4IFVTQiBoZWFkZXI7IHJlcXVlc3RlZCBieQotICogUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0Pi4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9VU0JfTElOVVgJMTg5Ci0KLS8qCi0gKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2LiAyLjBCIHBhY2tldHMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBVc2VkIHRvIGR1bXAgQ0FOIHBhY2tldHMgY29taW5nIGZyb20gYSBDQU4gVmVjdG9yIGJvYXJkLgotICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBDQU4gdjIuMEIgZnJhbWVzIGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5jYW4tY2lhLm9yZy9kb3dubG9hZHMvPzI2OQotICovCi0jZGVmaW5lIExJTktUWVBFX0NBTjIwQiAgICAgICAgIDE5MAotCi0vKgotICogSUVFRSA4MDIuMTUuNCwgd2l0aCBhZGRyZXNzIGZpZWxkcyBwYWRkZWQsIGFzIGlzIGRvbmUgYnkgTGludXgKLSAqIGRyaXZlcnM7IHJlcXVlc3RlZCBieSBKdWVyZ2VuIFNjaGltbWVyLgotICovCi0jZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTVfNF9MSU5VWAkxOTEKLQotLyoKLSAqIFBlciBQYWNrZXQgSW5mb3JtYXRpb24gZW5jYXBzdWxhdGVkIHBhY2tldHMuCi0gKiBMSU5LVFlQRV8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9QUEkJCQkxOTIKLQotLyoKLSAqIEhlYWRlciBmb3IgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciBwbHVzIGEgcmFkaW90YXAgcmFkaW8gaGVhZGVyOwotICogcmVxdWVzdGVkIGJ5IENoYXJsZXMgQ2xhbmN5LgotICovCi0jZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTZfTUFDX0NQU19SQURJTwkxOTMKLQotLyoKLSAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQotICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAotICogVGhlIERMVF8gaXMgdXNlZCBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiB3aXRoIGEKLSAqIGludGVncmF0ZWQgc2VydmljZSBtb2R1bGUgKElTTSkuCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9JU00gICAgMTk0Ci0KLS8qCi0gKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCi0gKiBub3RoaW5nKTsgcmVxdWVzdGVkIGJ5IE1pa2tvIFNhYXJuaXZhbGEgPG1pa2tvLnNhYXJuaXZhbGFAc2Vuc2lub2RlLmNvbT4uCi0gKi8KLSNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xNV80CTE5NQotCi0vKgotICogVmFyaW91cyBsaW5rLWxheWVyIHR5cGVzLCB3aXRoIGEgcHNldWRvLWhlYWRlciwgZm9yIFNJVEEKLSAqIChodHRwOi8vd3d3LnNpdGEuYWVyby8pOyByZXF1ZXN0ZWQgYnkgRnVsa28gSGV3IChmdWxrby5oZXdAZ21haWwuY29tKS4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9TSVRBCQkxOTYKLQotLyoKLSAqIFZhcmlvdXMgbGluay1sYXllciB0eXBlcywgd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBFbmRhY2UgREFHIGNhcmRzOwotICogZW5jYXBzdWxhdGVzIEVuZGFjZSBFUkYgcmVjb3Jkcy4gIFJlcXVlc3RlZCBieSBTdGVwaGVuIERvbm5lbGx5Ci0gKiA8c3RlcGhlbkBlbmRhY2UuY29tPi4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9FUkYJCTE5NwotCi0vKgotICogU3BlY2lhbCBoZWFkZXIgcHJlcGVuZGVkIHRvIEV0aGVybmV0IHBhY2tldHMgd2hlbiBjYXB0dXJpbmcgZnJvbSBhCi0gKiB1MTAgTmV0d29ya3MgYm9hcmQuICBSZXF1ZXN0ZWQgYnkgUGhpbCBNdWxob2xsYW5kCi0gKiA8cGhpbEB1MTBuZXR3b3Jrcy5jb20+LgotICovCi0jZGVmaW5lIExJTktUWVBFX1JBSUYxCQkxOTgKLQotLyoKLSAqIElQTUIgcGFja2V0IGZvciBJUE1JLCBiZWdpbm5pbmcgd2l0aCB0aGUgSTJDIHNsYXZlIGFkZHJlc3MsIGZvbGxvd2VkCi0gKiBieSB0aGUgbmV0Rm4gYW5kIExVTiwgZXRjLi4gIFJlcXVlc3RlZCBieSBDaGFudGh5IFRvZXVuZwotICogPGNoYW50aHkudG9ldW5nQGNhLmtvbnRyb24uY29tPi4KLSAqLwotI2RlZmluZSBMSU5LVFlQRV9JUE1CCQkxOTkKLQotCi1zdGF0aWMgc3RydWN0IGxpbmt0eXBlX21hcCB7Ci0JaW50CWRsdDsKLQlpbnQJbGlua3R5cGU7Ci19IG1hcFtdID0gewotCS8qCi0JICogVGhlc2UgRExUXyogY29kZXMgaGF2ZSBMSU5LVFlQRV8qIGNvZGVzIHdpdGggdmFsdWVzIGlkZW50aWNhbAotCSAqIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgRExUXyogY29kZS4KLQkgKi8KLQl7IERMVF9OVUxMLAkJTElOS1RZUEVfTlVMTCB9LAotCXsgRExUX0VOMTBNQiwJCUxJTktUWVBFX0VUSEVSTkVUIH0sCi0JeyBETFRfRU4zTUIsCQlMSU5LVFlQRV9FWFBfRVRIRVJORVQgfSwKLQl7IERMVF9BWDI1LAkJTElOS1RZUEVfQVgyNSB9LAotCXsgRExUX1BST05FVCwJCUxJTktUWVBFX1BST05FVCB9LAotCXsgRExUX0NIQU9TLAkJTElOS1RZUEVfQ0hBT1MgfSwKLQl7IERMVF9JRUVFODAyLAkJTElOS1RZUEVfVE9LRU5fUklORyB9LAotCXsgRExUX0FSQ05FVCwJCUxJTktUWVBFX0FSQ05FVCB9LAotCXsgRExUX1NMSVAsCQlMSU5LVFlQRV9TTElQIH0sCi0JeyBETFRfUFBQLAkJTElOS1RZUEVfUFBQIH0sCi0JeyBETFRfRkRESSwJIAlMSU5LVFlQRV9GRERJIH0sCi0KLQkvKgotCSAqIFRoZXNlIERMVF8qIGNvZGVzIGhhdmUgZGlmZmVyZW50IHZhbHVlcyBvbiBkaWZmZXJlbnQKLQkgKiBwbGF0Zm9ybXM7IHdlIG1hcCB0aGVtIHRvIExJTktUWVBFXyogY29kZXMgdGhhdAotCSAqIGhhdmUgdmFsdWVzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGVxdWFsIHRvIGFueSBETFRfKgotCSAqIGNvZGUuCi0JICovCi0jaWZkZWYgRExUX0ZSCi0JLyogQlNEL09TIEZyYW1lIFJlbGF5ICovCi0JeyBETFRfRlIsCQlMSU5LVFlQRV9GUkVMQVkgfSwKLSNlbmRpZgotCi0JeyBETFRfU1lNQU5URUNfRklSRVdBTEwsIExJTktUWVBFX1NZTUFOVEVDX0ZJUkVXQUxMIH0sCi0JeyBETFRfQVRNX1JGQzE0ODMsIAlMSU5LVFlQRV9BVE1fUkZDMTQ4MyB9LAotCXsgRExUX1JBVywJCUxJTktUWVBFX1JBVyB9LAotCXsgRExUX1NMSVBfQlNET1MsCUxJTktUWVBFX1NMSVBfQlNET1MgfSwKLQl7IERMVF9QUFBfQlNET1MsCUxJTktUWVBFX1BQUF9CU0RPUyB9LAotCi0JLyogQlNEL09TIENpc2NvIEhETEMgKi8KLQl7IERMVF9DX0hETEMsCQlMSU5LVFlQRV9DX0hETEMgfSwKLQotCS8qCi0JICogVGhlc2UgRExUXyogY29kZXMgYXJlIG5vdCBvbiBhbGwgcGxhdGZvcm1zLCBidXQsIHNvIGZhciwKLQkgKiB0aGVyZSBkb24ndCBhcHBlYXIgdG8gYmUgYW55IHBsYXRmb3JtcyB0aGF0IGRlZmluZQotCSAqIG90aGVyIGNvZGVzIHdpdGggdGhvc2UgdmFsdWVzOyB3ZSBtYXAgdGhlbSB0bwotCSAqIGRpZmZlcmVudCBMSU5LVFlQRV8qIHZhbHVlcyBhbnl3YXksIGp1c3QgaW4gY2FzZS4KLQkgKi8KLQotCS8qIExpbnV4IEFUTSBDbGFzc2ljYWwgSVAgKi8KLQl7IERMVF9BVE1fQ0xJUCwJCUxJTktUWVBFX0FUTV9DTElQIH0sCi0KLQkvKiBOZXRCU0Qgc3luYy9hc3luYyBzZXJpYWwgUFBQIChvciBDaXNjbyBIRExDKSAqLwotCXsgRExUX1BQUF9TRVJJQUwsCUxJTktUWVBFX1BQUF9IRExDIH0sCi0KLQkvKiBOZXRCU0QgUFBQIG92ZXIgRXRoZXJuZXQgKi8KLQl7IERMVF9QUFBfRVRIRVIsCUxJTktUWVBFX1BQUF9FVEhFUiB9LAotCi0JLyogSUVFRSA4MDIuMTEgd2lyZWxlc3MgKi8KLQl7IERMVF9JRUVFODAyXzExLAlMSU5LVFlQRV9JRUVFODAyXzExIH0sCi0KLQkvKiBGcmFtZSBSZWxheSAqLwotCXsgRExUX0ZSRUxBWSwJCUxJTktUWVBFX0ZSRUxBWSB9LAotCi0JLyogT3BlbkJTRCBsb29wYmFjayAqLwotCXsgRExUX0xPT1AsCQlMSU5LVFlQRV9MT09QIH0sCi0KLQkvKiBMaW51eCBjb29rZWQgc29ja2V0IGNhcHR1cmUgKi8KLQl7IERMVF9MSU5VWF9TTEwsCUxJTktUWVBFX0xJTlVYX1NMTCB9LAotCi0JLyogQXBwbGUgTG9jYWxUYWxrIGhhcmR3YXJlICovCi0JeyBETFRfTFRBTEssCQlMSU5LVFlQRV9MVEFMSyB9LAotCi0JLyogQWNvcm4gRWNvbmV0ICovCi0JeyBETFRfRUNPTkVULAkJTElOS1RZUEVfRUNPTkVUIH0sCi0KLQkvKiBPcGVuQlNEIERMVF9QRkxPRyAqLwotCXsgRExUX1BGTE9HLAkJTElOS1RZUEVfUEZMT0cgfSwKLQotCS8qIEZvciBDaXNjby1pbnRlcm5hbCB1c2UgKi8KLQl7IERMVF9DSVNDT19JT1MsCUxJTktUWVBFX0NJU0NPX0lPUyB9LAotCi0JLyogUHJpc20gSUkgbW9uaXRvci1tb2RlIGhlYWRlciBwbHVzIDgwMi4xMSBoZWFkZXIgKi8KLQl7IERMVF9QUklTTV9IRUFERVIsCUxJTktUWVBFX1BSSVNNX0hFQURFUiB9LAotCi0JLyogRnJlZUJTRCBBaXJvbmV0IGRyaXZlciBzdHVmZiAqLwotCXsgRExUX0FJUk9ORVRfSEVBREVSLAlMSU5LVFlQRV9BSVJPTkVUX0hFQURFUiB9LAotCi0JLyogU2llbWVucyBIaVBhdGggSERMQyAqLwotCXsgRExUX0hIRExDLAkJTElOS1RZUEVfSEhETEMgfSwKLQotCS8qIFJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbCAqLwotCXsgRExUX0lQX09WRVJfRkMsCUxJTktUWVBFX0lQX09WRVJfRkMgfSwKLQotCS8qIFNvbGFyaXMrU3VuQVRNICovCi0JeyBETFRfU1VOQVRNLAkJTElOS1RZUEVfU1VOQVRNIH0sCi0KLQkvKiBSYXBpZElPICovCi0JeyBETFRfUklPLAkJTElOS1RZUEVfUklPIH0sCi0KLQkvKiBQQ0kgRXhwcmVzcyAqLwotCXsgRExUX1BDSV9FWFAsCQlMSU5LVFlQRV9QQ0lfRVhQIH0sCi0KLQkvKiBYaWxpbnggQXVyb3JhIGxpbmsgbGF5ZXIgKi8KLQl7IERMVF9BVVJPUkEsCQlMSU5LVFlQRV9BVVJPUkEgfSwKLQotCS8qIDgwMi4xMSBwbHVzIEJTRCByYWRpbyBoZWFkZXIgKi8KLQl7IERMVF9JRUVFODAyXzExX1JBRElPLAlMSU5LVFlQRV9JRUVFODAyXzExX1JBRElPIH0sCi0KLQkvKiBUYXptZW4gU25pZmZlciBQcm90b2NvbCAqLwotCXsgRExUX1RaU1AsCQlMSU5LVFlQRV9UWlNQIH0sCi0KLQkvKiBBcmNuZXQgd2l0aCBMaW51eC1zdHlsZSBsaW5rLWxheWVyIGhlYWRlcnMgKi8KLQl7IERMVF9BUkNORVRfTElOVVgsCUxJTktUWVBFX0FSQ05FVF9MSU5VWCB9LAotCi0gICAgICAgIC8qIEp1bmlwZXItaW50ZXJuYWwgY2hhc3NpcyBlbmNhcHN1bGF0aW9uICovCi0gICAgICAgIHsgRExUX0pVTklQRVJfTUxQUFAsICAgIExJTktUWVBFX0pVTklQRVJfTUxQUFAgfSwKLSAgICAgICAgeyBETFRfSlVOSVBFUl9NTEZSLCAgICAgTElOS1RZUEVfSlVOSVBFUl9NTEZSIH0sCi0gICAgICAgIHsgRExUX0pVTklQRVJfRVMsICAgICAgIExJTktUWVBFX0pVTklQRVJfRVMgfSwKLSAgICAgICAgeyBETFRfSlVOSVBFUl9HR1NOLCAgICAgTElOS1RZUEVfSlVOSVBFUl9HR1NOIH0sCi0gICAgICAgIHsgRExUX0pVTklQRVJfTUZSLCAgICAgIExJTktUWVBFX0pVTklQRVJfTUZSIH0sCi0gICAgICAgIHsgRExUX0pVTklQRVJfQVRNMiwgICAgIExJTktUWVBFX0pVTklQRVJfQVRNMiB9LAotICAgICAgICB7IERMVF9KVU5JUEVSX1NFUlZJQ0VTLCBMSU5LVFlQRV9KVU5JUEVSX1NFUlZJQ0VTIH0sCi0gICAgICAgIHsgRExUX0pVTklQRVJfQVRNMSwgICAgIExJTktUWVBFX0pVTklQRVJfQVRNMSB9LAotCi0JLyogQXBwbGUgSVAtb3Zlci1JRUVFIDEzOTQgY29va2VkIGhlYWRlciAqLwotCXsgRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQsIExJTktUWVBFX0FQUExFX0lQX09WRVJfSUVFRTEzOTQgfSwKLQotCS8qIFNTNyAqLwotCXsgRExUX01UUDJfV0lUSF9QSERSLAlMSU5LVFlQRV9NVFAyX1dJVEhfUEhEUiB9LAotCXsgRExUX01UUDIsCQlMSU5LVFlQRV9NVFAyIH0sCi0JeyBETFRfTVRQMywJCUxJTktUWVBFX01UUDMgfSwKLQl7IERMVF9TQ0NQLAkJTElOS1RZUEVfU0NDUCB9LAotCi0JLyogRE9DU0lTIE1BQyBmcmFtZXMgKi8KLQl7IERMVF9ET0NTSVMsCQlMSU5LVFlQRV9ET0NTSVMgfSwKLQotCS8qIElyREEgSXJMQVAgcGFja2V0cyArIExpbnV4LWNvb2tlZCBoZWFkZXIgKi8KLQl7IERMVF9MSU5VWF9JUkRBLAlMSU5LVFlQRV9MSU5VWF9JUkRBIH0sCi0KLQkvKiBJQk0gU1AgYW5kIE5leHQgRmVkZXJhdGlvbiBzd2l0Y2hlcyAqLwotCXsgRExUX0lCTV9TUCwJCUxJTktUWVBFX0lCTV9TUCB9LAotCXsgRExUX0lCTV9TTiwJCUxJTktUWVBFX0lCTV9TTiB9LAotCi0JLyogODAyLjExIHBsdXMgQVZTIHJhZGlvIGhlYWRlciAqLwotCXsgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTLCBMSU5LVFlQRV9JRUVFODAyXzExX1JBRElPX0FWUyB9LAotCi0JLyoKLQkgKiBBbnkgcGxhdGZvcm0gdGhhdCBkZWZpbmVzIGFkZGl0aW9uYWwgRExUXyogY29kZXMgc2hvdWxkOgotCSAqCi0JICoJcmVxdWVzdCBhIExJTktUWVBFXyogY29kZSBhbmQgdmFsdWUgZnJvbSB0Y3BkdW1wLm9yZywKLQkgKglhcyBwZXIgdGhlIGFib3ZlOwotCSAqCi0JICoJYWRkLCBpbiB0aGVpciB2ZXJzaW9uIG9mIGxpYnBjYXAsIGFuIGVudHJ5IHRvIG1hcAotCSAqCXRob3NlIERMVF8qIGNvZGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIExJTktUWVBFXyoKLQkgKgljb2RlOwotCSAqCi0JICoJcmVkZWZpbmUsIGluIHRoZWlyICJuZXQvYnBmLmgiLCBhbnkgRExUXyogdmFsdWVzCi0JICoJdGhhdCBjb2xsaWRlIHdpdGggdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZWlyIGFkZGl0aW9uYWwKLQkgKglETFRfKiBjb2RlcywgdG8gcmVtb3ZlIHRob3NlIGNvbGxpc2lvbnMgKGJ1dCB3aXRob3V0Ci0JICoJbWFraW5nIHRoZW0gY29sbGlkZSB3aXRoIGFueSBvZiB0aGUgTElOS1RZUEVfKgotCSAqCXZhbHVlcyBlcXVhbCB0byA1MCBvciBhYm92ZTsgdGhleSBzaG91bGQgYWxzbyBhdm9pZAotCSAqCWRlZmluaW5nIERMVF8qIHZhbHVlcyB0aGF0IGNvbGxpZGUgd2l0aCB0aG9zZQotCSAqCUxJTktUWVBFXyogdmFsdWVzLCBlaXRoZXIpLgotCSAqLwotCi0JLyogSnVuaXBlci1pbnRlcm5hbCBjaGFzc2lzIGVuY2Fwc3VsYXRpb24gKi8KLQl7IERMVF9KVU5JUEVSX01PTklUT1IsCUxJTktUWVBFX0pVTklQRVJfTU9OSVRPUiB9LAotCi0JLyogQkFDbmV0IE1TL1RQICovCi0JeyBETFRfQkFDTkVUX01TX1RQLAlMSU5LVFlQRV9CQUNORVRfTVNfVFAgfSwKLQotCS8qIFBQUCBmb3IgcHBwZCwgd2l0aCBkaXJlY3Rpb24gZmxhZyBpbiB0aGUgUFBQIGhlYWRlciAqLwotCXsgRExUX1BQUF9QUFBELAkJTElOS1RZUEVfUFBQX1BQUER9LAotCi0JLyogSnVuaXBlci1pbnRlcm5hbCBjaGFzc2lzIGVuY2Fwc3VsYXRpb24gKi8KLSAgICAgICAgeyBETFRfSlVOSVBFUl9QUFBPRSwgICAgTElOS1RZUEVfSlVOSVBFUl9QUFBPRSB9LAotICAgICAgICB7IERMVF9KVU5JUEVSX1BQUE9FX0FUTSxMSU5LVFlQRV9KVU5JUEVSX1BQUE9FX0FUTSB9LAotCi0JLyogR1BSUyBMTEMgKi8KLQl7IERMVF9HUFJTX0xMQywJCUxJTktUWVBFX0dQUlNfTExDIH0sCi0KLQkvKiBUcmFuc3BhcmVudCBHZW5lcmljIEZyYW1pbmcgUHJvY2VkdXJlIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLwotCXsgRExUX0dQRl9ULAkJTElOS1RZUEVfR1BGX1QgfSwKLQotCS8qIEZyYW1lZCBHZW5lcmljIEZyYW1pbmcgUHJvY2VkdXJlIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLwotCXsgRExUX0dQRl9GLAkJTElOS1RZUEVfR1BGX0YgfSwKLQotCXsgRExUX0dDT01fVDFFMSwJTElOS1RZUEVfR0NPTV9UMUUxIH0sCi0JeyBETFRfR0NPTV9TRVJJQUwsCUxJTktUWVBFX0dDT01fU0VSSUFMIH0sCi0KLSAgICAgICAgLyogSnVuaXBlci1pbnRlcm5hbCBjaGFzc2lzIGVuY2Fwc3VsYXRpb24gKi8KLSAgICAgICAgeyBETFRfSlVOSVBFUl9QSUNfUEVFUiwgTElOS1RZUEVfSlVOSVBFUl9QSUNfUEVFUiB9LAotCi0JLyogRW5kYWNlIHR5cGVzICovCi0JeyBETFRfRVJGX0VUSCwJCUxJTktUWVBFX0VSRl9FVEggfSwKLQl7IERMVF9FUkZfUE9TLAkJTElOS1RZUEVfRVJGX1BPUyB9LAotCi0JLyogdmlTRE4gTEFQRCAqLwotCXsgRExUX0xJTlVYX0xBUEQsCUxJTktUWVBFX0xJTlVYX0xBUEQgfSwKLQotICAgICAgICAvKiBKdW5pcGVyIG1ldGEtaW5mb3JtYXRpb24gYmVmb3JlIEV0aGVyLCBQUFAsIEZyYW1lIFJlbGF5LCBDLUhETEMgRnJhbWVzICovCi0gICAgICAgIHsgRExUX0pVTklQRVJfRVRIRVIsIExJTktUWVBFX0pVTklQRVJfRVRIRVIgfSwKLSAgICAgICAgeyBETFRfSlVOSVBFUl9QUFAsIExJTktUWVBFX0pVTklQRVJfUFBQIH0sCi0gICAgICAgIHsgRExUX0pVTklQRVJfRlJFTEFZLCBMSU5LVFlQRV9KVU5JUEVSX0ZSRUxBWSB9LAotICAgICAgICB7IERMVF9KVU5JUEVSX0NIRExDLCBMSU5LVFlQRV9KVU5JUEVSX0NIRExDIH0sCi0KLSAgICAgICAgLyogTXVsdGkgTGluayBGcmFtZSBSZWxheSAoRlJGLjE2KSAqLwotICAgICAgICB7IERMVF9NRlIsICAgICAgICAgICAgICBMSU5LVFlQRV9NRlIgfSwKLQotICAgICAgICAvKiBKdW5pcGVyIFZvaWNlIFBJQyAqLwotICAgICAgICB7IERMVF9KVU5JUEVSX1ZQLCAgICAgICBMSU5LVFlQRV9KVU5JUEVSX1ZQIH0sCi0KLQkvKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2Mi4wQiAqLwotCXsgRExUX0E0MjksCQlMSU5LVFlQRV9BNDI5IH0sCi0KLQkvKiBBcmluYyA2NTMgSW50ZXJwYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiBtZXNzYWdlcyAqLwotCXsgRExUX0E2NTNfSUNNLCAgICAgICAgIExJTktUWVBFX0E2NTNfSUNNIH0sCi0KLQkvKiBVU0IgKi8KLQl7IERMVF9VU0IsCQlMSU5LVFlQRV9VU0IgfSwKLQotCS8qIEJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIgKi8KLQl7IERMVF9CTFVFVE9PVEhfSENJX0g0LAlMSU5LVFlQRV9CTFVFVE9PVEhfSENJX0g0IH0sCi0KLQkvKiBJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgKi8KLQl7IERMVF9JRUVFODAyXzE2X01BQ19DUFMsCUxJTktUWVBFX0lFRUU4MDJfMTZfTUFDX0NQUyB9LAotCi0JLyogVVNCIHdpdGggTGludXggaGVhZGVyICovCi0JeyBETFRfVVNCX0xJTlVYLAlMSU5LVFlQRV9VU0JfTElOVVggfSwKLQotCS8qIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIChDQU4pIHYyLjBCICovCi0JeyBETFRfQ0FOMjBCLAkJTElOS1RZUEVfQ0FOMjBCIH0sCi0KLQkvKiBJRUVFIDgwMi4xNS40IHdpdGggYWRkcmVzcyBmaWVsZHMgcGFkZGVkICovCi0JeyBETFRfSUVFRTgwMl8xNV80X0xJTlVYLAlMSU5LVFlQRV9JRUVFODAyXzE1XzRfTElOVVggfSwKLQotCS8qIFBlciBQYWNrZXQgSW5mb3JtYXRpb24gZW5jYXBzdWxhdGVkIHBhY2tldHMgKi8KLQl7IERMVF9QUEksCQkJTElOS1RZUEVfUFBJIH0sCi0KLQkvKiBJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgcGx1cyByYWRpb3RhcCBoZWFkZXIgKi8KLQl7IERMVF9JRUVFODAyXzE2X01BQ19DUFNfUkFESU8sIExJTktUWVBFX0lFRUU4MDJfMTZfTUFDX0NQU19SQURJTyB9LAotCi0gICAgICAgIC8qIEp1bmlwZXIgVm9pY2UgSVNNICovCi0gICAgICAgIHsgRExUX0pVTklQRVJfSVNNLCAgICAgIExJTktUWVBFX0pVTklQRVJfSVNNIH0sCi0KLQkvKiBJRUVFIDgwMi4xNS40IGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAqLwotICAgICAgICB7IERMVF9JRUVFODAyXzE1XzQsCUxJTktUWVBFX0lFRUU4MDJfMTVfNCB9LAotCi0JLyogVmFyaW91cyBsaW5rLWxheWVyIHR5cGVzIGZvciBTSVRBICovCi0JeyBETFRfU0lUQSwJCUxJTktUWVBFX1NJVEEgfSwKLQotCS8qIFZhcmlvdXMgbGluay1sYXllciB0eXBlcyBmb3IgRW5kYWNlICovCi0JeyBETFRfRVJGLAkJTElOS1RZUEVfRVJGIH0sCi0KLQkvKiBTcGVjaWFsIGhlYWRlciBmb3IgdTEwIE5ldHdvcmtzIGJvYXJkcyAqLwotCXsgRExUX1JBSUYxLAkJTElOS1RZUEVfUkFJRjEgfSwKLQotCS8qIElQTUIgKi8KLQl7IERMVF9JUE1CLAkJTElOS1RZUEVfSVBNQiB9LAotCi0JeyAtMSwJCQktMSB9Ci19OwotCi1zdGF0aWMgaW50Ci1kbHRfdG9fbGlua3R5cGUoaW50IGRsdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IG1hcFtpXS5kbHQgIT0gLTE7IGkrKykgewotCQlpZiAobWFwW2ldLmRsdCA9PSBkbHQpCi0JCQlyZXR1cm4gKG1hcFtpXS5saW5rdHlwZSk7Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgbWFwcGluZyBmb3IgdGhpcyBETFRfIGNvZGUsIHJldHVybiBhbgotCSAqIGVycm9yOyB0aGF0IG1lYW5zIHRoYXQgdGhlIHRhYmxlIGFib3ZlIG5lZWRzIHRvIGhhdmUgYW4KLQkgKiBlbnRyeSBhZGRlZC4KLQkgKi8KLQlyZXR1cm4gKC0xKTsKLX0KLQotc3RhdGljIGludAotbGlua3R5cGVfdG9fZGx0KGludCBsaW5rdHlwZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IG1hcFtpXS5saW5rdHlwZSAhPSAtMTsgaSsrKSB7Ci0JCWlmIChtYXBbaV0ubGlua3R5cGUgPT0gbGlua3R5cGUpCi0JCQlyZXR1cm4gKG1hcFtpXS5kbHQpOwotCX0KLQotCS8qCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcyBsaW5rIHR5cGUsIHJldHVybgotCSAqIHRoZSBsaW5rIHR5cGUgdmFsdWU7IGl0IG1heSBiZSBhIERMVF8gdmFsdWUgZnJvbSBhbgotCSAqIG9sZGVyIHZlcnNpb24gb2YgbGlicGNhcC4KLQkgKi8KLQlyZXR1cm4gbGlua3R5cGU7Ci19Ci0KLXN0YXRpYyBpbnQKLXNmX3dyaXRlX2hlYWRlcihGSUxFICpmcCwgaW50IGxpbmt0eXBlLCBpbnQgdGhpc3pvbmUsIGludCBzbmFwbGVuKQotewotCXN0cnVjdCBwY2FwX2ZpbGVfaGVhZGVyIGhkcjsKLQotCWhkci5tYWdpYyA9IFRDUERVTVBfTUFHSUM7Ci0JaGRyLnZlcnNpb25fbWFqb3IgPSBQQ0FQX1ZFUlNJT05fTUFKT1I7Ci0JaGRyLnZlcnNpb25fbWlub3IgPSBQQ0FQX1ZFUlNJT05fTUlOT1I7Ci0KLQloZHIudGhpc3pvbmUgPSB0aGlzem9uZTsKLQloZHIuc25hcGxlbiA9IHNuYXBsZW47Ci0JaGRyLnNpZ2ZpZ3MgPSAwOwotCWhkci5saW5rdHlwZSA9IGxpbmt0eXBlOwotCi0JaWYgKGZ3cml0ZSgoY2hhciAqKSZoZHIsIHNpemVvZihoZHIpLCAxLCBmcCkgIT0gMSkKLQkJcmV0dXJuICgtMSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotc3dhcF9oZHIoc3RydWN0IHBjYXBfZmlsZV9oZWFkZXIgKmhwKQotewotCWhwLT52ZXJzaW9uX21ham9yID0gU1dBUFNIT1JUKGhwLT52ZXJzaW9uX21ham9yKTsKLQlocC0+dmVyc2lvbl9taW5vciA9IFNXQVBTSE9SVChocC0+dmVyc2lvbl9taW5vcik7Ci0JaHAtPnRoaXN6b25lID0gU1dBUExPTkcoaHAtPnRoaXN6b25lKTsKLQlocC0+c2lnZmlncyA9IFNXQVBMT05HKGhwLT5zaWdmaWdzKTsKLQlocC0+c25hcGxlbiA9IFNXQVBMT05HKGhwLT5zbmFwbGVuKTsKLQlocC0+bGlua3R5cGUgPSBTV0FQTE9ORyhocC0+bGlua3R5cGUpOwotfQotCiBzdGF0aWMgaW50CiBzZl9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKIHsKQEAgLTg5NSwxMCArOTQsMTYgQEAKIHNmX3NldG5vbmJsb2NrKHBjYXBfdCAqcCwgaW50IG5vbmJsb2NrLCBjaGFyICplcnJidWYpCiB7CiAJLyoKLQkgKiBUaGlzIGlzIGEgc2F2ZWZpbGUsIG5vdCBhIGxpdmUgY2FwdHVyZSBmaWxlLCBzbyBpZ25vcmUKLQkgKiByZXF1ZXN0cyB0byBwdXQgaXQgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisJICogVGhpcyBpcyBhIHNhdmVmaWxlLCBub3QgYSBsaXZlIGNhcHR1cmUgZmlsZSwgc28gcmVqZWN0CisJICogcmVxdWVzdHMgdG8gcHV0IGl0IGluIG5vbi1ibG9ja2luZyBtb2RlLiAgKElmIGl0J3MgYQorCSAqIHBpcGUsIGl0IGNvdWxkIGJlIHB1dCBpbiBub24tYmxvY2tpbmcgbW9kZSwgYnV0IHRoYXQKKwkgKiB3b3VsZCBzaWduaWZpY2FudGx5IGNvbXBsaWNhdGUgdGhlIGNvZGUgdG8gcmVhZCBwYWNrZXRzLAorCSAqIGFzIGl0IHdvdWxkIGhhdmUgdG8gaGFuZGxlIHJlYWRpbmcgcGFydGlhbCBwYWNrZXRzIGFuZAorCSAqIGtlZXBpbmcgdGhlIHN0YXRlIG9mIHRoZSByZWFkLikKIAkgKi8KLQlyZXR1cm4gKDApOworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlNhdmVmaWxlcyBjYW5ub3QgYmUgcHV0IGludG8gbm9uLWJsb2NraW5nIG1vZGUiKTsKKwlyZXR1cm4gKC0xKTsKIH0KIAogc3RhdGljIGludApAQCAtOTA5LDYgKzExNCwzMiBAQAogCXJldHVybiAoLTEpOwogfQogCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQKK3NmX3NldGJ1ZmYocGNhcF90ICpwLCBpbnQgZGltKQoreworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlRoZSBrZXJuZWwgYnVmZmVyIHNpemUgY2Fubm90IGJlIHNldCB3aGlsZSByZWFkaW5nIGZyb20gYSBmaWxlIik7CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NmX3NldG1vZGUocGNhcF90ICpwLCBpbnQgbW9kZSkKK3sKKwlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJpbXBvc3NpYmxlIHRvIHNldCBtb2RlIHdoaWxlIHJlYWRpbmcgZnJvbSBhIGZpbGUiKTsKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorc2Zfc2V0bWludG9jb3B5KHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiVGhlIG1pbnRvY29weSBwYXJhbWV0ZXIgY2Fubm90IGJlIHNldCB3aGlsZSByZWFkaW5nIGZyb20gYSBmaWxlIik7CisJcmV0dXJuICgtMSk7Cit9CisjZW5kaWYKKwogc3RhdGljIGludAogc2ZfaW5qZWN0KHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmIF9VXywgc2l6ZV90IHNpemUgX1VfKQogewpAQCAtOTI5LDE3ICsxNjAsMTkgQEAKIAlyZXR1cm4gKC0xKTsKIH0KIAotc3RhdGljIHZvaWQKLXNmX2Nsb3NlKHBjYXBfdCAqcCkKK3ZvaWQKK3NmX2NsZWFudXAocGNhcF90ICpwKQogewotCWlmIChwLT5zZi5yZmlsZSAhPSBzdGRpbikKLQkJKHZvaWQpZmNsb3NlKHAtPnNmLnJmaWxlKTsKLQlpZiAocC0+c2YuYmFzZSAhPSBOVUxMKQotCQlmcmVlKHAtPnNmLmJhc2UpOworCWlmIChwLT5yZmlsZSAhPSBzdGRpbikKKwkJKHZvaWQpZmNsb3NlKHAtPnJmaWxlKTsKKwlpZiAocC0+YnVmZmVyICE9IE5VTEwpCisJCWZyZWUocC0+YnVmZmVyKTsKKwlwY2FwX2ZyZWVjb2RlKCZwLT5mY29kZSk7CiB9CiAKIHBjYXBfdCAqCi1wY2FwX29wZW5fb2ZmbGluZShjb25zdCBjaGFyICpmbmFtZSwgY2hhciAqZXJyYnVmKQorcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGNvbnN0IGNoYXIgKmZuYW1lLCB1X2ludCBwcmVjaXNpb24sCisgICAgY2hhciAqZXJyYnVmKQogewogCUZJTEUgKmZwOwogCXBjYXBfdCAqcDsKQEAgLTk2Nyw3ICsyMDAsNyBAQAogCQkJcmV0dXJuIChOVUxMKTsKIAkJfQogCX0KLQlwID0gcGNhcF9mb3Blbl9vZmZsaW5lKGZwLCBlcnJidWYpOworCXAgPSBwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGZwLCBwcmVjaXNpb24sIGVycmJ1Zik7CiAJaWYgKHAgPT0gTlVMTCkgewogCQlpZiAoZnAgIT0gc3RkaW4pCiAJCQlmY2xvc2UoZnApOwpAQCAtOTc2LDI0ICsyMDksNzMgQEAKIH0KIAogcGNhcF90ICoKLXBjYXBfZm9wZW5fb2ZmbGluZShGSUxFICpmcCwgY2hhciAqZXJyYnVmKQorcGNhcF9vcGVuX29mZmxpbmUoY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKmVycmJ1ZikKIHsKLQlyZWdpc3RlciBwY2FwX3QgKnA7Ci0Jc3RydWN0IHBjYXBfZmlsZV9oZWFkZXIgaGRyOwotCXNpemVfdCBhbXRfcmVhZDsKLQlicGZfdV9pbnQzMiBtYWdpYzsKLQlpbnQgbGlua2xlbjsKKwlyZXR1cm4gKHBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihmbmFtZSwKKwkgICAgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPLCBlcnJidWYpKTsKK30KIAotCXAgPSAocGNhcF90ICopbWFsbG9jKHNpemVvZigqcCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJc3RybGNweShlcnJidWYsICJvdXQgb2Ygc3dhcCIsIFBDQVBfRVJSQlVGX1NJWkUpOwotCQlyZXR1cm4gKE5VTEwpOworI2lmZGVmIFdJTjMyCitwY2FwX3QqIHBjYXBfaG9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oaW50cHRyX3Qgb3NmZCwgdV9pbnQgcHJlY2lzaW9uLAorICAgIGNoYXIgKmVycmJ1ZikKK3sKKwlpbnQgZmQ7CisJRklMRSAqZmlsZTsKKworCWZkID0gX29wZW5fb3NmaGFuZGxlKG9zZmQsIF9PX1JET05MWSk7CisJaWYgKCBmZCA8IDAgKSAKKwl7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltZW1zZXQoKGNoYXIgKilwLCAwLCBzaXplb2YoKnApKTsKKwlmaWxlID0gX2Zkb3BlbihmZCwgInJiIik7CisJaWYgKCBmaWxlID09IE5VTEwgKSAKKwl7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKLQlhbXRfcmVhZCA9IGZyZWFkKChjaGFyICopJmhkciwgMSwgc2l6ZW9mKGhkciksIGZwKTsKLQlpZiAoYW10X3JlYWQgIT0gc2l6ZW9mKGhkcikpIHsKKwlyZXR1cm4gcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihmaWxlLCBwcmVjaXNpb24sCisJICAgIGVycmJ1Zik7Cit9CisKK3BjYXBfdCogcGNhcF9ob3Blbl9vZmZsaW5lKGludHB0cl90IG9zZmQsIGNoYXIgKmVycmJ1ZikKK3sKKwlyZXR1cm4gcGNhcF9ob3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihvc2ZkLAorCSAgICBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8sIGVycmJ1Zik7Cit9CisjZW5kaWYKKworc3RhdGljIHBjYXBfdCAqKCpjaGVja19oZWFkZXJzW10pKGJwZl91X2ludDMyLCBGSUxFICosIHVfaW50LCBjaGFyICosIGludCAqKSA9IHsKKwlwY2FwX2NoZWNrX2hlYWRlciwKKwlwY2FwX25nX2NoZWNrX2hlYWRlcgorfTsKKworI2RlZmluZQlOX0ZJTEVfVFlQRVMJKHNpemVvZiBjaGVja19oZWFkZXJzIC8gc2l6ZW9mIGNoZWNrX2hlYWRlcnNbMF0pCisKKyNpZmRlZiBXSU4zMgorc3RhdGljCisjZW5kaWYKK3BjYXBfdCAqCitwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKEZJTEUgKmZwLCB1X2ludCBwcmVjaXNpb24sCisgICAgY2hhciAqZXJyYnVmKQoreworCXJlZ2lzdGVyIHBjYXBfdCAqcDsKKwlicGZfdV9pbnQzMiBtYWdpYzsKKwlzaXplX3QgYW10X3JlYWQ7CisJdV9pbnQgaTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBSZWFkIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBmaWxlOyB0aGUgbmV0d29yayBhbmFseXplciBkdW1wCisJICogZmlsZSBmb3JtYXRzIHdlIHN1cHBvcnQgKHBjYXAgYW5kIHBjYXAtbmcpLCBhbmQgc2V2ZXJhbCBvdGhlcgorCSAqIGZvcm1hdHMgd2UgbWlnaHQgc3VwcG9ydCBpbiB0aGUgZnV0dXJlIChzdWNoIGFzIHNub29wLCBET1MgYW5kCisJICogV2luZG93cyBTbmlmZmVyLCBhbmQgTWljcm9zb2Z0IE5ldHdvcmsgTW9uaXRvcikgYWxsIGhhdmUgbWFnaWMKKwkgKiBudW1iZXJzIHRoYXQgYXJlIHVuaXF1ZSBpbiB0aGVpciBmaXJzdCA0IGJ5dGVzLgorCSAqLworCWFtdF9yZWFkID0gZnJlYWQoKGNoYXIgKikmbWFnaWMsIDEsIHNpemVvZihtYWdpYyksIGZwKTsKKwlpZiAoYW10X3JlYWQgIT0gc2l6ZW9mKG1hZ2ljKSkgewogCQlpZiAoZmVycm9yKGZwKSkgewogCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJlcnJvciByZWFkaW5nIGR1bXAgZmlsZTogJXMiLApAQCAtMTAwMSwxNDMgKzI4Myw0MSBAQAogCQl9IGVsc2UgewogCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICVsdSBmaWxlIGhlYWRlciBieXRlcywgb25seSBnb3QgJWx1IiwKLQkJCSAgICAodW5zaWduZWQgbG9uZylzaXplb2YoaGRyKSwKKwkJCSAgICAodW5zaWduZWQgbG9uZylzaXplb2YobWFnaWMpLAogCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKIAkJfQotCQlnb3RvIGJhZDsKKwkJcmV0dXJuIChOVUxMKTsKIAl9Ci0JbWFnaWMgPSBoZHIubWFnaWM7Ci0JaWYgKG1hZ2ljICE9IFRDUERVTVBfTUFHSUMgJiYgbWFnaWMgIT0gS1VaTkVUWk9WX1RDUERVTVBfTUFHSUMpIHsKLQkJbWFnaWMgPSBTV0FQTE9ORyhtYWdpYyk7Ci0JCWlmIChtYWdpYyAhPSBUQ1BEVU1QX01BR0lDICYmIG1hZ2ljICE9IEtVWk5FVFpPVl9UQ1BEVU1QX01BR0lDKSB7Ci0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkgICAgImJhZCBkdW1wIGZpbGUgZm9ybWF0Iik7Ci0JCQlnb3RvIGJhZDsKLQkJfQotCQlwLT5zZi5zd2FwcGVkID0gMTsKLQkJc3dhcF9oZHIoJmhkcik7Ci0JfQotCWlmIChtYWdpYyA9PSBLVVpORVRaT1ZfVENQRFVNUF9NQUdJQykgewotCQkvKgotCQkgKiBYWFggLSB0aGUgcGF0Y2ggdGhhdCdzIGluIHNvbWUgdmVyc2lvbnMgb2YgbGlicGNhcAotCQkgKiBjaGFuZ2VzIHRoZSBwYWNrZXQgaGVhZGVyIGJ1dCBub3QgdGhlIG1hZ2ljIG51bWJlciwKLQkJICogYW5kIHNvbWUgb3RoZXIgdmVyc2lvbnMgd2l0aCB0aGlzIG1hZ2ljIG51bWJlciBoYXZlCi0JCSAqIHNvbWUgZXh0cmEgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBwYWNrZXQgaGVhZGVyOwotCQkgKiB3ZSdkIGhhdmUgdG8gdXNlIHNvbWUgaGFja3NeSF5IXkheSF5IaGV1cmlzdGljcyB0bwotCQkgKiBkZXRlY3QgdGhvc2UgdmFyaWFudHMuCi0JCSAqCi0JCSAqIEV0aGVyZWFsIGRvZXMgdGhhdCwgYnV0IGl0IGRvZXMgc28gYnkgdHJ5aW5nIHRvIHJlYWQKLQkJICogdGhlIGZpcnN0IHR3byBwYWNrZXRzIG9mIHRoZSBmaWxlIHdpdGggZWFjaCBvZiB0aGUKLQkJICogcmVjb3JkIGhlYWRlciBmb3JtYXRzLiAgVGhhdCBjdXJyZW50bHkgbWVhbnMgaXQgc2Vla3MKLQkJICogYmFja3dhcmRzIGFuZCByZXRyaWVzIHRoZSByZWFkcywgd2hpY2ggZG9lc24ndCB3b3JrCi0JCSAqIG9uIHBpcGVzLiAgV2Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgZnJvbSBhIHBpcGUsIHNvCi0JCSAqIHRoYXQgc3RyYXRlZ3kgd29uJ3Qgd29yazsgd2UnZCBoYXZlIHRvIGJ1ZmZlciBzb21lCi0JCSAqIGRhdGEgb3Vyc2VsdmVzIGFuZCByZWFkIGZyb20gdGhhdCBidWZmZXIgaW4gb3JkZXIgdG8KLQkJICogbWFrZSB0aGF0IHdvcmsuCi0JCSAqLwotCQlwLT5zZi5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBwY2FwX3NmX3BhdGNoZWRfcGt0aGRyKTsKLQl9IGVsc2UKLQkJcC0+c2YuaGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGNhcF9zZl9wa3RoZHIpOwotCWlmIChoZHIudmVyc2lvbl9tYWpvciA8IFBDQVBfVkVSU0lPTl9NQUpPUikgewotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJhcmNoYWljIGZpbGUgZm9ybWF0Iik7Ci0JCWdvdG8gYmFkOwotCX0KLQlwLT50em9mZiA9IGhkci50aGlzem9uZTsKLQlwLT5zbmFwc2hvdCA9IGhkci5zbmFwbGVuOwotCXAtPmxpbmt0eXBlID0gbGlua3R5cGVfdG9fZGx0KGhkci5saW5rdHlwZSk7Ci0JaWYgKG1hZ2ljID09IEtVWk5FVFpPVl9UQ1BEVU1QX01BR0lDICYmIHAtPmxpbmt0eXBlID09IERMVF9FTjEwTUIpIHsKLQkJLyoKLQkJICogVGhpcyBjYXB0dXJlIG1pZ2h0IGhhdmUgYmVlbiBkb25lIGluIHJhdyBtb2RlIG9yIGNvb2tlZAotCQkgKiBtb2RlLgotCQkgKgotCQkgKiBJZiBpdCB3YXMgZG9uZSBpbiBjb29rZWQgbW9kZSwgcC0+c25hcHNob3Qgd2FzIHBhc3NlZAotCQkgKiB0byByZWN2ZnJvbSgpIGFzIHRoZSBidWZmZXIgc2l6ZSwgbWVhbmluZyB0aGF0IHRoZQotCQkgKiBtb3N0IHBhY2tldCBkYXRhIHRoYXQgd291bGQgYmUgY29waWVkIHdvdWxkIGJlCi0JCSAqIHAtPnNuYXBzaG90LiAgSG93ZXZlciwgYSBmYWtlZCBFdGhlcm5ldCBoZWFkZXIgd291bGQKLQkJICogdGhlbiBoYXZlIGJlZW4gYWRkZWQgdG8gaXQsIHNvIHRoZSBtb3N0IGRhdGEgdGhhdCB3b3VsZAotCQkgKiBiZSBpbiBhIHBhY2tldCBpbiB0aGUgZmlsZSB3b3VsZCBiZSBwLT5zbmFwc2hvdCArIDE0LgotCQkgKgotCQkgKiBXZSBjYW4ndCBlYXNpbHkgdGVsbCB3aGV0aGVyIHRoZSBjYXB0dXJlIHdhcyBkb25lIGluCi0JCSAqIHJhdyBtb2RlIG9yIGNvb2tlZCBtb2RlLCBzbyB3ZSdsbCBhc3N1bWUgaXQgd2FzCi0JCSAqIGNvb2tlZCBtb2RlLCBhbmQgYWRkIDE0IHRvIHRoZSBzbmFwc2hvdCBsZW5ndGguICBUaGF0Ci0JCSAqIG1lYW5zIHRoYXQsIGZvciBhIHJhdyBjYXB0dXJlLCB0aGUgc25hcHNob3QgbGVuZ3RoIHdpbGwKLQkJICogYmUgbWlzbGVhZGluZyBpZiB5b3UgdXNlIGl0IHRvIGZpZ3VyZSBvdXQgd2h5IGEgY2FwdHVyZQotCQkgKiBkb2Vzbid0IGhhdmUgYWxsIHRoZSBwYWNrZXQgZGF0YSwgYnV0IHRoZXJlJ3Mgbm90IG11Y2gKLQkJICogd2UgY2FuIGRvIHRvIGF2b2lkIHRoYXQuCi0JCSAqLwotCQlwLT5zbmFwc2hvdCArPSAxNDsKLQl9Ci0JcC0+c2YucmZpbGUgPSBmcDsKLSNpZm5kZWYgV0lOMzIKLQlwLT5idWZzaXplID0gaGRyLnNuYXBsZW47Ci0jZWxzZQotCS8qIEFsbG9jYXRlIHRoZSBzcGFjZSBmb3IgcGNhcF9wa3RoZHIgYXMgd2VsbC4gSXQgd2lsbCBiZSB1c2VkIGJ5IHBjYXBfcmVhZF9leCAqLwotCXAtPmJ1ZnNpemUgPSBoZHIuc25hcGxlbitzaXplb2Yoc3RydWN0IHBjYXBfcGt0aGRyKTsKLSNlbmRpZgotCi0JLyogQWxpZ24gbGluayBoZWFkZXIgYXMgcmVxdWlyZWQgZm9yIHByb3BlciBkYXRhIGFsaWdubWVudCAqLwotCS8qIFhYWCBzaG91bGQgaGFuZGxlIGFsbCB0eXBlcyAqLwotCXN3aXRjaCAocC0+bGlua3R5cGUpIHsKLQotCWNhc2UgRExUX0VOMTBNQjoKLQkJbGlua2xlbiA9IDE0OwotCQlicmVhazsKLQotCWNhc2UgRExUX0ZEREk6Ci0JCWxpbmtsZW4gPSAxMyArIDg7CS8qIGZkZGlfaGVhZGVyICsgbGxjICovCi0JCWJyZWFrOwotCi0JY2FzZSBETFRfTlVMTDoKLQlkZWZhdWx0OgotCQlsaW5rbGVuID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHAtPmJ1ZnNpemUgPCAwKQotCQlwLT5idWZzaXplID0gQlBGX01BWEJVRlNJWkU7Ci0JcC0+c2YuYmFzZSA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSArIEJQRl9BTElHTk1FTlQpOwotCWlmIChwLT5zZi5iYXNlID09IE5VTEwpIHsKLQkJc3RybGNweShlcnJidWYsICJvdXQgb2Ygc3dhcCIsIFBDQVBfRVJSQlVGX1NJWkUpOwotCQlnb3RvIGJhZDsKLQl9Ci0JcC0+YnVmZmVyID0gcC0+c2YuYmFzZSArIEJQRl9BTElHTk1FTlQgLSAobGlua2xlbiAlIEJQRl9BTElHTk1FTlQpOwotCXAtPnNmLnZlcnNpb25fbWFqb3IgPSBoZHIudmVyc2lvbl9tYWpvcjsKLQlwLT5zZi52ZXJzaW9uX21pbm9yID0gaGRyLnZlcnNpb25fbWlub3I7Ci0jaWZkZWYgUENBUF9GRERJUEFECi0JLyogUGFkZGluZyBvbmx5IG5lZWRlZCBmb3IgbGl2ZSBjYXB0dXJlIGZjb2RlICovCi0JcC0+ZmRkaXBhZCA9IDA7Ci0jZW5kaWYKIAogCS8qCi0JICogV2UgaW50ZXJjaGFuZ2VkIHRoZSBjYXBsZW4gYW5kIGxlbiBmaWVsZHMgYXQgdmVyc2lvbiAyLjMsCi0JICogaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGJwZiBoZWFkZXIgbGF5b3V0LiAgQnV0IHVuZm9ydHVuYXRlbHkKLQkgKiBzb21lIGZpbGVzIHdlcmUgd3JpdHRlbiB3aXRoIHZlcnNpb24gMi4zIGluIHRoZWlyIGhlYWRlcnMKLQkgKiBidXQgd2l0aG91dCB0aGUgaW50ZXJjaGFuZ2VkIGZpZWxkcy4KLQkgKgotCSAqIEluIGFkZGl0aW9uLCBERy9VWCB0Y3BkdW1wIHdyaXRlcyBvdXQgZmlsZXMgd2l0aCBhIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgNTQzLjAsIGFuZCB3aXRoIHRoZSBjYXBsZW4gYW5kIGxlbiBmaWVsZHMgaW4gdGhlCi0JICogcHJlLTIuMyBvcmRlci4KKwkgKiBUcnkgYWxsIGZpbGUgdHlwZXMuCiAJICovCi0Jc3dpdGNoIChoZHIudmVyc2lvbl9tYWpvcikgewotCi0JY2FzZSAyOgotCQlpZiAoaGRyLnZlcnNpb25fbWlub3IgPCAzKQotCQkJcC0+c2YubGVuZ3Roc19zd2FwcGVkID0gU1dBUFBFRDsKLQkJZWxzZSBpZiAoaGRyLnZlcnNpb25fbWlub3IgPT0gMykKLQkJCXAtPnNmLmxlbmd0aHNfc3dhcHBlZCA9IE1BWUJFX1NXQVBQRUQ7Ci0JCWVsc2UKLQkJCXAtPnNmLmxlbmd0aHNfc3dhcHBlZCA9IE5PVF9TV0FQUEVEOwotCQlicmVhazsKLQotCWNhc2UgNTQzOgotCQlwLT5zZi5sZW5ndGhzX3N3YXBwZWQgPSBTV0FQUEVEOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXAtPnNmLmxlbmd0aHNfc3dhcHBlZCA9IE5PVF9TV0FQUEVEOwotCQlicmVhazsKKwlmb3IgKGkgPSAwOyBpIDwgTl9GSUxFX1RZUEVTOyBpKyspIHsKKwkJcCA9ICgqY2hlY2tfaGVhZGVyc1tpXSkobWFnaWMsIGZwLCBwcmVjaXNpb24sIGVycmJ1ZiwgJmVycik7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCS8qIFl1cCwgdGhhdCdzIGl0LiAqLworCQkJZ290byBmb3VuZDsKKwkJfQorCQlpZiAoZXJyKSB7CisJCQkvKgorCQkJICogRXJyb3IgdHJ5aW5nIHRvIHJlYWQgdGhlIGhlYWRlci4KKwkJCSAqLworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQogCX0KIAorCS8qCisJICogV2VsbCwgd2hvIGtub3dzIHdoYXQgdGhpcyBtZXNzIGlzLi4uLgorCSAqLworCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInVua25vd24gZmlsZSBmb3JtYXQiKTsKKwlyZXR1cm4gKE5VTEwpOworCitmb3VuZDoKKwlwLT5yZmlsZSA9IGZwOworCisJLyogUGFkZGluZyBvbmx5IG5lZWRlZCBmb3IgbGl2ZSBjYXB0dXJlIGZjb2RlICovCisJcC0+ZmRkaXBhZCA9IDA7CisKICNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiAJLyoKIAkgKiBZb3UgY2FuIGRvICJzZWxlY3QoKSIgYW5kICJwb2xsKCkiIG9uIHBsYWluIGZpbGVzIG9uIG1vc3QKQEAgLTExNTcsMTYwICszMzcsMzYgQEAKIAlwLT5nZXRub25ibG9ja19vcCA9IHNmX2dldG5vbmJsb2NrOwogCXAtPnNldG5vbmJsb2NrX29wID0gc2Zfc2V0bm9uYmxvY2s7CiAJcC0+c3RhdHNfb3AgPSBzZl9zdGF0czsKLQlwLT5jbG9zZV9vcCA9IHNmX2Nsb3NlOwotCi0JcmV0dXJuIChwKTsKLSBiYWQ6Ci0JZnJlZShwKTsKLQlyZXR1cm4gKE5VTEwpOwotfQotCi0vKgotICogUmVhZCBzZl9yZWFkZmlsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IHBhY2tldC4gIFJldHVybiB0aGUgaGVhZGVyIGluIGhkcgotICogYW5kIHRoZSBjb250ZW50cyBpbiBidWYuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBTRkVSUl9FT0YgaWYgdGhlcmUgd2VyZQotICogbm8gbW9yZSBwYWNrZXRzLCBhbmQgU0ZFUlJfVFJVTkMgaWYgYSBwYXJ0aWFsIHBhY2tldCB3YXMgZW5jb3VudGVyZWQuCi0gKi8KLXN0YXRpYyBpbnQKLXNmX25leHRfcGFja2V0KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfcGt0aGRyICpoZHIsIHVfY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCi17Ci0Jc3RydWN0IHBjYXBfc2ZfcGF0Y2hlZF9wa3RoZHIgc2ZfaGRyOwotCUZJTEUgKmZwID0gcC0+c2YucmZpbGU7Ci0Jc2l6ZV90IGFtdF9yZWFkOwotCWJwZl91X2ludDMyIHQ7CisjaWZkZWYgV0lOMzIKKwlwLT5zZXRidWZmX29wID0gc2Zfc2V0YnVmZjsKKwlwLT5zZXRtb2RlX29wID0gc2Zfc2V0bW9kZTsKKwlwLT5zZXRtaW50b2NvcHlfb3AgPSBzZl9zZXRtaW50b2NvcHk7CisjZW5kaWYKIAogCS8qCi0JICogUmVhZCB0aGUgcGFja2V0IGhlYWRlcjsgdGhlIHN0cnVjdHVyZSB3ZSB1c2UgYXMgYSBidWZmZXIKLQkgKiBpcyB0aGUgbG9uZ2VyIHN0cnVjdHVyZSBmb3IgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBwYXRjaGVkCi0JICogbGlicGNhcCwgYnV0IGlmIHRoZSBmaWxlIGhhcyB0aGUgbWFnaWMgbnVtYmVyIGZvciBhbgotCSAqIHVucGF0Y2hlZCBsaWJwY2FwIHdlIG9ubHkgcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHRoZSByZWd1bGFyCi0JICogaGVhZGVyIGhhcy4KKwkgKiBGb3Igb2ZmbGluZSBjYXB0dXJlcywgdGhlIHN0YW5kYXJkIG9uZS1zaG90IGNhbGxiYWNrIGNhbgorCSAqIGJlIHVzZWQgZm9yIHBjYXBfbmV4dCgpL3BjYXBfbmV4dF9leCgpLgogCSAqLwotCWFtdF9yZWFkID0gZnJlYWQoJnNmX2hkciwgMSwgcC0+c2YuaGRyc2l6ZSwgZnApOwotCWlmIChhbXRfcmVhZCAhPSBwLT5zZi5oZHJzaXplKSB7Ci0JCWlmIChmZXJyb3IoZnApKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCi0JCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYW10X3JlYWQgIT0gMCkgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWQgaGVhZGVyIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAotCQkJCSAgICBwLT5zZi5oZHJzaXplLCAodW5zaWduZWQgbG9uZylhbXRfcmVhZCk7Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCQkvKiBFT0YgKi8KLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl9CisJcC0+b25lc2hvdF9jYWxsYmFjayA9IHBjYXBfb25lc2hvdDsKIAotCWlmIChwLT5zZi5zd2FwcGVkKSB7Ci0JCS8qIHRoZXNlIHdlcmUgd3JpdHRlbiBpbiBvcHBvc2l0ZSBieXRlIG9yZGVyICovCi0JCWhkci0+Y2FwbGVuID0gU1dBUExPTkcoc2ZfaGRyLmNhcGxlbik7Ci0JCWhkci0+bGVuID0gU1dBUExPTkcoc2ZfaGRyLmxlbik7Ci0JCWhkci0+dHMudHZfc2VjID0gU1dBUExPTkcoc2ZfaGRyLnRzLnR2X3NlYyk7Ci0JCWhkci0+dHMudHZfdXNlYyA9IFNXQVBMT05HKHNmX2hkci50cy50dl91c2VjKTsKLQl9IGVsc2UgewotCQloZHItPmNhcGxlbiA9IHNmX2hkci5jYXBsZW47Ci0JCWhkci0+bGVuID0gc2ZfaGRyLmxlbjsKLQkJaGRyLT50cy50dl9zZWMgPSBzZl9oZHIudHMudHZfc2VjOwotCQloZHItPnRzLnR2X3VzZWMgPSBzZl9oZHIudHMudHZfdXNlYzsKLQl9Ci0JLyogU3dhcCB0aGUgY2FwbGVuIGFuZCBsZW4gZmllbGRzLCBpZiBuZWNlc3NhcnkuICovCi0Jc3dpdGNoIChwLT5zZi5sZW5ndGhzX3N3YXBwZWQpIHsKKwlwLT5hY3RpdmF0ZWQgPSAxOwogCi0JY2FzZSBOT1RfU1dBUFBFRDoKLQkJYnJlYWs7CisJcmV0dXJuIChwKTsKK30KIAotCWNhc2UgTUFZQkVfU1dBUFBFRDoKLQkJaWYgKGhkci0+Y2FwbGVuIDw9IGhkci0+bGVuKSB7Ci0JCQkvKgotCQkJICogVGhlIGNhcHR1cmVkIGxlbmd0aCBpcyA8PSB0aGUgYWN0dWFsIGxlbmd0aCwKLQkJCSAqIHNvIHByZXN1bWFibHkgdGhleSB3ZXJlbid0IHN3YXBwZWQuCi0JCQkgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEZBTExUSFJPVUdIICovCi0KLQljYXNlIFNXQVBQRUQ6Ci0JCXQgPSBoZHItPmNhcGxlbjsKLQkJaGRyLT5jYXBsZW4gPSBoZHItPmxlbjsKLQkJaGRyLT5sZW4gPSB0OwotCQlicmVhazsKLQl9Ci0KLQlpZiAoaGRyLT5jYXBsZW4gPiBidWZsZW4pIHsKLQkJLyoKLQkJICogVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBTb2xhcmlzIDIuMyBzeXN0ZW1zIHRyaXBwaW5nCi0JCSAqIG92ZXIgdGhlIEJVRk1PRCBwcm9ibGVtIGFuZCBub3Qgc2V0dGluZyB0aGUgc25hcHNob3QKLQkJICogY29ycmVjdGx5IGluIHRoZSBzYXZlZmlsZSBoZWFkZXIuICBJZiB0aGUgY2FwbGVuIGlzbid0Ci0JCSAqIGdyb3NzbHkgd3JvbmcsIHRyeSB0byBzYWx2YWdlLgotCQkgKi8KLQkJc3RhdGljIHVfY2hhciAqdHAgPSBOVUxMOwotCQlzdGF0aWMgc2l6ZV90IHRzaXplID0gMDsKLQotCQlpZiAoaGRyLT5jYXBsZW4gPiA2NTUzNSkgewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJICAgICJib2d1cyBzYXZlZmlsZSBoZWFkZXIiKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0KLQkJaWYgKHRzaXplIDwgaGRyLT5jYXBsZW4pIHsKLQkJCXRzaXplID0gKChoZHItPmNhcGxlbiArIDEwMjMpIC8gMTAyNCkgKiAxMDI0OwotCQkJaWYgKHRwICE9IE5VTEwpCi0JCQkJZnJlZSgodV9jaGFyICopdHApOwotCQkJdHAgPSAodV9jaGFyICopbWFsbG9jKHRzaXplKTsKLQkJCWlmICh0cCA9PSBOVUxMKSB7Ci0JCQkJdHNpemUgPSAwOwotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkgICAgIkJVRk1PRCBoYWNrIG1hbGxvYyIpOwotCQkJCXJldHVybiAoLTEpOwotCQkJfQotCQl9Ci0JCWFtdF9yZWFkID0gZnJlYWQoKGNoYXIgKil0cCwgMSwgaGRyLT5jYXBsZW4sIGZwKTsKLQkJaWYgKGFtdF9yZWFkICE9IGhkci0+Y2FwbGVuKSB7Ci0JCQlpZiAoZmVycm9yKGZwKSkgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCi0JCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSAgICAidHJ1bmNhdGVkIGR1bXAgZmlsZTsgdHJpZWQgdG8gcmVhZCAldSBjYXB0dXJlZCBieXRlcywgb25seSBnb3QgJWx1IiwKLQkJCQkgICAgaGRyLT5jYXBsZW4sICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKLQkJCX0KLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCS8qCi0JCSAqIFdlIGNhbiBvbmx5IGtlZXAgdXAgdG8gYnVmbGVuIGJ5dGVzLiAgU2luY2UgY2FwbGVuID4gYnVmbGVuCi0JCSAqIGlzIGV4YWN0bHkgaG93IHdlIGdvdCBoZXJlLCB3ZSBrbm93IHdlIGNhbiBvbmx5IGtlZXAgdGhlCi0JCSAqIGZpcnN0IGJ1ZmxlbiBieXRlcyBhbmQgbXVzdCBkcm9wIHRoZSByZW1haW5kZXIuICBBZGp1c3QKLQkJICogY2FwbGVuIGFjY29yZGluZ2x5LCBzbyB3ZSBkb24ndCBnZXQgY29uZnVzZWQgbGF0ZXIgYXMKLQkJICogdG8gaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBwbGF5IHdpdGguCi0JCSAqLwotCQloZHItPmNhcGxlbiA9IGJ1ZmxlbjsKLQkJbWVtY3B5KChjaGFyICopYnVmLCAoY2hhciAqKXRwLCBidWZsZW4pOwotCi0JfSBlbHNlIHsKLQkJLyogcmVhZCB0aGUgcGFja2V0IGl0c2VsZiAqLwotCQlhbXRfcmVhZCA9IGZyZWFkKChjaGFyICopYnVmLCAxLCBoZHItPmNhcGxlbiwgZnApOwotCQlpZiAoYW10X3JlYWQgIT0gaGRyLT5jYXBsZW4pIHsKLQkJCWlmIChmZXJyb3IoZnApKSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKLQkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJfSBlbHNlIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICV1IGNhcHR1cmVkIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAotCQkJCSAgICBoZHItPmNhcGxlbiwgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOwotCQkJfQotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuICgwKTsKKyNpZmRlZiBXSU4zMgorc3RhdGljCisjZW5kaWYKK3BjYXBfdCAqCitwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqZnAsIGNoYXIgKmVycmJ1ZikKK3sKKwlyZXR1cm4gKHBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oZnAsCisJICAgIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTywgZXJyYnVmKSk7CiB9CiAKIC8qCi0gKiBQcmludCBvdXQgcGFja2V0cyBzdG9yZWQgaW4gdGhlIGZpbGUgaW5pdGlhbGl6ZWQgYnkgc2ZfcmVhZF9pbml0KCkuCisgKiBSZWFkIHBhY2tldHMgZnJvbSBhIGNhcHR1cmUgZmlsZSwgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIGZvciBlYWNoCisgKiBwYWNrZXQuCiAgKiBJZiBjbnQgPiAwLCByZXR1cm4gYWZ0ZXIgJ2NudCcgcGFja2V0cywgb3RoZXJ3aXNlIGNvbnRpbnVlIHVudGlsIGVvZi4KICAqLwogaW50CkBAIC0xMzE5LDYgKzM3NSw3IEBACiAJc3RydWN0IGJwZl9pbnNuICpmY29kZTsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgbiA9IDA7CisJdV9jaGFyICpkYXRhOwogCiAJd2hpbGUgKHN0YXR1cyA9PSAwKSB7CiAJCXN0cnVjdCBwY2FwX3BrdGhkciBoOwpAQCAtMTM0MCw3ICszOTcsNyBAQAogCQkJCXJldHVybiAobik7CiAJCX0KIAotCQlzdGF0dXMgPSBzZl9uZXh0X3BhY2tldChwLCAmaCwgcC0+YnVmZmVyLCBwLT5idWZzaXplKTsKKwkJc3RhdHVzID0gcC0+bmV4dF9wYWNrZXRfb3AocCwgJmgsICZkYXRhKTsKIAkJaWYgKHN0YXR1cykgewogCQkJaWYgKHN0YXR1cyA9PSAxKQogCQkJCXJldHVybiAoMCk7CkBAIC0xMzQ4LDggKzQwNSw4IEBACiAJCX0KIAogCQlpZiAoKGZjb2RlID0gcC0+ZmNvZGUuYmZfaW5zbnMpID09IE5VTEwgfHwKLQkJICAgIGJwZl9maWx0ZXIoZmNvZGUsIHAtPmJ1ZmZlciwgaC5sZW4sIGguY2FwbGVuKSkgewotCQkJKCpjYWxsYmFjaykodXNlciwgJmgsIHAtPmJ1ZmZlcik7CisJCSAgICBicGZfZmlsdGVyKGZjb2RlLCBkYXRhLCBoLmxlbiwgaC5jYXBsZW4pKSB7CisJCQkoKmNhbGxiYWNrKSh1c2VyLCAmaCwgZGF0YSk7CiAJCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMzU3LDEzNyArNDE0LDMgQEAKIAkvKlhYWCB0aGlzIGJyZWFrcyBzZW1hbnRpY3MgdGNwc2xpY2UgZXhwZWN0cyAqLwogCXJldHVybiAobik7CiB9Ci0KLS8qCi0gKiBPdXRwdXQgYSBwYWNrZXQgdG8gdGhlIGluaXRpYWxpemVkIGR1bXAgZmlsZS4KLSAqLwotdm9pZAotcGNhcF9kdW1wKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnNwKQotewotCXJlZ2lzdGVyIEZJTEUgKmY7Ci0Jc3RydWN0IHBjYXBfc2ZfcGt0aGRyIHNmX2hkcjsKLQotCWYgPSAoRklMRSAqKXVzZXI7Ci0Jc2ZfaGRyLnRzLnR2X3NlYyAgPSBoLT50cy50dl9zZWM7Ci0Jc2ZfaGRyLnRzLnR2X3VzZWMgPSBoLT50cy50dl91c2VjOwotCXNmX2hkci5jYXBsZW4gICAgID0gaC0+Y2FwbGVuOwotCXNmX2hkci5sZW4gICAgICAgID0gaC0+bGVuOwotCS8qIFhYWCB3ZSBzaG91bGQgY2hlY2sgdGhlIHJldHVybiBzdGF0dXMgKi8KLQkodm9pZClmd3JpdGUoJnNmX2hkciwgc2l6ZW9mKHNmX2hkciksIDEsIGYpOwotCSh2b2lkKWZ3cml0ZShzcCwgaC0+Y2FwbGVuLCAxLCBmKTsKLX0KLQotc3RhdGljIHBjYXBfZHVtcGVyX3QgKgotcGNhcF9zZXR1cF9kdW1wKHBjYXBfdCAqcCwgaW50IGxpbmt0eXBlLCBGSUxFICpmLCBjb25zdCBjaGFyICpmbmFtZSkKLXsKLQotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoTVNET1MpCi0JLyoKLQkgKiBJZiB3ZSdyZSB3cml0aW5nIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQsIHB1dCBpdCBpbiBiaW5hcnkKLQkgKiBtb2RlLCBhcyBzYXZlZmlsZXMgYXJlIGJpbmFyeSBmaWxlcy4KLQkgKgotCSAqIE90aGVyd2lzZSwgd2UgdHVybiBvZmYgYnVmZmVyaW5nLgotCSAqIFhYWCAtIHdoeT8gIEFuZCB3aHkgbm90IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQ/Ci0JICovCi0JaWYgKGYgPT0gc3Rkb3V0KQotCQlTRVRfQklOTU9ERShmKTsKLQllbHNlCi0JCXNldGJ1ZihmLCBOVUxMKTsKLSNlbmRpZgotCWlmIChzZl93cml0ZV9oZWFkZXIoZiwgbGlua3R5cGUsIHAtPnR6b2ZmLCBwLT5zbmFwc2hvdCkgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3Qgd3JpdGUgdG8gJXM6ICVzIiwKLQkJICAgIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCWlmIChmICE9IHN0ZG91dCkKLQkJCSh2b2lkKWZjbG9zZShmKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JcmV0dXJuICgocGNhcF9kdW1wZXJfdCAqKWYpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBzbyB0aGF0IHNmX3dyaXRlKCkgd2lsbCBvdXRwdXQgdG8gdGhlIGZpbGUgbmFtZWQgJ2ZuYW1lJy4KLSAqLwotcGNhcF9kdW1wZXJfdCAqCi1wY2FwX2R1bXBfb3BlbihwY2FwX3QgKnAsIGNvbnN0IGNoYXIgKmZuYW1lKQotewotCUZJTEUgKmY7Ci0JaW50IGxpbmt0eXBlOwotCi0JbGlua3R5cGUgPSBkbHRfdG9fbGlua3R5cGUocC0+bGlua3R5cGUpOwotCWlmIChsaW5rdHlwZSA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgICAiJXM6IGxpbmstbGF5ZXIgdHlwZSAlZCBpc24ndCBzdXBwb3J0ZWQgaW4gc2F2ZWZpbGVzIiwKLQkJICAgIGZuYW1lLCBsaW5rdHlwZSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JaWYgKGZuYW1lWzBdID09ICctJyAmJiBmbmFtZVsxXSA9PSAnXDAnKSB7Ci0JCWYgPSBzdGRvdXQ7Ci0JCWZuYW1lID0gInN0YW5kYXJkIG91dHB1dCI7Ci0JfSBlbHNlIHsKLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCi0JCWYgPSBmb3BlbihmbmFtZSwgInciKTsKLSNlbHNlCi0JCWYgPSBmb3BlbihmbmFtZSwgIndiIik7Ci0jZW5kaWYKLQkJaWYgKGYgPT0gTlVMTCkgewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwKLQkJCSAgICBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCX0KLQlyZXR1cm4gKHBjYXBfc2V0dXBfZHVtcChwLCBsaW5rdHlwZSwgZiwgZm5hbWUpKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgc28gdGhhdCBzZl93cml0ZSgpIHdpbGwgb3V0cHV0IHRvIHRoZSBnaXZlbiBzdHJlYW0uCi0gKi8KLXBjYXBfZHVtcGVyX3QgKgotcGNhcF9kdW1wX2ZvcGVuKHBjYXBfdCAqcCwgRklMRSAqZikKLXsJCi0JaW50IGxpbmt0eXBlOwotCi0JbGlua3R5cGUgPSBkbHRfdG9fbGlua3R5cGUocC0+bGlua3R5cGUpOwotCWlmIChsaW5rdHlwZSA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgICAic3RyZWFtOiBsaW5rLWxheWVyIHR5cGUgJWQgaXNuJ3Qgc3VwcG9ydGVkIGluIHNhdmVmaWxlcyIsCi0JCSAgICBsaW5rdHlwZSk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JcmV0dXJuIChwY2FwX3NldHVwX2R1bXAocCwgbGlua3R5cGUsIGYsICJzdHJlYW0iKSk7Ci19Ci0KLUZJTEUgKgotcGNhcF9kdW1wX2ZpbGUocGNhcF9kdW1wZXJfdCAqcCkKLXsKLQlyZXR1cm4gKChGSUxFICopcCk7Ci19Ci0KLWxvbmcKLXBjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICpwKQotewotCXJldHVybiAoZnRlbGwoKEZJTEUgKilwKSk7Ci19Ci0KLWludAotcGNhcF9kdW1wX2ZsdXNoKHBjYXBfZHVtcGVyX3QgKnApCi17Ci0KLQlpZiAoZmZsdXNoKChGSUxFICopcCkgPT0gRU9GKQotCQlyZXR1cm4gKC0xKTsKLQllbHNlCi0JCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLXBjYXBfZHVtcF9jbG9zZShwY2FwX2R1bXBlcl90ICpwKQotewotCi0jaWZkZWYgbm90eWV0Ci0JaWYgKGZlcnJvcigoRklMRSAqKXApKQotCQlyZXR1cm4tYW4tZXJyb3I7Ci0JLyogWFhYIHNob3VsZCBjaGVjayByZXR1cm4gZnJvbSBmY2xvc2UoKSB0b28gKi8KLSNlbmRpZgotCSh2b2lkKWZjbG9zZSgoRklMRSAqKXApOwotfQpkaWZmIC0tZ2l0IGEvc2Nhbm5lci5jIGIvc2Nhbm5lci5jCmluZGV4IDMxYmE1NTIuLmU5ZmM3MzYgMTAwNjQ0Ci0tLSBhL3NjYW5uZXIuYworKysgYi9zY2FubmVyLmMKQEAgLTEsMTQgKzEsMzQgQEAKKyNsaW5lIDIgInNjYW5uZXIuYyIKIAotI2xpbmUgMyAiPHN0ZG91dD4iCisjbGluZSA0ICJzY2FubmVyLmMiCiAKICNkZWZpbmUgIFlZX0lOVF9BTElHTkVEIHNob3J0IGludAogCiAvKiBBIGxleGljYWwgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgZmxleCAqLwogCisjZGVmaW5lIHl5X2NyZWF0ZV9idWZmZXIgcGNhcF9fY3JlYXRlX2J1ZmZlcgorI2RlZmluZSB5eV9kZWxldGVfYnVmZmVyIHBjYXBfX2RlbGV0ZV9idWZmZXIKKyNkZWZpbmUgeXlfZmxleF9kZWJ1ZyBwY2FwX19mbGV4X2RlYnVnCisjZGVmaW5lIHl5X2luaXRfYnVmZmVyIHBjYXBfX2luaXRfYnVmZmVyCisjZGVmaW5lIHl5X2ZsdXNoX2J1ZmZlciBwY2FwX19mbHVzaF9idWZmZXIKKyNkZWZpbmUgeXlfbG9hZF9idWZmZXJfc3RhdGUgcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUKKyNkZWZpbmUgeXlfc3dpdGNoX3RvX2J1ZmZlciBwY2FwX19zd2l0Y2hfdG9fYnVmZmVyCisjZGVmaW5lIHl5aW4gcGNhcF9pbgorI2RlZmluZSB5eWxlbmcgcGNhcF9sZW5nCisjZGVmaW5lIHl5bGV4IHBjYXBfbGV4CisjZGVmaW5lIHl5bGluZW5vIHBjYXBfbGluZW5vCisjZGVmaW5lIHl5b3V0IHBjYXBfb3V0CisjZGVmaW5lIHl5cmVzdGFydCBwY2FwX3Jlc3RhcnQKKyNkZWZpbmUgeXl0ZXh0IHBjYXBfdGV4dAorI2RlZmluZSB5eXdyYXAgcGNhcF93cmFwCisjZGVmaW5lIHl5YWxsb2MgcGNhcF9hbGxvYworI2RlZmluZSB5eXJlYWxsb2MgcGNhcF9yZWFsbG9jCisjZGVmaW5lIHl5ZnJlZSBwY2FwX2ZyZWUKKwogI2RlZmluZSBGTEVYX1NDQU5ORVIKICNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKICNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKLSNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDMxCisjZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzNQogI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKICNkZWZpbmUgRkxFWF9CRVRBCiAjZW5kaWYKQEAgLTMwLDcgKzUwLDE1IEBACiAKIC8qIEM5OSBzeXN0ZW1zIGhhdmUgPGludHR5cGVzLmg+LiBOb24tQzk5IHN5c3RlbXMgbWF5IG9yIG1heSBub3QuICovCiAKLSNpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisKKy8qIEM5OSBzYXlzIHRvIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSBpbmNsdWRpbmcgc3RkaW50LmgsCisgKiBpZiB5b3Ugd2FudCB0aGUgbGltaXQgKG1heC9taW4pIG1hY3JvcyBmb3IgaW50IHR5cGVzLiAKKyAqLworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgMQorI2VuZGlmCisKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogdHlwZWRlZiBpbnQ4X3QgZmxleF9pbnQ4X3Q7CiB0eXBlZGVmIHVpbnQ4X3QgZmxleF91aW50OF90OwpAQCAtNDUsNyArNzMsNiBAQAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZsZXhfdWludDhfdDsgCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmbGV4X3VpbnQxNl90OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxleF91aW50MzJfdDsKLSNlbmRpZiAvKiAhIEM5OSAqLwogCiAvKiBMaW1pdHMgb2YgaW50ZWdyYWwgdHlwZXMuICovCiAjaWZuZGVmIElOVDhfTUlOCkBAIC03Niw2ICsxMDMsOCBAQAogI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKICNlbmRpZgogCisjZW5kaWYgLyogISBDOTkgKi8KKwogI2VuZGlmIC8qICEgRkxFWElOVF9IICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtODUsMTEgKzExNCwxMiBAQAogCiAjZWxzZQkvKiAhIF9fY3BsdXNwbHVzICovCiAKLSNpZiBfX1NURENfXworLyogQzk5IHJlcXVpcmVzIF9fU1REQ19fIHRvIGJlIGRlZmluZWQgYXMgMS4gKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykKIAogI2RlZmluZSBZWV9VU0VfQ09OU1QKIAotI2VuZGlmCS8qIF9fU1REQ19fICovCisjZW5kaWYJLyogZGVmaW5lZCAoX19TVERDX18pICovCiAjZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLwogCiAjaWZkZWYgWVlfVVNFX0NPTlNUCkBAIC0xMzEsOSArMTYxLDIxIEBACiAKIC8qIFNpemUgb2YgZGVmYXVsdCBpbnB1dCBidWZmZXIuICovCiAjaWZuZGVmIFlZX0JVRl9TSVpFCisjaWZkZWYgX19pYTY0X18KKy8qIE9uIElBLTY0LCB0aGUgYnVmZmVyIHNpemUgaXMgMTZrLCBub3QgOGsuCisgKiBNb3Jlb3ZlciwgWVlfQlVGX1NJWkUgaXMgMipZWV9SRUFEX0JVRl9TSVpFIGluIHRoZSBnZW5lcmFsIGNhc2UuCisgKiBEaXR0byBmb3IgdGhlIF9faWE2NF9fIGNhc2UgYWNjb3JkaW5nbHkuCisgKi8KKyNkZWZpbmUgWVlfQlVGX1NJWkUgMzI3NjgKKyNlbHNlCiAjZGVmaW5lIFlZX0JVRl9TSVpFIDE2Mzg0CisjZW5kaWYgLyogX19pYTY0X18gKi8KICNlbmRpZgogCisvKiBUaGUgc3RhdGUgYnVmIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb25lIHN0YXRlIHBlciBjaGFyYWN0ZXIgaW4gdGhlIG1haW4gYnVmZmVyLgorICovCisjZGVmaW5lIFlZX1NUQVRFX0JVRl9TSVpFICAgKChZWV9CVUZfU0laRSArIDIpICogc2l6ZW9mKHl5X3N0YXRlX3R5cGUpKQorCiAjaWZuZGVmIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCiAjZGVmaW5lIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCiB0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKQEAgLTE2NSwxNCArMjA3LDkgQEAKIAogI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCAoeXl0ZXh0X3B0cikgICkKIAotLyogVGhlIGZvbGxvd2luZyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBwb3J0YWJseSBnZXQgb3VyIGhhbmRzIG9uIHNpemVfdAotICogKHdpdGhvdXQgYXV0b2NvbmYncyBoZWxwLCB3aGljaCBpc24ndCBhdmFpbGFibGUgYmVjYXVzZSB3ZSB3YW50Ci0gKiBmbGV4LWdlbmVyYXRlZCBzY2FubmVycyB0byBjb21waWxlIG9uIHRoZWlyIG93bikuCi0gKi8KLQogI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NJWkVfVAogI2RlZmluZSBZWV9UWVBFREVGX1lZX1NJWkVfVAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgeXlfc2l6ZV90OwordHlwZWRlZiBzaXplX3QgeXlfc2l6ZV90OwogI2VuZGlmCiAKICNpZm5kZWYgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQpAQCAtMjY3LDcgKzMwNCw3IEBACiAKIC8qIFBvaW50cyB0byBjdXJyZW50IGNoYXJhY3RlciBpbiBidWZmZXIuICovCiBzdGF0aWMgY2hhciAqeXlfY19idWZfcCA9IChjaGFyICopIDA7Ci1zdGF0aWMgaW50IHl5X2luaXQgPSAxOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KK3N0YXRpYyBpbnQgeXlfaW5pdCA9IDA7CQkvKiB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSAqLwogc3RhdGljIGludCB5eV9zdGFydCA9IDA7CS8qIHN0YXJ0IHN0YXRlIG51bWJlciAqLwogCiAvKiBGbGFnIHdoaWNoIGlzIHVzZWQgdG8gYWxsb3cgcGNhcF93cmFwKCkncyB0byBkbyBidWZmZXIgc3dpdGNoZXMKQEAgLTM1MSw4ICszODgsOCBAQAogCSp5eV9jcCA9ICdcMCc7IFwKIAkoeXlfY19idWZfcCkgPSB5eV9jcDsKIAotI2RlZmluZSBZWV9OVU1fUlVMRVMgMTM3Ci0jZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMTM4CisjZGVmaW5lIFlZX05VTV9SVUxFUyAxNTQKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUiAxNTUKIC8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKICAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLwogc3RydWN0IHl5X3RyYW5zX2luZm8KQEAgLTM2MCwxNTQgKzM5NywxNjggQEAKIAlmbGV4X2ludDMyX3QgeXlfdmVyaWZ5OwogCWZsZXhfaW50MzJfdCB5eV9ueHQ7CiAJfTsKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbMTMzMF0gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFsxNDU5XSA9CiAgICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsICAxMzgsICAxMzUsICAgOTUsICAgOTUsICAgOTUsICAgOTYsICAxMzUsICAgOTYsCi0gICAgICAgOTYsICAgOTYsICAxMzYsICAxMDQsICAxMDQsICAgOTYsICAgOTYsICAgOTYsICAgOTYsICAxMzMsCi0gICAgICAxMzMsICAxMzUsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAxMzMsICAxMzMsICAgOTYsICAxMzUsICAgOTksICAxMDMsICAgNTcsICAgIDAsICAxMzMsICAxMDQsCi0gICAgICAgIDAsICAxMzMsICAxMzMsICAxMzMsICAxMDcsICAxMDEsICAgOTgsICAxMDAsICAgOTcsICAxMDIsCi0gICAgICAxMzQsICAxMzQsICAxMzMsICAxMzMsICAgMTksICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAgIDcsICAxMzMsICAgMzMsICAgMzQsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCisgICAgICAgIDAsICAgIDAsICAxNTUsICAxNTIsICAxMTIsICAxMTIsICAxMTIsICAxMTMsICAxNTIsICAxMTMsCisgICAgICAxMTMsICAxMTMsICAxNTMsICAxMjIsICAxMjIsICAxMTMsICAxMTMsICAxMTMsICAxMTMsICAxNTAsCisgICAgICAxNTAsICAxNTIsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxMTMsICAxNTIsICAxMTYsICAxMjAsICAgNjcsICAgIDAsICAxNTAsICAxMjIsCisgICAgICAgIDAsICAxNTAsICAxNTAsICAxNTAsICAgIDAsICAxMjQsICAxMTgsICAxMTUsICAxMTcsICAxMTQsCisgICAgICAxMTksICAxNTAsICAxNTEsICAxNTEsICAxNTAsICAxNTAsICAxNTAsICAgMjAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCiAKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICA4MSwgIDEzMywKLSAgICAgICA1OCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgICA3NSwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgICAgNCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICA1OCwgIDEwMywgIDEwNSwKLSAgICAgIDEwNSwgIDEwNCwgIDEzMywgICAgMCwgIDEwNywgIDEwNCwgIDEwNywgIDEwNywgIDEwNywgIDEzMywKLSAgICAgIDEzMywgICA1NywgICAgNSwgIDEzMywgICA3MCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgICA5MywgICAgMSwgICAgMCwgIDEzMywgICAyMCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICAzNSwgIDEzMywgIDEzMywgICAxNywKLSAgICAgICA0MiwgICAgMCwgIDEzMywgICAyOCwgIDEzMywgICAyNCwgICA2MCwgIDEzMywgIDEzMywgICA2OCwKLSAgICAgICAzNiwgIDEzMywgICA4OSwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICA5MCwgIDEzMywgICA0NSwKKyAgICAgICAgNywgIDE1MCwgICAzNCwgICAzNSwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgICA5MSwgIDE1MCwKKyAgICAgICA2OCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgICA2MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgICA4NSwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgICA2MSwKKyAgICAgIDE1MCwgICAgNCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgICA2OCwKKyAgICAgIDEyMCwgIDE1MCwgIDEyMywgIDEyMywgIDE1MCwgIDEyMiwgIDE1MCwgICAgMCwgIDEyNCwgIDEyMiwKKyAgICAgIDEyNCwgIDEyNCwgIDEyNCwgIDE1MCwgIDE1MCwgIDE1MCwgICA2NywgICAgNSwgIDE1MCwgICA4MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgICA1NSwgIDEwNiwgICAgMSwKKyAgICAgICAgMCwgIDE1MCwgICAyMSwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKIAotICAgICAgIDU5LCAgIDcxLCAgIDkyLCAgMTMzLCAgIDE0LCAgMTMzLCAgICAzLCAgMTMzLCAgMTMzLCAgMTMzLAotICAgICAgMTMzLCAgMTMzLCAgIDgzLCAgMTMzLCAgMTMzLCAgIDI1LCAgMTMzLCAgIDkxLCAgMTMzLCAgIDk0LAotICAgICAgIDM3LCAgICAyLCAgMTMzLCAgIDQxLCAgMTMzLCAgICA5LCAgIDEwLCAgIDc4LCAgMTMzLCAgIDc3LAotICAgICAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTA0LCAgICAwLCAgMTMzLCAgICAwLCAgMTA4LCAgMTA3LAotICAgICAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgIDIyLCAgMTMzLAotICAgICAgMTMzLCAgMTMzLCAgIDU0LCAgIDQwLCAgMTMzLCAgIDM4LCAgMTMzLCAgMTMzLCAgIDI5LCAgMTMzLAotICAgICAgIDg3LCAgMTMzLCAgMTMzLCAgIDQ0LCAgIDExLCAgMTMzLCAgIDEyLCAgIDEzLCAgMTMzLCAgMTMzLAotICAgICAgMTMzLCAgIDMxLCAgIDY3LCAgMTMzLCAgIDUyLCAgICAzLCAgIDg4LCAgIDQ2LCAgMTMzLCAgMTMzLAotICAgICAgMTMzLCAgIDY0LCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgIDQ3LCAgMTMzLCAgMTMzLCAgIDM5LAotICAgICAgMTMzLCAgICA2LCAgMTMzLCAgIDgyLCAgMTMzLCAgICA4LCAgIDg0LCAgMTMzLCAgICAwLCAgMTMzLAorICAgICAgIDM2LCAgMTUwLCAgMTUwLCAgIDE4LCAgIDQzLCAgICAwLCAgMTUwLCAgIDI5LCAgMTUwLCAgIDI1LAorICAgICAgIDcwLCAgMTUwLCAgMTUwLCAgIDc4LCAgIDM3LCAgMTUwLCAgIDk5LCAgMTUwLCAgMTUwLCAgMTUwLAorICAgICAgMTUwLCAgMTAwLCAgMTUwLCAgIDQ2LCAgIDY5LCAgIDgxLCAgMTA1LCAgMTUwLCAgIDE0LCAgMTUwLAorICAgICAgICAzLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgIDkzLCAgMTUwLCAgMTUwLCAgIDI2LAorICAgICAgMTUwLCAgMTA0LCAgMTUwLCAgMTA3LCAgIDM4LCAgICAyLCAgMTUwLCAgIDQyLCAgMTUwLCAgICA5LAorICAgICAgMTUwLCAgIDEwLCAgIDg4LCAgMTUwLCAgIDg3LCAgMTUwLCAgMTUwLCAgICAwLCAgMTUwLCAgMTUwLAorICAgICAgMTIzLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTIyLCAgICAwLCAgMTUwLCAgICAwLCAgMTI1LAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLCAgIDIzLAorICAgICAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgIDY0LCAgIDE2LCAgIDQxLCAgMTUwLCAgIDM5LCAgMTUwLAorICAgICAgMTUwLCAgMTUwLCAgIDMwLCAgMTUwLCAgIDk3LCAgMTUwLCAgMTUwLCAgMTEwLCAgMTUwLCAgMTUwLAogCi0gICAgICAgNjMsICAgMTUsICAxMDUsICAxMDUsICAxMDUsICAxMDQsICAgIDAsICAxMDcsICAgIDAsICAgIDAsCi0gICAgICAxMDcsICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAxMzMsICAgMjEsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAgMzAsICAxMzMsICAxMzMsICAgIDAsICAgMTgsICAxMzMsICAxMzMsICAxMzMsICAgNzYsICAxMzMsCi0gICAgICAgMzIsICAxMzMsICAgNjksICAgMjcsICAgMjYsICAxMzMsICAxMzMsICAgNzIsICAxMzMsICAxMzMsCi0gICAgICAxMzMsICAgNDksICAgMTYsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAgIDAsICAgIDAsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAgIDAsICAgIDAsICAxMDgsICAxMDcsICAxMDcsICAxMDgsICAxMDcsICAgIDAsICAgIDAsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCi0gICAgICAxMDcsICAgIDAsICAxMDcsICAgIDAsICAxMDcsICAgIDAsICAgODYsICAxMzMsICAxMzMsICAgMjMsCisgICAgICAxMDMsICAxMDksICAgNDUsICAxMDgsICAxMTEsICAgMTEsICAxNTAsICAgMTIsICAgMTMsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAgMzIsICAgNzcsICAxNTAsICAgNjIsICAgIDMsICAgOTgsICAgNDcsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAgNzQsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAgNDgsICAxNTAsICAxNTAsCisgICAgICAgNDAsICAxNTAsICAgIDYsICAxNTAsICAgOTIsICAxNTAsICAgIDgsICAgOTQsICAxNTAsICAxNTAsCisgICAgICAgIDAsICAxNTAsICAgNTMsICAgNzMsICAgMTUsICAxNTAsICAxMjMsICAxMjMsICAxNTAsICAxMjMsCisgICAgICAxMjMsICAxMjMsICAxNTAsICAxMjIsICAxNTAsICAgIDAsICAxMjQsICAxNTAsICAgIDAsICAgIDAsCisgICAgICAxMjQsICAgIDAsICAxMjQsICAxMjUsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxNTAsICAgNTYsICAgNTcsICAgNTgsICAgNTksCisgICAgICAxNTAsICAgMjIsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAgMzEsICAxNTAsICAxNTAsICAxMDEsCisgICAgICAxMDIsICAgIDAsICAgMTksICAxNTAsICAxNTAsICAxNTAsICAgODYsICAxNTAsICAgMzMsICAxNTAsCiAKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgIDEzMywgICA2MCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgICA2NSwgICA2NiwgIDEzMywgICA4NSwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEwNSwgIDEwNSwgIDEwNSwgICAgMCwgIDEwNywKLSAgICAgIDEwNywgICAgMCwgIDEwNywgICAgMCwgICAgMCwgIDEwNywgICAgMCwgIDEwNywgIDEwOCwgIDEwNywKLSAgICAgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwOCwgIDEwNywgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDEwNywgIDEwNywgIDEwNywKLSAgICAgIDEwNywgICAgMCwgIDEzMywgIDEzMywgICA1MSwgICA1MywgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICA2MSwgIDEzMywKLSAgICAgIDEzMywgICA0MywgICA3MywgICA3NCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMSwgIDEyNywKKyAgICAgICA3OSwgICAyOCwgICAyNywgIDE1MCwgIDE1MCwgICA4MiwgIDE1MCwgIDE1MCwgIDE1MCwgICA1MCwKKyAgICAgICAxNywgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgICAgMCwgIDE1MCwgIDE1MCwgIDEyMywgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDEyMywgIDEyMywgIDE1MCwgIDEyMiwgIDE1MCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwKKyAgICAgIDEyNCwgICAgMCwgICAgMCwgIDEyNSwgIDEyNCwgIDEyNCwgIDEyNSwgIDEyNCwgICAgMCwgICAgMCwKKyAgICAgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwKKyAgICAgIDEyNCwgICAgMCwgIDEyNCwgICAgMCwgIDEyNCwgICAgMCwgICA5NiwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgICAyNCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgICA3MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgICA3NSwgICA3NiwgIDE1MCwgICA5NSwgIDE1MCwgIDE1MCwgIDE1MCwKIAotICAgICAgMTMzLCAgMTI5LCAgMTI4LCAgMTMyLCAgMTMzLCAgMTMzLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LAotICAgICAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgMTA4LCAgMTA3LCAgMTA3LCAgMTA3LAotICAgICAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgMTA3LAotICAgICAgICAwLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLAotICAgICAgMTMzLCAgMTMzLCAgMTMzLCAgMTEwLCAgMTA5LCAgMTMzLCAgMTMzLCAgIDYyLCAgMTMzLCAgMTMzLAotICAgICAgMTMzLCAgMTMwLCAgMTI2LCAgMTA1LCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgMTA3LAotICAgICAgICAwLCAgMTA3LCAgICAwLCAgICAwLCAgMTA3LCAgICAwLCAgMTA3LCAgMTA4LCAgMTA3LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgMTA4LCAgMTA3LCAgICAwLCAgICAwLAorICAgICAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTIzLAorICAgICAgMTIzLCAgMTUwLCAgMTIzLCAgMTIzLCAgMTIzLCAgMTIzLCAgMTUwLCAgMTIyLCAgMTUwLCAgICAwLAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLCAgICAwLCAgMTI0LCAgICAwLCAgMTI0LCAgMTI1LAorICAgICAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgMTI1LCAgMTI0LAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgIDUyLCAgIDYzLCAgMTUwLAorICAgICAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLAorICAgICAgMTUwLCAgIDcxLCAgMTUwLCAgMTUwLCAgIDQ0LCAgIDgzLCAgIDg0LCAgMTUwLCAgMTUwLCAgMTUwLAorICAgICAgMTUwLCAgIDU0LCAgMTQ4LCAgMTQ0LCAgMTUwLCAgMTQ2LCAgMTQ1LCAgMTQ5LCAgMTUwLCAgICAwLAorICAgICAgMTUwLCAgMTUwLCAgMTIzLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTIzLCAgMTUwLCAgMTIyLCAgMTUwLAogCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsCi0gICAgICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgNTUsICAxMzMsICAxMTUsICAxMjIsICAxMzMsCi0gICAgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAgNTYsICAgNDgsCi0gICAgICAxMzMsICAxMzMsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAxMDgsICAxMDcsICAxMDcsICAxMDcsICAgIDAsCi0gICAgICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAxMDcsCi0gICAgICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCisgICAgICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsCisgICAgICAxMjUsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsCisgICAgICAgIDAsICAxMjQsICAgIDAsICAxMjQsICAgIDAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxMjcsICAxMjYsCisgICAgICAxNTAsICAxNTAsICAgNzIsICAxNTAsICAxNTAsICAxNTAsICAxNDcsICAxNDMsICAxNTAsICAxNTAsCisgICAgICAxMjMsICAxMjMsICAxMjMsICAxMjMsICAxNTAsICAxMjIsICAxNTAsICAgIDAsICAxMjQsICAxMjQsCisgICAgICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAgIDAsICAgIDAsICAxMjQsICAgIDAsICAxMjQsCisgICAgICAxMjUsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjUsCiAKLSAgICAgIDEwNywgICAgMCwgIDEwNywgICAgMCwgIDEwNywgICAgMCwgICA3OSwgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICA1MCwgICAgMCwKLSAgICAgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywKLSAgICAgICAgMCwgIDEwNiwgIDEwNywgICAgMCwgIDEwNywgIDEwOCwgIDEwNywgICAgMCwgICAgMCwgICAgMCwKLSAgICAgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwOCwgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwOCwgIDEwNywgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwOCwgIDEwNywgICAgMCwKLSAgICAgIDEwNywgIDEwNywgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgIDEwNywgIDEwNywgIDEwNywgIDEwNywgIDEwNywgICAgMCwgIDEzMywgIDEzMywgIDEzMywgIDEzMywKLSAgICAgIDEzMywgIDEzMywgIDEzMywgIDEzMywgIDEyMCwgIDEzMywgICA4MCwgICAgMCwgICAgMCwgIDEwNywKKyAgICAgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgIDEyNCwKKyAgICAgIDEyNSwgIDEyNCwgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgICAgMCwgICA2NSwgIDE1MCwKKyAgICAgICA1NSwgIDEzMiwgIDEzOSwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgICA2NiwgICA0OSwgIDE1MCwgIDE1MCwgICAgMCwgIDE1MCwgIDE1MCwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDEyMiwgIDE1MCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwKKyAgICAgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgICAgMCwgICAgMCwgIDEyNSwgIDEyNCwgIDEyNCwKKyAgICAgIDEyNCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwKKyAgICAgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKIAotICAgICAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LAotICAgICAgMTA3LCAgICAwLCAgMTA2LCAgMTA4LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgMTA3LAotICAgICAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LAotICAgICAgMTA3LCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLAotICAgICAgMTMzLCAgMTMzLCAgMTMzLCAgMTI0LCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLAotICAgICAgMTMzLCAgMTEyLCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LAorICAgICAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLCAgIDg5LCAgMTUwLAorICAgICAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLAorICAgICAgIDUxLCAgMTIxLCAgMTIxLCAgMTIzLCAgMTIzLCAgMTUwLCAgMTIyLCAgMTUwLCAgICAwLCAgMTI0LAorICAgICAgMTI0LCAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgICAwLAorICAgICAgMTIxLCAgMTI0LCAgICAwLCAgMTI0LCAgMTI1LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgMTI0LAorICAgICAgMTI0LCAgICAwLCAgMTI0LCAgMTI1LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgMTI1LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgMTI1LCAgMTI0LCAgICAwLCAgMTI0LAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LAogCi0gICAgICAxMDcsICAgIDAsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCi0gICAgICAgIDAsICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsCi0gICAgICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCi0gICAgICAxMDcsICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAxMDgsICAxMDcsICAgIDAsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAxMzMsICAxMzMsICAxMzMsICAxMzMsCi0gICAgICAxMTQsICAxMzMsICAxMzMsICAxMzMsICAxMTgsICAxMzMsICAgIDAsICAgIDAsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsCisgICAgICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsCisgICAgICAxNTAsICAxNTAsICAxNTAsICAxMzcsICAxNTAsICAgOTAsICAxMjEsICAxMjEsICAxMjMsICAxNTAsCisgICAgICAxMjEsICAxMjEsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxMjEsICAxMjUsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsCiAKLSAgICAgIDEwNywgIDEwNywgIDEwNywgICAgMCwgICAgMCwgICAgMCwgIDEwOCwgICAgMCwgICAgMCwgIDEwNywKLSAgICAgICAgMCwgICAgMCwgIDEwNywgIDEwNywgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgIDEwNywgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwNywgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDEwNywgIDEwNywgICAgMCwgIDEwNywKLSAgICAgIDEwNywgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEwNywKLSAgICAgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwNywgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDEwNywgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywgICAgMCwgIDEwNywgICAgMCwgIDExMSwKLSAgICAgIDEyMywgIDEyNSwgIDExOSwgIDEzMywgIDEzMywgIDEzMywgIDEzMywgICAgMCwgICAgMCwgIDEwNywKLSAgICAgICAgMCwgIDEwNywgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwNywgICAgMCwgIDEwNywKKyAgICAgICAgMCwgIDEyNCwgICAgMCwgIDEyNCwgICAgMCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE0MSwgIDE1MCwKKyAgICAgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDE1MCwgIDEyOSwgIDEyMywgIDE1MCwgIDEyMiwKKyAgICAgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwKKyAgICAgIDEyNCwgIDEyNCwgICAgMCwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwgICAgMCwgICAgMCwKKyAgICAgIDEyNCwgIDEyNSwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgIDEyNCwKKyAgICAgIDEyNSwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwKKyAgICAgIDEyNCwgIDEyNSwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwKKyAgICAgIDEyNCwgICAgMCwgIDEyNCwgIDEyNSwgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgIDEyNCwgIDEyNCwgICAgMCwgIDEyNCwgIDEyNSwgIDEyNCwgICAgMCwgIDEyNCwgIDEyNCwKKyAgICAgIDEyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEyNCwgIDEyNCwKIAotICAgICAgMTA3LCAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgMTA3LCAgMTA3LCAgICAwLCAgMTA3LCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LAotICAgICAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LAotICAgICAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgMTMzLCAgMTMzLCAgMTMzLCAgMTMzLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgMTA3LCAgMTA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTA3LCAgMTA3LCAgMTA3LCAgMTA3LCAgICAwLAorICAgICAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTUwLCAgMTMxLCAgMTUwLAorICAgICAgMTUwLCAgMTUwLCAgMTM1LCAgMTUwLCAgMTIxLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LAorICAgICAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgMTI1LCAgICAwLCAgICAwLCAgMTI0LCAgICAwLAorICAgICAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgMTI0LCAgMTI0LAorICAgICAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LAorICAgICAgMTI0LCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAogCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAxMzMsICAxMzMsICAxMzMsICAxMjEsICAxMDcsICAxMDcsICAxMDcsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAgIDAsCi0gICAgICAgIDAsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAxMDcsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAxMDcsCi0gICAgICAxMDcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMDcsICAxMTYsICAxMzMsICAxMTMsCi0gICAgICAxMDcsICAgIDAsICAgIDAsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAgIDAsCi0gICAgICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAxMDcsICAxMDcsICAgIDAsICAxMDcsICAxMDcsCisgICAgICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAgIDAsICAxMjQsICAgIDAsICAxMjgsICAxNDAsCisgICAgICAxNDIsICAxMzYsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAgIDAsICAgIDAsICAxMjQsICAgIDAsCisgICAgICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsCisgICAgICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsCisgICAgICAxMjQsICAgIDAsICAxMjQsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAgIDAsICAxNTAsICAxNTAsICAxNTAsICAxNTAsICAgIDAsICAgIDAsICAgIDAsCiAKLSAgICAgIDEwNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDExNywgIDEwNywgIDEwNywgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDEwNywgIDEwNywgIDEwNywgICAgMCwgICAgMCwKLSAgICAgIDEwNywgIDEwNywgIDEwNywgIDEwNywgIDEwNywgICAgMCwgIDEwNywgIDEwNywgICAgMAorICAgICAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LAorICAgICAgMTUwLCAgMTUwLCAgMTUwLCAgMTM4LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LAorICAgICAgMTI0LCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgICAwLCAgICAwLAorICAgICAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgICAwLAorICAgICAgICAwLCAgICAwLCAgMTI0LCAgICAwLCAgICAwLCAgICAwLCAgMTI0LCAgMTI0LCAgMTI0LCAgMTI0LAorCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMzMsICAxNTAsICAxMzAsICAxMjQsCisgICAgICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAxMjQsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMzQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAgIDAsICAxMjQsCisgICAgICAxMjQsICAxMjQsICAxMjQsICAxMjQsICAgIDAsICAxMjQsICAxMjQsICAgIDAKICAgICB9IDsKIAogc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQpAQCAtNTE3LDE1ICs1NjgsMTUgQEAKICAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMiwgICAgNSwgICAgMSwgICAgMSwgICAgNiwgICAgMSwgICAgNywgICAgMSwgICAgOCwKICAgICAgICAgOCwgICAgOSwgICAgOSwgICAgMSwgICAxMCwgICAxMSwgICAgOSwgICAxMiwgICAxMywgICAxNCwKLSAgICAgICAxNSwgICAxNiwgICAxNSwgICAxNywgICAxNSwgICAxNSwgICAxNSwgICAxOCwgICAgMSwgICAxOSwKLSAgICAgICAyMCwgICAyMSwgICAgMSwgICAgMSwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwKLSAgICAgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywKLSAgICAgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyNCwgICAyMywgICAyMywKLSAgICAgICAyNSwgICAyNiwgICAyNSwgICAgMSwgICAyNywgICAgMSwgICAyOCwgICAyOSwgICAzMCwgICAzMSwKKyAgICAgICAxNSwgICAxNiwgICAxNywgICAxOCwgICAxNywgICAxNywgICAxNywgICAxOSwgICAgMSwgICAyMCwKKyAgICAgICAyMSwgICAyMiwgICAgMSwgICAgMSwgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywgICAyMywKKyAgICAgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwKKyAgICAgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNCwgICAyNSwgICAyNCwgICAyNCwKKyAgICAgICAyNiwgICAyNywgICAyNiwgICAgMSwgICAyOCwgICAgMSwgICAyOSwgICAzMCwgICAzMSwgICAzMiwKIAotICAgICAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LCAgIDIzLCAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLAotICAgICAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLAotICAgICAgIDUxLCAgIDIzLCAgICAxLCAgIDUyLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDI0LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLAorICAgICAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAorICAgICAgIDUyLCAgIDI0LCAgICAxLCAgIDUzLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLApAQCAtNTQyLDE4NjQgKzU5MywyMDkyIEBACiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X21ldGFbNTNdID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9tZXRhWzU0XSA9CiAgICAgeyAgIDAsCiAgICAgICAgIDEsICAgIDIsICAgIDIsICAgIDEsICAgIDIsICAgIDEsICAgIDMsICAgIDIsICAgIDEsICAgIDQsCi0gICAgICAgIDUsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDcsICAgIDMsICAgIDMsCi0gICAgICAgIDMsICAgIDgsICAgIDQsICAgIDksICAgIDMsICAgIDEsICAgIDQsICAgIDgsICAgIDgsICAgIDgsCi0gICAgICAgIDgsICAgIDgsICAgIDgsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsCi0gICAgICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDksCi0gICAgICAgIDQsICAgIDMKKyAgICAgICAgNSwgICAgNiwgICAgNiwgICAgNiwgICAgNiwgICAgNiwgICAgNiwgICAgNiwgICAgNywgICAgMywKKyAgICAgICAgMywgICAgMywgICAgOCwgICAgNCwgICAgOSwgICAgMywgICAgMSwgICAgNCwgICAgOCwgICAgOCwKKyAgICAgICAgOCwgICAgOCwgICAgOCwgICAgOCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwKKyAgICAgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwKKyAgICAgICAgOSwgICAgNCwgICAgMwogICAgIH0gOwogCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYmFzZVsxNzAzXSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYmFzZVsxOTE5XSA9CiAgICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsIDM0NTQsICAgNTIsIDY1NzAsIDY1NzAsICAgNTMsIDM0MTksICAgNTksIDM0MzEsCi0gICAgIDY1NzAsICAgNjMsIDY1NzAsICAgODAsICAgNDksICAxMzEsICAgNTUsIDM0MTcsICAgNjIsICAxNDcsCi0gICAgICAxODYsICAxNDcsICAxMDYsICAgMzYsICAxMjksICAxMzQsICAgNTUsICAxMDIsICAxMTEsIDMzOTUsCi0gICAgICAxOTAsICAxOTMsICAxNDAsICAxMTMsICAxNDksICAxOTgsICAyMDUsICAxNDgsICAxMzksIDM0MDQsCi0gICAgICAyMTEsIDMzOTUsIDMzNzksICAyNTAsIDY1NzAsICAgIDAsIDY1NzAsICAgIDAsICAyNDgsICAyNjYsCi0gICAgIDM0MDMsICAyNTgsICAgIDAsICAyODgsICAzMjEsIDY1NzAsIDY1NzAsIDY1NzAsIDY1NzAsIDY1NzAsCi0gICAgICAzMDUsICAgIDAsICAzNDQsICAgNDAsICAgIDAsIDMzODksIDMzNzYsIDMzNzEsICAxODMsIDMzNTcsCi0gICAgIDMzNTEsIDMzNTUsIDMzNTMsIDMzNTIsICAxOTIsIDMzNjEsIDMzMzAsICAyNDgsIDMzNDAsICAyMTMsCi0gICAgIDMzMjksIDMzMjcsIDMzNDAsIDMzMjUsIDMzMzAsIDMzMjgsICAxMDMsIDMzMjMsIDMzMTgsIDMzMDcsCi0gICAgICAgMzgsICAzMDUsICAgIDAsICAgIDAsICAxNjUsICAxMzUsIDMyOTUsIDMzMDQsICAyNDQsIDMyODcsCisgICAgICAgIDAsICAgIDAsIDM5MDcsICAgNTMsIDc0MDEsIDc0MDEsICAgNTQsIDM4ODQsICAgNjAsIDM4OTcsCisgICAgIDc0MDEsICAgODIsIDc0MDEsICAxMDAsICAgMzEsICAxNTIsICAgNDcsIDM4ODIsICAgNDksICAxNjksCisgICAgICAyMTEsICAxNjksICAgNjEsICAgNDQsICAxMjYsICAgNjEsICAgMzAsICAgNjMsICAgNzYsICAxNTgsCisgICAgICAyMTUsICAyMTgsICAxNjAsICAgMzIsICAxNjYsICAxMTcsICAyMzAsICAyMzYsICAyMDgsIDM4NTUsCisgICAgICAxNzQsIDM4NDcsIDM4MzIsICAyODEsIDc0MDEsICAgIDAsIDc0MDEsICAyOTcsICAzMjAsICAzNDQsCisgICAgIDM4NjUsICAzNjgsICAgIDAsICAzNzUsICAgIDAsICA0MDksIDc0MDEsIDc0MDEsIDc0MDEsIDc0MDEsCisgICAgIDc0MDEsICAyNzksICAyOTcsICAgIDAsIDM4MzgsIDM4MzQsIDM4NDgsICAgIDAsIDM4NDcsIDM4MjEsCisgICAgIDM4MzQsIDM4MzEsIDM4MTksIDM4MTMsIDM4MTMsIDM4MTYsIDM4MTUsIDM3OTksIDM4MDgsIDM3OTMsCisgICAgIDM4MDYsIDM3ODksICAyMjUsIDM3OTgsIDM4MDEsIDM3ODYsIDM3NzAsIDM3ODMsIDM3NzIsIDM3NzcsCisgICAgIDM3NjcsIDM3NjUsICAxMjEsICAgODMsIDM3NzAsIDM3NjgsICAxMjksIDM3NTcsIDM3NTIsIDM3NjEsCiAKLSAgICAgMzI4NCwgMzI4NywgMzI5MCwgMzI2NiwgMzI3NCwgMzI2NSwgMzI2NCwgMzI3MCwgICAgMCwgMzI3NywKLSAgICAgICAgMCwgMzI2MCwgMzI2NiwgMzI1MSwgMzI1MiwgMzIzMiwgMzIzMiwgIDI4MiwgMzI0MywgMzIyMywKLSAgICAgMzIzNCwgMzIyNywgIDIyMCwgMzIwOSwgIDMyNiwgMzIwNywgIDMwMiwgMzIwNiwgMzIxOCwgMzIwNCwKLSAgICAgICAgMCwgMzIwMiwgMzIwNiwgMzIwNCwgMzE5NSwgMzE2NiwgMzE4MCwgNjU3MCwgNjU3MCwgIDM3OCwKLSAgICAgIDI0MywgIDQxNywgIDM1MiwgMzE4OCwgIDQzOSwgMzE5MywgIDQ2MiwgIDMyMCwgMzE4NSwgMzE2MCwKLSAgICAgMzE1MSwgICAgMCwgICAgMCwgMzE0OCwgIDM2MSwgMzE1NywgMzE1MiwgMzEzOSwgMzE0MCwgMzEzNywKLSAgICAgIDUwMiwgICAgMCwgICAgMCwgMzEzMywgMzEwMywgICAgMCwgMzExNSwgIDI3MiwgMzA5OSwgMzExMiwKLSAgICAgMzExNCwgMzA5NSwgMzA5OCwgMzEwMiwgMzA4NywgMzA2NiwgICAgMCwgMzA3MSwgMzA2NSwgICAgMCwKLSAgICAgICAgMCwgMzA2OCwgMzA1NiwgICAgMCwgMzA2OCwgICAgMCwgMzA1NiwgMzAyMywgMzAzMCwgICAgMCwKLSAgICAgICAgMCwgMzAxOSwgICAgMCwgMzAyNywgMzAzNCwgIDM1MiwgMzAxNiwgICAgMCwgMzAxNCwgMzAyMSwKKyAgICAgIDE0OCwgIDIyOCwgICAgMCwgICAgMCwgICAzNywgIDE2OSwgMzc0OSwgMzc1OCwgIDIyNiwgMzc0MSwKKyAgICAgMzczOSwgMzc0MiwgMzczMSwgMzcyMSwgMzcyOSwgMzcyMCwgMzcxOSwgMzcyNCwgICAgMCwgMzczMiwKKyAgICAgICAgMCwgMzcxNSwgMzcwNiwgMzcwMCwgMzcwMSwgMzcwMSwgMzcwMSwgIDIzNCwgMzcxMCwgMzY5MywKKyAgICAgMzY5MCwgMzY4MywgICA1NiwgMzY3OSwgIDI0MywgMzY3NywgIDE2MCwgMzY3NiwgMzY4NywgICAgMCwKKyAgICAgMzY3MywgICAgMCwgMzY3MiwgMzY1NiwgMzY2MSwgMzY2OCwgMzY1OSwgMzY0OSwgMzY2MywgNzQwMSwKKyAgICAgNzQwMSwgIDQzNCwgIDQ1OCwgIDI3NCwgIDQ5OSwgIDUyMywgIDU0NywgMzY1NywgIDU1NCwgMzY2NCwKKyAgICAgIDU3OCwgIDI5MywgMzY1NSwgMzYzMCwgMzYzNSwgMzYyNSwgICAgMCwgICAgMCwgMzYzMCwgICAgMCwKKyAgICAgMzYzOSwgMzYxOSwgMzYwOCwgMzYwNywgMzYwOCwgMzYwNCwgMzYwNCwgMzU5NiwgICAgMCwgICAgMCwKKyAgICAgMzU5MSwgMzU4MSwgICAgMCwgMzU5MywgMzU4OCwgMzU3NSwgMzU4OSwgMzU5MiwgMzU3NCwgMzU1OCwKKyAgICAgMzU1NywgMzU1NCwgMzU2OSwgMzU1MiwgMzU1NiwgMzUzNiwgMzUzOCwgMzU1MSwgMzUzNiwgMzUzNSwKIAotICAgICAgICAwLCAzMDE2LCAgICAwLCAyOTk5LCAgICAwLCAyOTgxLCAyOTg1LCAyOTc4LCAyOTgwLCAyOTg1LAotICAgICAyOTc4LCAyOTY1LCAgICAwLCAyOTYzLCAyOTU2LCAgICAwLCAyOTQ1LCAgICAwLCAyOTQ0LCAgICAwLAotICAgICAgICAwLCAgICAwLCAyOTQwLCAgICAwLCAyOTM4LCAgMzcwLCAgICAwLCAgICAwLCAyOTQxLCAgICAwLAotICAgICAyOTM4LCAyOTE4LCAgMzkyLCAgNTMxLCAgNTU0LCAyOTM5LCAyOTM4LCAyOTM3LCAyOTM2LCAgNTYyLAotICAgICAgMzYwLCAyOTM0LCAyOTMzLCAgMzk5LCAgNjAyLCAgNjI0LCAgNDA2LCAgICAwLCAgICAwLCAyOTA5LAotICAgICAyODY0LCAyODY5LCAgICAwLCAgICAwLCAyODY3LCAgICAwLCAyODY2LCAyODUyLCAgICAwLCAyODUxLAotICAgICAgICAwLCAyODQ1LCAyODQ3LCAgICAwLCAgNDc5LCAyODQwLCAgICAwLCAgICAwLCAyODQ4LCAyODMwLAotICAgICAyODMxLCAgICAwLCAgICAwLCAyODI5LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAyODQzLCAyODM0LAotICAgICAyODQxLCAgICAwLCAyNzk1LCAyNzk4LCAyODEzLCAyNzg3LCAyNzgzLCAyNzkzLCAyNzgzLCAgICAwLAotICAgICAyNzgyLCAgICAwLCAyNzY4LCAgICAwLCAgMjQ3LCAgICAwLCAgICAwLCAyNzYxLCAgNDU1LCAyNzY5LAorICAgICAgICAwLCAzNTM5LCAzNTMzLCAgICAwLCAgICAwLCAzNTM3LCAzNTI3LCAgICAwLCAzNTE4LCAgICAwLAorICAgICAzNTE1LCAzNTAyLCAzNTA5LCAgICAwLCAgICAwLCAzNDk3LCAgICAwLCAzNTA2LCAzNTE0LCAgMjcyLAorICAgICAzNDk2LCAgICAwLCAzNDgwLCAzNDk2LCAgICAwLCAzNDkxLCAgICAwLCAzNDk0LCAgICAwLCAzNDc0LAorICAgICAzNDc4LCAzNDcyLCAzNDc1LCAzNDcxLCAzNDQ0LCAzNDQwLCAgICAwLCAzNDM4LCAzNDUwLCAgICAwLAorICAgICAzNDM4LCAgICAwLCAzNDM3LCAgICAwLCAgICAwLCAgICAwLCAzNDM0LCAgICAwLCAgMTcxLCAgMjAyLAorICAgICAzNDQ1LCAgICAwLCAgICAwLCAzNDIxLCAgICAwLCAzNDE4LCAzNDE5LCAgNjE4LCAzNDQ5LCAgNjQxLAorICAgICAgNjY1LCAzNDQ2LCAgNjcyLCAgNDgxLCAgMTE1LCAgNjk2LCAzNDM3LCAgNzIwLCAzNDM2LCAzNDM1LAorICAgICAgNzI4LCAgMjk0LCAzNDIwLCAzNDE5LCAgNDg4LCAgNzY5LCAgNzkyLCAzNDE3LCAgICAwLCAgICAwLAorICAgICAzMzkyLCAgMzgxLCAzMzk1LCAzMzk5LCAgICAwLCAgICAwLCAgICAwLCAzMzgyLCAgICAwLCAzMzgxLAorICAgICAzMzgyLCAzMzY2LCAgICAwLCAzMzY0LCAgICAwLCAzMzU4LCAzMzYwLCAgICAwLCAzMzQzLCAzMzQyLAogCi0gICAgICAgIDAsICAgIDAsICA2NDcsICAzNzQsIDI3OTUsIDI3ODcsIDI3ODUsICA2ODYsIDI3ODQsIDI3ODMsCi0gICAgICA3MDgsICA0OTEsICA3MzEsICA3NTMsICA1MTUsICAgIDAsIDI3NDMsICAzNzUsICA1MjIsICA3NzYsCi0gICAgICA1ODUsICA3OTksICAzNzYsIDI3NDIsIDI3NDgsIDI3MTgsICAgIDAsIDI3MjcsIDI3MjUsIDI3MDgsCi0gICAgICAgIDAsIDI3MjUsIDI3MDcsICA4MTgsICAgIDAsIDI2OTcsIDI2ODYsIDI3MDQsICAgIDAsIDI2OTUsCi0gICAgICAgIDAsIDI2OTgsIDI2OTEsICAgIDAsICAgIDAsIDI3MDEsIDI2NTAsICAzOTUsIDI2NDksIDI2NjcsCi0gICAgICAzNTYsIDI2NjQsICAgIDAsIDI2NTMsIDI2NDQsIDI2NTgsIDI2NTEsIDI2NDUsIDI2MzgsIDI2MjYsCi0gICAgIDI2MjcsIDI2MjAsIDI2MjUsIDI2NDAsICA1OTEsICA4NTQsIDI2NDksIDI2MjgsICA4NzcsICA0MTIsCi0gICAgIDI2MjcsIDI2MjYsIDI2MjUsIDI2MjQsICA5MTcsICA0MTMsIDI2MjIsIDI2MjEsICA0NzQsICA2NjEsCi0gICAgICA5NTcsICA2NjgsICA5ODAsICA0MTQsIDI2MjAsIDI2MDYsIDI1OTgsICA2NTMsICAgIDAsICA0NDcsCi0gICAgIDI1OTcsICA2NzQsIDEwMjAsIDEwNDIsICA4MjIsICAgIDAsICAgIDAsIDI1ODYsIDI1NjcsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA1OTUsIDMzNDksICAgIDAsICAgIDAsIDMzNTUsCisgICAgIDMzMjUsIDMzMjQsICAgIDAsICAgIDAsIDMzMTMsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDMzMjgsCisgICAgIDMzMTEsIDMzMTgsICAgIDAsIDMzMTAsIDMyOTQsIDMzMTAsIDMyODMsIDMyNzksIDMyOTAsIDMyNzksCisgICAgICAgIDAsIDMyNzgsICAgIDAsIDMyNjQsICAgIDAsICAyNjEsICAgIDAsICAgIDAsIDMyNDcsIDMyNDEsCisgICAgICA3MjAsIDMyNDcsICAgIDAsICAgIDAsICAgIDAsICA4MTcsICA4NDEsICAyOTYsICA4ODIsIDMyNzQsCisgICAgIDMyNzMsICA0MDUsICA5MDUsICA5MjksICA5NTMsIDMyNDIsICA5NjAsICA2MDIsIDMyNDEsIDMyNDAsCisgICAgICA5ODMsICA3NTcsIDEwMDcsIDEwMzAsIDMyMzksICAgIDAsIDMyMzYsICA0MDgsICA0MDksIDEwNTQsCisgICAgIDMyMzUsIDEwNzgsICAyOTcsIDMyMjQsIDMyMTAsIDMxNzksICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgIDMxNzMsICAgIDAsIDMxODMsIDMxODIsIDMxNTAsIDMxNDgsICAgIDAsIDMxNjUsIDMxNjAsICAgIDAsCisgICAgICAgIDAsIDEwOTcsICAgIDAsIDMxNDgsIDMxMjYsIDMxNDAsICAgIDAsIDMxMzEsICAgIDAsIDMxMzUsCiAKLSAgICAgMjU2MCwgMjU2NiwgMjU3OSwgMjU2NCwgMjU2NywgMjU2NiwgIDQ2OSwgMjU1MiwgIDQ3NSwgMjU1MiwKLSAgICAgMjU2MCwgMjU0NywgMjU1NywgICAgMCwgMjU0NywgMjUzNiwgMjUyNywgMjUzMiwgMjUzMSwgMjUxOSwKLSAgICAgMjUxOCwgICAgMCwgICAgMCwgMjUyMiwgICAgMCwgMjUwNCwgMjQ5NiwgMjUwOSwgMjUwMywgMjQ5NywKLSAgICAgMjQ5MSwgMjQ4OSwgMjQ3MiwgMjQ3NywgMjQ3NiwgMTA2NCwgIDQ5OSwgMjQ5OCwgMjQ4OSwgMTEwMywKLSAgICAgMjQ4OCwgMTEyNSwgMjQ4NywgMjQ3MywgMjQ3MiwgMTE0NywgIDgyOCwgMTE3MCwgMTE5MiwgIDkwMCwKLSAgICAgICAgMCwgIDkwNiwgICAgMCwgIDQ0OCwgMjQ3MSwgIDkzOSwgMTIxNSwgMTIzNywgIDk0NiwgICAgMCwKLSAgICAgIDU5OCwgMTAwMywgMjQ3NywgMTAxMCwgIDU5OSwgMTA3OCwgMTI2MCwgMTA4NSwgMTI4MywgIDUzMSwKLSAgICAgMjQ2NiwgMjQ3MiwgMjQyMywgMjQyOCwgICAgMCwgICAgMCwgMjQzMSwgMjQzMywgMjQxOSwgMjQxOCwKLSAgICAgMjQzMCwgMjQxMywgMjM5OCwgMjQwNSwgMjM5NiwgMjM5NiwgMjM5MiwgMjM4OSwgICAgMCwgMjM4MCwKLSAgICAgMjM3MywgICAgMCwgICAgMCwgICAgMCwgMjM4NSwgMjM1MCwgMjM1NSwgMjM0MiwgICAgMCwgICAgMCwKKyAgICAgMzExMiwgICAgMCwgICAgMCwgMzEyMSwgMzEwMSwgIDM2NiwgMzA4OSwgMzEwNCwgIDM3MSwgMzEwMSwKKyAgICAgICAgMCwgMzA5MCwgMzA2MCwgMzA2MywgMzA1MywgMzA0OCwgMzA1OSwgMzA1MiwgMzAzOCwgMzAzOSwKKyAgICAgMzAzMiwgMzAzOCwgMzA1MywgMTEzNCwgMzA2MiwgMTE1NywgMTE4MSwgMzA1OSwgMTE4OCwgIDg2NCwKKyAgICAgIDE2NSwgMTIxMiwgIDMxNCwgMTI1MiwgMTI3NSwgMTI5OSwgMzA0NywgMzAzNiwgMTMwNywgIDMxNSwKKyAgICAgMzAxNCwgMzAxMywgMzAxMiwgMzAxMCwgMTM0OCwgIDMxNywgMzAwOCwgMzAwNywgIDQ5NiwgIDYxMiwKKyAgICAgMTM4OSwgMzAwNiwgMTQxMywgIDMyMSwgMjk4MSwgMjk4OCwgMjk3OSwgIDg3MSwgICAgMCwgIDM1MiwKKyAgICAgMjk3OCwgMTEwMSwgMTQ1NCwgMTQ3NywgMjk3NiwgICAgMCwgICAgMCwgMjk0OCwgMjk2NCwgMjkzMCwKKyAgICAgICAgMCwgMjkzOSwgMjkyMywgMjkyOCwgMjk0MCwgMjkyNSwgMjk0MCwgMjkzOSwgIDM2OSwgMjkxMSwKKyAgICAgIDQwOCwgMjkxMSwgMjkxNiwgMjkwNCwgMjkxNCwgICAgMCwgMjkwNCwgMjkwMSwgMjg5MiwgMjg5NiwKKyAgICAgMjg5MiwgMjg4MSwgMjg0OCwgICAgMCwgICAgMCwgMjg1MiwgICAgMCwgMjg0NywgMjgzOCwgMjg1MCwKIAotICAgICAyMzQzLCAgICAwLCAgICAwLCAgICAwLCAyMzMyLCAxMzIyLCAyMzQzLCAyMzQyLCAxMzQ1LCAgNTMyLAotICAgICAyMzQxLCAxMzg1LCAgNTMzLCAyMzQwLCAyMzM3LCAyMzM1LCAyMzI1LCAxNDI1LCAgNTYxLCAyMzI0LAotICAgICAgNjgxLCAxMDkyLCAxNDY1LCAxMzA2LCAxNDg4LCAgNTk3LCAyMzAzLCAyMzA5LCAgNjgyLCAxMzEzLAotICAgICAyMzA4LCAxMzY4LCAgNjgzLCAxMzc1LCAxNTI4LCAxNDA4LCAxNTUxLCAgNjAxLCAyMjk5LCAyMzAzLAotICAgICAxMDcwLCAgICAwLCAxNDE0LCAgICAwLCAgNTQwLCAyMjk1LCAxNDQ3LCAxNTkxLCAxNjEzLCAxNDU0LAotICAgICAgICAwLCAyMjUyLCAyMjUyLCAyMjU0LCAyMjUxLCAyMjU1LCAyMjYzLCAyMjU0LCAyMjM0LCAyMjE0LAotICAgICAyMjA3LCAyMjI4LCAyMjIyLCAgICAwLCAgICAwLCAyMjIwLCAyMjA1LCAgICAwLCAyMjAzLCAyMTk4LAotICAgICAyMTg1LCAgICAwLCAgICAwLCAgICAwLCAyMjEzLCAxNjM1LCAxNjU4LCAxNjgwLCAxNTExLCAxNzAzLAotICAgICAxNzI1LCAxNTE4LCAyMjExLCAyMjEwLCAxNzQ3LCAxNTczLCAxNzcwLCAxNzkyLCAxNTgwLCAgICAwLAotICAgICAxODE0LCAgICAwLCAgNjMyLCAyMjA5LCAxODIwLCAxODI3LCAxODQ5LCAxODcyLCAgICAwLCAxODc4LAorICAgICAyODQ5LCAyODQzLCAyODI0LCAyODE4LCAyODE2LCAyODIxLCAyODI2LCAyODI0LCAxNTAyLCAxNTI2LAorICAgICAgNDA0LCAxNTY3LCAyODQ3LCAyODQ2LCAgNjE0LCAxNTkxLCAxNjE1LCAxNjIyLCAxNjQ2LCAyODIyLAorICAgICAxNjUzLCAxNjc3LCAxNzAwLCAyODIxLCAyODIwLCAyODE5LCAxNzIzLCAxMTA4LCAxNzQ3LCAxNzcwLAorICAgICAyODE4LCAgICAwLCAxMjM1LCAgICAwLCAgNDQyLCAyODE2LCAxMjQyLCAxNzk0LCAxODE3LCAyODE1LAorICAgICAgICAwLCAgNzM5LCAgNzY2LCAyODIyLCAgNDY2LCAgNzg2LCAgODE3LCAxODQxLCAyNzk5LCAxODY1LAorICAgICAgNDMzLCAyNzk4LCAyODA1LCAgNTEwLCAyNzY5LCAyNzc0LCAyNzcwLCAgICAwLCAgICAwLCAyNzc1LAorICAgICAyNzc3LCAyNzQ4LCAyNzQ4LCAyNzYwLCAyNzQzLCAyNzQyLCAyNzQ4LCAyNzQwLCAyNzQxLCAyNzM4LAorICAgICAyNzM3LCAgICAwLCAyNzI4LCAyNzIyLCAgICAwLCAgICAwLCAgICAwLCAyNzM1LCAyNzMwLCAyNzM1LAorICAgICAyNzIyLCAgICAwLCAgICAwLCAgICAwLCAyNzExLCAgICAwLCAgICAwLCAgICAwLCAyNzAwLCAxOTA1LAorICAgICAyNzM1LCAxOTI4LCAxOTUyLCAyNzMzLCAxOTU5LCAgMzU4LCAxOTgzLCAyMDA3LCAyMDE0LCAyMDM4LAogCi0gICAgICAgIDAsIDE4ODQsICAgIDAsICA2OTMsIDIxNzcsIDE4OTAsIDE4OTcsIDE5MTksIDE5NDIsICAgIDAsCi0gICAgICA2ODUsIDE5NDgsIDIxODMsICA4NDgsIDE5NTUsIDIxNzgsIDE5NjIsICA4NTAsIDE5NjksIDE5NzYsCi0gICAgIDE5OTksIDIwMDYsICA3MDQsIDIxNzAsIDIxNzYsICAyOTcsICA3MDAsICA2ODUsICA5NTUsICA5NTYsCi0gICAgIDIwMTUsIDEwMTgsICA3NDUsICAzMTgsICA3NDYsIDIwMTYsICA2MTcsICA3NjksICA0MzMsICA2ODYsCi0gICAgIDExMDMsIDIwMTksIDIxMzcsIDIxMzYsIDIwNDgsICA3MjgsIDIxMzUsIDIwODgsICA3NTAsIDIxMzAsCi0gICAgIDIxMjgsICA3OTYsIDIxMjksIDIwOTcsIDIwOTMsIDIwOTEsIDIxNjgsICA3OTgsIDIwOTAsICA5MTQsCi0gICAgIDIwMzYsIDIyMDgsIDIwNzEsIDIyMzEsICA4MDEsIDIwODksIDIwNjQsIDEwOTksIDIwNzgsIDIwNjMsCi0gICAgIDIxMTEsIDExMDAsIDIxMTgsIDIyNzEsIDIxNTEsIDIyOTQsICA4MDIsIDIwNTUsIDIwNTgsICA4MjMsCi0gICAgIDIxNTcsIDIwMjIsIDEzMjEsIDIxOTEsIDIwMjAsIDIxOTgsIDEzODIsIDIyNTQsIDIzMzQsIDIyNjEsCi0gICAgIDIzNTcsICA4MjksIDE5ODUsIDE5OTEsICAgIDAsIDIzMTYsICAgIDAsIDIzMjIsICAgIDAsICA3MzksCisgICAgIDI3MjQsIDI3MjIsIDIwNDYsICA0NTcsIDI3MjEsIDIwODcsICA0OTMsIDI3MjAsIDI3MDUsIDI3MDQsCisgICAgIDI3MDMsIDIxMjgsICA0OTQsIDI3MDIsICA4NzksICA4OTksIDIxNjksIDI3MDEsIDIxOTMsICA1MjMsCisgICAgIDI2OTksIDI3MDYsIDExMjgsIDExMzAsIDI3MDUsIDI2ODksIDEyNTEsIDEzMTcsIDIyMzQsIDI2ODAsCisgICAgIDIyNTgsICA1MjQsIDI2NzksIDI2ODYsIDEzMzEsICAgIDAsIDEzMzgsICAgIDAsICA0NjcsIDI2NzcsCisgICAgIDEzNzEsIDIyOTksIDIzMjIsIDI2NzQsICAgIDAsIDIzNDUsICAzNTQsICAzOTAsICA1MzQsICA1MzUsCisgICAgICA2MjIsICAyNzYsICA1OTEsIDI2NDUsICAyNDEsICA1NTEsICA0MzMsIDExMjksIDI2MzAsIDI2MjksCisgICAgIDEyNDcsIDI2MjgsIDI2MjcsIDEzNDMsICA4NTQsICA1MDMsIDI2MjYsIDI2MjQsIDIzODMsIDI0MjAsCisgICAgIDI0NTYsIDI0OTIsICA1NTMsIDI1MTYsICA2NTAsIDI1MjQsIDI1NDgsIDI2NTEsIDI1NTUsIDI1NzksCisgICAgIDI2MDIsIDI2NTAsIDI2MjYsIDI2NDksIDI2MzQsIDI2MzMsIDI2MzIsIDI2NzIsIDEzNzksIDI2OTYsCisgICAgIDI3MTksIDI2MzEsICAgIDAsIDE0MzYsICAgIDAsICA2ODAsIDI2MjksIDE0NDMsIDI3NDMsIDI3NjYsCiAKLSAgICAgMTk4MywgMjM3OSwgMjM5NywgMjQxOSwgMjM4NiwgICAgMCwgIDc3MCwgIDc5MiwgIDg0OCwgIDk3NCwKLSAgICAgMTAxOSwgMTAzMywgMTEwMiwgMTE0MSwgMTE2MiwgMTU4OSwgMTExOCwgMTQ2MiwgIDc5MSwgMTk4MiwKLSAgICAgMjQ0MSwgMjQ2NCwgMjQ4NiwgMjUwOSwgMjUxNiwgMjUzOCwgMjU2MSwgMjU2OCwgMjU5MCwgMjYxMywKLSAgICAgMTk4MSwgMTk3OSwgMjYxOSwgMjY0MSwgMjY0OCwgMjY3MCwgMjY5MywgICAgMCwgMjY5OSwgICAgMCwKLSAgICAgIDc0MCwgMTk3OCwgMjcwNSwgMjcxMiwgMjczNCwgMjc1NywgICAgMCwgMjc2MywgICAgMCwgMjc2OSwKLSAgICAgICAgMCwgIDg4NSwgMTk3NywgMjc3NSwgMjc4MiwgMjgwNCwgMjgyNywgICAgMCwgICAgMCwgMjgzMywKLSAgICAgICAgMCwgMjgzOSwgICAgMCwgIDg4NiwgMTkyNywgMjg0NSwgMjg1MiwgMjg3NCwgMjg5NywgICAgMCwKLSAgICAgICAgMCwgIDgzMSwgMjkwMywgMTkzMSwgMTU4NywgMjkxMCwgMTkyOSwgMjkxNywgMTYyOSwgMjkyNCwKLSAgICAgMjkzMSwgMjk1NCwgMjk2MSwgIDk1MywgMTkwNiwgMTkwOSwgMTU5MCwgMjM5NSwgMjM5NiwgMTMyMSwKLSAgICAgMTE4NSwgMTQ2NCwgMTUyNywgMTE2NCwgMTQ2MywgMTExNywgIDkxNiwgMTg1NSwgMTg1MiwgMzAwMSwKKyAgICAgMjYyNywgICAgMCwgMTU0OSwgICAgMCwgMTU1NiwgICAgMCwgIDY4MSwgMjYxMSwgMTg4OCwgMjc5MCwKKyAgICAgMjgxMywgMjYxMCwgICAgMCwgIDU1NSwgMTg5NSwgMjYxNywgMTQ1MSwgMTQ3MSwgMjYxNiwgMjYxNSwKKyAgICAgMTUwMiwgMTU2NCwgMjgzNywgMjYwNSwgMjg2MSwgIDYxNSwgMjYwNCwgMjYxMSwgIDYxNywgIDY4OCwKKyAgICAgIDYzNCwgIDc2OCwgMTI1MSwgMTM4OCwgMjA1NiwgMTQ1MywgIDgwOCwgIDgzNCwgIDg5OCwgMjA4MywKKyAgICAgIDc2NiwgIDkyMywgIDgxMCwgIDgzMywgMjA4MSwgMjA4NSwgMjkwMywgIDgzNSwgMjkyNiwgIDkyMSwKKyAgICAgMjk0OSwgMjExNCwgMjk3MywgMjk5NywgMjU4NywgMjU4NiwgMzAwNSwgIDY0MiwgMjU4NSwgMzA0NiwKKyAgICAgIDY0MywgMjU4NCwgMzA4NywgIDY3MSwgMjU4MiwgMjU4MSwgMjU4MCwgMjU2NCwgMzEyOCwgIDc0MiwKKyAgICAgMjU2MywgMTY5NCwgMTkwNCwgMzE2OSwgMjU2MiwgMzE5MywgIDkwMiwgMjU2MSwgMjU2OCwgMjA1NiwKKyAgICAgMjA1NywgMjU2NiwgMjU2NSwgMjA2MywgMjEyMywgMzIzNCwgMjU1NiwgMzI1OCwgIDkzMCwgMjU1NSwKKyAgICAgMjU0MSwgIDkzMSwgMjE1MSwgMjU0MCwgMjEyNCwgMjEyNSwgMjUzOSwgMjUzOCwgMjE0NSwgMjE2NiwKIAotICAgICAgOTU3LCAxODMzLCAzMDQxLCAxMDE2LCAxNzk3LCAzMDgxLCAxMDE3LCAxNzc2LCAzMTIxLCAxMTQzLAotICAgICAxNzc1LCAxNzUyLCAxNzMzLCAzMTYwLCAzMTgzLCAxMTQ3LCAxNzMwLCAxNjc0LCAyOTg0LCAzMjIzLAotICAgICAyOTkxLCAzMjQ2LCAxMTY2LCAxNjg5LCAxNjcxLCAyMDIxLCAzMDI0LCAxNjUxLCAzMDMxLCAyMTI1LAotICAgICAzMDY0LCAzMjg2LCAzMDcxLCAzMzA5LCAxMTg5LCAxNjM2LCAxNjIzLCAxMjEwLCAzMTAzLCAxNjA3LAotICAgICAyMzMwLCAzMTEwLCAxNjA0LCAzMTQ0LCAyMzkzLCAzMTUxLCAzMzQ5LCAzMjA2LCAzMzcyLCAxMjExLAotICAgICAxNTk2LCAxNTY1LCAgICAwLCAxMjEyLCAzMjEyLCAxNTYwLCAyNDM1LCAzMjY5LCAxNTQ0LCAzMjc2LAotICAgICAzMDc4LCAzMzMyLCAzNDEyLCAzMzM5LCAzNDM1LCAxMjE0LCAxNTMxLCAxNTM2LCAgICAwLCAzMzk0LAotICAgICAgICAwLCAzNDAwLCAgICAwLCAgOTI2LCAxNDk3LCAzNDU3LCAzNDc1LCAzNDk3LCAzNDY0LCAgICAwLAotICAgICAyMDMwLCAzNTA1LCAzNTA2LCAxMjMwLCAzNDkwLCAxNTI2LCAxMjUzLCAzNTA4LCAxNjk2LCAxMjc1LAotICAgICAxMjc2LCAxMjMxLCAxNDk1LCAzNTM4LCAzNTYxLCAzNTgzLCAzNTI1LCAzNjA2LCAzNjI4LCAzNjUxLAorICAgICAzMjk5LCAyNTI5LCAzMzIzLCAgOTU0LCAyNTI3LCAyNTM0LCAgICAwLCAyMjE2LCAgICAwLCAyMjIzLAorICAgICAgICAwLCAgNzM3LCAyNTI1LCAyMjgxLCAzMzY0LCAzMzg3LCAyNTI0LCAgICAwLCAgODk3LCAgOTc1LAorICAgICAgOTc2LCAxMDAwLCAxOTA0LCAxMDAxLCAxNTY2LCAxMDIyLCAxMDQ2LCAyMjc2LCAxMDQ3LCAyMTA1LAorICAgICAxMDQ4LCAzNDEyLCAzNDM1LCAzNDU5LCAxMDI5LCAzNDk5LCAzNTIzLCAzNTQ3LCAyNTAxLCAzNTU0LAorICAgICAzNTc4LCAzNjAxLCAyNTAwLCAzNjI1LCAzNjQ4LCAyNDk5LCAzNjcyLCAzNjk1LCAyNDk4LCAyNDk3LAorICAgICAyNDk1LCAzNzE4LCAyMzY4LCAzNzQyLCAzNzY1LCAyNDk0LCAgICAwLCAyNDA2LCAgICAwLCAgOTY5LAorICAgICAyNDkzLCAyNDQzLCAzNzg5LCAzODEyLCAyNDkyLCAgICAwLCAyNDYzLCAgICAwLCAyNDcwLCAgICAwLAorICAgICAxMDE2LCAyNDQ1LCAyNDc3LCAzODM2LCAzODU5LCAyNDQzLCAgICAwLCAgICAwLCAyNDg0LCAgICAwLAorICAgICAyODg0LCAgICAwLCAxMDg3LCAyNDI5LCAyODkxLCAzODgzLCAzOTA2LCAyNDI4LCAgICAwLCAgICAwLAorICAgICAxMDc3LCAzMDI4LCAyNDM0LCAyMjMxLCAyMjk1LCAyNDMxLCAyMzk3LCAyMjk2LCAyMzE2LCAzOTMwLAogCi0gICAgIDM2NTgsIDM2ODAsIDM3MDMsIDM3MTAsIDM3MzIsIDM3NTUsIDE0NjgsIDM3NjIsIDEyNTksIDE0NjYsCi0gICAgIDE0MzAsIDM3ODQsIDM4MDIsIDE0MjgsIDM3OTEsICAgIDAsIDM4MjQsICAgIDAsIDEyMDAsIDE0MjcsCi0gICAgIDM4MzAsIDM4MzcsIDE0MjYsIDM4NjAsICAgIDAsIDM4NjYsICAgIDAsIDM4NzIsICAgIDAsIDEzMjksCi0gICAgIDEzOTIsIDM4NzgsIDM4ODUsIDEzOTAsIDM5MDgsICAgIDAsICAgIDAsIDM5MTQsICAgIDAsIDM5MjAsCi0gICAgICAgIDAsIDEzMzEsIDEzNTIsIDM5MjYsIDM5MzMsIDEzNDgsIDM5NTYsICAgIDAsICAgIDAsIDM5NjIsCi0gICAgICAgIDAsIDM5NjgsICAgIDAsIDEzOTMsIDEzNDYsIDM5NzQsIDM5ODEsIDEzMjUsIDQwMDQsICAgIDAsCi0gICAgICAgIDAsIDEzMjIsIDQwMTAsIDEzMzAsIDMxNTksIDQwMTcsIDEyOTksIDQwMjQsIDMyMTksIDQwMzEsCi0gICAgIDQwMzgsIDQwNjEsIDQwNjgsIDEzNDQsIDEyNjMsIDEyNjgsIDE2NTAsIDE2OTUsIDE3MTcsIDE0MjMsCi0gICAgIDEyNzcsIDE2NTEsIDQwNzcsIDE3MTgsIDE0MjQsIDM1MzgsIDEyMzgsIDQxMDcsIDQxMzAsIDE0NjEsCi0gICAgIDEyMjQsIDQxNzAsIDE0NjQsIDEyMDEsIDQyMTAsIDE1MjQsIDExOTksIDQyNTAsIDE1MjcsIDExNTIsCisgICAgIDIzNzUsIDM5NTQsIDEwODAsIDIzNDcsIDIzNTQsIDIzNTksIDIzNjAsIDIzNjEsIDIxMjcsIDExMjgsCisgICAgIDIyMzMsIDIyOTgsIDEwNzEsIDIzNjIsIDEyMDMsIDEwNzIsIDExMjYsIDExNTAsIDM5OTYsIDQwMjAsCisgICAgIDQwMjksIDEyMDQsIDIzNDUsIDIzMzEsIDQwNDcsIDExMDcsIDIzMzAsIDQwODgsIDExMTAsIDIzMjksCisgICAgIDQxMjksIDExNTcsIDIzMjUsIDQxNzAsIDExNTgsIDIzMjQsIDIzMDYsIDIzMDUsIDQyMTAsIDQyMzQsCisgICAgIDExNTksIDIyODYsIDI0MTQsIDI0MTUsIDQyNzUsIDIyODMsIDQyOTksIDExODIsIDIyODIsIDIyODksCisgICAgIDI1OTYsIDI2NDMsIDIyNzMsIDIyNjksIDI4OTksIDI5MDAsIDQzNDAsIDIyNTksIDQzNjQsIDExODcsCisgICAgIDIyNDEsIDIyNDgsIDEyNDYsIDMwMzUsIDIyNDcsIDI5MDMsIDMwNDMsIDIyNDQsIDIyNDMsIDMwNTYsCisgICAgIDMwNjIsIDQ0MDUsIDIyMDIsIDQ0MjksIDEyNDgsIDIyMDEsIDIyMDgsICAgIDAsIDEyNDksIDMxMTAsCisgICAgIDIyMDQsIDMwNjMsIDMwODQsIDIyMDMsIDIxODMsIDMxMDQsIDMxMjMsIDQ0NzAsIDIxNzQsIDQ0OTQsCisgICAgIDEyNTIsIDIxNzEsIDIxNjcsICAgIDAsIDMxNTEsICAgIDAsIDMyMTYsICAgIDAsIDExNjYsIDIxNTQsCiAKLSAgICAgNDI5MCwgMTUyOCwgMTE0OCwgMTEwOCwgNDA5MywgNDMzMCwgMTEwNCwgNDE1MywgICAgMCwgMTEwMywKLSAgICAgMzQwOCwgNDE2MCwgNDM1MywgNDE5MywgMTA1MSwgMTA1NywgMzQ3MSwgNDIwMCwgMTA1MiwgNDIzMywKLSAgICAgMzQ3MiwgNDI0MCwgNDM3NiwgNDI3MywgMTAyOSwgMTAzMywgMTU4NiwgNDI3OSwgMTAyOCwgMzUzNCwKLSAgICAgNDMxMywgIDk5NCwgNDMyMCwgMzUzNSwgNDM5OSwgNDQwNiwgNDQyOSwgIDk2MiwgIDk2NywgICAgMCwKLSAgICAgMTU4OCwgNDQzNSwgIDk2NSwgMzU3NywgNDQ0MiwgIDkzMSwgNDQ0OSwgNDA3OCwgNDQ1NiwgNDQ2MywKLSAgICAgNDQ4NiwgIDkyMiwgIDkyNSwgICAgMCwgMTYwOSwgNDQ5MiwgIDkxMywgNDEwMywgNDQ5OSwgIDg5MSwKLSAgICAgNDUwNiwgNDEwNiwgNDUxMywgNDUyMCwgNDU0MywgIDg2MCwgIDg2NiwgICAgMCwgNDU0OSwgICAgMCwKLSAgICAgNDU1NSwgICAgMCwgMTM5NCwgIDgzOCwgNDU2MSwgNDU2OCwgICAgMCwgNDU5MSwgICAgMCwgMTYyOSwKLSAgICAgMTY3MywgMTczOSwgMTc2MiwgMTc2MywgMjQ3NywgNDU4MiwgNDU4MywgNDYxMiwgMTYzMSwgICAgMCwKLSAgICAgIDc4NSwgNDY1MiwgICAgMCwgNDYwMCwgNDY3NSwgICAgMCwgNDYzNSwgNDY5OCwgICAgMCwgNDY0MiwKKyAgICAgMzIyMywgNDUzNSwgNDU1OCwgMjEzNSwgICAgMCwgMzI2OCwgMzI2OSwgMzMzMywgMTIwNiwgMjM5OSwKKyAgICAgMjM2MywgMTQwNywgMzI1MiwgMjI3NSwgMTQ2OSwgMTQ5MywgMTM0NywgNDU4MywgNDYwNywgNDYxNiwKKyAgICAgMjEwNSwgNDYzMywgNDY1NywgNDY4MCwgMjA3NSwgNDcwNCwgNDcyNywgMjA3MywgNDc1MSwgNDc3NCwKKyAgICAgMjA3MCwgNDc5OCwgNDgyMSwgMjA2OCwgMjA2NywgNDg0NSwgMTI3NiwgMjA2NiwgMjA2NCwgMzI4NiwKKyAgICAgNDg4NiwgMjA1NCwgMjA1MSwgICAgMCwgMzM1MCwgICAgMCwgMTUzNSwgMjAyMywgMzQ4MiwgNDkxMCwKKyAgICAgMjAyMSwgMjAyMCwgICAgMCwgMzQ4OSwgICAgMCwgMzk3NywgICAgMCwgMTU3NiwgMjAxOSwgMzk4NCwKKyAgICAgNDkzNCwgMjAxNywgMjAxNiwgICAgMCwgICAgMCwgNDAzNiwgICAgMCwgNDA3MCwgICAgMCwgMTU5OSwKKyAgICAgMjAxNSwgNDA3NywgNDk1OCwgMTk5MSwgMTk4OSwgICAgMCwgICAgMCwgNDExMSwgICAgMCwgNDExOCwKKyAgICAgICAgMCwgMTYzMCwgMTk4NiwgNDE1MiwgNDk4MiwgMTk4NSwgMTkxMSwgICAgMCwgICAgMCwgMTM4NiwKKyAgICAgNDE1OSwgMTg3NiwgMzEyNSwgMzE0NSwgMTg1NywgMTgzMiwgMzE2NCwgMzE2NiwgNTAwNiwgMTgxOSwKIAotICAgICA0NzIxLCAgICAwLCA0NzQ0LCA0NzUxLCAgICAwLCA0Nzc0LCA0MjQ3LCA0NzgxLCA0Nzg4LCA0ODExLAotICAgICAgNzc3LCAgNjI0LCAgNjE4LCAgNjEwLCA0ODE3LCAgICAwLCAxNzU2LCAgNjA4LCAgNTcxLCA0ODIzLAotICAgICAgICAwLCA0ODI5LCAgICAwLCAxODAwLCAgNTcwLCAgNTY5LCAgICAwLCA0ODM1LCAgICAwLCA0ODQxLAotICAgICAgICAwLCAxODAxLCAgNTM2LCAgNTM0LCAgICAwLCA0ODQ3LCAgICAwLCA0ODUzLCAgICAwLCAxODM1LAotICAgICAgNTMyLCAgNTIzLCAgICAwLCA0ODU5LCAgICAwLCA0ODY1LCAgICAwLCAxODM2LCAgNTIyLCAgNTA0LAotICAgICAgICAwLCAxNjM0LCA0ODcxLCAgNTEwLCA0MzI3LCA0ODc4LCAgNDc2LCA0ODg1LCA0NjQ5LCA0ODkyLAotICAgICA0ODk5LCA0OTIyLCAgICAwLCAgNDcxLCAyMjA2LCAxNzg2LCAxODQyLCAyMDg2LCA0OTI5LCAgNDYzLAotICAgICA0OTUyLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCA0OTU4LCAgICAwLCAxODU3LAotICAgICAgNDI2LCAgNDI0LCAgICAwLCA0OTY1LCA0OTY2LCAgNDMwLCA0OTc5LCAgICAwLCAxNjc5LCA0OTg1LAotICAgICAgMzg2LCA0OTkyLCA0OTkzLCAgMzc0LCA1MDA2LCAgICAwLCAgICAwLCAxNjgwLCA1MDEyLCAgMzcxLAorICAgICA1MDMwLCAxMzg5LCAxODAzLCAxODA3LCAxNDk1LCAxNjY5LCAxNjcwLCAxNTIwLCAxNjcxLCAxNzQxLAorICAgICA0MTY4LCAxNjkyLCAxNzE2LCAyNDAxLCA1MDcyLCAxNzc2LCA1MDg5LCA1MTEzLCAxMzkwLCAxNzc1LAorICAgICA1MTU0LCAxNDUzLCAxNzUzLCA1MTk1LCAxNTYxLCAxNzUyLCA1MjM2LCAxNTY2LCAxNzMwLCA1Mjc3LAorICAgICAxNTY4LCAxNzI5LCAxNzI4LCA0MTk2LCA1MzE4LCAxNzI0LCAxNzA5LCAgICAwLCAxNzA4LCAzMjMxLAorICAgICAzMjk0LCA1MzQyLCAxNzA1LCAxNjMxLCAxNjMzLCAzMzMzLCAzMzYwLCAxNjMyLCAxNjAyLCAzMzgxLAorICAgICAzNDEyLCA1MzY2LCAxNTczLCAxNTY5LCAxNTQxLCAxNTkxLCA0MjU3LCAxNTM0LCAzNDk4LCAzNTk1LAorICAgICAxNTE4LCAxNTE3LCAzNjQyLCAzNjg5LCA1MzkwLCAxNTA1LCAxNDgwLCAxNDY5LCAgICAwLCAxNjIxLAorICAgICA0MjY0LCAxNDY0LCA0MTgwLCA0MTgxLCAxNDYzLCAxNDIzLCA0MjA1LCA0MjA5LCA1NDE0LCAxMzk0LAorICAgICAxMzkxLCAxMzk4LCAgICAwLCAxNjIyLCA0MzIyLCAxMzYzLCA0MjcyLCA0MzE2LCAxMzYxLCAxMzU5LAorICAgICA0MzM1LCA0MzM3LCA1NDM4LCAxMzUwLCAxMzE2LCAxMzIzLCAgICAwLCA0Mzg3LCAgICAwLCA0Mzk0LAogCi0gICAgIDUwMTksIDUwMjAsICAzNzAsIDUwMzMsICAgIDAsICAgIDAsIDE3MDIsIDUwMzksICAzNjgsIDUwNDYsCi0gICAgIDUwNDcsICAzMjksIDUwNjAsICAgIDAsICAgIDAsIDE3NDcsIDUwNjYsICAzMTgsIDUwNzMsIDUwNzQsCi0gICAgICAyNzQsIDUwODcsICAgIDAsICAgIDAsIDUwOTMsICAgIDAsIDUwOTksICAgIDAsIDE5MDUsICAyMjksCi0gICAgICAgIDAsIDIyNjksIDI1MjksIDE5MTEsIDE5MTIsICAgIDAsIDY1NzAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsIDUxMDYsIDUxMjAsICAyMzUsIDUxMjcsICAgIDAsIDY1NzAsIDUxMTIsCi0gICAgICAgIDAsIDY1NzAsICAgIDAsIDUxMzMsICAgIDAsIDY1NzAsICAgIDAsIDUxNDUsICAgIDAsIDY1NzAsCi0gICAgICAgIDAsIDUxNTEsICAgIDAsIDY1NzAsICAgIDAsIDUxNTcsICAgIDAsIDY1NzAsICAgIDAsIDE3NjcsCi0gICAgIDUxNjMsICAyMDEsIDUxNzAsIDUxNzEsICAxOTksIDUxODQsICAgIDAsIDIwMTcsIDIzMzAsIDIwODcsCi0gICAgICAgIDAsIDUxOTAsICAgIDAsIDE4MjQsIDUxOTYsICAxOTgsICAgIDAsIDE4MjYsIDUyMDIsICAxNzksCi0gICAgICAgIDAsIDE4OTMsIDUyMDksICAxMzMsICAgIDAsIDE4OTQsIDUyMTUsICAxMzIsICAgIDAsIDIwMTcsCisgICAgICAgIDAsIDE3NTYsIDEzMTQsIDQ0NTIsIDU0NjIsICAgIDAsIDEzMTIsICAgIDAsIDE3NDAsIDE3NjMsCisgICAgIDE3NjQsIDE3ODYsIDE3ODcsIDE5NzQsIDQ0ODgsIDQ1MDQsIDU0ODYsIDE2MjMsICAgIDAsIDEzMTAsCisgICAgIDU1MjcsICAgIDAsIDEyNzYsIDU1NTEsICAgIDAsIDEyNTksIDU1NzUsICAgIDAsIDEyNTMsIDU1OTksCisgICAgICAgIDAsIDEyMjEsIDU2MjMsICAgIDAsIDEyMTcsIDQ0MDIsIDQ0NDYsIDU2NDcsIDExOTYsIDExMTQsCisgICAgIDExMDgsICAgODgsICAxMzgsIDQ0NjAsICAgIDAsIDE4MjYsICAyMTQsICAyMjksIDQ1MjEsICAgIDAsCisgICAgIDQ2MjMsICAgIDAsIDE4NTAsICAzMjIsICAzNDUsICAgIDAsIDQ4NjgsICAgIDAsIDQ4NzUsICAgIDAsCisgICAgIDE4NzQsICA0MTYsICA0NjAsICAgIDAsIDUwNTMsICAgIDAsIDUwNjAsICAgIDAsIDE5MTQsICA1MDEsCisgICAgICA1MDgsICAgIDAsIDUwNzksICAgIDAsIDUxMzYsICAgIDAsIDE5MzcsICA1MjQsICA1ODAsICAgIDAsCisgICAgIDE2NTAsIDUxNDMsICA1ODksIDQ1MzEsIDQ1NTIsICA2MTAsICA2MTEsIDQ2MzIsIDQ2NzQsIDU2NzEsCisgICAgICA2MDUsICAgIDAsICA2MzIsIDI0MTgsIDE3ODgsIDE4MTEsIDE4MzQsIDU2OTUsICA2MjcsICA2OTYsCiAKLSAgICAgNTIyMSwgICA5NSwgICAgMCwgNTIyNywgICAgMCwgNjU3MCwgMjE2NiwgMjEyNywgNTIzMywgICA5NCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMjE2NywgNTIzOSwgICA2NSwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgNjU3MCwgNTI1NiwKLSAgICAgNTI2NCwgNTI2OCwgNTI3MSwgNTI3NCwgNTI3NywgNTI4MCwgNTI4MywgNTI4NiwgNTI4OSwgNTI5MiwKLSAgICAgNTI5NSwgNTI5OCwgNTMwMSwgNTMwNCwgNTMwNywgNTMxMCwgNTMxNCwgNTMxOCwgNTMyMSwgNTMyNCwKLSAgICAgNTMyNywgNTMzMCwgNTMzMywgNTMzNywgNTM0MSwgNTM0NCwgNTM0OCwgNTM1MCwgNTM1MywgNTM1NiwKLSAgICAgNTM1OSwgNTM2MiwgNTM2NSwgNTM2OSwgNTM3MSwgNTM3NSwgNTM4MCwgNTM4NCwgNTM4NywgNTM5MCwKLSAgICAgNTM5MywgNTM5NiwgNTM5OSwgNTQwMiwgNTQwNSwgNTQwOSwgNTQxMywgNTQxNywgNTQyMiwgNTQyNiwKLSAgICAgNTQyOSwgNTQzMiwgNTQzNiwgNTQzOCwgNTQ0MSwgNTQ0NCwgNTQ0NywgNTQ1MCwgNTQ1MywgNTQ1NywKLSAgICAgNTQ1OSwgNTQ2MiwgNTQ2NSwgNTQ2OSwgNTQ3MSwgNTQ3NCwgNTQ3OSwgNTQ4NCwgNTQ4OCwgNTQ5MiwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgNTE3NywgICAgMCwgMTk2NywgIDY5OCwKKyAgICAgIDY5OSwgICAgMCwgNDcyMSwgNDc2OCwgIDcwOSwgIDcxMCwgICAgMCwgMTY1MiwgNTE4NCwgIDcxMywKKyAgICAgNDgxNSwgNDg4MywgIDc0MSwgIDc0NCwgICAgMCwgICAgMCwgMTY1MywgNTIxOCwgIDc3OCwgNTA4OCwKKyAgICAgNTE5MiwgIDgwMSwgIDgwMywgICAgMCwgICAgMCwgMTgxNiwgNTI1OSwgIDgwNSwgNTIxMiwgNTIzMSwKKyAgICAgIDgwOCwgIDgyOCwgICAgMCwgICAgMCwgMTgzOCwgNTMwMCwgIDg0OSwgNTIzMywgNTI1MywgIDg1NiwKKyAgICAgIDg1OCwgICAgMCwgICAgMCwgNTMwNywgICAgMCwgNTUwOSwgICAgMCwgMTk2OCwgIDg4MywgICAgMCwKKyAgICAgMzA4MywgMjk2NCwgMjE2MSwgMTkyMSwgICAgMCwgNzQwMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgNTMxNSwgNTUwMywgIDg5MiwgIDg5NSwgICAgMCwgNzQwMSwgNTUxNywgICAgMCwKKyAgICAgNzQwMSwgICAgMCwgNTcxOCwgICAgMCwgNzQwMSwgICAgMCwgNTcyNSwgICAgMCwgNzQwMSwgICAgMCwKKyAgICAgNTczMiwgICAgMCwgNzQwMSwgICAgMCwgNTczOSwgICAgMCwgNzQwMSwgICAgMCwgMTg0MCwgNTc0NiwKIAotICAgICA1NDk2LCA1NTAxLCA1NTA1LCA1NTA4LCA1NTExLCA1NTE0LCA1NTE3LCA1NTIwLCA1NTIzLCA1NTI2LAotICAgICA1NTMwLCA1NTM0LCA1NTM4LCA1NTQyLCA1NTQ3LCA1NTUxLCA1NTU1LCA1NTU5LCA1NTYyLCA1NTY3LAotICAgICA1NTcxLCA1NTc2LCA1NTgwLCA1NTg0LCA1NTg4LCA1NTkxLCA1NTk0LCA1NTk3LCA1NjAxLCA1NjAzLAotICAgICA1NjA4LCA1NjEyLCA1NjE1LCA1NjE4LCA1NjIxLCA1NjI0LCA1NjI4LCA1NjMwLCA1NjMzLCA1NjM2LAotICAgICA1NjQwLCA1NjQyLCA1NjQ1LCA1NjQ4LCA1NjUxLCA1NjU1LCA1NjU3LCA1NjYwLCA1NjYzLCA1NjY4LAotICAgICA1NjcyLCA1Njc3LCA1NjgxLCA1Njg1LCA1Njg5LCA1Njk0LCA1Njk4LCA1NzAxLCA1NzA0LCA1NzA3LAotICAgICA1NzEwLCA1NzEzLCA1NzE2LCA1NzE5LCA1NzIzLCA1NzI3LCA1NzMxLCA1NzM1LCA1NzQwLCA1NzQ0LAotICAgICA1NzQ4LCA1NzUyLCA1NzU1LCA1NzYwLCA1NzY0LCA1NzY5LCA1NzczLCA1Nzc3LCA1NzgxLCA1Nzg0LAotICAgICA1Nzg3LCA1NzkyLCA1Nzk2LCA1ODAxLCA1ODA1LCA1ODA5LCA1ODEzLCA1ODE2LCA1ODE5LCA1ODIyLAotICAgICA1ODI2LCA1ODI4LCA1ODMzLCA1ODM3LCA1ODQwLCA1ODQzLCA1ODQ2LCA1ODQ5LCA1ODUyLCA1ODU1LAorICAgICAgODk4LCA1NzU0LCA1NzU1LCAgOTM3LCAyMDIyLCAgICAwLCAxOTc1LCAzMzQxLCAyMDYyLCAgICAwLAorICAgICA1NzU1LCAgICAwLCAxODQxLCA1NzY5LCAgOTQ2LCAgICAwLCAxODk5LCA1Nzc2LCAgOTczLCAgICAwLAorICAgICAxOTAxLCA1NzgzLCAgOTc2LCAgICAwLCAxOTAyLCA1Nzk1LCAgOTk2LCAgICAwLCAxOTI5LCA1ODAyLAorICAgICAxMDIwLCAgICAwLCA1ODA5LCAgICAwLCA3NDAxLCAyMTg1LCAxOTU2LCA1ODE2LCAxMDQwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxOTU4LCA1ODIzLCAxMDQxLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCA3NDAxLCA1ODQxLCA1ODQ5LAorICAgICA1ODUzLCA1ODU2LCA1ODU5LCA1ODYyLCA1ODY1LCA1ODY4LCA1ODcxLCA1ODc0LCA1ODc3LCA1ODgwLAorICAgICA1ODgzLCA1ODg2LCA1ODg5LCA1ODkyLCA1ODk1LCA1ODk4LCA1OTAxLCA1OTA1LCA1OTA5LCA1OTEyLAorICAgICA1OTE1LCA1OTE4LCA1OTIxLCA1OTI0LCA1OTI3LCA1OTMwLCA1OTMzLCA1OTM3LCA1OTQxLCA1OTQ0LAorICAgICA1OTQ3LCA1OTUxLCA1OTUzLCA1OTU2LCA1OTU5LCA1OTYyLCA1OTY1LCA1OTY4LCA1OTcxLCA1OTc0LAogCi0gICAgIDU4NTksIDU4NjEsIDU4NjQsIDU4NjcsIDU4NzAsIDU4NzQsIDU4NzYsIDU4NzksIDU4ODIsIDU4ODUsCi0gICAgIDU4ODgsIDU4OTIsIDU4OTQsIDU4OTcsIDU5MDAsIDU5MDMsIDU5MDYsIDU5MTAsIDU5MTIsIDU5MTUsCi0gICAgIDU5MTgsIDU5MjEsIDU5MjYsIDU5MzAsIDU5MzUsIDU5MzksIDU5NDMsIDU5NDcsIDU5NTIsIDU5NTYsCi0gICAgIDU5NTksIDU5NjIsIDU5NjUsIDU5NjgsIDU5NzEsIDU5NzQsIDU5NzcsIDU5ODAsIDU5ODQsIDU5ODgsCi0gICAgIDU5OTIsIDU5OTYsIDYwMDEsIDYwMDUsIDYwMDksIDYwMTMsIDYwMTYsIDYwMjEsIDYwMjUsIDYwMzAsCi0gICAgIDYwMzQsIDYwMzgsIDYwNDIsIDYwNDUsIDYwNDgsIDYwNTMsIDYwNTcsIDYwNjIsIDYwNjYsIDYwNzAsCi0gICAgIDYwNzQsIDYwNzcsIDYwODAsIDYwODUsIDYwODksIDYwOTQsIDYwOTgsIDYxMDIsIDYxMDYsIDYxMDksCi0gICAgIDYxMTIsIDYxMTUsIDYxMTksIDYxMjEsIDYxMjQsIDYxMjksIDYxMzMsIDYxMzYsIDYxMzksIDYxNDIsCi0gICAgIDYxNDUsIDYxNDgsIDYxNTEsIDYxNTUsIDYxNTksIDYxNjIsIDYxNjYsIDYxNjksIDYxNzIsIDYxNzYsCi0gICAgIDYxNzgsIDYxODEsIDYxODQsIDYxODgsIDYxOTAsIDYxOTMsIDYxOTYsIDYxOTksIDYyMDMsIDYyMDUsCisgICAgIDU5NzcsIDU5ODEsIDU5ODMsIDU5ODYsIDU5OTAsIDU5OTUsIDU5OTksIDYwMDIsIDYwMDYsIDYwMDksCisgICAgIDYwMTIsIDYwMTUsIDYwMTgsIDYwMjEsIDYwMjQsIDYwMjcsIDYwMzEsIDYwMzUsIDYwMzgsIDYwNDIsCisgICAgIDYwNDYsIDYwNTEsIDYwNTUsIDYwNTcsIDYwNjEsIDYwNjQsIDYwNjgsIDYwNzEsIDYwNzQsIDYwNzgsCisgICAgIDYwODAsIDYwODMsIDYwODYsIDYwODksIDYwOTIsIDYwOTUsIDYwOTgsIDYxMDEsIDYxMDQsIDYxMDcsCisgICAgIDYxMTEsIDYxMTMsIDYxMTYsIDYxMTksIDYxMjIsIDYxMjYsIDYxMjgsIDYxMzEsIDYxMzQsIDYxMzksCisgICAgIDYxNDMsIDYxNDgsIDYxNTIsIDYxNTQsIDYxNTgsIDYxNjEsIDYxNjUsIDYxNzAsIDYxNzQsIDYxNzcsCisgICAgIDYxODAsIDYxODMsIDYxODYsIDYxODksIDYxOTIsIDYxOTUsIDYxOTksIDYyMDMsIDYyMDYsIDYyMTAsCisgICAgIDYyMTQsIDYyMTksIDYyMjMsIDYyMjUsIDYyMjksIDYyMzIsIDYyMzYsIDYyMzksIDYyNDQsIDYyNDgsCisgICAgIDYyNTMsIDYyNTcsIDYyNTksIDYyNjMsIDYyNjYsIDYyNzAsIDYyNzMsIDYyNzYsIDYyNzksIDYyODMsCisgICAgIDYyODUsIDYyODgsIDYyOTMsIDYyOTcsIDYzMDAsIDYzMDMsIDYzMDYsIDYzMDksIDYzMTIsIDYzMTUsCiAKLSAgICAgNjIwOCwgNjIxMSwgNjIxNCwgNjIxOCwgNjIyMCwgNjIyMywgNjIyNiwgNjIyOSwgNjIzMywgNjIzNSwKLSAgICAgNjIzOCwgNjI0MSwgNjI0NiwgNjI1MCwgNjI1NSwgNjI1OSwgNjI2MywgNjI2NywgNjI3MiwgNjI3NiwKLSAgICAgNjI3OSwgNjI4MiwgNjI4NSwgNjI4OCwgNjI5MSwgNjI5NCwgNjI5NywgNjMwMSwgNjMwMywgNjMwNiwKLSAgICAgNjMxMCwgNjMxNSwgNjMxOCwgNjMyMSwgNjMyNiwgNjMzMCwgNjMzNSwgNjMzOCwgNjM0MSwgNjM0NCwKLSAgICAgNjM0OSwgNjM1MywgNjM1OCwgNjM2MSwgNjM2NCwgNjM2NywgNjM3MiwgNjM3NiwgNjM4MSwgNjM4NCwKLSAgICAgNjM4NywgNjM5MCwgNjM5NSwgNjM5OSwgNjQwNCwgNjQwNywgNjQxMCwgNjQxMywgNjQxNiwgNjQyMCwKLSAgICAgNjQyMiwgNjQyNywgNjQzMSwgNjQzNCwgNjQzNywgNjQ0MCwgNjQ0MywgNjQ0NiwgNjQ0OSwgNjQ1MywKLSAgICAgNjQ1OCwgNjQ2MSwgNjQ2NCwgNjQ2NywgNjQ3MCwgNjQ3MywgNjQ3NiwgNjQ3OSwgNjQ4MiwgNjQ4NSwKLSAgICAgNjQ4OCwgNjQ5MSwgNjQ5NiwgNjUwMCwgNjUwMywgNjUwNiwgNjUwOSwgNjUxMywgNjUxNywgNjUyMSwKLSAgICAgNjUyNSwgNjUyOSwgNjUzMiwgNjUzNSwgNjUzOSwgNjU0MiwgNjU0NSwgNjU0OCwgNjU1MSwgNjU1NCwKKyAgICAgNjMxOCwgNjMyMSwgNjMyNSwgNjMyNywgNjMzMCwgNjMzMywgNjMzNiwgNjM0MCwgNjM0MiwgNjM0NSwKKyAgICAgNjM0OCwgNjM1MSwgNjM1NCwgNjM1OCwgNjM2MCwgNjM2MywgNjM2NiwgNjM2OSwgNjM3NCwgNjM3OCwKKyAgICAgNjM4MywgNjM4NywgNjM4OSwgNjM5MywgNjM5NiwgNjQwMCwgNjQwNSwgNjQwOSwgNjQxMiwgNjQxNSwKKyAgICAgNjQxOCwgNjQyMSwgNjQyNCwgNjQyNywgNjQzMCwgNjQzNCwgNjQzOCwgNjQ0MSwgNjQ0NSwgNjQ0OSwKKyAgICAgNjQ1NCwgNjQ1OCwgNjQ2MCwgNjQ2NCwgNjQ2NywgNjQ3MSwgNjQ3NCwgNjQ3OSwgNjQ4MywgNjQ4OCwKKyAgICAgNjQ5MiwgNjQ5NCwgNjQ5OCwgNjUwMSwgNjUwNSwgNjUwOCwgNjUxMSwgNjUxNiwgNjUyMCwgNjUyNSwKKyAgICAgNjUyOSwgNjUzMSwgNjUzNSwgNjUzOCwgNjU0MiwgNjU0NSwgNjU0OCwgNjU1MSwgNjU1NSwgNjU1NywKKyAgICAgNjU2MCwgNjU2NSwgNjU2OSwgNjU3MiwgNjU3NSwgNjU3OCwgNjU4MSwgNjU4NCwgNjU4NywgNjU5MCwKKyAgICAgNjU5MywgNjU5NiwgNjU5OSwgNjYwMiwgNjYwNiwgNjYwOCwgNjYxMSwgNjYxNCwgNjYxNywgNjYyMCwKKyAgICAgNjYyNCwgNjYyNiwgNjYyOSwgNjYzMiwgNjYzNSwgNjYzOCwgNjY0MSwgNjY0NSwgNjY0NywgNjY1MCwKIAotICAgICA2NTU4LCA2NTYxCisgICAgIDY2NTMsIDY2NTYsIDY2NTksIDY2NjIsIDY2NjYsIDY2NjgsIDY2NzEsIDY2NzQsIDY2NzcsIDY2ODAsCisgICAgIDY2ODUsIDY2ODksIDY2OTQsIDY2OTgsIDY3MDAsIDY3MDQsIDY3MDcsIDY3MTEsIDY3MTYsIDY3MjAsCisgICAgIDY3MjMsIDY3MjYsIDY3MjksIDY3MzIsIDY3MzUsIDY3MzgsIDY3NDEsIDY3NDQsIDY3NDcsIDY3NTEsCisgICAgIDY3NTUsIDY3NTgsIDY3NjIsIDY3NjYsIDY3NzEsIDY3NzUsIDY3NzcsIDY3ODEsIDY3ODQsIDY3ODgsCisgICAgIDY3OTEsIDY3OTYsIDY4MDAsIDY4MDUsIDY4MDksIDY4MTEsIDY4MTUsIDY4MTgsIDY4MjIsIDY4MjUsCisgICAgIDY4MjgsIDY4MzMsIDY4MzcsIDY4NDIsIDY4NDYsIDY4NDgsIDY4NTIsIDY4NTUsIDY4NTksIDY4NjIsCisgICAgIDY4NjUsIDY4NzAsIDY4NzQsIDY4NzksIDY4ODMsIDY4ODUsIDY4ODksIDY4OTIsIDY4OTYsIDY4OTksCisgICAgIDY5MDIsIDY5MDUsIDY5MDksIDY5MTEsIDY5MTQsIDY5MTcsIDY5MjIsIDY5MjYsIDY5MjksIDY5MzIsCisgICAgIDY5MzUsIDY5MzgsIDY5NDEsIDY5NDQsIDY5NDcsIDY5NTAsIDY5NTMsIDY5NTYsIDY5NTksIDY5NjMsCisgICAgIDY5NjcsIDY5NzAsIDY5NzMsIDY5NzcsIDY5ODAsIDY5ODMsIDY5ODcsIDY5ODksIDY5OTIsIDY5OTUsCisKKyAgICAgNjk5OSwgNzAwMSwgNzAwNCwgNzAwNywgNzAxMCwgNzAxNCwgNzAxNiwgNzAxOSwgNzAyMiwgNzAyNSwKKyAgICAgNzAyOSwgNzAzMSwgNzAzNCwgNzAzNywgNzA0MCwgNzA0NCwgNzA0NiwgNzA0OSwgNzA1MiwgNzA1NywKKyAgICAgNzA2MSwgNzA2NiwgNzA3MCwgNzA3MiwgNzA3NiwgNzA3OSwgNzA4MywgNzA4OCwgNzA5MiwgNzA5NSwKKyAgICAgNzA5OCwgNzEwMSwgNzEwNCwgNzEwNywgNzExMCwgNzExMywgNzExNiwgNzEyMCwgNzEyMiwgNzEyNSwKKyAgICAgNzEyOSwgNzEzNCwgNzEzOCwgNzEzOSwgNzE0MiwgNzE0NywgNzE1MSwgNzE1NiwgNzE2MCwgNzE2MSwKKyAgICAgNzE2NCwgNzE2NywgNzE3MiwgNzE3NiwgNzE4MSwgNzE4NSwgNzE4NiwgNzE4OSwgNzE5MiwgNzE5NywKKyAgICAgNzIwMSwgNzIwNiwgNzIxMCwgNzIxMSwgNzIxNCwgNzIxNywgNzIyMiwgNzIyNiwgNzIzMSwgNzIzNSwKKyAgICAgNzIzNiwgNzIzOSwgNzI0MiwgNzI0NSwgNzI0OSwgNzI1MSwgNzI1NiwgNzI2MCwgNzI2MywgNzI2NiwKKyAgICAgNzI2OSwgNzI3MiwgNzI3NSwgNzI3OCwgNzI4MiwgNzI4NywgNzI5MSwgNzI5MiwgNzI5NSwgNzI5OCwKKyAgICAgNzMwMSwgNzMwNCwgNzMwNywgNzMxMCwgNzMxMywgNzMxNiwgNzMxOSwgNzMyMiwgNzMyNywgNzMzMSwKKworICAgICA3MzM0LCA3MzM3LCA3MzQwLCA3MzQ0LCA3MzQ4LCA3MzUyLCA3MzU2LCA3MzYwLCA3MzYzLCA3MzY2LAorICAgICA3MzcwLCA3MzczLCA3Mzc2LCA3Mzc5LCA3MzgyLCA3Mzg1LCA3Mzg5LCA3MzkyCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9kZWZbMTcwM10gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZlsxOTE5XSA9CiAgICAgeyAgIDAsCi0gICAgIDEzMjksICAgIDEsIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMzAsIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksICAgMTQsIDEzMjksIDEzMjksIDEzMjksIDEzMjksICAgMTQsCi0gICAgICAgMjAsIDEzMzEsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjEsICAgMjEsCisgICAgIDE0NTgsICAgIDEsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTksIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsICAgMTQsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsICAgMTQsCisgICAgICAgMjAsIDE0NjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjEsICAgMjEsCiAgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAgMjEsICAgMjEsIDEzMjksIDEzMjksIDEzMjksIDEzMzIsIDEzMjksICAgMjEsICAgMjEsICAgMjAsCi0gICAgIDEzMzMsICAgNTAsICAgMjEsICAgMjEsIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMzEsIDEzMzEsICAgNTAsICAgNjMsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgNjMsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgNjMsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgNjMsCisgICAgICAgMjEsICAgMjEsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NjEsIDE0NTgsICAgMjEsICAgMjEsICAgMjAsCisgICAgIDE0NjIsICAgNTAsICAgMjEsICAgMjEsICAgMjEsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsICAgNDksIDE0NjAsIDE0NjAsICAgNTIsICAgNTIsICAgNTIsICAgMjEsICAgMjEsICAgMjEsCisgICAgICAgMjEsICAgNTIsICAgMjEsICAgMjEsICAgNTIsICAgMjEsICAgMjEsICAgMjEsICAgNTIsICAgMjEsCisgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgNTIsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgMTQ1OCwKKyAgICAgMTQ1OCwgICAyMSwgICAyMSwgIDE1MywgICAyMSwgICAyMSwgIDE1NiwgMTQ2MywgMTQ1OCwgICA1NCwKKyAgICAgMTQ1OCwgIDE2MSwgMTQ2NCwgICAyMSwgICAyMSwgIDE1NywgICAyMSwgICAyMSwgICAyMSwgIDE1NywKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgIDE1NywgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgIDE1NywgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKworICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgMjYwLCAgMjYxLCAgMTU3LCAxNDY1LCAgMjY2LCAxNDY2LCAxNDY3LAorICAgICAxNDU4LCAgMjcxLCAxNDY4LCAxNDY5LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDcwLCAxNDcxLCAgIDIxLAogICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAogICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAogCiAgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCiAgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCiAgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsIDEzMjksIDEzMjksICAgMjEsCi0gICAgICAxNDAsICAgNTAsICAxNDIsIDEzMzQsIDEzMjksICAgNTQsIDEzMjksICAxNDcsIDEzMzUsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAxNDIsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAxNDIsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAxNjEsICAgMjEsICAgMjEsCisgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAzNDcsICAgMjEsICAyNjEsCisgICAgICAyNjMsICAyNjEsICAyNjMsICAyNjMsICAzNTQsIDE0NzIsIDE0NTgsICAzNTMsIDE0NzMsIDE0NzQsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NzUsIDE0NzYsIDE0NzcsIDE0NzgsIDE0NzgsIDE0NTgsCisgICAgIDE0NzksIDE0NTgsICAzNzIsIDE0ODAsIDE0NzEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisgICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgIDQyNiwKKyAgICAgIDQyNywgIDQyNywgIDQzMiwgIDQyNiwgIDM1NCwgIDQzNSwgMTQ4MSwgMTQ4MiwgMTQ1OCwgIDQzOSwKKyAgICAgMTQ4MywgMTQ1OCwgMTQ4NCwgMTQ4NSwgMTQ1OCwgIDQ0NSwgMTQ4NiwgMTQ4NywgMTQ4OCwgMTQ4OCwKKyAgICAgMTQ1OCwgMTQ4OSwgMTQ1OCwgIDQ1MywgMTQ5MCwgMTQ3NiwgMTQ1OCwgMTQ1OCwgMTQ5MSwgMTQ5MiwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ5MywgMTQ5NCwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKICAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKICAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKICAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKIAogICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAxMzM2LCAgIDIxLCAxMzM3LCAxMzM4LCAxMzI5LAotICAgICAgMjQwLCAxMzM5LCAxMzQwLCAxMzI5LCAxMzI5LCAxMzI5LCAgMjQ1LCAxMzQxLCAgIDIxLCAgIDIxLAorICAgICAgNTEwLCAgIDIxLCAgNDI3LCAgNDI5LCAgNDI3LCAgNDI3LCAgNTE2LCAgNDM1LCAgNTE4LCAxNDk1LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDk2LCAxNDk3LCAxNDk4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDk5LCAxNTAwLCAxNDU4LCAxNTAxLCAxNTAyLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNTAzLAorICAgICAxNTA0LCAxNTA1LCAxNTA1LCAxNDkxLCAxNDkyLCAxNTA2LCAxNTA2LCAxNDU4LCAxNTA3LCAxNDU4LAorICAgICAgNTUwLCAxNTA4LCAxNTA5LCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAogICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAogICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAogICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgNTkzLCAgNTkzLCAgNTk3LCAgNTE4LCAgNTk5LAogCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAzMDMsICAyMzQsICAyMzUsIDEzNDIsIDEzMjksIDEzNDMsIDEzNDQsCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksICAzMTMsIDEzNDUsIDEzNDYsIDEzNDcsIDEzMjksIDEzMjksCi0gICAgICAzMjAsIDEzMjksICAzMjIsIDEzNDgsIDEzNDEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCi0gICAgICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMjEsIDEzMzcsIDEzNDksIDEzMjksICAzNjksCi0gICAgIDEzNTAsIDEzMjksIDEzNTEsIDEzNTIsIDEzMjksICAzNzUsIDEzMzksIDEzNTMsIDEzNTQsIDEzMjksCi0gICAgIDEzMjksICAzODEsIDEzMjksICAzODMsIDEzNTUsIDEzNDUsIDEzMjksIDEzMjksIDEzNTYsIDEzNTcsCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksICAzOTMsIDEzNTgsICAgMjEsICAgMjEsICAgMjEsICAgMjEsCisgICAgIDE1MTAsIDE1MTEsIDE0NTgsICA2MDMsIDE1MTIsIDE0NTgsICA2MDYsIDE1MTMsIDE0NTgsIDE1MTQsCisgICAgIDE1MTUsIDE0NTgsICA2MTIsIDE1MTYsIDE1MTcsIDE1MTcsIDE0NTgsIDE1MTgsIDE0NTgsICA2MTksCisgICAgIDE1MTksIDE1MjAsIDE1MjEsIDE1MjEsIDE1MjIsIDE1MjMsIDE1MjQsIDE1MjQsIDE0NTgsIDE1MjUsCisgICAgIDE0NTgsICA2MzEsIDE1MjYsIDE1MjcsIDE0NTgsIDE1MjgsIDE0NTgsIDE1MjksIDE1MzAsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE1MzEsIDE1MzIsICA2MDAsICA2NDYsICA2NDYsICA2NDYsICA2NDYsCisgICAgICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsCisgICAgICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsICA2NDYsCisgICAgICA2NDYsICA2NzEsICA2NzEsICA2NzEsICA2NDYsICA2NzEsICA2NzYsIDE1MzMsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE1MzQsIDE0NTgsIDE0NTgsIDE1MzUsIDE1MzYsIDE1MzcsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE1MzgsIDE1MzksIDE0NTgsIDE1NDAsIDE1NDEsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCiAKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgIDQzNiwgIDM2NiwgMTM1OSwgMTMyOSwKLSAgICAgIDMxMywgMTMyOSwgIDMxNSwgMTM2MCwgMTM2MSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDQ0OCwKLSAgICAgMTM2MiwgMTMyOSwgMTM2MywgMTM2NCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDQ1NywgMTM2NSwKLSAgICAgMTM2NiwgMTMyOSwgMTM1NiwgMTMyOSwgMTM2NywgMTMyOSwgMTMyOSwgIDQ2NywgMTMyOSwgIDQ2OSwKLSAgICAgMTM2OCwgMTM1OCwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgMTU0MiwgMTU0MywgMTQ1OCwgMTU0NCwgMTQ1OCwgMTU0NSwgMTU0NiwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTU0NywgMTU0OCwgMTU0OSwgMTQ1OCwgMTU1MCwgMTU1MSwgMTU1MSwgMTU1MiwgMTU1MywKKyAgICAgMTU1NCwgMTU1NCwgMTQ1OCwgMTU1NSwgMTQ1OCwgIDcyNSwgMTU1NiwgMTU1NywgMTU1OCwgMTU1OCwKKyAgICAgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwKKyAgICAgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgMTU1OCwgIDc0NywgMTU1OCwKKyAgICAgIDc0NywgIDc1MSwgIDc1MSwgIDc1MywgMTU1OSwgMTU2MCwgMTQ1OCwgIDc1NywgMTU2MSwgMTQ1OCwKKyAgICAgIDc2MCwgMTU2MiwgMTQ1OCwgIDc2MywgMTU2MywgMTQ1OCwgMTU2NCwgMTU2NSwgMTQ1OCwgIDc2OSwKKyAgICAgMTU2NiwgMTU2NywgMTU2NywgMTQ1OCwgMTU2OCwgMTQ1OCwgIDc3NiwgMTU2OSwgMTU3MCwgMTU3MSwKKyAgICAgMTU3MSwgMTU3MiwgMTU3MywgMTU3NCwgMTU3NCwgMTQ1OCwgMTU3NSwgMTQ1OCwgIDc4OCwgMTU3NiwKKyAgICAgMTU3NywgMTU3OCwgMTQ1OCwgMTU3OSwgMTU4MCwgMTU4MCwgMTU4MSwgMTU4MiwgMTU4MywgMTU4MywKIAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAxMzY5LCAxMzcwLCAxMzI5LCAgNTA5LAotICAgICAxMzcxLCAxMzI5LCAgNTEyLCAxMzcyLCAxMzI5LCAxMzczLCAxMzc0LCAxMzI5LCAgNTE4LCAxMzc1LAotICAgICAxMzc2LCAxMzI5LCAxMzI5LCAgNTIzLCAxMzI5LCAgNTI1LCAxMzc3LCAxMzYyLCAxMzc4LCAxMzI5LAotICAgICAxMzYzLCAxMzI5LCAxMzc5LCAxMzI5LCAxMzI5LCAgNTM1LCAxMzI5LCAgNTM3LCAxMzgwLCAxMzY1LAotICAgICAxMzI5LCAxMzgxLCAxMzI5LCAxMzgyLCAxMzgzLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAgNTQ4LAotICAgICAxMzg0LCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLAotICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgNTA2LCAxMzg1LCAxMzI5LCAxMzI5LCAxMzI5LCAgNTc3LCAxMzI5LAotICAgICAxMzI5LCAgNTgwLCAxMzg2LCAxMzg3LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAgNTg3LCAxMzg4LAotICAgICAxMzI5LCAxMzg5LCAxMzkwLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAgNTk2LCAxMzkxLCAxMzI5LAorICAgICAxNDU4LCAxNTg0LCAxNDU4LCAgODAzLCAxNTg1LCAxNTg2LCAxNTg3LCAxNDU4LCAxNTg4LCAxNDU4LAorICAgICAxNTg5LCAxNTkwLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNTkxLCAxNTkyLCAxNTkzLCAxNTkzLAorICAgICAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLCAxNTkzLAorICAgICAxNTkzLCAxNTkzLCAgODMyLCAgODMyLCAgODM0LCAgODMyLCAgODMyLCAgODM3LCAxNTk0LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNTk1LCAxNDU4LCAxNDU4LCAxNTk2LCAxNDU4LCAxNDU4LCAxNTk3LCAxNTk4LAorICAgICAxNTk5LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNjAwLCAxNjAxLCAxNDU4LCAxNjAyLCAxNjAzLAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNjA0LCAxNjA1LCAxNDU4LCAxNjA2LCAxNDU4LCAxNjA3LAorICAgICAxNjA4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNjA5LCAxNjEwLCAxNjExLCAxNDU4LCAxNjEyLAorICAgICAxNDU4LCAxNjEzLCAxNjE0LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNjE1LCAxNjE2LCAxNjE3LAorICAgICAxNjE4LCAxNDU4LCAxNjE5LCAxNjIwLCAxNjIwLCAxNjIxLCAxNjIyLCAxNjIzLCAxNjIzLCAxNDU4LAogCi0gICAgIDEzOTIsIDEzMjksIDEzOTMsIDEzOTQsIDEzMjksIDEzMjksIDEzMjksIDEzMjksICA2MDcsIDEzOTUsCi0gICAgIDEzOTYsIDEzMjksIDEzODEsIDEzOTcsIDEzMjksIDEzOTgsIDEzMjksIDEzOTksIDEzMjksIDEzMjksCi0gICAgICA2MjAsIDEzMjksICA2MjIsIDE0MDAsIDE0MDEsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsCi0gICAgIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsIDE0MDIsCi0gICAgIDE0MDIsIDE0MDIsIDE0MDMsIDE0MDQsIDEzMjksICA2NDUsIDE0MDUsIDEzMjksICA2NDgsIDE0MDYsCi0gICAgIDEzMjksICA2NTEsIDE0MDcsIDEzMjksIDE0MDgsIDE0MDksIDEzMjksICA2NTcsIDE0MTAsIDE0MTEsCi0gICAgIDEzMjksIDEzMjksICA2NjIsIDEzMjksICA2NjQsIDE0MTIsIDE0MTMsIDE0MTQsIDEzMjksIDE0MTUsCi0gICAgIDEzMjksIDE0MTYsIDEzMjksIDEzMjksICA2NzQsIDEzMjksICA2NzYsIDE0MTcsIDE0MTgsIDE0MTksCi0gICAgIDEzMjksIDE0MjAsIDE0MjEsIDEzMjksIDE0MjIsIDEzMjksIDE0MjMsIDEzMjksIDEzMjksICA2ODksCi0gICAgIDEzMjksICA2OTEsIDE0MjQsIDE0MjUsIDE0MjYsIDEzMjksIDE0MjcsIDEzMjksIDE0MjgsIDE0MjksCisgICAgIDE2MjQsIDE0NTgsICA5MDIsIDE2MjUsIDE2MjYsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsCisgICAgIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsIDE2MjcsICA5MTksCisgICAgIDE2MjcsIDE2MjcsIDE2MjgsIDE2MjksIDE0NTgsICA5MjUsIDE2MzAsIDE0NTgsICA5MjgsIDE2MzEsCisgICAgIDE0NTgsICA5MzEsIDE2MzIsIDE0NTgsICA5MzQsIDE2MzMsIDE0NTgsIDE2MzQsIDE0NTgsIDE0NTgsCisgICAgICA5NDAsIDE2MzUsIDE2MzYsIDE2MzYsIDE0NTgsIDE2MzcsIDE0NTgsICA5NDcsIDE2MzgsIDE2MzksCisgICAgIDE2NDAsIDE2NDAsIDE2NDEsIDE2NDIsIDE2NDMsIDE2NDMsIDE0NTgsIDE2NDQsIDE0NTgsICA5NTksCisgICAgIDE2NDUsIDE2NDYsIDE2NDcsIDE0NTgsIDE2NDgsIDE2NDksIDE2NDksIDE2NTAsIDE2NTEsIDE2NTIsCisgICAgIDE2NTIsIDE0NTgsIDE2NTMsIDE0NTgsICA5NzQsIDE2NTQsIDE2NTUsIDE2NTYsIDE2NTcsIDE0NTgsCisgICAgIDE2NTgsIDE2NTksIDE2NTksIDE2NjAsIDE2NjEsIDE2NjIsIDE2NjIsIDE0NTgsIDE2NjMsIDE0NTgsCisgICAgICA5OTAsIDE2NjQsIDE2NjUsIDE2NjYsIDE0NTgsIDE2NjcsIDE0NTgsIDE2NjgsIDE2NjksIDE0NTgsCiAKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDcwMywgMTQzMCwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwKLSAgICAgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMSwgMTQzMiwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgIDcyMiwgMTMyOSwgMTMyOSwgIDcyNSwgMTMyOSwgMTMyOSwgIDcyOCwKLSAgICAgMTQzMywgMTQzNCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDczNSwgMTQzNSwgMTMyOSwgMTQzNiwKLSAgICAgMTQzNywgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDc0NCwgMTQzOCwgMTMyOSwgMTQzOSwgMTMyOSwKLSAgICAgMTQ0MCwgMTQ0MSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDc1NSwgMTQ0MiwgMTQ0MywgMTMyOSwKLSAgICAgMTQ0NCwgMTMyOSwgMTQ0NSwgMTQ0NiwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDc2NywgMTQ0NywKLSAgICAgMTQ0OCwgMTQ0OSwgMTMyOSwgMTQ1MCwgMTQ1MSwgMTMyOSwgMTQ1MiwgMTMyOSwgMTQ1MywgMTMyOSwKLSAgICAgMTMyOSwgIDc4MSwgMTMyOSwgIDc4MywgMTQ1NCwgMTQ1NSwgMTQ1NiwgMTQ1NiwgMTQ1NiwgMTQ1NiwKLSAgICAgMTQ1NiwgMTQ1NiwgMTQ1NiwgMTQ1NiwgMTQ1NiwgMTQ1NiwgMTQ1NiwgMTQ1NywgMTQ1OCwgMTMyOSwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTY3MCwgMTY3MSwgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwKKyAgICAgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwgMTY3MiwgMTAxOCwgMTY3MiwKKyAgICAgMTY3MywgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTY3NCwgMTQ1OCwgMTQ1OCwgMTY3NSwgMTQ1OCwgMTQ1OCwKKyAgICAgMTY3NiwgMTQ1OCwgMTQ1OCwgMTY3NywgMTY3OCwgMTQ1OCwgMTAzNiwgMTY3OSwgMTY4MCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTY4MSwgMTY4MiwgMTY4MywgMTQ1OCwgMTY4NCwgMTY4NSwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTY4NiwgMTY4NywgMTY4OCwgMTQ1OCwgMTY4OSwgMTQ1OCwgMTY5MCwgMTY5MSwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTY5MiwgMTY5MywgMTY5NCwgMTY5NSwgMTQ1OCwgMTY5NiwgMTQ1OCwgMTY5NywgMTY5OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTY5OSwgMTcwMCwgMTcwMSwgMTcwMiwgMTQ1OCwgMTcwMywgMTQ1OCwKKyAgICAgMTcwNCwgMTcwNSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTcwNiwgMTcwNywgMTcwOCwgMTcwOSwgMTcxMCwKKyAgICAgMTQ1OCwgMTcxMSwgMTcxMiwgMTcxMiwgMTcxMywgMTcxNCwgMTcxNSwgMTcxNSwgMTQ1OCwgMTcxNiwKIAotICAgICAgODAwLCAxNDU5LCAxMzI5LCAgODAzLCAxNDYwLCAxMzI5LCAgODA2LCAxNDYxLCAxMzI5LCAgODA5LAotICAgICAxNDYyLCAxMzI5LCAxNDYzLCAxMzI5LCAxMzI5LCAgODE1LCAxNDY0LCAxNDY1LCAxMzI5LCAxMzI5LAotICAgICAgODIwLCAxMzI5LCAgODIyLCAxNDY2LCAxNDY3LCAxNDY4LCAxMzI5LCAxNDY5LCAxMzI5LCAxNDcwLAotICAgICAxMzI5LCAxMzI5LCAgODMyLCAxMzI5LCAgODM0LCAxNDcxLCAxNDcyLCAxNDczLCAxMzI5LCAxNDc0LAotICAgICAxNDc1LCAxMzI5LCAxNDc2LCAxMzI5LCAxNDc3LCAxMzI5LCAxMzI5LCAgODQ3LCAxMzI5LCAgODQ5LAotICAgICAxNDc4LCAxNDc5LCAxNDgwLCAxNDgxLCAxMzI5LCAxNDgyLCAxNDgzLCAxMzI5LCAxNDg0LCAxMzI5LAotICAgICAxNDg1LCAxMzI5LCAxMzI5LCAgODYzLCAxMzI5LCAgODY1LCAxNDg2LCAxNDg3LCAxNDg4LCAxMzI5LAotICAgICAxNDg5LCAxMzI5LCAxNDkwLCAxNDkxLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAgODc3LCAxNDkyLAotICAgICAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLCAxNDkzLAotICAgICAxNDkzLCAxNDkzLCAxNDk0LCAxMzI5LCAxMzI5LCAxMzI5LCAgODk1LCAxMzI5LCAxMzI5LCAgODk4LAorICAgICAxNDU4LCAxMTAxLCAxNzE3LCAxNzE4LCAxNzE5LCAxNzE5LCAxNzE5LCAxNzE5LCAxNzE5LCAxNzE5LAorICAgICAxNzE5LCAxNzE5LCAxNzE5LCAxNzE5LCAxNzE5LCAxNzIwLCAxNDU4LCAxNDU4LCAxMTE4LCAxNzIxLAorICAgICAxNDU4LCAxMTIxLCAxNzIyLCAxNDU4LCAxMTI0LCAxNzIzLCAxNDU4LCAxMTI3LCAxNzI0LCAxNDU4LAorICAgICAxMTMwLCAxNzI1LCAxNDU4LCAxNDU4LCAxNDU4LCAxNzI2LCAxNzI3LCAxNzI4LCAxNzI5LCAxNzMwLAorICAgICAxNzMwLCAxNDU4LCAxNzMxLCAxNzMyLCAxNzMzLCAxNzM0LCAxNzM0LCAxNzM1LCAxNzM2LCAxNzM3LAorICAgICAxNzM3LCAxNDU4LCAxNzM4LCAxNzM5LCAxNzQwLCAxNzQxLCAxNDU4LCAxNzQyLCAxNzQzLCAxNzQzLAorICAgICAxNzQ0LCAxNzQ1LCAxNzQ2LCAxNzQ2LCAxNDU4LCAxNzQ3LCAxNzQ4LCAxNzQ5LCAxNzUwLCAxNzUxLAorICAgICAxNDU4LCAxNzUyLCAxNzUzLCAxNzUzLCAxNzU0LCAxNzU1LCAxNzU2LCAxNzU2LCAxNDU4LCAxNzU3LAorICAgICAxNzU4LCAxNzU5LCAxNzYwLCAxNzYxLCAxNDU4LCAxNzYyLCAxNzYzLCAxNzYzLCAxNzY0LCAxNzY1LAorICAgICAxNzY2LCAxNzY2LCAxNDU4LCAxNzY3LCAxNzY4LCAxNzY5LCAxNzcwLCAxNDU4LCAxNzcxLCAxNDU4LAogCi0gICAgIDEzMjksIDEzMjksICA5MDEsIDEzMjksIDEzMjksICA5MDQsIDE0OTUsIDEzMjksICA5MDgsIDE0OTYsCi0gICAgIDE0OTcsIDEzMjksIDEzMjksIDE0OTgsICA5MTMsIDE0OTksIDEzMjksIDE1MDAsIDE1MDEsIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDE1MDIsICA5MjIsIDE1MDMsIDEzMjksIDE1MDQsIDEzMjksIDE1MDUsIDE1MDYsCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDE1MDcsICA5MzMsIDE1MDgsIDE1MDksIDEzMjksIDE1MTAsIDEzMjksCi0gICAgIDE1MTEsIDE1MTIsIDEzMjksIDEzMjksIDEzMjksIDE1MTMsICA5NDUsIDE1MTQsIDE1MTUsIDEzMjksCi0gICAgIDE1MTYsIDEzMjksIDE1MTcsIDE1MTgsIDEzMjksIDEzMjksIDEzMjksIDE1MTksICA5NTcsIDE1MjAsCi0gICAgIDE1MjEsIDE1MjIsIDEzMjksIDE1MjMsIDE1MjQsIDEzMjksIDE1MjUsIDEzMjksIDE1MjYsIDEzMjksCi0gICAgIDEzMjksICA5NzEsIDEzMjksICA5NzMsIDE1MjcsIDE1MjgsIDE1MjksIDE1MjksIDE1MjksIDE1MjksCi0gICAgIDE1MjksIDE1MjksIDE1MjksIDE1MjksIDE1MjksIDE1MjksIDE1MzAsIDEzMjksIDEzMjksICA5ODksCi0gICAgIDE1MzEsIDEzMjksICA5OTIsIDE1MzIsIDEzMjksICA5OTUsIDE1MzMsIDEzMjksICA5OTgsIDE1MzQsCisgICAgIDE3NzIsIDE3NzMsIDE0NTgsIDE0NTgsIDE0NTgsIDE3NzQsIDE3NzUsIDE3NzYsIDE3NzcsIDE3NzcsCisgICAgIDE3NzcsIDE3NzcsIDE3NzcsIDE3NzcsIDE3NzcsIDE3NzcsIDE0NTgsIDEyMTcsIDE3NzgsIDE3NzksCisgICAgIDE0NTgsIDE3ODAsIDE3ODEsIDE0NTgsIDE3ODIsIDE3ODMsIDE0NTgsIDE3ODQsIDE3ODUsIDE0NTgsCisgICAgIDE3ODYsIDE3ODcsIDE0NTgsIDE3ODgsIDE3ODksIDE3OTAsIDE3OTAsIDE0NTgsIDE3OTEsIDE3OTIsCisgICAgIDE3OTMsIDE3OTQsIDE3OTUsIDE0NTgsIDE3OTYsIDE3OTcsIDE0NTgsIDE3OTgsIDE0NTgsIDE3OTksCisgICAgIDE0NTgsIDE4MDAsIDE4MDEsIDE0NTgsIDE4MDIsIDE4MDMsIDE0NTgsIDE4MDQsIDE0NTgsIDE4MDUsCisgICAgIDE4MDYsIDE0NTgsIDE4MDcsIDE4MDgsIDE0NTgsIDE4MDksIDE0NTgsIDE4MTAsIDE4MTEsIDE0NTgsCisgICAgIDE4MTIsIDE4MTMsIDE0NTgsIDE4MTQsIDE0NTgsIDE4MTUsIDE4MTYsIDE0NTgsIDE4MTcsIDE4MTgsCisgICAgIDE4MTksIDE0NTgsIDE4MjAsIDE4MjEsIDE4MjEsIDE4MjIsIDE4MjMsIDE4MjQsIDE4MjQsIDE0NTgsCisgICAgIDE4MjUsIDE4MjYsIDE4MjcsIDE4MjgsIDE4MjgsIDE4MjgsIDE4MjgsIDE0NTgsIDE4MjksIDE4MzAsCiAKLSAgICAgMTMyOSwgMTAwMSwgMTUzNSwgMTMyOSwgMTMyOSwgMTMyOSwgMTUzNiwgMTAwNiwgMTUzNywgMTUzOCwKLSAgICAgMTUzOSwgMTMyOSwgMTMyOSwgMTAxMywgMTU0MCwgMTU0MSwgMTU0MiwgMTMyOSwgMTU0MywgMTMyOSwKLSAgICAgMTU0NCwgMTMyOSwgMTMyOSwgMTAyMywgMTU0NSwgMTU0NiwgMTU0NywgMTMyOSwgMTU0OCwgMTU0OSwKLSAgICAgMTMyOSwgMTU1MCwgMTMyOSwgMTU1MSwgMTMyOSwgMTMyOSwgMTAzNiwgMTU1MiwgMTU1MywgMTU1NCwKLSAgICAgMTU1NSwgMTMyOSwgMTU1NiwgMTU1NywgMTMyOSwgMTU1OCwgMTMyOSwgMTU1OSwgMTMyOSwgMTMyOSwKLSAgICAgMTA1MCwgMTU2MCwgMTU2MSwgMTU2MiwgMTU2MywgMTMyOSwgMTU2NCwgMTU2NSwgMTMyOSwgMTU2NiwKLSAgICAgMTMyOSwgMTU2NywgMTMyOSwgMTMyOSwgMTA2NCwgMTU2OCwgMTU2OSwgMTU3MCwgMTMyOSwgMTU3MSwKLSAgICAgMTMyOSwgMTU3MiwgMTU3MywgMTMyOSwgMTMyOSwgMTMyOSwgMTU3NCwgMTA3NiwgMTU3NSwgMTU3NiwKLSAgICAgMTU3NiwgMTU3NiwgMTU3NiwgMTU3NiwgMTU3NiwgMTU3NiwgMTU3NiwgMTMyOSwgMTA4OCwgMTU3NywKLSAgICAgMTU3OCwgMTMyOSwgMTU3OSwgMTA5MiwgMTMyOSwgMTU4MCwgMTA5NSwgMTMyOSwgMTU4MSwgMTA5OCwKKyAgICAgMTgzMSwgMTgzMiwgMTgzMywgMTgzNCwgMTgzNSwgMTgzNiwgMTQ1OCwgMTgzNywgMTgzOCwgMTQ1OCwKKyAgICAgMTgzOSwgMTg0MCwgMTg0MSwgMTg0MSwgMTg0MiwgMTg0MywgMTg0NCwgMTg0NSwgMTQ1OCwgMTg0NiwKKyAgICAgMTg0NywgMTg0NywgMTg0OCwgMTg0OSwgMTg1MCwgMTg1MSwgMTg1MiwgMTQ1OCwgMTg1MywgMTg1NCwKKyAgICAgMTg1NCwgMTg1NSwgMTg1NiwgMTg1NywgMTg1OCwgMTg1OSwgMTQ1OCwgMTg2MCwgMTg2MSwgMTg2MSwKKyAgICAgMTg2MiwgMTg2MywgMTg2NCwgMTg2NSwgMTg2NiwgMTQ1OCwgMTg2NywgMTg2OCwgMTg2OCwgMTg2OSwKKyAgICAgMTg3MCwgMTg3MSwgMTg3MiwgMTQ1OCwgMTg3MywgMTQ1OCwgMTg3NCwgMTg3NSwgMTQ1OCwgMTg3NiwKKyAgICAgMTg3NywgMTg3NywgMTg3NywgMTg3NywgMTg3OCwgMTQ1OCwgMTg3OSwgMTg4MCwgMTg4MSwgMTg4MiwKKyAgICAgMTg4MywgMTg4NCwgMTg4NSwgMTg4NSwgMTg4NiwgMTg4NywgMTg4OCwgMTQ1OCwgMTQ1OCwgMTg4OSwKKyAgICAgMTQ1OCwgMTg5MCwgMTQ1OCwgMTg5MSwgMTQ1OCwgMTg5MiwgMTQ1OCwgMTg5MywgMTQ1OCwgMTg5NCwKKyAgICAgMTQ1OCwgMTg5NSwgMTQ1OCwgMTg5NiwgMTQ1OCwgMTg5NywgMTQ1OCwgMTg3MiwgMTg5OCwgMTQ1OCwKIAotICAgICAxMzI5LCAxNTgyLCAxMTAxLCAxMzI5LCAxNTgzLCAxMTA0LCAxNTg0LCAxMzI5LCAxMzI5LCAxMTA5LAotICAgICAxNTg1LCAxNTg2LCAxNTg3LCAxNTg4LCAxMzI5LCAxNTg5LCAxNTkwLCAxMzI5LCAxNTkxLCAxMzI5LAotICAgICAxNTkyLCAxMzI5LCAxNTkzLCAxNTk0LCAxMzI5LCAxNTk1LCAxNTk2LCAxMzI5LCAxNTk3LCAxMzI5LAotICAgICAxNTk4LCAxNTk5LCAxMzI5LCAxNjAwLCAxNjAxLCAxMzI5LCAxNjAyLCAxMzI5LCAxNjAzLCAxNjA0LAotICAgICAxMzI5LCAxNjA1LCAxNjA2LCAxMzI5LCAxNjA3LCAxMzI5LCAxNjA4LCAxNjA5LCAxMzI5LCAxNjEwLAotICAgICAxNjExLCAxNjEyLCAxMzI5LCAxNjEzLCAxNjE0LCAxMzI5LCAxNjE1LCAxMzI5LCAxNjE2LCAxMzI5LAotICAgICAxMzI5LCAxMTYxLCAxNjE3LCAxNjE4LCAxNjE5LCAxNjE5LCAxNjE5LCAxNjE5LCAxMzI5LCAxNjIwLAotICAgICAxMTY5LCAxNjIxLCAxNjIyLCAxNjIzLCAxNjI0LCAxNjI1LCAxNjI2LCAxMzI5LCAxNjI3LCAxNjI4LAotICAgICAxMzI5LCAxNjI5LCAxNjMwLCAxNjMxLCAxMzI5LCAxNjMyLCAxMzI5LCAxNjMzLCAxNjM0LCAxMzI5LAotICAgICAxNjM1LCAxNjM2LCAxMzI5LCAxNjM3LCAxMzI5LCAxNjM4LCAxNjM5LCAxNjQwLCAxMzI5LCAxNjQxLAorICAgICAxODczLCAxODk5LCAxODk5LCAxODc0LCAxODc1LCAxOTAwLCAxODc3LCAxODc3LCAxODc3LCAxOTAxLAorICAgICAxNDU4LCAxOTAyLCAxOTAzLCAxNDU4LCAxODg5LCAxODkwLCAxOTA0LCAxNDU4LCAxODkxLCAxODkyLAorICAgICAxOTA1LCAxNDU4LCAxODkzLCAxODk0LCAxOTA2LCAxNDU4LCAxODk1LCAxODk2LCAxOTA3LCAxNDU4LAorICAgICAxODk3LCAxOTA4LCAxNDU4LCAxOTA5LCAxNDU4LCAxODc3LCAxOTEwLCAxNDU4LCAxOTAyLCAxOTExLAorICAgICAxOTEyLCAxOTEzLCAxOTE0LCAxOTE1LCAxOTA4LCAxOTE2LCAxNDU4LCAxOTA5LCAxOTE3LCAxOTExLAorICAgICAxOTEyLCAxOTEzLCAxOTE0LCAxOTE1LCAxOTE4LCAxOTE3LCAxOTE4LCAgICAwLCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAogCi0gICAgIDE2NDIsIDEzMjksIDE2NDMsIDEzMjksIDE2NDQsIDE2NDUsIDE2NDYsIDEzMjksIDE2NDcsIDE2NDgsCi0gICAgIDEzMjksIDE2NDksIDEzMjksIDE2NTAsIDE2NTEsIDE2NTIsIDEzMjksIDE2NTMsIDE2NTQsIDEzMjksCi0gICAgIDE2NTUsIDEzMjksIDE2NTYsIDE2NTcsIDEzMjksIDE2NTgsIDEzMjksIDE2NTksIDE2NjAsIDEzMjksCi0gICAgIDE2NjEsIDE2NjIsIDE2NjIsIDE2NjIsIDE2NjIsIDE2NjMsIDEzMjksIDE2NjQsIDE2NjUsIDE2NjYsCi0gICAgIDE2NjcsIDE2NjgsIDE2NjksIDE2NzAsIDEzMjksIDE2NzEsIDEzMjksIDE2NzIsIDEzMjksIDEzMjksCi0gICAgIDE2NzMsIDEzMjksIDE2NzQsIDEzMjksIDE2NzUsIDEzMjksIDE2NzYsIDEzMjksIDE2NzcsIDEzMjksCi0gICAgIDE2NzgsIDEzMjksIDE2NzksIDEzMjksIDE2ODAsIDEzMjksIDE2ODEsIDEzMjksIDE2NTcsIDE2ODIsCi0gICAgIDEzMjksIDE2NTgsIDE2ODMsIDEzMjksIDE2NTksIDEzMjksIDE2ODQsIDE2NjIsIDE2NjIsIDE2NjIsCi0gICAgIDE2ODUsIDEzMjksIDE2ODYsIDE2ODcsIDEzMjksIDE2NzMsIDE2NzQsIDE2ODgsIDEzMjksIDE2NzUsCi0gICAgIDE2NzYsIDE2ODksIDEzMjksIDE2NzcsIDE2NzgsIDE2OTAsIDEzMjksIDE2NzksIDE2ODAsIDE2OTEsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCiAKLSAgICAgMTMyOSwgMTY4MSwgMTY5MiwgMTMyOSwgMTY5MywgMTMyOSwgMTY2MiwgMTY5NCwgMTMyOSwgMTY4NiwKLSAgICAgMTY5NSwgMTY5NiwgMTY5NywgMTY5OCwgMTY5OSwgMTY5MiwgMTcwMCwgMTMyOSwgMTY5MywgMTcwMSwKLSAgICAgMTY5NSwgMTY5NiwgMTY5NywgMTY5OCwgMTY5OSwgMTcwMiwgMTcwMSwgMTcwMiwgICAgMCwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKIAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAogCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCiAKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLQotICAgICAxMzI5LCAxMzI5CisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFs2NjIzXSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0Wzc0NTVdID0KICAgICB7ICAgMCwKICAgICAgICAgNCwgICAgNSwgICAgNiwgICAgNywgICAgOCwgICAgOSwgICAxMCwgICAxMSwgICAxMiwgICAxMSwKLSAgICAgICAxMywgICAxNCwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNiwgICAxNywgICAxOCwKLSAgICAgICAxOSwgICAyMCwgICAyMSwgICAyMSwgICAxMSwgICAyMiwgICAxMywgICAyMywgICAyNCwgICAyNSwKLSAgICAgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAyMSwgICAzMiwgICAzMywgICAzNCwKLSAgICAgICAzNSwgICAzNiwgICAyMSwgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICAyMSwKLSAgICAgICAyMSwgICA0MywgICA0NCwgICA0NCwgIDE4MCwgICA0NCwgICA0NCwgICA0NCwgICA0NCwgICA0NCwKLSAgICAgICA0NCwgICA0NCwgICA0NCwgICA0NCwgICA0NCwgICA2OSwgICA0NCwgICA0NCwgICA0NCwgICA0NCwKLSAgICAgICA0NCwgICA0NCwgICA1MywgICA1NiwgICA1NywgMTMwNCwgICA0NCwgICA0NCwgICA0NCwgICA3MCwKLSAgICAgICA0NCwgICA1OSwgICA2MCwgICA1MywgICA0NCwgIDE1MSwgICA3MSwgIDE4MSwgICA0NCwgICA0OCwKLSAgICAgICA0OSwgICA1MCwgICA1MCwgICA1MCwgICA1MCwgICA1MCwgICA1MCwgICA1MSwgICA1MywgICA3OCwKKyAgICAgICAxMywgICAxNCwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNiwgICAxNywKKyAgICAgICAxOCwgICAxOSwgICAyMCwgICAyMSwgICAyMSwgICAxMSwgICAyMiwgICAxMywgICAyMywgICAyNCwKKyAgICAgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAyMSwgICAzMiwgICAzMywKKyAgICAgICAzNCwgICAzNSwgICAzNiwgICAyMSwgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwKKyAgICAgICAyMSwgICAyMSwgICA0MywgICA0NCwgICA0NCwgICA1MywgICA0NCwgICA0NCwgICA0NCwgICA0NCwKKyAgICAgICA0NCwgICA0NCwgICA0NCwgICA0NCwgIDExNiwgICA0NCwgICA1NywgICA1OCwgICA0NCwgICA2MCwKKyAgICAgICA2MSwgICA0NCwgICA0NCwgIDExNywgICA3MiwgICA4MywgICA4NCwgIDIwOSwgICA0NCwgICA0NCwKKyAgICAgICA0NCwgICA1MywgICA0NCwgIDIxMCwgIDI0MCwgICA0NCwgICA0NCwgICA0NCwgICA3MywgICA2NSwKKyAgICAgICA0NCwgICA2NiwgICA2NywgICA3OSwgICA4NSwgICA3NCwgICA2OCwgICA4MCwgMTEzNCwgICA4NiwKIAotICAgICAgIDc5LCAgIDUyLCAgIDUzLCAgIDU0LCAxMjgyLCAxMjY2LCAgIDQ4LCAgIDUyLCAgIDUyLCAgIDUyLAotICAgICAgIDUyLCAgIDUyLCAgIDUyLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLAotICAgICAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDU0LAotICAgICAgIDUzLCAgIDQ0LCAgIDgwLCAgIDYzLCAgIDQ0LCAgIDY0LCAgIDQ0LCAgIDgxLCAgIDgyLCAgIDQ0LAotICAgICAgIDY1LCAgMTc1LCAxMjYyLCAxMjU4LCAgMTA2LCAgIDY2LCAgMTc2LCAgIDYxLCAgIDU1LCAgIDY3LAotICAgICAgIDYxLCAgIDY4LCAgIDYxLCAgMTA3LCAgIDgzLCAgIDYxLCAgIDQ0LCAgIDUzLCAgIDUyLCAgIDUyLAotICAgICAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDYxLCAgIDc1LCAgIDcyLCAgMTAwLCAgMTMwLCAgIDczLAotICAgICAgIDUzLCAgMTAxLCAgIDYxLCAgIDc0LCAgMTg3LCAgIDc2LCAgMTA4LCAgMTIzLCAgIDc3LCAgMTg4LAotICAgICAgMTAyLCAgMTAzLCAgMTMxLCAgMTI0LCAgMTA0LCAgMTI1LCAgMTA1LCAgMTI2LCAgMTA5LCAxMjU0LAotICAgICAgMTEwLCAgMTI3LCAgMTExLCAgMTI4LCAgMTI5LCAgMTEyLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLAorICAgICAgIDQ0LCAgIDY5LCAgMjQxLCAgIDgxLCAgIDg3LCAgIDcwLCAgIDgyLCAgIDcxLCAgIDQ0LCAgIDQ4LAorICAgICAgIDQ5LCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUxLCAgMTk1LAorICAgICAgIDg4LCAgMTk2LCAgIDUyLCAgIDUzLCAgIDU0LCAgIDUzLCAgMzUyLCAgIDU1LCAgIDUyLCAgIDUyLAorICAgICAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLAorICAgICAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLAorICAgICAgIDU0LCAgIDUzLCAgIDQ0LCAgMTIzLCAgIDc1LCAgIDQ0LCAgNDQ3LCAgIDQ0LCAgMTI0LCAgMTI1LAorICAgICAgIDQ0LCAgMTI2LCAgMTI3LCAgMTkzLCAgIDc2LCAgMjA0LCAgMTk0LCAgIDc3LCAgMTk5LCAgIDYzLAorICAgICAgIDU2LCAgIDc4LCAgIDYzLCAgMjAwLCAgIDYzLCAgIDUzLCAgNTE1LCAgIDYzLCAgIDQ0LCAgIDYyLAorICAgICAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDYzLCAgMTEwLCAgIDg5LAorICAgICAgMjQ2LCAgIDkwLCAgMTExLCAgIDUzLCAgMTE4LCAgIDYzLCAgIDkxLCAgIDkyLCAgMjA1LCAgIDkzLAogCi0gICAgICAgNTMsICAgNTMsICAgNTMsIDEzMjksICAxODUsICAgOTMsICAgOTQsICAgNTMsIDEyNTAsIDEyMjcsCi0gICAgICAxODYsIDEyMjUsICAxNTUsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgODUsCi0gICAgICAgOTUsICAxNjEsICAgODYsICAgODcsICAgOTYsICAgODgsICAgNTMsICAgODksICAgOTcsICAgOTAsCi0gICAgICAgOTgsICAgOTEsICAxMTgsICAxMTMsICAgOTIsICAgNTMsICAxMTksICAgOTksICAxMTQsICAxMTUsCi0gICAgICAxMzMsICAxMTYsICAxMTcsICAxNjgsICAxMjAsIDExNzgsIDEwNzcsICAyMTYsICAxMzQsICAxMjEsCi0gICAgICAgNDQsICAxMjIsICAxMzUsICAgNDQsICAxMzYsICAgNDQsICAgNTMsICAxNjQsICAgNDQsICAxNDAsCi0gICAgICAxNDEsICAxNDEsICAxNDEsICAxNDEsICAxNDEsICAyMTcsICAgNTMsICAgNDQsICAgNTMsICAxNDMsCi0gICAgICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAgNDQsICAgNDksICAxNDIsICAxNDIsICAxNDIsCi0gICAgICAxNDIsICAxNDIsICAxNDIsICAxNjUsIDExNDYsICAxOTEsICAzNTUsICAxNDMsICAxOTIsICAxNjYsCi0gICAgICAxOTMsICAzNTYsICAgNTMsICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAxNDYsCisgICAgICAyNDcsICAxMTIsICAxMTMsICAgOTQsICAxNDUsICAxMTQsICAxMTksICAxMTUsICAxMjAsICAyMTEsCisgICAgICAxMjEsICAzNDEsICAxNDYsICAxMjIsICAyMTIsICAzMzksICAxNDcsICAzNDAsICAxNDgsICAgNTMsCisgICAgICAgNTUsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsIDE0NTgsCisgICAgICAxMDMsICAxMDQsIDEyMjIsICAgNTMsICAxODEsICAzNDIsICAxNDAsICAyMDYsICAxNDEsICAgNTMsCisgICAgICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgOTUsICAxMDUsICA0NDcsICAgOTYsICAgOTcsCisgICAgICAxMDYsICAgOTgsICAxNDIsICAgOTksICAxMDcsICAxMDAsICAxMDgsICAxMDEsICAxMjgsICAxNDMsCisgICAgICAxMDIsICAxODIsICAxMjksICAxMDksICAyMDcsICAyMzQsICAxMzMsICAxODMsICAyMTUsICAyMDgsCisgICAgICAxMzAsICAyMTYsICAxMzQsICAyMTcsICAxMzUsICAxMzEsICAxMzYsICAxMzIsICAyMzUsICAyNDMsCisgICAgICAxMzcsICAgNDQsICAxMzgsICAxMzksICAgNDQsICA3MzgsICAgNDQsICAgNTMsICAyNDQsICAgNDQsCisgICAgICAxNTUsICAxNTUsICAxNTUsICAxNTUsICAxNTUsICAxNTUsICAxNTUsICAgNjMsICAgNTMsICAgNDQsCiAKLSAgICAgIDE0NiwgIDE0NiwgIDE0NiwgIDE0NiwgIDE0NiwgICA2MSwgICA0OCwgIDEzMSwgICA2MSwgIDE0NiwKLSAgICAgICA2MSwgICA1MywgIDIxMCwgICA2MSwgIDE4MiwgIDE0NiwgIDE0NiwgIDE0NiwgIDE0NiwgIDE0NiwKLSAgICAgIDE0NiwgICA0NCwgICA2MSwgICA0OCwgICA0NCwgIDIxMSwgICA0NCwgICA0OCwgMTE0NCwgICA0NCwKLSAgICAgICA2MSwgIDIyMiwgIDE0NywgIDE0OCwgIDE0OCwgIDE0OCwgIDE0OCwgIDE0OCwgICA0NCwgMTEzOCwKLSAgICAgIDE4MywgIDIyMywgIDE0OSwgMTMyOSwgICA0OCwgIDE4NCwgICA0NCwgIDcxNCwgIDE0OSwgIDE0OSwKLSAgICAgIDE0OSwgIDE0OSwgIDE0OSwgIDE0OSwgICA1MywgIDE0MywgIDE0MywgIDE0MywgIDE0MywgIDE0MywKLSAgICAgIDE0MywgIDIxOSwgICA1MywgIDIzNywgIDIzNywgIDIzNywgIDIzNywgIDIzNywgIDIzNywgMTMyOSwKLSAgICAgIDIyMCwgICA1MywgIDIzNywgIDIzNywgIDIzNywgIDIzNywgIDIzNywgIDIzNywgMTEzNiwgIDI5OSwKLSAgICAgMTEzMCwgMTEyOCwgIDI4MCwgMTMyOSwgMTEyMiwgIDM4OCwgIDQyMiwgIDE1MCwgIDIzMywgIDE0MSwKLSAgICAgIDE0MSwgIDE0MSwgIDE0MSwgIDE0MSwgIDE0MSwgIDI4MSwgMTEyMCwgICA1MywgIDM4OSwgMTMyOSwKKyAgICAgICA2MywgIDQxMywgICA2MywgIDMyMSwgIDczNSwgICA2MywgIDQxNCwgICA0NCwgIDE1MiwgIDE1MiwKKyAgICAgIDE1MiwgIDE1MiwgIDE1MiwgIDE1MiwgIDE1MiwgICA2MywgIDMyMiwgMTQ1OCwgMTQ1OCwgIDE1MiwKKyAgICAgICA1MywgMTQ1OCwgICA1MywgICA2MywgICA1MywgIDE1MiwgIDE1MiwgIDE1MiwgIDE1MiwgIDE1MiwKKyAgICAgIDE1MiwgIDE1MywgIDE1NCwgIDE1NCwgIDE1NCwgIDE1NCwgIDE1NCwgIDE1NCwgICA1MywgMTQ1OCwKKyAgICAgMTIyNSwgMTQ1OCwgIDE1NSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgICA1MywgMTQ1OCwgIDE1NSwgIDE1NSwKKyAgICAgIDE1NSwgIDE1NSwgIDE1NSwgIDE1NSwgICA0OSwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwKKyAgICAgIDE1NiwgIDE1NiwgIDI3NSwgIDQ0NywgICA1MywgMTQ1OCwgIDE1NywgMTQ1OCwgICA1MywgIDY3MywKKyAgICAgIDI3NywgMTQ1OCwgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE1NywgICA2MiwgIDE1NywKKyAgICAgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE2MCwgIDE2MCwgIDE2MCwgIDE2MCwKKyAgICAgIDE2MCwgIDE2MCwgIDE2MCwgIDM3NywgIDM3OCwgIDM3OSwgIDM4MCwgIDE2MCwgIDQ5MCwgIDczMCwKIAotICAgICAgNDIzLCAgMjM0LCAgMzAwLCAgMzAzLCAgMzA0LCAgMzA0LCAgMzA0LCAgMzA0LCAgMzA0LCAxMzI5LAotICAgICAgMzE4LCAgMzE5LCAgMzE5LCAgMzE5LCAgMzE5LCAgMzE5LCAxMzI5LCAgMzIxLCAgMzIxLCAgMzIxLAotICAgICAgMzIxLCAgMzIxLCAgMzIxLCAgIDUzLCAgMzg5LCAxMzI5LCAgNDE4LCAgMjM0LCAgMjM1LCAgMjM1LAotICAgICAgMjM1LCAgMjM1LCAgMjM1LCAgMjM1LCAgMjM2LCAxMzI5LCAxMzI5LCAxMzI5LCAgMjM3LCAgNDE5LAotICAgICAxMTE1LCAgMzc3LCAgIDQ4LCAxMTcwLCAgMjM3LCAgMjM3LCAgMjM3LCAgMjM3LCAgMjM3LCAgMjM3LAotICAgICAgMjQwLCAgMjQxLCAgMjQxLCAgMjQxLCAgMjQxLCAgMjQxLCAgMjQyLCAgMjQ0LCAgMzEyLCAgIDQ4LAotICAgICAgMjQzLCAxMzI5LCAxMzI5LCAxMzI5LCAgMjQ2LCAgNDQyLCAgMjQzLCAgMjQzLCAgMjQzLCAgMjQzLAotICAgICAgMjQzLCAgMjQzLCAgMjQ0LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ2LAotICAgICAxMjM3LCAxMDc1LCAgMzU4LCAgMjQ3LCAgNDUyLCAgMjQ4LCAxMDcxLCAgMzU5LCAgMzM0LCAgMjQ3LAotICAgICAgMjQ3LCAgMjQ3LCAgMjQ3LCAgMjQ3LCAgMjQ3LCAgMzM1LCAgMzYwLCAgNDUzLCAgMzYxLCAgMzYyLAorICAgICAgIDUzLCAgNTY0LCAgNDk0LCAgMTYwLCAgMTYwLCAgMTYwLCAgMTYwLCAgMTYwLCAgMTYwLCAgIDQ0LAorICAgICAgNTY1LCAgNDkxLCAgIDQ0LCAgMzgxLCAgIDQ0LCAgNDMxLCAgNDk1LCAgIDQ0LCAgNDU4LCAgNDU4LAorICAgICAgMTYxLCAgMTYyLCAgMTYyLCAgMTYyLCAgMTYyLCAgMTYyLCAgMTYyLCAgIDQ0LCAgIDUzLCAgMjYzLAorICAgICAgNzMxLCAgMTYzLCAgNDU5LCAxNDU4LCAxMjI4LCAgIDQ0LCAgIDUzLCAgMTYzLCAgMTYzLCAgMTYzLAorICAgICAgMTYzLCAgMTYzLCAgMTYzLCAgMjU4LCAgNTY3LCAgMjU5LCAgMjU5LCAgMjU5LCAgMjU5LCAgMjU5LAorICAgICAgMjU5LCAgMjU5LCAgMzYyLCAgNTY4LCAgIDUzLCAgMjYzLCAgMjU5LCAxNDU4LCAgNDU5LCAxNDU4LAorICAgICAgNTIzLCAgNzQwLCAgMjU5LCAgMjU5LCAgMjU5LCAgMjU5LCAgMjU5LCAgMjU5LCAgMjYwLCAgMjYxLAorICAgICAgMjYxLCAgMjYxLCAgMjYxLCAgMjYxLCAgMjYxLCAgMjYxLCAgMjc1LCAgNDYyLCAgNDQ3LCAgIDUzLAorICAgICAgMjYyLCAxNDU4LCAgMjYzLCAxNDU4LCAxNDU4LCAgNDY0LCAgMjYyLCAgMjYyLCAgMjYyLCAgMjYyLAorICAgICAgMjYyLCAgMjYyLCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzY4LAogCi0gICAgICA0ODEsICAzNjMsICAzNzksICAzODAsICAzODAsICAzODAsICAzODAsICAzODAsICAzMzYsICA0ODIsCi0gICAgICA0ODQsICAyNDgsICAgNTMsICAyMzcsICAyMzcsICAyMzcsICAyMzcsICAyMzcsICAyMzcsICA0ODUsCi0gICAgIDEwNjksICAzNzcsICAgNTMsICA0NTMsICAzMzcsIDEzMjksICAzODIsICAzODIsICAzODIsICAzODIsCi0gICAgICAzODIsICAzODIsICAzODgsICAzMTksICAzMTksICAzMTksICAzMTksICAzMTksICAzMTksIDExMDUsCi0gICAgICAzNzcsICAyNTcsICAzMDUsICAzMDUsICAzMDUsICAzMDUsICAzMDUsICAzMDUsICAgNTMsIDExMDIsCi0gICAgICAzOTIsICAzNzcsICAzMDUsIDEwOTksIDEzMjksIDEzMjksIDEzMjksICAzOTQsICAzMDUsICAzMDUsCi0gICAgICAzMDUsICAzMDUsICAzMDUsICAzMDUsICAgNDksICAzMDYsICAzMDYsICAzMDYsICAzMDYsICAzMDYsCi0gICAgICAzMDYsICAyMzYsICAzMTIsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTQsCi0gICAgIDEzMjksIDEzMjksIDEzMjksICAzMTUsIDEzMjksICAzMTYsICAzNzcsIDEwOTYsICAzNzcsICAzMTUsCi0gICAgICAzMTUsICAzMTUsICAzMTUsICAzMTUsICAzMTUsIDEzMjksICAzOTEsICAzOTEsICAzOTEsICAzOTEsCisgICAgICAzNjksICAzNjksICAzNjksICAzNjksICAzNjksICAzNjksICA1MzMsIDE0NTgsICAyNjMsICAyNjQsCisgICAgICAyNjIsICAyNjIsICAyNjIsICAyNjIsICAyNjIsICAyNjIsICAyNjIsIDE0NTgsIDE0NTgsIDEyMzEsCisgICAgICA1MzQsICAyNjIsICAzNzcsICAzNzgsICAzNzksICAzODAsICA0NDcsICAyNjIsICAyNjIsICAyNjIsCisgICAgICAyNjIsICAyNjIsICAyNjIsICAyNjUsICAyNjYsICAyNjYsICAyNjYsICAyNjYsICAyNjYsICAyNjYsCisgICAgICAyNjYsICAyNjcsIDEyMzQsIDE0NTgsIDE0NTgsICAyNjgsICA1MzQsIDE0NTgsIDE0NTgsICAgNTMsCisgICAgICA3NDYsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAgNTMsICAyNjgsICAyNjgsCisgICAgICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNzEsICAyNzIsICAyNzIsICAyNzIsICAyNzIsCisgICAgICAyNzIsICAyNzIsICAyNzMsIDE0NTgsIDE0NTgsICA3MzIsICAyNzQsICA1OTUsICA3MzMsICA4MDcsCisgICAgICAgNTMsICAgNTMsICAyNzQsICAyNzQsICAyNzQsICAyNzQsICAyNzQsICAyNzQsICAyNzUsICAyNzYsCisgICAgICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzcsICAgNTMsICA0NDcsIDExOTgsCiAKLSAgICAgIDM5MSwgIDM5MSwgIDQzNiwgIDQzNywgIDQzNywgIDQzNywgIDQzNywgIDQzNywgIDU0MSwgIDU0MywKLSAgICAgMTMyOSwgIDMxNiwgIDI0NCwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMCwgIDI0NiwKLSAgICAgMTMyOSwgIDU0MiwgIDU0NCwgIDMyMSwgMTMyOSwgMTA5MywgICA0OCwgIDM3NywgMTAwNSwgIDMyMSwKLSAgICAgIDMyMSwgIDMyMSwgIDMyMSwgIDMyMSwgIDMyMSwgIDMyMiwgIDMyMywgIDMyMywgIDMyMywgIDMyMywKLSAgICAgIDMyMywgIDM3NywgIDQ0NywgICA0OCwgIDcxNywgIDMyNCwgMTMyOSwgIDU0MiwgIDU0NCwgIDU3OCwKLSAgICAgMTMyOSwgIDMyNCwgIDMyNCwgIDMyNCwgIDMyNCwgIDMyNCwgIDMyNCwgIDM2NSwgIDMwNCwgIDMwNCwKLSAgICAgIDMwNCwgIDMwNCwgIDMwNCwgIDMwNCwgIDQ2MSwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwKLSAgICAgIDM2NiwgIDQ1MiwgIDM4MCwgIDM4MCwgIDM4MCwgIDM4MCwgIDM4MCwgIDM4MCwgMTMyOSwgIDQ1NSwKLSAgICAgIDQ1NSwgIDQ1NSwgIDQ1NSwgIDQ1NSwgIDQ1NSwgIDQ2NSwgIDQ2NiwgIDQ2NiwgIDQ2NiwgIDQ2NiwKLSAgICAgIDQ2NiwgIDU5MSwgIDYwMCwgIDYwMiwgICA0OCwgICA0OCwgIDM2NiwgIDM2OSwgIDM3MCwgIDM3MCwKKyAgICAgIDI3OCwgIDczOSwgIDI3OSwgIDU5NSwgIDM5MiwgIDgwNywgIDI3OCwgIDI3OCwgIDI3OCwgIDI3OCwKKyAgICAgIDI3OCwgIDI3OCwgIDM5MywgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwKKyAgICAgMTIwMCwgMTAwMSwgIDUzMywgMTIwNiwgIDU5NiwgIDM5NCwgICA1NSwgIDczNiwgIDI3OSwgIDM0NiwKKyAgICAgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwgMTQ1OCwgICA1MywgIDQyOSwgMTQ1OCwKKyAgICAgIDM0NiwgIDM5NSwgMTIwNCwgICA1NSwgICA1NSwgMTM2NiwgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwKKyAgICAgIDM0NiwgIDM0NiwgIDM0NywgIDM0OCwgIDM0OCwgIDM0OCwgIDM0OCwgIDM0OCwgIDM0OCwgIDczNCwKKyAgICAgIDc1MiwgICA1NSwgMTQ1OCwgIDM0OSwgIDQyOSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgICA1MywgIDM0OSwKKyAgICAgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwgIDI2MCwgIDM1MCwgIDM1MCwgIDM1MCwgIDM1MCwKKyAgICAgIDM1MCwgIDM1MCwgIDM1MCwgIDM1MSwgIDM1MSwgIDM1MSwgIDM1MSwgIDM1MSwgIDM1MSwgIDM1MSwKKyAgICAgIDUyOCwgIDUzNywgMTQ1OCwgMTQ1OCwgIDM1MSwgMTQ1OCwgICA1MywgICA1NSwgIDY4MSwgIDY4NCwKIAotICAgICAgMzcwLCAgMzcwLCAgMzcwLCAgNDU2LCAgNTkyLCAgNjAxLCAgNjAzLCAgMzcxLCAgNjk1LCAgIDQ4LAotICAgICAgNTgxLCAgIDQ4LCAgIDQ4LCAgMzcxLCAgMzcxLCAgMzcxLCAgMzcxLCAgMzcxLCAgMzcxLCAgMzc1LAotICAgICAgMzc2LCAgMzc2LCAgMzc2LCAgMzc2LCAgMzc2LCAgMzc3LCAgIDQ4LCAxMzI5LCAgNzA4LCAgMzc4LAotICAgICAgNTkyLCAgNjAxLCAgNjAzLCAgNzA3LCAgNjk1LCAgMzc4LCAgMzc4LCAgMzc4LCAgMzc4LCAgMzc4LAotICAgICAgMzc4LCAgMzEyLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzE0LCAgNTQ3LAotICAgICAgNTg2LCAxMzI5LCAgMzgyLCAxMzI5LCAgIDQ4LCAgIDQ4LCAgNTQ5LCAgNzIzLCAgMzgyLCAgMzgyLAotICAgICAgMzgyLCAgMzgyLCAgMzgyLCAgMzgyLCAgMzgzLCAgMzg0LCAgMzg0LCAgMzg0LCAgMzg0LCAgMzg0LAotICAgICAgMzc3LCAgIDQ4LCAgIDQ4LCAxMzI5LCAgMzg1LCAgNzE1LCAgNzEzLCAxMzI5LCAgIDQ4LCAgIDQ4LAotICAgICAgMzg1LCAgMzg1LCAgMzg1LCAgMzg1LCAgMzg1LCAgMzg1LCAgMjQ0LCAgMzkwLCAgMzkwLCAgMzkwLAotICAgICAgMzkwLCAgMzkwLCAgMzkwLCAgMjQ2LCAgMzc3LCAgIDQ4LCAgIDQ4LCAgMzkxLCAgNzE4LCAxMzI5LAorICAgICAgMzUxLCAgMzUxLCAgMzUxLCAgMzUxLCAgMzUxLCAgMzUxLCAgMzUzLCAgMzU0LCAgMzU0LCAgMzU0LAorICAgICAgMzU0LCAgMzU0LCAgMzU0LCAgMzU0LCAxMjk5LCAgIDU1LCAxMjk5LCAgNDQ3LCAgMzU1LCAxMjQ0LAorICAgICAxMDQwLCAxNDU4LCAgODE5LCAxMjQ5LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LAorICAgICAgMzU4LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzYyLCAgMzYzLAorICAgICAgMzYzLCAgMzYzLCAgMzYzLCAgMzYzLCAgMzYzLCAgMzYzLCAgMzY0LCAgNjQxLCAgNDE3LCAgNjM1LAorICAgICAgMzY1LCAxMjUxLCAgMzY2LCAgNDE4LCAxMDQ5LCAgNjQzLCAgMzY1LCAgMzY1LCAgMzY1LCAgMzY1LAorICAgICAgMzY1LCAgMzY1LCAgNDE5LCAgNjM2LCAgNDIwLCAgNDIxLCAxNDU4LCAgNDIyLCAgNDQ5LCAgNDUwLAorICAgICAgNDUwLCAgNDUwLCAgNDUwLCAgNDUwLCAgNDUwLCAgIDU1LCAgNjM1LCAgIDU1LCAgMzY2LCAgMjc1LAorICAgICAgMzcwLCAgMzcwLCAgMzcwLCAgMzcwLCAgMzcwLCAgMzcwLCAgMzcwLCAgMjc3LCAxMjU3LCAgNjM2LAorICAgICAxNDU4LCAgMzcxLCAxNDU4LCAgIDU1LCAgODI5LCAgIDU1LCAgNjM3LCAgMzcxLCAgMzcxLCAgMzcxLAogCi0gICAgICAgNDgsICAgNDgsIDExNzAsICAzOTEsICAzOTEsICAzOTEsICAzOTEsICAzOTEsICAzOTEsICAzOTIsCi0gICAgICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTQsICAgNDgsICAgNDgsIDEzMjksCi0gICAgICAzOTUsIDEzMjksICAzOTYsICA3ODcsIDEzMjksIDEzMjksICAzOTUsICAzOTUsICAzOTUsICAzOTUsCi0gICAgICAzOTUsICAzOTUsIDEzMjksICA0NjgsICA0NjgsICA0NjgsICA0NjgsICA0NjgsICA0NjgsICA1MjEsCi0gICAgICA1MjIsICA1MjIsICA1MjIsICA1MjIsICA1MjIsIDEzMjksICA3NTksIDEzMjksICAzOTYsICA0MDMsCi0gICAgIDEzMjksIDEzMjksIDEzMjksICA0MDQsICA4NjksICA4NzgsICA0MDUsICAgNDgsICA2OTYsICA0MDYsCi0gICAgICA2OTgsICA0MDcsICA0MDgsICA0MDksICA0MTAsICA0MzgsICA0MzgsICA0MzgsICA0MzgsICA0MzgsCi0gICAgICA0MzgsICA2OTcsICA3NTksICA2OTksICAgNDgsICA0MzgsICA5NTYsICAzNzcsIDEzMjksICA3ODgsCi0gICAgICA4NjksICA0MzgsICA0MzgsICA0MzgsICA0MzgsICA0MzgsICA0MzgsICAzMTIsICA0NDEsICA0NDEsCi0gICAgICA0NDEsICA0NDEsICA0NDEsICA0NDEsICA0NDIsICA1OTUsICA2MDYsICA2OTcsICA0NDMsICA2OTksCisgICAgICAzNzEsICAzNzEsICAzNzEsICAzNzIsICAzNzMsICAzNzMsICAzNzMsICAzNzMsICAzNzMsICAzNzMsCisgICAgICA2MzgsIDEyNTksICA4MjAsIDEwNjAsICAzNzQsIDEyNjUsIDE0NTgsICAgNTUsIDEyNjcsICAgNTUsCisgICAgICAzNzQsICAzNzQsICAzNzQsICAzNzQsICAzNzQsICAzNzQsICA0MjQsICA2MzcsICA0MjUsICA0MjUsCisgICAgICA0MjUsICA0MjUsICA0MjUsICA0MjUsICA0MjUsICAgNTUsICA2MzgsICAgNTUsIDEwNzIsICA0MjUsCisgICAgICA4MjUsIDE0NTgsICAgNTUsICAgNTUsICA3NDcsICA0MjUsICA0MjUsICA0MjUsICA0MjUsICA0MjUsCisgICAgICA0MjUsICA0MjYsICA0MjcsICA0MjcsICA0MjcsICA0MjcsICA0MjcsICA0MjcsICA0MjcsIDEyNzMsCisgICAgICAgNTUsICAgNTUsICAgNTUsICA0MjgsICA4MjYsICA0MjksIDEyNzUsIDE0NTgsIDEwODQsICA0MjgsCisgICAgICA0MjgsICA0MjgsICA0MjgsICA0MjgsICA0MjgsICA1MTIsICA1MTIsICA1MTIsICA1MTIsICA1MTIsCisgICAgICA1MTIsICA1MTIsICA1NDIsICA1NDMsICA1NDMsICA1NDMsICA1NDMsICA1NDMsICA1NDMsICA2OTQsCisgICAgICA3NDUsICA0MjksICA0MzAsICA0MjgsICA0MjgsICA0MjgsICA0MjgsICA0MjgsICA0MjgsICA0MjgsCiAKLSAgICAgIDMxNiwgIDk1MiwgIDcyNiwgIDcyOSwgIDQ0MywgIDQ0MywgIDQ0MywgIDQ0MywgIDQ0MywgIDQ0MywKLSAgICAgMTMyOSwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyOSwgIDUzMCwgIDUzMCwKLSAgICAgIDUzMCwgIDUzMCwgIDUzMCwgIDk1MCwgIDczOSwgICA0OCwgIDMxNiwgIDQ0NywgIDQ0OCwgIDQ0OCwKLSAgICAgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OSwgIDk0NCwgIDcwMiwgIDc0MCwgIDQ1MCwgIDM3NywKLSAgICAgIDQ1MSwgIDk0MCwgICA0OCwgIDcwNCwgIDQ1MCwgIDQ1MCwgIDQ1MCwgIDQ1MCwgIDQ1MCwgIDQ1MCwKLSAgICAgIDUzMywgIDUzNCwgIDUzNCwgIDUzNCwgIDUzNCwgIDUzNCwgMTMyOSwgIDUzNiwgIDUzNiwgIDUzNiwKLSAgICAgIDUzNiwgIDUzNiwgIDUzNiwgIDc0MCwgICA0OCwgICA0OCwgIDQ1MSwgIDMxMiwgIDQ1NCwgIDQ1NCwKLSAgICAgIDQ1NCwgIDQ1NCwgIDQ1NCwgIDQ1NCwgIDQ0MiwgIDkzOCwgMTMyOSwgIDkzMiwgIDQ1NSwgIDM3NywKLSAgICAgMTMyOSwgICA0OCwgICA0OCwgICA0OCwgIDQ1NSwgIDQ1NSwgIDQ1NSwgIDQ1NSwgIDQ1NSwgIDQ1NSwKLSAgICAgIDQ1NiwgIDQ1NywgIDQ1NywgIDQ1NywgIDQ1NywgIDQ1NywgIDQ1NywgIDQ1OCwgIDcwOSwgIDcxMCwKKyAgICAgICA1MywgMTIwNiwgMTMwNywgIDY5NSwgIDQyOCwgMTEzNCwgICA1NSwgICA1NSwgMTM1NCwgIDY5NCwKKyAgICAgIDQyOCwgIDQyOCwgIDQyOCwgIDQyOCwgIDQyOCwgIDQyOCwgIDQzMiwgIDQzMywgIDQzMywgIDQzMywKKyAgICAgIDQzMywgIDQzMywgIDQzMywgMTQ1OCwgICA1NSwgICA1NSwgMTQ1OCwgIDQzNCwgIDgyNywgIDY5NSwKKyAgICAgICA1NSwgIDc0OSwgICA1NSwgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwgIDQzNCwgIDI2NSwKKyAgICAgIDQzNSwgIDQzNSwgIDQzNSwgIDQzNSwgIDQzNSwgIDQzNSwgIDQzNSwgMTM1NiwgICA1NSwgMTQ1OCwKKyAgICAgICA1NSwgIDQzNiwgMTQ1OCwgIDgzMCwgMTQ1OCwgIDg3OCwgMTM3OSwgIDQzNiwgIDQzNiwgIDQzNiwKKyAgICAgIDQzNiwgIDQzNiwgIDQzNiwgICA1MywgIDQzNiwgIDQzNiwgIDQzNiwgIDQzNiwgIDQzNiwgIDQzNiwKKyAgICAgIDQzNiwgIDQzOSwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgMTQ1OCwgIDY4OSwKKyAgICAgMTQ1OCwgIDg3OCwgIDQ0MSwgMTM4MywgICA1NSwgICA1NSwgMTM4NywgIDg0MiwgIDQ0MSwgIDQ0MSwKKyAgICAgIDQ0MSwgIDQ0MSwgIDQ0MSwgIDQ0MSwgIDQ0NSwgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwKIAotICAgICAgIDQ4LCAgNDU5LCAxMzI5LCAgNDYwLCAgOTI4LCAgNzg5LCAxMzI5LCAgNDU5LCAgNDU5LCAgNDU5LAotICAgICAgNDU5LCAgNDU5LCAgNDU5LCAgNTQxLCAgNDYyLCAgNDYyLCAgNDYyLCAgNDYyLCAgNDYyLCAgNDYyLAotICAgICAgMjQ0LCAgNDY0LCAgNDY0LCAgNDY0LCAgNDY0LCAgNDY0LCAgNDY0LCAgIDQ4LCAgIDQ4LCAgNDYwLAotICAgICAgMzkyLCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgMzk0LCAgOTI2LCAxMzI5LAotICAgICAxMzI5LCAgNDY4LCAgIDQ4LCAgOTIxLCAgIDQ4LCAgIDQ4LCAgMzc3LCAgNDY4LCAgNDY4LCAgNDY4LAotICAgICAgNDY4LCAgNDY4LCAgNDY4LCAgNDY5LCAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLCAgNDcwLCAgIDQ4LAotICAgICAgNzkwLCAgNzEyLCAgOTE3LCAgNDcxLCAgNzkxLCAxMzI5LCAxMzI5LCAgOTEyLCAgMzc3LCAgNDcxLAotICAgICAgNDcxLCAgNDcxLCAgNDcxLCAgNDcxLCAgNDcxLCAgNDM3LCAgNDM3LCAgNDM3LCAgNDM3LCAgNDM3LAotICAgICAgNDM3LCAgNjExLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNTA2LCAgNTQzLCAgNDY2LAotICAgICAgNDY2LCAgNDY2LCAgNDY2LCAgNDY2LCAgNDY2LCAxMzI5LCAgNTQ2LCAgNTQ2LCAgNTQ2LCAgNTQ2LAorICAgICAgNDQ2LCAgNDQ3LCAgIDU1LCAgIDU1LCAxNDU4LCAgNDQ4LCAxMzkxLCAgOTA2LCAgOTA3LCAgIDU1LAorICAgICAgIDU1LCAgNDQ4LCAgNDQ4LCAgNDQ4LCAgNDQ4LCAgNDQ4LCAgNDQ4LCAgMzYyLCAgNDUxLCAgNDUxLAorICAgICAgNDUxLCAgNDUxLCAgNDUxLCAgNDUxLCAgNDUxLCAgMzY0LCAgNjk4LCAgIDU1LCAgIDU1LCAgNDUyLAorICAgICAxMzk1LCAgIDU1LCAgOTA4LCAgOTEwLCAgODQ1LCAgNDUyLCAgNDUyLCAgNDUyLCAgNDUyLCAgNDUyLAorICAgICAgNDUyLCAgNDUzLCAgNDU0LCAgNDU0LCAgNDU0LCAgNDU0LCAgNDU0LCAgNDU0LCAgNDQ3LCAgIDU1LAorICAgICAxNDExLCAxNDMzLCAgNDU1LCAgIDUzLCAgOTEyLCAgIDU1LCAgIDU1LCAgIDU1LCAgNDU1LCAgNDU1LAorICAgICAgNDU1LCAgNDU1LCAgNDU1LCAgNDU1LCAgMjc1LCAgNDYwLCAgNDYwLCAgNDYwLCAgNDYwLCAgNDYwLAorICAgICAgNDYwLCAgNDYwLCAgMjc3LCAgIDU1LCAgIDU1LCAgIDU1LCAgNDYxLCAgOTE1LCAgOTEzLCAgIDUzLAorICAgICAgIDU1LCAgIDU1LCAgNDYxLCAgNDYxLCAgNDYxLCAgNDYxLCAgNDYxLCAgNDYxLCAgNDYyLCAgNDYzLAorICAgICAgNDYzLCAgNDYzLCAgNDYzLCAgNDYzLCAgNDYzLCAgNDYzLCAgNDY0LCAgNzA5LCAgIDU1LCAgIDU1LAogCi0gICAgICA1NDYsICA1NDYsICA1OTEsICA1MjIsICA1MjIsICA1MjIsICA1MjIsICA1MjIsICA1MjIsICA3NDgsCi0gICAgICA3NTAsICAgNDgsICAgNDgsICA1MDYsICA1MDksICA1MTAsICA1MTAsICA1MTAsICA1MTAsICA1MTAsCi0gICAgICAzNzcsIDExMTIsICA3NDksICA3NTEsICA1MTEsICA5ODgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsCi0gICAgICA1MTEsICA1MTEsICA1MTEsICA1MTEsICA1MTEsICA1MTEsICA1MTIsICA1MTMsICA1MTMsICA1MTMsCi0gICAgICA1MTMsICA1MTMsICA3MTksICAgNDgsICAgNDgsICA3OTIsICA1MTQsICA3OTYsICA3NDksICA3NTEsCi0gICAgICAgNDgsICA4OTIsICA1MTQsICA1MTQsICA1MTQsICA1MTQsICA1MTQsICA1MTQsICA1MTgsICA1MTksCi0gICAgICA1MTksICA1MTksICA1MTksICA1MTksICAzNzcsIDExMDUsIDEzMjksICAgNDgsICA1MjAsIDExMDIsCi0gICAgIDEzMjksICAgNDgsICA3OTMsICAgNDgsICA1MjAsICA1MjAsICA1MjAsICA1MjAsICA1MjAsICA1MjAsCi0gICAgICA0NDcsICA1MjMsICA1MjMsICA1MjMsICA1MjMsICA1MjMsICA1MjMsICA0NDksICAgNDgsIDEzMjksCi0gICAgICAgNDgsICA1MjQsIDEzMjksICA3OTQsICAgNDgsICA4OTAsIDEzMjksICA1MjQsICA1MjQsICA1MjQsCisgICAgICA0NjUsICA5OTQsICA0NjYsIDEwMTUsIDE0NTgsICA4NDgsICA0NjUsICA0NjUsICA0NjUsICA0NjUsCisgICAgICA0NjUsICA0NjUsICA1NDYsICA1NDcsICA1NDcsICA1NDcsICA1NDcsICA1NDcsICA1NDcsICA2MTUsCisgICAgICA2MTYsICA2MTYsICA2MTYsICA2MTYsICA2MTYsICA2MTYsICA0NDcsICA5OTQsICA0NjYsICA0NzUsCisgICAgIDE0NTgsIDE0NTgsICA0NDcsICA0NzYsIDE0NTgsICAgNTUsICA0NzcsICAgNTUsICA3MDMsICA0NzgsCisgICAgICA3MDMsICA0NzksICA0ODAsICA0ODEsICA0ODIsICA1MDksICA1MDksICA1MDksICA1MDksICA1MDksCisgICAgICA1MDksICA1MDksICA3MDQsICAgNTUsIDE0NTgsICAgNTUsICA1MDksIDE0NTgsIDEwMTEsICAgNTUsCisgICAgIDE0NTgsICA3NDEsICA1MDksICA1MDksICA1MDksICA1MDksICA1MDksICA1MDksICA1MTAsICA1MTEsCisgICAgICA1MTEsICA1MTEsICA1MTEsICA1MTEsICA1MTEsICAgNTMsICA4MTQsICAgNTUsICA3MDQsICA1MTIsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsICA4MTYsICA1MTIsICA1MTIsICA1MTIsICA1MTIsICA1MTIsCisgICAgICA1MTIsICA0MjYsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTQsCiAKLSAgICAgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNSwgIDUyNiwgIDUyNiwgIDUyNiwgIDUyNiwgIDUyNiwgIDM3NywKLSAgICAgIDczNCwgICA0OCwgMTMyOSwgIDUyNywgIDg4NiwgMTMyOSwgMTA5OSwgIDg5NiwgMTA5NiwgIDUyNywKLSAgICAgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDQ1NiwgIDUzNSwgIDUzNSwgIDUzNSwgIDUzNSwKLSAgICAgIDUzNSwgIDUzNSwgIDQ1OCwgIDkzNywgMTMyOSwgIDk0OSwgIDUzNiwgMTMyOSwgMTMyOSwgICA0OCwKLSAgICAgICA0OCwgMTA5MywgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNywgIDUzOCwKLSAgICAgIDUzOCwgIDUzOCwgIDUzOCwgIDUzOCwgIDM3NywgIDk4OCwgICA0OCwgICA0OCwgIDUzOSwgIDkzNywKLSAgICAgMTMyOSwgIDk0OSwgICA0OCwgMTMyOSwgIDUzOSwgIDUzOSwgIDUzOSwgIDUzOSwgIDUzOSwgIDUzOSwKLSAgICAgIDM5MiwgIDU0NSwgIDU0NSwgIDU0NSwgIDU0NSwgIDU0NSwgIDU0NSwgIDM5NCwgIDg3NiwgICA0OCwKLSAgICAgMTA3NywgIDU0NiwgMTMyOSwgIDk4MiwgICA0OCwgICA0OCwgICA0OCwgIDU0NiwgIDU0NiwgIDU0NiwKLSAgICAgIDU0NiwgIDU0NiwgIDU0NiwgIDU0NywgIDU0OCwgIDU0OCwgIDU0OCwgIDU0OCwgIDU0OCwgIDU0OCwKKyAgICAgIDUxNCwgIDUxNCwgIDUxNCwgIDUxNCwgIDUxNCwgIDUxNCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgIDUxNCwgMTQ1OCwgICA1NSwgICA1NSwgMTI5OSwgICA1NSwgIDUxNCwgIDUxNCwgIDUxNCwgIDUxNCwKKyAgICAgIDUxNCwgIDUxNCwgIDQzMSwgIDUxNiwgIDUxNiwgIDUxNiwgIDUxNiwgIDUxNiwgIDUxNiwgIDUxNiwKKyAgICAgICA1NSwgICA1NSwgMTQ1OCwgICA1NSwgIDUxNywgMTIzNCwgIDI2MywgMTQ1OCwgMTAxNywgMTIzMSwKKyAgICAgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDYyMywgIDYyNCwgIDYyNCwgIDYyNCwKKyAgICAgIDYyNCwgIDYyNCwgIDYyNCwgIDYyNywgIDYyOCwgIDYyOCwgIDYyOCwgIDYyOCwgIDYyOCwgIDYyOCwKKyAgICAgICA1NSwgIDcwNSwgIDI2MywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywKKyAgICAgMTA2NSwgMTIyOCwgMTQ1OCwgMTA3NywgIDUxNywgIDcwNiwgMTQ1OCwgMTIyNSwgICA1NSwgIDc0MiwKKyAgICAgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxNywgIDUxOCwgIDUxOCwgIDUxOCwgIDUxOCwKKyAgICAgIDUxOCwgIDUxOCwgIDUxOCwgICA1MywgMTIyMiwgIDgyMSwgMTA2NSwgIDUxOSwgMTQ1OCwgMTA3NywKIAotICAgICAgNTQ5LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgNTUwLCAgOTg1LCAgNTUxLCAgOTg2LCAxMzI5LCAgODcyLAotICAgICAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAxMzI5LCAgNTk0LCAgNTk0LCAgNTk0LAotICAgICAgNTk0LCAgNTk0LCAgNTk0LCAgNjAwLCAgNTMwLCAgNTMwLCAgNTMwLCAgNTMwLCAgNTMwLCAgNTMwLAotICAgICAgIDQ4LCAgNzYwLCAgNTUxLCAgNTc0LCAgNTc0LCAgNTc0LCAgNTc0LCAgNTc0LCAgNTc0LCAgNzQzLAotICAgICAgODcwLCAgNzU0LCAgMzc3LCAgNTc0LCAgNzYxLCAxMDY4LCAgODk5LCAgIDQ4LCAgOTAyLCAgNTc0LAotICAgICAgNTc0LCAgNTc0LCAgNTc0LCAgNTc0LCAgNTc0LCAgNDQ3LCAgNTc3LCAgNTc3LCAgNTc3LCAgNTc3LAotICAgICAgNTc3LCAgNTc3LCAgNTc4LCAgOTA1LCAgODg1LCAgMzc3LCAgNTc5LCAxMzI5LCAgNDUxLCAgOTAyLAotICAgICAgNzYxLCAxMDY4LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgMzEyLCAgNTMyLAotICAgICAgNTMyLCAgNTMyLCAgNTMyLCAgNTMyLCAgNTMyLCAgNjAyLCAgNTM0LCAgNTM0LCAgNTM0LCAgNTM0LAotICAgICAgNTM0LCAgNTM0LCAgNzYyLCAxMzI5LCAgNDUxLCAgNDU2LCAgNTgwLCAgNTgwLCAgNTgwLCAgNTgwLAorICAgICAxNDU4LCAgNzA2LCAxNDU4LCAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgIDUzLAorICAgICAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgNTE5LCAgMzYyLCAgNTIyLCAgNTIyLAorICAgICAgNTIyLCAgNTIyLCAgNTIyLCAgNTIyLCAgNTIyLCAgNTIzLCAxNDU4LCAgNzA1LCAxMjk5LCAgNTI0LAorICAgICAxMjA2LCAgMzY2LCAxMDAzLCAxMDg0LCAgNDQ3LCAgNTI0LCAgNTI0LCAgNTI0LCAgNTI0LCAgNTI0LAorICAgICAgNTI0LCAxNDU4LCAgNzE0LCAgNzE1LCAgNzE1LCAgNzE1LCAgNzE1LCAgNzE1LCAgNzE1LCAgNzE3LAorICAgICAgNzE4LCAgNzE4LCAgNzE4LCAgNzE4LCAgNzE4LCAgNzE4LCAgIDU1LCAgMzY2LCAgNTI4LCAgNTI5LAorICAgICAgNTI5LCAgNTI5LCAgNTI5LCAgNTI5LCAgNTI5LCAgNTI5LCAgNTMwLCAxNDU4LCAxMjM0LCAgODg1LAorICAgICAgNTMxLCAxMDgwLCAgNTMyLCAxMDc4LCAgIDU1LCAgNzQ0LCAgNTMxLCAgNTMxLCAgNTMxLCAgNTMxLAorICAgICAgNTMxLCAgNTMxLCAgNzIxLCAgNzIyLCAgNzIyLCAgNzIyLCAgNzIyLCAgNzIyLCAgNzIyLCAgIDUzLAorICAgICAgNzcyLCAgNzczLCAgNzczLCAgNzczLCAgNzczLCAgNzczLCAgNzczLCAgIDU1LCAgNTMyLCAgMzYyLAogCi0gICAgICA1ODAsICA1ODAsICA1ODEsICA3NjYsICA4NzYsICA3NjMsICA1ODIsICAzNzcsICA0NjAsICA4OTksCi0gICAgICA5MDUsICA4NzgsICA1ODIsICA1ODIsICA1ODIsICA1ODIsICA1ODIsICA1ODIsIDEzMjksICA2MDUsCi0gICAgICA2MDUsICA2MDUsICA2MDUsICA2MDUsICA2MDUsICA2MTQsICA2MTUsICA2MTUsICA2MTUsICA2MTUsCi0gICAgICA2MTUsICA3NjMsICAgNDgsICAgNDgsICA0NjAsICA1ODYsICA1ODcsICA1ODcsICA1ODcsICA1ODcsCi0gICAgICA1ODcsICA1ODcsICA1ODgsICAzNzcsICA4OTYsICAzNzcsICA1ODksIDEwMDcsICA1OTAsICAgNDgsCi0gICAgICAgNDgsIDEwODMsICA1ODksICA1ODksICA1ODksICA1ODksICA1ODksICA1ODksICA2MTgsICA2MTksCi0gICAgICA2MTksICA2MTksICA2MTksICA2MTksIDEzMjksICA2MjEsICA2MjEsICA2MjEsICA2MjEsICA2MjEsCi0gICAgICA2MjEsICAgNDgsICAgNDgsICAgNDgsICA1OTAsICA0NDcsICA1OTMsICA1OTMsICA1OTMsICA1OTMsCi0gICAgICA1OTMsICA1OTMsICA1NzgsICAzNzcsIDEzMjksICA5ODgsICA1OTQsIDEzMjksICAgNDgsICAgNDgsCi0gICAgICAgNDgsICA4ODcsICA1OTQsICA1OTQsICA1OTQsICA1OTQsICA1OTQsICA1OTQsICA1OTUsICA1OTYsCisgICAgICA1MzUsICA1MzUsICA1MzUsICA1MzUsICA1MzUsICA1MzUsICA1MzUsICA1MjMsIDEwNzIsICA0NDcsCisgICAgIDExOTcsICA1MzYsIDEyMzEsIDE0NTgsIDE0NTgsICAgNTUsICAgNTUsICA1MzYsICA1MzYsICA1MzYsCisgICAgICA1MzYsICA1MzYsICA1MzYsICA1MzcsICA1MzgsICA1MzgsICA1MzgsICA1MzgsICA1MzgsICA1MzgsCisgICAgICA1MzgsICA1MzksICA4MjIsICA4NzMsICAgNTUsICA1NDAsIDExOTcsICA1NDEsIDExMTAsIDE0NTgsCisgICAgIDE0NTgsICA1NDAsICA1NDAsICA1NDAsICA1NDAsICA1NDAsICA1NDAsICA3ODAsICA3ODEsICA3ODEsCisgICAgICA3ODEsICA3ODEsICA3ODEsICA3ODEsICA3ODQsICA3ODUsICA3ODUsICA3ODUsICA3ODUsICA3ODUsCisgICAgICA3ODUsICA4MDgsICAgNTUsICA1NDEsICA0NjIsICA1NDgsICA1NDgsICA1NDgsICA1NDgsICA1NDgsCisgICAgICA1NDgsICA1NDgsICA0NjQsIDEwNjgsIDEwNjYsICA4MDksICA1NDksIDE0NTgsICAgNTUsIDEwNjAsCisgICAgICAgNTUsICA4MDgsICA1NDksICA1NDksICA1NDksICA1NDksICA1NDksICA1NDksICA1NTAsICA1NTEsCisgICAgICA1NTEsICA1NTEsICA1NTEsICA1NTEsICA1NTEsIDE0NTgsICAgNTUsICA4MjQsICA0NDcsICA1NTIsCiAKLSAgICAgIDU5NiwgIDU5NiwgIDU5NiwgIDU5NiwgIDU5NiwgIDU5NywgIDg5MSwgIDc5NywgIDg4OCwgIDU5OCwKLSAgICAgMTMyOSwgIDU5OSwgIDk4OCwgMTMyOSwgIDcwNCwgIDU5OCwgIDU5OCwgIDU5OCwgIDU5OCwgIDU5OCwKLSAgICAgIDU5OCwgMTMyOSwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNCwgIDUyNCwgMTMyOSwgIDUzNiwKLSAgICAgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgICA0OCwgICA0OCwgIDU5OSwgIDQ1NiwgIDYwNCwKLSAgICAgIDYwNCwgIDYwNCwgIDYwNCwgIDYwNCwgIDYwNCwgIDU4MSwgIDc2NiwgMTMyOSwgIDk1OCwgIDYwNSwKLSAgICAgMTMyOSwgMTMyOSwgICA0OCwgICA0OCwgIDc2MiwgIDYwNSwgIDYwNSwgIDYwNSwgIDYwNSwgIDYwNSwKLSAgICAgIDYwNSwgIDYwNiwgIDYwNywgIDYwNywgIDYwNywgIDYwNywgIDYwNywgIDYwNywgIDYwOCwgIDg4OSwKLSAgICAgIDc2MCwgIDk4MSwgIDYwOSwgMTMyOSwgIDYxMCwgIDc1NCwgMTMyOSwgMTMyOSwgIDYwOSwgIDYwOSwKLSAgICAgIDYwOSwgIDYwOSwgIDYwOSwgIDYwOSwgIDY2MCwgIDY2MSwgIDY2MSwgIDY2MSwgIDY2MSwgIDY2MSwKLSAgICAgMTMyOSwgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDg3MCwgICA0OCwgICA0OCwKKyAgICAgMTExMywgIDgwOSwgICA1NSwgMTQ1OCwgICA1NSwgIDU1MiwgIDU1MiwgIDU1MiwgIDU1MiwgIDU1MiwKKyAgICAgIDU1MiwgIDU5MCwgIDgxMCwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwKKyAgICAgICA1NSwgMTQ1OCwgICA1NSwgMTIyOCwgIDU5MSwgMTExNCwgIDgxMSwgIDg2MiwgMTA1NiwgICA1NSwKKyAgICAgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MSwgIDU5MiwgIDU5MywgIDU5MywgIDU5MywKKyAgICAgIDU5MywgIDU5MywgIDU5MywgIDU5MywgMTA1NCwgIDg1MywgMTIwOSwgICA1NSwgIDU5NCwgMTIxMiwKKyAgICAgIDU5NSwgMTA0OSwgIDgxMSwgMTAyNCwgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwKKyAgICAgIDc5MiwgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDc5NSwgIDc5NiwgIDc5NiwKKyAgICAgIDc5NiwgIDc5NiwgIDc5NiwgIDc5NiwgIDgxMCwgICA1NSwgIDU5NSwgIDU5MiwgIDU5NCwgIDU5NCwKKyAgICAgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwgMTQ1OCwgIDg2MiwgIDQ0NywgMTQ1OCwgIDU5NCwKKyAgICAgMTQ1OCwgMTIyNSwgMTQ1OCwgICA1NSwgMTAyNywgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwgIDU5NCwKIAotICAgICAgNjEwLCAgNTQ3LCAgNjIwLCAgNjIwLCAgNjIwLCAgNjIwLCAgNjIwLCAgNjIwLCAgNTQ5LCAxMTI3LAotICAgICAgODcxLCAxMTM1LCAgNjIxLCAgOTQ2LCAgNzUwLCAgIDQ4LCAgIDQ4LCAgNzQ4LCAgNjIxLCAgNjIxLAotICAgICAgNjIxLCAgNjIxLCAgNjIxLCAgNjIxLCAgNjIyLCAgNjIzLCAgNjIzLCAgNjIzLCAgNjIzLCAgNjIzLAotICAgICAgNzk1LCAgODgxLCAxMTQzLCAgNzQzLCAgNjI0LCAxMTI3LCAgODcxLCAxMTM1LCAgIDQ4LCAgODcyLAotICAgICAgNjI0LCAgNjI0LCAgNjI0LCAgNjI0LCAgNjI0LCAgNjI0LCAgNjQ1LCAgNjQ2LCAgNjQ2LCAgNjQ2LAotICAgICAgNjQ2LCAgNjQ2LCAgODczLCAgOTM0LCAxMzI5LCAgIDQ4LCAgNjQ3LCAxMjI0LCAxMTQzLCAgIDQ4LAotICAgICAgIDQ4LCAgNzM5LCAgNjQ3LCAgNjQ3LCAgNjQ3LCAgNjQ3LCAgNjQ3LCAgNjQ3LCAgNDQ3LCAgNTIzLAotICAgICAgNTIzLCAgNTIzLCAgNTIzLCAgNTIzLCAgNTIzLCAgNTc4LCAgIDQ4LCAgIDQ4LCAgODczLCAgNTI0LAotICAgICAxMzI5LCAgNzM0LCAgIDQ4LCAxMjI0LCAgOTE3LCAgNTI0LCAgNTI0LCAgNTI0LCAgNTI0LCAgNTI0LAotICAgICAgNTI0LCAgNjQ4LCAgNjQ5LCAgNjQ5LCAgNjQ5LCAgNjQ5LCAgNjQ5LCAgOTE4LCAxMDg0LCAgIDQ4LAorICAgICAgNTk0LCAgNDMxLCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgODczLAorICAgICAgOTExLCAxNDU4LCAgODUzLCAgNTk4LCAxNDU4LCAxMjU2LCAxNDU4LCAxMDMwLCAxNDU4LCAgNTk4LAorICAgICAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LCAgIDUzLCAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LAorICAgICAgNTk4LCAgNTk4LCAgNTk4LCAgNTk5LCAgNTk5LCAgNTk5LCAgNTk5LCAgNTk5LCAgNTk5LCAgNTk5LAorICAgICAgODg1LCAxMjU2LCAxMDQ1LCAxMDQwLCAgNjAwLCAxMjY0LCAxMjcyLCAxNDU4LCAxMDMzLCAgNDQ3LAorICAgICAgNjAwLCAgNjAwLCAgNjAwLCAgNjAwLCAgNjAwLCAgNjAwLCAgIDUzLCAgNjAwLCAgNjAwLCAgNjAwLAorICAgICAgNjAwLCAgNjAwLCAgNjAwLCAgNjAwLCAgNjAzLCAgNjA0LCAgNjA0LCAgNjA0LCAgNjA0LCAgNjA0LAorICAgICAgNjA0LCAxMjY0LCAxMjcyLCAxNDU4LCAxMzUzLCAgNjA1LCAxMzgyLCAxMzg2LCAgIDU1LCAgIDU1LAorICAgICAgIDU1LCAgNjA1LCAgNjA1LCAgNjA1LCAgNjA1LCAgNjA1LCAgNjA1LCAgMzYyLCAgNDUxLCAgNDUxLAorICAgICAgNDUxLCAgNDUxLCAgNDUxLCAgNDUxLCAgNDUxLCAgNTIzLCAgIDU1LCAgIDU1LCAgIDU1LCAgNDUyLAogCi0gICAgIDEwODAsICA2NTAsIDEyNTMsIDEyNTcsICAgNDgsICAgNDgsICA5MjMsICA2NTAsICA2NTAsICA2NTAsCi0gICAgICA2NTAsICA2NTAsICA2NTAsICA0NTYsICA1MzUsICA1MzUsICA1MzUsICA1MzUsICA1MzUsICA1MzUsCi0gICAgICA1ODEsICAgNDgsICAgNDgsICA5MTgsICA1MzYsIDEyNjEsICAgNDgsICAgNDgsIDEyNTMsIDEyNTcsCi0gICAgICA1MzYsICA1MzYsICA1MzYsICA1MzYsICA1MzYsICA1MzYsICA2NTEsICA2NTIsICA2NTIsICA2NTIsCi0gICAgICA2NTIsICA2NTIsICA5ODQsICAgNDgsICAgNDgsIDEwODEsICA2NTMsICA5MTQsICAgNDgsIDEwODYsCi0gICAgICA4MTQsIDEyNjEsICA2NTMsICA2NTMsICA2NTMsICA2NTMsICA2NTMsICA2NTMsICA2NTcsICA2NTgsCi0gICAgICA2NTgsICA2NTgsICA2NTgsICA2NTgsICAzNzcsICAgNDgsICA5MTIsIDEwODIsICA2NTksICA3OTksCi0gICAgIDEyNjUsICAgNDgsICAgNDgsIDEwOTMsICA2NTksICA2NTksICA2NTksICA2NTksICA2NTksICA2NTksCi0gICAgICA1ODYsICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA1ODgsICAgNDgsICAgNDgsCi0gICAgIDEzMDMsICA2NjMsICA5MDUsICA5MDIsIDExNjUsICAgNDgsIDEyNjUsICA2NjMsICA2NjMsICA2NjMsCisgICAgIDEzNTMsICAgNTUsIDEzODIsIDEzODYsICA4NTgsICA0NTIsICA0NTIsICA0NTIsICA0NTIsICA0NTIsCisgICAgICA0NTIsICA2MDYsICA2MDcsICA2MDcsICA2MDcsICA2MDcsICA2MDcsICA2MDcsICA4NTksICAgNTUsCisgICAgIDEyMTAsIDEyMTEsICA2MDgsIDEyMjIsIDEyMTUsICAgNTUsICA0NDcsIDExMzYsICA2MDgsICA2MDgsCisgICAgICA2MDgsICA2MDgsICA2MDgsICA2MDgsICA2MTIsICA2MTMsICA2MTMsICA2MTMsICA2MTMsICA2MTMsCisgICAgICA2MTMsICA0NDcsIDEyNDEsICAgNTUsICA4NTksICA2MTQsIDExMTcsIDEyMzQsIDEyMzEsICAgNTUsCisgICAgICAgNTUsICA2MTQsICA2MTQsICA2MTQsICA2MTQsICA2MTQsICA2MTQsICA1MjgsICA2MTcsICA2MTcsCisgICAgICA2MTcsICA2MTcsICA2MTcsICA2MTcsICA2MTcsICA1MzAsIDEwMDEsICAgNTUsICAgNTUsICA2MTgsCisgICAgIDEyMjgsIDEyMjUsICAgNTUsICAgNTUsIDEwMDMsICA2MTgsICA2MTgsICA2MTgsICA2MTgsICA2MTgsCisgICAgICA2MTgsICA2MTksICA2MjAsICA2MjAsICA2MjAsICA2MjAsICA2MjAsICA2MjAsICA0NDcsIDEyMTMsCisgICAgICAgNTUsICAgNTUsICA2MjEsIDEyMjIsIDExMTcsICAgNTUsICAgNTUsICAgNTUsICA2MjEsICA2MjEsCiAKLSAgICAgIDY2MywgIDY2MywgIDY2MywgIDY2NCwgIDY2NSwgIDY2NSwgIDY2NSwgIDY2NSwgIDY2NSwgIDM3NywKLSAgICAgIDkyMSwgIDkzMiwgICA0OCwgIDY2NiwgIDg5OSwgMTIzMywgMTMwMywgMTA5NiwgMTA5OSwgIDY2NiwKLSAgICAgIDY2NiwgIDY2NiwgIDY2NiwgIDY2NiwgIDY2NiwgIDY2OCwgIDY2OSwgIDY2OSwgIDY2OSwgIDY2OSwKLSAgICAgIDY2OSwgIDY3MiwgIDY3MywgIDY3MywgIDY3MywgIDY3MywgIDY3MywgIDU5NSwgIDY3NCwgIDY3NCwKLSAgICAgIDY3NCwgIDY3NCwgIDY3NCwgIDY3NCwgIDU5NywgIDk0NCwgIDk1NiwgMTMxMSwgIDY3NSwgMTMxMiwKLSAgICAgIDg5NiwgICA0OCwgMTEwMiwgMTEwNSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY3NSwKLSAgICAgIDY3NiwgIDY3NywgIDY3NywgIDY3NywgIDY3NywgIDY3NywgIDM3NywgMTAwNSwgICA0OCwgIDg5NCwKLSAgICAgIDY3OCwgMTIzNCwgIDc5OSwgMTMxMSwgMTE3MCwgMTMxMiwgIDY3OCwgIDY3OCwgIDY3OCwgIDY3OCwKLSAgICAgIDY3OCwgIDY3OCwgMTMyOSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY3NSwgIDY4MCwKLSAgICAgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MywgIDY4NCwgIDY4NCwgIDY4NCwgIDY4NCwKKyAgICAgIDYyMSwgIDYyMSwgIDYyMSwgIDYyMSwgIDUzNywgIDYyOSwgIDYyOSwgIDYyOSwgIDYyOSwgIDYyOSwKKyAgICAgIDYyOSwgIDYyOSwgIDUzOSwgICA1NSwgICA1NSwgICA1NSwgIDYzMCwgMTAwMSwgMTM2MiwgMTI5NCwKKyAgICAgICA1NSwgMTIwNiwgIDYzMCwgIDYzMCwgIDYzMCwgIDYzMCwgIDYzMCwgIDYzMCwgIDYzMSwgIDYzMiwKKyAgICAgIDYzMiwgIDYzMiwgIDYzMiwgIDYzMiwgIDYzMiwgIDQ0NywgMTA0MCwgMTAwMywgICA1NSwgIDYzMywKKyAgICAgMTM5MCwgMTM2MywgIDgxNCwgICA1NSwgMTIyMiwgIDYzMywgIDYzMywgIDYzMywgIDYzMywgIDYzMywKKyAgICAgIDYzMywgIDQ2MiwgIDYzOSwgIDYzOSwgIDYzOSwgIDYzOSwgIDYzOSwgIDYzOSwgIDYzOSwgIDQ2NCwKKyAgICAgMTA0OSwgICA1NSwgMTM5NCwgIDY0MCwgMTQzMiwgMTQ0MCwgMTM5MCwgIDk5NywgMTIyNSwgIDY0MCwKKyAgICAgIDY0MCwgIDY0MCwgIDY0MCwgIDY0MCwgIDY0MCwgIDY0MSwgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MiwKKyAgICAgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MywgMTA2MCwgMTM2NCwgIDk5NSwgIDY0NCwgMTM5NCwgIDY0NSwKKyAgICAgMTQzMiwgMTQ0MCwgMTIyOCwgIDY0NCwgIDY0NCwgIDY0NCwgIDY0NCwgIDY0NCwgIDY0NCwgIDc5OSwKIAotICAgICAgNjg0LCAgNjg3LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjA2LCAgNjg5LCAgNjg5LAotICAgICAgNjg5LCAgNjg5LCAgNjg5LCAgNjg5LCAgNjA4LCAxMDc1LCAxMzEzLCAxMzE0LCAgNjkwLCAgNzAyLAotICAgICAgIDQ4LCAgIDQ4LCAxMDc3LCAgODc4LCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLAotICAgICAgNjkxLCAgNjkyLCAgNjkyLCAgNjkyLCAgNjkyLCAgNjkyLCAgMzc3LCAgIDQ4LCAgIDQ4LCAgNjk4LAotICAgICAgNjkzLCAgNjk2LCAxMzEzLCAxMzE0LCAgNzI5LCAxMjgwLCAgNjkzLCAgNjkzLCAgNjkzLCAgNjkzLAotICAgICAgNjkzLCAgNjkzLCAxMzI5LCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjEyLAotICAgICAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjk2LCAgNjE1LCAgNjE1LCAgNjE1LCAgNjE1LAotICAgICAgNjE1LCAgNjE1LCAgMzkyLCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjk4LAotICAgICAgNjE5LCAgNjE5LCAgNjE5LCAgNjE5LCAgNjE5LCAgNjE5LCAgNTQ3LCAgNzAwLCAgNzAwLCAgNzAwLAotICAgICAgNzAwLCAgNzAwLCAgNzAwLCAgNTQ5LCAgNzI2LCAgNzIzLCAgODE0LCAgNzAxLCAgNzk5LCAgNzk5LAorICAgICAgODAwLCAgODAwLCAgODAwLCAgODAwLCAgODAwLCAgODAwLCAgNzE1LCAgNzE1LCAgNzE1LCAgNzE1LAorICAgICAgNzE1LCAgNzE1LCAgNzE1LCAgIDU1LCAgODU4LCAgNjQ1LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LAorICAgICAgNjY5LCAgNjY5LCAgNjY5LCAxNDQxLCAxMDcyLCAxNDQyLCAxNDQzLCAgNjY5LCAxNDU4LCAxMDg2LAorICAgICAgIDU1LCAgIDU1LCAxMjMxLCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjcwLAorICAgICAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgOTA5LCAxMDg0LCAgIDU1LCAxNDQxLAorICAgICAgNjcwLCAxNDQyLCAxNDQzLCAxNDQ0LCAxNDU4LCAxMjM0LCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLAorICAgICAgNjcwLCAgNjcwLCAgNTkyLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLAorICAgICAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAxMTM0LCAxMjA0LCAxNDQ0LAorICAgICAxNDQ5LCAgNjcyLCAxNDU1LCAgIDU1LCAgIDU1LCAxMjk5LCAxMjA2LCAgNjcyLCAgNjcyLCAgNjcyLAorICAgICAgNjcyLCAgNjcyLCAgNjcyLCAgNDMxLCAgNjc0LCAgNjc0LCAgNjc0LCAgNjc0LCAgNjc0LCAgNjc0LAogCi0gICAgICA1NDksICA2MDYsICA3NjgsICA3MDEsICA3MDEsICA3MDEsICA3MDEsICA3MDEsICA3MDEsIDEzMjksCi0gICAgICA3MDEsICA3MDEsICA3MDEsICA3MDEsICA3MDEsICA3MDEsICA3MDIsICA3MDMsICA3MDMsICA3MDMsCi0gICAgICA3MDMsICA3MDMsICA3MDMsICA3MDQsICAgNDgsICAgNDgsICAgNDgsICA3MDUsICAgNDgsICA3MDYsCi0gICAgICA2MDIsICA5MjYsICA2MDAsICA3MDUsICA3MDUsICA3MDUsICA3MDUsICA3MDUsICA3MDUsICAgNDgsCi0gICAgIDEzMTUsICAgNDgsICAgNDgsICAgNDgsICA5MjcsICAgNDgsICA3MzksICA2NjEsICA2NjEsICA2NjEsCi0gICAgICA2NjEsICA2NjEsICA2NjEsICA3MTEsICA3MTYsICA3MDYsICAgNDgsICAyOTcsICA1ODYsICA3MjIsCi0gICAgICA3MjIsICA3MjIsICA3MjIsICA3MjIsICA3MjIsICA3MjMsIDEzMTUsICA5NzcsICA1OTUsICA3MjQsCi0gICAgICA5MjcsICA1OTAsICA3NTYsICA1OTEsICA1ODYsICA3MjQsICA3MjQsICA3MjQsICA3MjQsICA3MjQsCi0gICAgICA3MjQsIDEzMjksICA3NDIsICA3NDIsICA3NDIsICA3NDIsICA3NDIsICA3NDIsICA3NDgsICA2NjksCi0gICAgICA2NjksICA2NjksICA2NjksICA2NjksICA2NjksICAgNDgsICAgNDgsICA1OTAsICA1OTUsICA3MjUsCisgICAgICA2NzQsICAgNTUsICAgNTUsICA0NDcsIDEwMzMsICA2NzUsIDE0NDksIDEwNzQsIDE0NTUsICA0NDcsCisgICAgIDEyOTUsICA2NzUsICA2NzUsICA2NzUsICA2NzUsICA2NzUsICA2NzUsICAgNTMsICA2NzUsICA2NzUsCisgICAgICA2NzUsICA2NzUsICA2NzUsICA2NzUsICA2NzUsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsCisgICAgICA2NzYsICA2NzYsIDEyMDQsIDEwMzAsIDEwNjIsICA0NDcsICA2NzcsIDEwMjcsIDEwNTEsICA0NDcsCisgICAgIDE0NTgsIDEwMjQsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICAgNTMsICA2NzcsCisgICAgICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA1MjgsICA2ODAsICA2ODAsICA2ODAsCisgICAgICA2ODAsICA2ODAsICA2ODAsICA2ODAsICA2ODEsICAgNTUsICA4NjcsICA4NjcsICA2ODIsIDEwNDIsCisgICAgICA1MzIsICAgNTUsICA0NDcsICA4NjksICA2ODIsICA2ODIsICA2ODIsICA2ODIsICA2ODIsICA2ODIsCisgICAgICA4NjgsIDE0NTgsIDExMzYsICAgNTUsICA0NDcsIDExMTcsIDEwMzMsICA4NzAsIDEwMzAsICAgNTUsCisgICAgICAgNTUsIDEwMjcsICAgNTUsIDEwMjQsICAgNTUsICA4MjMsICA1MzIsICA1MzcsICA2ODMsICA2ODMsCiAKLSAgICAgIDcyNSwgIDcyNSwgIDcyNSwgIDcyNSwgIDcyNSwgIDcyNiwgIDc0NSwgIDczNiwgIDczMywgIDcyNywKLSAgICAgIDY1NiwgIDU5OSwgICA0OCwgICA0OCwgIDY0NCwgIDcyNywgIDcyNywgIDcyNywgIDcyNywgIDcyNywKLSAgICAgIDcyNywgIDQ0NywgIDY3MSwgIDY3MSwgIDY3MSwgIDY3MSwgIDY3MSwgIDY3MSwgIDc1MCwgIDY3MywKLSAgICAgIDY3MywgIDY3MywgIDY3MywgIDY3MywgIDY3MywgIDkyOCwgMTIzNSwgIDU5OSwgIDYwNiwgIDcyOCwKLSAgICAgIDcyOCwgIDcyOCwgIDcyOCwgIDcyOCwgIDcyOCwgIDcyOSwgIDcyOSwgIDcyNiwgIDkyOSwgIDczMCwKLSAgICAgMTMyMCwgIDYxMCwgIDcyMywgIDcyMSwgIDY0NCwgIDczMCwgIDczMCwgIDczMCwgIDczMCwgIDczMCwKLSAgICAgIDczMCwgMTMyOSwgIDc1MywgIDc1MywgIDc1MywgIDc1MywgIDc1MywgIDc1MywgIDY4MSwgIDY4MSwKLSAgICAgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDkyOSwgICA0OCwgMTMyMCwgIDYxMCwgIDczNCwgIDczNSwKLSAgICAgIDczNSwgIDczNSwgIDczNSwgIDczNSwgIDczNSwgIDczNiwgIDU0NywgIDcwNCwgIDU0MywgIDczNywKLSAgICAgMTMyNiwgIDczOCwgICA0OCwgIDU0MSwgIDU4MSwgIDczNywgIDczNywgIDczNywgIDczNywgIDczNywKKyAgICAgIDY4MywgIDY4MywgIDY4MywgIDY4MywgIDY4MywgIDY4NCwgIDg2OCwgMTQ1OCwgICA1NSwgIDY4NSwKKyAgICAgICA1NSwgIDU0MSwgICA1NSwgIDg3MCwgICA1NSwgIDY4NSwgIDY4NSwgIDY4NSwgIDY4NSwgIDY4NSwKKyAgICAgIDY4NSwgIDgzMSwgIDgyOCwgMTExNywgIDMzOCwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwKKyAgICAgIDgzNiwgIDgzNiwgICA1NSwgIDg2OSwgIDg3OSwgIDg3OSwgICA1NSwgIDU0MSwgIDY4OSwgIDY5MCwKKyAgICAgIDY5MCwgIDY5MCwgIDY5MCwgIDY5MCwgIDY5MCwgIDY5MCwgIDY5MSwgMTQ1OCwgIDg4MCwgMTQ1OCwKKyAgICAgIDY5MiwgIDkxNiwgIDY5MywgMTAwMywgICA1NSwgIDg4MSwgIDY5MiwgIDY5MiwgIDY5MiwgIDY5MiwKKyAgICAgIDY5MiwgIDY5MiwgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDc5MywgIDg4MiwKKyAgICAgICA1NSwgMTAxMCwgIDgxNiwgMTQ1OCwgIDg4MCwgMTQ1OCwgIDg4MSwgIDg4NSwgIDY5MywgIDUyOCwKKyAgICAgIDY5NiwgIDY5NiwgIDY5NiwgIDY5NiwgIDY5NiwgIDY5NiwgIDY5NiwgIDY4MSwgICA1NSwgMTA4NiwKKyAgICAgMTQ1OCwgIDY5NywgMTAzMywgIDcwOSwgICA1NSwgIDg4MiwgMTQwOSwgIDY5NywgIDY5NywgIDY5NywKIAotICAgICAgNzM3LCAgNzYwLCAgNjg0LCAgNjg0LCAgNjg0LCAgNjg0LCAgNjg0LCAgNjg0LCAgNDU2LCAgNjg2LAotICAgICAgNjg2LCAgNjg2LCAgNjg2LCAgNjg2LCAgNjg2LCAgIDQ4LCAxMzI2LCAgNzM4LCAgNTg2LCAgNzQxLAotICAgICAgNzQxLCAgNzQxLCAgNzQxLCAgNzQxLCAgNzQxLCAgNzIzLCAgNTc4LCAgNjU2LCAgNjQ0LCAgNzQyLAotICAgICAgNjQ0LCAgNjQyLCAgIDQ4LCAgNjQxLCAgNjQwLCAgNzQyLCAgNzQyLCAgNzQyLCAgNzQyLCAgNzQyLAotICAgICAgNzQyLCAgNzQzLCAgNzQ0LCAgNzQ0LCAgNzQ0LCAgNzQ0LCAgNzQ0LCAgNzQ0LCAgNzQ1LCAxMjMyLAotICAgICAgNjM5LCAgNjM4LCAgNzQ2LCAgNjM3LCAgNzQ3LCAgNjM2LCAgNjM1LCAgNjM0LCAgNzQ2LCAgNzQ2LAotICAgICAgNzQ2LCAgNzQ2LCAgNzQ2LCAgNzQ2LCAgNzYyLCAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LAotICAgICAgNjg4LCAxMzI5LCAgNzY1LCAgNzY1LCAgNzY1LCAgNzY1LCAgNzY1LCAgNzY1LCAgIDQ4LCAgNjMzLAotICAgICAgNzQ3LCAgNTk1LCAgNzUyLCAgNzUyLCAgNzUyLCAgNzUyLCAgNzUyLCAgNzUyLCAgNzI2LCAgNjMyLAotICAgICAgNjMxLCAgNjMwLCAgNzUzLCAgNjI5LCAgNjI4LCAgIDQ4LCAgNjI3LCAgNjI2LCAgNzUzLCAgNzUzLAorICAgICAgNjk3LCAgNjk3LCAgNjk3LCAgNjk4LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LAorICAgICAgNjk5LCAgNzAwLCAgIDU1LCAgODgxLCAgODc5LCAgNzAxLCAxNDU4LCAgNzAyLCAgODczLCAxMDc0LAorICAgICAxMDMwLCAgNzAxLCAgNzAxLCAgNzAxLCAgNzAxLCAgNzAxLCAgNzAxLCAgODkxLCAgODkyLCAgODkyLAorICAgICAgODkyLCAgODkyLCAgODkyLCAgODkyLCAgODk0LCAgODk1LCAgODk1LCAgODk1LCAgODk1LCAgODk1LAorICAgICAgODk1LCAgOTk1LCAgIDU1LCAgNzAyLCAgNTM3LCAgNzA3LCAgNzA3LCAgNzA3LCAgNzA3LCAgNzA3LAorICAgICAgNzA3LCAgNzA3LCAgNjg0LCAgNjk4LCAgODY5LCAgOTk2LCAgNzA4LCAgODY3LCAgODYyLCAxMDYyLAorICAgICAgIDU1LCAxMDEyLCAgNzA4LCAgNzA4LCAgNzA4LCAgNzA4LCAgNzA4LCAgNzA4LCAgNzA5LCAgNzEwLAorICAgICAgNzEwLCAgNzEwLCAgNzEwLCAgNzEwLCAgNzEwLCAgNzEwLCAgNzExLCAxMDI3LCAxMDEzLCAgNjg5LAorICAgICAgNzEyLCAgOTk2LCAgNzEzLCAgODU4LCAgIDU1LCAgIDU1LCAgNzEyLCAgNzEyLCAgNzEyLCAgNzEyLAorICAgICAgNzEyLCAgNzEyLCAgODk4LCAgODk5LCAgODk5LCAgODk5LCAgODk5LCAgODk5LCAgODk5LCAgODUzLAogCi0gICAgICA3NTMsICA3NTMsICA3NTMsICA3NTMsICA3NTQsICA3NTUsICA3NTUsICA3NTUsICA3NTUsICA3NTUsCi0gICAgICA3NTUsICA3NTYsICAzOTQsICA0NTYsIDEyNzgsICA3NTcsICA2MDgsICA3NTgsICA0NTIsICA0NDcsCi0gICAgICA1OTcsICA3NTcsICA3NTcsICA3NTcsICA3NTcsICA3NTcsICA3NTcsICA3NzIsICA3NzMsICA3NzMsCi0gICAgICA3NzMsICA3NzMsICA3NzMsICA3NzUsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICAgNDgsCi0gICAgICA5MzgsICA1ODgsICA1ODUsICA3NTgsICA2MDYsICA3NjQsICA3NjQsICA3NjQsICA3NjQsICA3NjQsCi0gICAgICA3NjQsICA3MjksICA1MTcsICA5MzksICA1MDgsICA3NjUsICAgNDgsICA1ODEsICA1NzgsICA1NzYsCi0gICAgICA1MDgsICA3NjUsICA3NjUsICA3NjUsICA3NjUsICA3NjUsICA3NjUsICA3NjYsICA3NjcsICA3NjcsCi0gICAgICA3NjcsICA3NjcsICA3NjcsICA3NjcsICA3NjgsIDEzMDcsICA1NzMsICA1NzIsICA3NjksICA5MzksCi0gICAgICA3NzAsICA1NzEsICA1NzAsICA1NjksICA3NjksICA3NjksICA3NjksICA3NjksICA3NjksICA3NjksCi0gICAgICA3NzksICA3ODAsICA3ODAsICA3ODAsICA3ODAsICA3ODAsIDEzMjksICA3ODIsICA3ODIsICA3ODIsCisgICAgIDEwNTEsIDEwMjQsICAgNTUsICAgNTUsIDEwNDIsICA5OTUsICA5OTcsICAgNTUsICA3MTMsICA2NDEsCisgICAgICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA2NDMsICA5MTQsIDE0NTgsCisgICAgICA5OTgsICA3MjQsIDExMTIsICA5MzksICA5MjQsICAgNTUsICA5OTcsICA3MjQsICA3MjQsICA3MjQsCisgICAgICA3MjQsICA3MjQsICA3MjQsICA3MjUsICA3MjYsICA3MjYsICA3MjYsICA3MjYsICA3MjYsICA3MjYsCisgICAgIDE0NTgsIDEwMTQsIDEwMzMsIDEwMzAsICA3MjcsIDE0NTgsICA5OTgsIDEwMjcsIDEwMjQsIDEwMjIsCisgICAgICA3MjcsICA3MjcsICA3MjcsICA3MjcsICA3MjcsICA3MjcsICAgNTMsICAgNTMsICAgNTMsICAgNTMsCisgICAgICAgNTMsICAgNTMsICAgNTMsICA5MjQsICA4MTQsIDEwMDMsIDE0NTgsICAgNTMsICAgNTUsICAgNTUsCisgICAgICAgNTUsICAgNTUsICAgNTUsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICA5NDMsCisgICAgICA5NDQsICA5NDQsICA5NDQsICA5NDQsICA5NDQsICA5NDQsICAgNTUsICAgNTUsICAgNTUsICAgNTUsCisgICAgICAgNTUsICA3MjksICA3NDcsICA4MTYsICA3NDgsICA3NDgsICA3NDgsICA3NDgsICA3NDgsICA3NDgsCiAKLSAgICAgIDc4MiwgIDc4MiwgIDc4MiwgIDk0MCwgICA0OCwgICA0OCwgIDc3MCwgIDcwMiwgIDc4MSwgIDc4MSwKLSAgICAgIDc4MSwgIDc4MSwgIDc4MSwgIDc4MSwgIDcwNCwgIDU2OCwgIDk0MSwgIDU2NywgIDc4MiwgIDU2NiwKLSAgICAgIDU2NSwgICA0OCwgICA0OCwgIDU2NCwgIDc4MiwgIDc4MiwgIDc4MiwgIDc4MiwgIDc4MiwgIDc4MiwKLSAgICAgIDc4MywgIDc4NCwgIDc4NCwgIDc4NCwgIDc4NCwgIDc4NCwgIDg4MiwgIDg4MywgIDg4NCwgIDU2MywKLSAgICAgIDc4NSwgIDU2MiwgIDk0MSwgIDU2MSwgIDU2MCwgIDk1MCwgIDc4NSwgIDc4NSwgIDc4NSwgIDc4NSwKLSAgICAgIDc4NSwgIDc4NSwgIDgwMCwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDk1MSwgIDU1OSwKLSAgICAgIDU1OCwgIDU1NywgIDgwMiwgIDU1NiwgIDU1NSwgIDU1NCwgIDU1MywgIDU1MiwgIDgwMiwgIDgwMiwKLSAgICAgIDgwMiwgIDgwMiwgIDgwMiwgIDgwMiwgIDU4NiwgIDY2MiwgIDY2MiwgIDY2MiwgIDY2MiwgIDY2MiwKLSAgICAgIDY2MiwgIDcyMywgIDM5MiwgIDU0OSwgIDk1MSwgIDY2MywgICA0OCwgIDM4OCwgIDQ0MiwgIDUxNywKLSAgICAgIDUwOCwgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDgwMywgIDgwNCwgIDgwNCwKKyAgICAgIDc0OCwgMTAwNiwgMTAwNywgMTAwOCwgMTAwOSwgIDc0OCwgMTAxNiwgIDY0MSwgICA1NSwgMTEwOSwKKyAgICAgICA1NSwgIDc0OCwgIDc0OCwgIDc0OCwgIDc0OCwgIDc0OCwgIDc0OCwgIDk1MSwgIDk1MiwgIDk1MiwKKyAgICAgIDk1MiwgIDk1MiwgIDk1MiwgIDk1MiwgMTA0NSwgMTA0NSwgICA1NSwgICA1NSwgICA1NSwgICA1MywKKyAgICAgIDc0OSwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgMTA0NiwgMTQ1OCwKKyAgICAgMTEwOCwgIDgxMCwgIDc1MCwgMTIxNiwgIDgwOCwgICA1NSwgIDg4NywgIDg0OCwgIDc1MCwgIDc1MCwKKyAgICAgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDk1NSwgIDk1NiwgIDk1NiwgIDk1NiwgIDk1NiwgIDk1NiwKKyAgICAgIDk1NiwgIDg3NSwgMTM2MSwgIDg0NSwgMTA0NiwgMTQ1OCwgICA1MywgIDY3MSwgIDY3MSwgIDY3MSwKKyAgICAgIDY3MSwgIDY3MSwgIDY3MSwgIDY3MSwgIDk2MywgIDk2NCwgIDk2NCwgIDk2NCwgIDk2NCwgIDk2NCwKKyAgICAgIDk2NCwgIDk2NiwgIDk2NywgIDk2NywgIDk2NywgIDk2NywgIDk2NywgIDk2NywgIDk3MCwgIDk3MSwKKyAgICAgIDk3MSwgIDk3MSwgIDk3MSwgIDk3MSwgIDk3MSwgIDk3OSwgIDk4MCwgIDk4MCwgIDk4MCwgIDk4MCwKIAotICAgICAgODA0LCAgODA0LCAgODA0LCAgIDQ4LCAgNDQyLCAgNDQyLCAgNTA4LCAgODA1LCAgMzY1LCAgNTA1LAotICAgICAgNTA0LCAgNTAzLCAxMTY2LCAgODA1LCAgODA1LCAgODA1LCAgODA1LCAgODA1LCAgODA1LCAxMzI5LAotICAgICAgNjYzLCAgNjYzLCAgNjYzLCAgNjYzLCAgNjYzLCAgNjYzLCAgNTk1LCAgNjc0LCAgNjc0LCAgNjc0LAotICAgICAgNjc0LCAgNjc0LCAgNjc0LCAgNzI2LCAgNTAyLCAgNTAxLCAgNTAwLCAgNjc1LCAgIDQ4LCAgNDk5LAotICAgICAgNDk4LCAgMjk0LCAgMjEzLCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgODA2LAotICAgICAgODA3LCAgODA3LCAgODA3LCAgODA3LCAgODA3LCAgIDQ4LCAgNDk3LCAgNDk2LCAgNDk1LCAgODA4LAotICAgICAgNDk0LCAgNDkzLCAgNDkyLCAgNDkxLCAxMjc5LCAgODA4LCAgODA4LCAgODA4LCAgODA4LCAgODA4LAotICAgICAgODA4LCAxMzI5LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjA2LCAgNjg5LAotICAgICAgNjg5LCAgNjg5LCAgNjg5LCAgNjg5LCAgNjg5LCAgNzI5LCAgNDkwLCAgNDg5LCAgNDg4LCAgNjkwLAotICAgICAgNDg3LCAgNDg2LCAgNDgzLCAgNDgwLCAgNDc5LCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLAorICAgICAgOTgwLCAgOTgwLCAgIDUzLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLAorICAgICAgODY0LCAgODQyLCAgODU1LCAgOTM5LCAgNjcyLCAgOTI0LCAgODQ4LCAgODQ1LCAgODQyLCAgOTI0LAorICAgICAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNjcyLCAgNzUxLCAgMzUwLCAgMzUwLCAgMzUwLAorICAgICAgMzUwLCAgMzUwLCAgMzUwLCAgMzUwLCAgMjY1LCAgNzUzLCAgNzUzLCAgNzUzLCAgNzUzLCAgNzUzLAorICAgICAgNzUzLCAgNzUzLCAgODE2LCAgNjQzLCAgNzA5LCAgODg3LCAgNzU0LCAgODQ4LCAgNTM3LCAgNzA1LAorICAgICAgNzAzLCAgNjk4LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgIDUzLCAgNzU0LAorICAgICAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU3LCAgNzU4LCAgNzU4LCAgNzU4LAorICAgICAgNzU4LCAgNzU4LCAgNzU4LCAgODc1LCAgODQ1LCAgNTI4LCAgNjk0LCAgNzU5LCAgNjg5LCAgODY0LAorICAgICAgODQyLCAgODU1LCAgODUyLCAgNzU5LCAgNzU5LCAgNzU5LCAgNzU5LCAgNzU5LCAgNzU5LCAgNTI4LAorICAgICAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjgxLCAgNzY4LCAgNzU2LAogCi0gICAgICA2OTAsICA4MDksICA4MTAsICA4MTAsICA4MTAsICA4MTAsICA4MTAsICA0NzgsICA0NzcsICA0NzYsCi0gICAgICA0NzUsICA4MTEsICA0NzQsICA0NzMsICAyNDYsICAzNzcsICAzMTIsICA4MTEsICA4MTEsICA4MTEsCi0gICAgICA4MTEsICA4MTEsICA4MTEsIDEzMjksICA2OTAsICA2OTAsICA2OTAsICA2OTAsICA2OTAsICA2OTAsCi0gICAgICA4MTUsICA4MTYsICA4MTYsICA4MTYsICA4MTYsICA4MTYsICAzNzcsICA0NTgsICA0NDksICAzNzcsCi0gICAgICA4MTcsICA0NDYsICAzNzQsICAzNjgsICA0NDIsICA0NDAsICA4MTcsICA4MTcsICA4MTcsICA4MTcsCi0gICAgICA4MTcsICA4MTcsICA4MTgsICA4MTksICA4MTksICA4MTksICA4MTksICA4MTksICA3MzQsICA4MjAsCi0gICAgICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA3MzYsICAzNjgsICA0MzUsICA0MzQsICA4MjEsCi0gICAgICA0MzMsICA0MzIsICA0MzEsICA0MzAsICA0MjksICA4MjEsICA4MjEsICA4MjEsICA4MjEsICA4MjEsCi0gICAgICA4MjEsICA4MjIsICA4MjMsICA4MjMsICA4MjMsICA4MjMsICA4MjMsICAzNzcsICA0MjgsICA0MjcsCi0gICAgICA0MjYsICA4MjQsICA0MjUsICA0MjQsICA0MjEsICA0MjAsICA0MTcsICA4MjQsICA4MjQsICA4MjQsCisgICAgICA4NDgsICA2MTgsICA4NDUsICA4NDIsICA4NDAsICA3NTYsIDEwNTQsICA2MTgsICA2MTgsICA2MTgsCisgICAgICA2MTgsICA2MTgsICA2MTgsICA3NjAsICA3NjEsICA3NjEsICA3NjEsICA3NjEsICA3NjEsICA3NjEsCisgICAgIDEwNTUsICA2NDEsICA4MTYsICA2NDMsICA3NjIsICA0NjIsICA2MzcsICA2MzUsICA3MTEsICA2ODQsCisgICAgICA3NjIsICA3NjIsICA3NjIsICA3NjIsICA3NjIsICA3NjIsICA1MzcsICA2MjksICA2MjksICA2MjksCisgICAgICA2MjksICA2MjksICA2MjksICA2MjksICA2ODQsICA3MDAsIDEwNTUsICA2ODEsICA2MzAsICA2OTEsCisgICAgICA3NjgsICA3NTYsICA2ODQsIDEwNTQsICA2MzAsICA2MzAsICA2MzAsICA2MzAsICA2MzAsICA2MzAsCisgICAgICA3NjMsICA3NjQsICA3NjQsICA3NjQsICA3NjQsICA3NjQsICA3NjQsIDE0NTgsICA2ODEsICA3NTYsCisgICAgICAgNTMsICA3NjUsICAgNTMsICAgNTMsICA3NDMsICAgNTMsICAgNTMsICA3NjUsICA3NjUsICA3NjUsCisgICAgICA3NjUsICA3NjUsICA3NjUsICA3NjksICA3NzAsICA3NzAsICA3NzAsICA3NzAsICA3NzAsICA3NzAsCisgICAgICA0NDcsICA3MzcsICA2NDMsIDE0NTgsICA3NzEsICA0NjQsICA1MzcsICA3MTEsICA2ODQsICAzNjIsCiAKLSAgICAgIDgyNCwgIDgyNCwgIDgyNCwgMTMyOSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwKLSAgICAgIDgyNiwgIDgyNywgIDgyNywgIDgyNywgIDgyNywgIDgyNywgIDgzMCwgIDgzMSwgIDgzMSwgIDgzMSwKLSAgICAgIDgzMSwgIDgzMSwgIDc0MywgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDc0NSwKLSAgICAgIDQxNiwgIDQxNSwgIDQxNCwgIDgzMywgIDQxMywgIDEwOSwgIDQxMiwgIDQxMSwgIDQwMiwgIDgzMywKLSAgICAgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDgzNCwgIDgzNSwgIDgzNSwgIDgzNSwgIDgzNSwKLSAgICAgIDgzNSwgIDM3NywgIDQwMSwgIDQwMCwgIDM5OSwgIDgzNiwgIDM5OCwgIDM5NywgIDI0NCwgIDM5NCwKLSAgICAgIDM3NywgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgMTMyOSwgIDgzMywgIDgzMywKLSAgICAgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDgzOCwgIDgzOSwgIDgzOSwgIDgzOSwgIDgzOSwgIDgzOSwKLSAgICAgIDg0MSwgIDg0MiwgIDg0MiwgIDg0MiwgIDg0MiwgIDg0MiwgIDg0NSwgIDg0NiwgIDg0NiwgIDg0NiwKLSAgICAgIDg0NiwgIDg0NiwgIDc1NCwgIDg0NywgIDg0NywgIDg0NywgIDg0NywgIDg0NywgIDg0NywgIDc1NiwKKyAgICAgIDc3MSwgIDc3MSwgIDc3MSwgIDc3MSwgIDc3MSwgIDc3MSwgIDY4OSwgIDc3NCwgIDc3NCwgIDc3NCwKKyAgICAgIDc3NCwgIDc3NCwgIDc3NCwgIDc3NCwgIDY5MSwgIDUzMywgIDUyOCwgIDcwMCwgIDc3NSwgIDY4MSwKKyAgICAgIDY5MSwgIDY4OCwgIDYxMSwgIDYwMiwgIDc3NSwgIDc3NSwgIDc3NSwgIDc3NSwgIDc3NSwgIDc3NSwKKyAgICAgIDc3NiwgIDc3NywgIDc3NywgIDc3NywgIDc3NywgIDc3NywgIDc3NywgIDQ0NywgIDY4NCwgIDY4MSwKKyAgICAgIDY3OSwgIDc3OCwgIDYwMiwgIDU5MiwgIDU5MCwgIDY2OCwgIDY2NywgIDc3OCwgIDc3OCwgIDc3OCwKKyAgICAgIDc3OCwgIDc3OCwgIDc3OCwgIDY5OCwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwKKyAgICAgIDc4NiwgIDcwMCwgIDY2NiwgIDY2NSwgIDY2NCwgIDc4NywgIDY2MywgIDY2MiwgIDY2MSwgIDY2MCwKKyAgICAgIDY1OSwgIDc4NywgIDc4NywgIDc4NywgIDc4NywgIDc4NywgIDc4NywgIDc4OCwgIDc4OSwgIDc4OSwKKyAgICAgIDc4OSwgIDc4OSwgIDc4OSwgIDc4OSwgIDQ0NywgIDY1OCwgIDY1NywgIDY1NiwgIDc5MCwgIDY1NSwKKyAgICAgIDY1NCwgIDY1MywgIDY1MiwgIDY1MSwgIDc5MCwgIDc5MCwgIDc5MCwgIDc5MCwgIDc5MCwgIDc5MCwKIAotICAgICAgMzc0LCAgMzY4LCAgMzY4LCAgODQ4LCAxMzI5LCAgMjMzLCAgMzY0LCAgMzU3LCAgMzU0LCAgODQ4LAotICAgICAgODQ4LCAgODQ4LCAgODQ4LCAgODQ4LCAgODQ4LCAgODQ5LCAgODUwLCAgODUwLCAgODUwLCAgODUwLAotICAgICAgODUwLCAgMzc3LCAgMzUzLCAgMzUyLCAgMzUxLCAgODUxLCAgMzUwLCAgMzQ5LCAgMzQ4LCAgMzQ3LAotICAgICAgMzQ2LCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAgODUxLCAxMzI5LCAgODQ4LCAgODQ4LAotICAgICAgODQ4LCAgODQ4LCAgODQ4LCAgODQ4LCAgODU0LCAgODU1LCAgODU1LCAgODU1LCAgODU1LCAgODU1LAotICAgICAgODU3LCAgODU4LCAgODU4LCAgODU4LCAgODU4LCAgODU4LCAgODYxLCAgODYyLCAgODYyLCAgODYyLAotICAgICAgODYyLCAgODYyLCAgNzY2LCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgNzY4LAotICAgICAgMzQ1LCAgMzQ0LCAgMzQzLCAgODY0LCAgMzQyLCAgMzQxLCAgMzQwLCAgMzM5LCAgMzM4LCAgODY0LAotICAgICAgODY0LCAgODY0LCAgODY0LCAgODY0LCAgODY0LCAgODY1LCAgODY2LCAgODY2LCAgODY2LCAgODY2LAotICAgICAgODY2LCAgMzc3LCAgMzMzLCAgMzMyLCAgMjc2LCAgODY3LCAgMzMxLCAgMzMwLCAgMzI5LCAgMzI4LAorICAgICAgNzA5LCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgNzExLCAgNjUwLAorICAgICAgNjQ5LCAgNjQ4LCAgODAyLCAgNjQ3LCAgNjQ2LCAgNDYyLCAgNjQzLCAgNDY0LCAgODAyLCAgODAyLAorICAgICAgODAyLCAgODAyLCAgODAyLCAgODAyLCAgODAzLCAgODA0LCAgODA0LCAgODA0LCAgODA0LCAgODA0LAorICAgICAgODA0LCAgNDQ3LCAgNDU4LCAgNTM5LCAgNTIzLCAgODA1LCAgNTMwLCAgNjExLCAgNjAyLCAgNTIzLAorICAgICAgNjAyLCAgODA1LCAgODA1LCAgODA1LCAgODA1LCAgODA1LCAgODA1LCAgNjQxLCAgODEyLCAgODEyLAorICAgICAgODEyLCAgODEyLCAgODEyLCAgODEyLCAgODEyLCAgNjQzLCAgNTk2LCAgNTk2LCAgNTg5LCAgODEzLAorICAgICAgNTg4LCAgNTg3LCAgNTg2LCAgNTg1LCAgNTg0LCAgODEzLCAgODEzLCAgODEzLCAgODEzLCAgODEzLAorICAgICAgODEzLCAgODE0LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE2LAorICAgICAgNTgzLCAgNTgyLCAgNTgxLCAgODE3LCAgMzM1LCAgODE4LCAgMjM3LCAgNTgwLCAgNTc5LCAgODE3LAorICAgICAgODE3LCAgODE3LCAgODE3LCAgODE3LCAgODE3LCAgOTgyLCAgOTgzLCAgOTgzLCAgOTgzLCAgOTgzLAogCi0gICAgICAzMjcsICA4NjcsICA4NjcsICA4NjcsICA4NjcsICA4NjcsICA4NjcsIDEzMjksICA4NjQsICA4NjQsCi0gICAgICA4NjQsICA4NjQsICA4NjQsICA4NjQsICA3NzMsICA3NzMsICA3NzMsICA3NzMsICA3NzMsICA3NzMsCi0gICAgICA4NzAsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA1NDcsICA3NzgsICA3NzgsCi0gICAgICA3NzgsICA3NzgsICA3NzgsICA3NzgsICA4NzIsICA3ODAsICA3ODAsICA3ODAsICA3ODAsICA3ODAsCi0gICAgICA3ODAsICA3MDIsICA4NzQsICA4NzQsICA4NzQsICA4NzQsICA4NzQsICA4NzQsICA3MDQsICAzMjYsCi0gICAgICAzMTQsICAyNDIsICA4NzUsICAzMTEsICAyMzksICAyMzYsICAzMDgsICAxMzEsICA4NzUsICA4NzUsCi0gICAgICA4NzUsICA4NzUsICA4NzUsICA4NzUsIDEzMjksICA4NzUsICA4NzUsICA4NzUsICA4NzUsICA4NzUsCi0gICAgICA4NzUsICA4NzYsICA4NzcsICA4NzcsICA4NzcsICA4NzcsICA4NzcsICA4NzcsICA4NzgsICAzMDIsCi0gICAgICAzMDEsICAyOTgsICA4NzksICAyOTcsICA4ODAsICAyNzYsICAyOTYsICAyOTUsICA4NzksICA4NzksCi0gICAgICA4NzksICA4NzksICA4NzksICA4NzksICA5MTcsICA4MTksICA4MTksICA4MTksICA4MTksICA4MTksCisgICAgICA5ODMsICA5ODMsICA5ODYsICA5ODcsICA5ODcsICA5ODcsICA5ODcsICA5ODcsICA5ODcsIDEwNTYsCisgICAgIDEwNTYsICA4MTgsICAgNTUsIDEwNjYsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsCisgICAgICA4MzIsICA1NzgsICA1NzcsIDEwNTcsIDE0NTgsICA4MzIsICA1NzYsIDEwNjcsICA1NzUsICA1NzQsCisgICAgICAgNTUsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzMsICA4MzMsICA4MzMsCisgICAgICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA1NzMsICA1NzIsICA1NzEsICA1NzAsICA4MzMsIDEwNTcsCisgICAgIDE0NTgsICA1NjksICA1NjYsIDEwNjcsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsCisgICAgICA4MzQsICA4MzUsICA4MzUsICA4MzUsICA4MzUsICA4MzUsICA4MzUsICA1NjMsICA1NjIsICA1NjEsCisgICAgICA1NjAsICA4MzYsICA1NTksICAgNTUsICA1NTgsICA1NTcsICA1NTYsICA4MzYsICA4MzYsICA4MzYsCisgICAgICA4MzYsICA4MzYsICA4MzYsICAyNjUsICA4MzcsICA4MzcsICA4MzcsICA4MzcsICA4MzcsICA4MzcsCisgICAgICA4MzcsICAgNTUsICA1NTUsICA1NTQsICA0NjQsICA4MzgsICAyNzcsICA0NDcsICAzNjIsICA1MzksCiAKLSAgICAgIDgxOSwgMTMyOSwgIDkyMCwgIDkyMCwgIDkyMCwgIDkyMCwgIDkyMCwgIDkyMCwgIDI5NCwgIDI5MywKLSAgICAgIDg4MCwgIDczNCwgIDg5NSwgIDg5NSwgIDg5NSwgIDg5NSwgIDg5NSwgIDg5NSwgIDg5NiwgIDI5MiwKLSAgICAgIDI5MSwgIDI5MCwgIDg5NywgIDI4OSwgIDczOCwgIDI4OCwgIDI4NywgIDI4NiwgIDg5NywgIDg5NywKLSAgICAgIDg5NywgIDg5NywgIDg5NywgIDg5NywgIDkyNiwgIDgyNywgIDgyNywgIDgyNywgIDgyNywgIDgyNywKLSAgICAgIDgyNywgIDU4NiwgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDI4NSwgIDI4NCwKLSAgICAgIDczOCwgIDc0MywgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OSwgIDI4MywKLSAgICAgIDI4MiwgIDI3OSwgIDkwMCwgIDI3OCwgIDc0NywgIDI3NywgIDI3NiwgIDI3NSwgIDkwMCwgIDkwMCwKLSAgICAgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkyOCwgIDgzMSwgIDgzMSwgIDgzMSwgIDgzMSwgIDgzMSwKLSAgICAgIDgzMSwgMTMyOSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDk1MiwgIDI3NCwKLSAgICAgIDc0NywgIDc1NCwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMiwgIDI3MywKKyAgICAgMTQwOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgICA1MywgIDgzOCwgIDgzOCwKKyAgICAgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDY4OSwgIDg0MSwgIDg0MSwgIDg0MSwgIDg0MSwKKyAgICAgIDg0MSwgIDg0MSwgIDg0MSwgIDg0MiwgIDUyMywgIDUzMCwgIDQ0NywgIDg0MywgIDUyNywgIDY5MywKKyAgICAgIDQ0NCwgIDQzOCwgIDUyMywgIDg0MywgIDg0MywgIDg0MywgIDg0MywgIDg0MywgIDg0MywgIDg5MiwKKyAgICAgIDg5MiwgIDg5MiwgIDg5MiwgIDg5MiwgIDg5MiwgIDg5MiwgIDk2NCwgIDk2NCwgIDk2NCwgIDk2NCwKKyAgICAgIDk2NCwgIDk2NCwgIDk2NCwgMTA2NiwgIDUyMSwgIDY5MywgIDY5OCwgIDg0NCwgIDg0NCwgIDg0NCwKKyAgICAgIDg0NCwgIDg0NCwgIDg0NCwgIDg0NCwgIDg0NSwgIDQzOCwgMTA2OCwgMTQ1OCwgIDg0NiwgIDQzMCwKKyAgICAgIDcwMiwgIDQyNCwgMTA2OCwgMTA3OCwgIDg0NiwgIDg0NiwgIDg0NiwgIDg0NiwgIDg0NiwgIDg0NiwKKyAgICAgMTA2OSwgIDUwOCwgIDUwNywgIDUwNiwgIDUwNSwgIDUwNCwgMTQ1OCwgMTA3OSwgIDUwMywgIDUwMiwKKyAgICAgIDUwMSwgIDUwMCwgICA1NSwgMTQ1OCwgMTA3OCwgIDQ5OSwgIDcwMiwgIDcwOSwgIDg0NywgIDg0NywKIAotICAgICAgMjcyLCAgOTUzLCAgOTAzLCAgMjcxLCAgNzU4LCAgMjcwLCAgMjY5LCAgMjY4LCAgOTAzLCAgOTAzLAotICAgICAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLCAgODM5LCAgODM5LCAgODM5LCAgODM5LCAgODM5LCAgODM5LAotICAgICAgOTM4LCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgOTUzLCAgMjY3LCAgMjY2LAotICAgICAgNzU4LCAgNzY2LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA1LCAgMjY1LAotICAgICAgMjY0LCAgMjYzLCAgOTA2LCAgMjYyLCAgNzcwLCAgMjYxLCAgMjYwLCAgMjU5LCAgOTA2LCAgOTA2LAotICAgICAgOTA2LCAgOTA2LCAgOTA2LCAgOTA2LCAgNTk1LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LAotICAgICAgODQ0LCAgOTQwLCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgMjU4LCAxMDY5LAotICAgICAgNzcwLCAgOTA4LCAgOTA5LCAgOTA5LCAgOTA5LCAgOTA5LCAgOTA5LCAgOTEwLCAgMjU2LCAgMjU1LAotICAgICAgMjU0LCAgOTExLCAxMDcwLCAgMjUzLCAgMjUyLCAgMjUxLCAgMjUwLCAgOTExLCAgOTExLCAgOTExLAotICAgICAgOTExLCAgOTExLCAgOTExLCAgOTEyLCAgOTEzLCAgOTEzLCAgOTEzLCAgOTEzLCAgOTEzLCAgOTEzLAorICAgICAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ4LCAxMDY5LCAgNDk4LCAxNDU4LCAgODQ5LAorICAgICAgIDU1LCAgNzEzLCAxNDU4LCAxMDc5LCAxMDgwLCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LAorICAgICAgODQ5LCAgOTgwLCAgOTgwLCAgOTgwLCAgOTgwLCAgOTgwLCAgOTgwLCAgOTgwLCAxMDgxLCAxNDA3LAorICAgICAgNDk3LCAgNDk2LCAgNDkzLCAxMDgwLCAxNDU4LCAxMTk4LCAgNDkyLCAgNzEzLCAgODUzLCAgODU0LAorICAgICAgODU0LCAgODU0LCAgODU0LCAgODU0LCAgODU0LCAgODU0LCAgODU1LCAxNDU4LCAgNDg5LCAxMTk5LAorICAgICAgODU2LCAgNDg4LCAgODU3LCAgNDg3LCAxMDgxLCAxMTk4LCAgODU2LCAgODU2LCAgODU2LCAgODU2LAorICAgICAgODU2LCAgODU2LCAxMDkwLCAxMDkxLCAxMDkxLCAxMDkxLCAxMDkxLCAxMDkxLCAxMDkxLCAxNDU4LAorICAgICAgNDg2LCAgNDg1LCAgMTE5LCAxNDU4LCAxMjAwLCAxMTk5LCAxMjAwLCAgNDg0LCAgODU3LCAgNjg5LAorICAgICAgODYwLCAgODYwLCAgODYwLCAgODYwLCAgODYwLCAgODYwLCAgODYwLCAgODQyLCAxMjAxLCAgNDgzLAorICAgICAxNDU4LCAgODYxLCAgNDc0LCAgNDczLCAgNDcyLCAxNDU4LCAgNDcxLCAgODYxLCAgODYxLCAgODYxLAorCisgICAgICA4NjEsICA4NjEsICA4NjEsICA4NjIsICA4NjMsICA4NjMsICA4NjMsICA4NjMsICA4NjMsICA4NjMsCisgICAgICA4NjMsICA4NjQsICA0NzAsICA0NjksIDEyMDEsICA4NjUsIDE0NTgsICA4NjYsICA0NjgsICA0NjcsCisgICAgICAyNzUsICA4NjUsICA4NjUsICA4NjUsICA4NjUsICA4NjUsICA4NjUsIDEwOTMsIDEwOTQsIDEwOTQsCisgICAgIDEwOTQsIDEwOTQsIDEwOTQsIDEwOTQsIDEwOTcsIDEwOTgsIDEwOTgsIDEwOTgsIDEwOTgsIDEwOTgsCisgICAgIDEwOTgsIDEyNDQsICA0NjQsICA4NjYsICA2OTgsICA4NzEsICA4NzEsICA4NzEsICA4NzEsICA4NzEsCisgICAgICA4NzEsICA4NzEsICA4NDUsICAyNzcsICA0NDcsIDEyNDUsICA4NzIsICAzNjQsICA0NDQsICA0MzgsCisgICAgICA0MzgsICAgNTUsICA4NzIsICA4NzIsICA4NzIsICA4NzIsICA4NzIsICA4NzIsICA4NzMsICA4NzQsCisgICAgICA4NzQsICA4NzQsICA4NzQsICA4NzQsICA4NzQsICA4NzQsICA4NzUsICAgNTUsICAgNTUsICAgNTUsCisgICAgICA4NzYsIDEyNDUsICA4NzcsICA0MzEsICA0MzEsICA0MjMsICA4NzYsICA4NzYsICA4NzYsICA4NzYsCisgICAgICA4NzYsICA4NzYsICA0MTYsIDExMTEsICA0MTUsICAgNTUsICAgNTUsIDExNDAsIDExNDEsIDExNDEsCisKKyAgICAgMTE0MSwgMTE0MSwgMTE0MSwgMTE0MSwgMTI0NCwgIDQxMiwgMTEwNSwgMTEwNiwgIDg3NywgIDcwOSwKKyAgICAgIDg4MywgIDg4MywgIDg4MywgIDg4MywgIDg4MywgIDg4MywgIDg4MywgIDg0OCwgMTQ1OCwgIDQxMSwKKyAgICAgIDQxMCwgIDg4NCwgIDQwOSwgIDQwOCwgIDQwNywgIDQwNiwgIDQwNSwgIDg4NCwgIDg4NCwgIDg4NCwKKyAgICAgIDg4NCwgIDg4NCwgIDg4NCwgIDg4NSwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwKKyAgICAgIDg4NiwgIDg4NywgICA1NSwgMTI0OSwgMTQ1OCwgIDg4OCwgIDQwNCwgIDg4OSwgIDQwMywgIDQwMiwKKyAgICAgICA1NSwgIDg4OCwgIDg4OCwgIDg4OCwgIDg4OCwgIDg4OCwgIDg4OCwgMTI1MCwgIDQwMSwgIDQwMCwKKyAgICAgICA1NSwgMTE0NiwgMTE0NywgMTE0NywgMTE0NywgMTE0NywgMTE0NywgMTE0NywgICA1NSwgIDM5OSwKKyAgICAgMTI0OSwgMTEwNywgIDM5OCwgIDg4OSwgIDgxNCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwKKyAgICAgIDkwMCwgIDkwMCwgIDgxNiwgMTI1MCwgMTQ1OCwgIDM5NywgIDkwMSwgMTQzNiwgIDM5NiwgIDM5MSwKKyAgICAgIDM5MCwgMTI1MSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMiwgIDkwMywKKworICAgICAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLCAxMjUyLCAgMzg5LCAgMzg4LCAgMzE3LCAgOTA0LAorICAgICAxNDU4LCAgMzg3LCAgMzg2LCAgMzg1LCAgMzg0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LAorICAgICAgOTA0LCAgIDU1LCAxMjUxLCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LAorICAgICAgMzgzLCAxMjUyLCAgMzgyLCAgMzc2LCAgOTE3LCAgMjc3LCAxNDU4LCAgMzY0LCAgMjczLCAgIDU1LAorICAgICAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE3LCAgOTE4LCAgOTE4LCAgOTE4LCAgOTE4LAorICAgICAgOTE4LCAgOTE4LCAgOTE4LCAgMzYxLCAgMjcwLCAgMzU3LCAgMjY0LCAgOTE4LCAgMjU4LCAgMTQyLAorICAgICAgMzQ1LCAgMzQ0LCAxNDU4LCAgOTE4LCAgOTE4LCAgOTE4LCAgOTE4LCAgOTE4LCAgOTE4LCAgNTk2LAorICAgICAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LCAgMzQzLCAgMzM4LCAgMzE3LAorICAgICAgMzM3LCAgOTIwLCAgMzM2LCAgNDI5LCAgMzM1LCAgMzM0LCAgMzMzLCAgOTIwLCAgOTIwLCAgOTIwLAorICAgICAgOTIwLCAgOTIwLCAgOTIwLCAxMTUwLCAxMTUxLCAxMTUxLCAxMTUxLCAxMTUxLCAxMTUxLCAxMTUxLAorCisgICAgIDExNTYsIDExNTcsIDExNTcsIDExNTcsIDExNTcsIDExNTcsIDExNTcsICAzMzIsIDEyNTcsICA0MjksCisgICAgICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICAzMzEsICAzMzAsICAzMjksCisgICAgICAzMjgsICA5MjAsIDEyNTgsICAzMjcsICAzMjYsICAzMjUsICAzMjQsICA5MjAsICA5MjAsICA5MjAsCisgICAgICA5MjAsICA5MjAsICA5MjAsICAyNjUsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsCisgICAgICA5MjEsICAzMjMsICAzMjAsICAzMTksICAzMTgsICA5MjIsICAzMTcsICAzMTYsIDEyNTgsICAzMTUsCisgICAgICAzMTQsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICAgNTMsICA5MjIsICA5MjIsCisgICAgICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjUsICA5MjYsICA5MjYsICA5MjYsICA5MjYsCisgICAgICA5MjYsICA5MjYsICAzMTMsICAzMTIsICAzMTEsICAzMTAsICA5MjcsICAzMDksICAzMDgsICAzMDcsCisgICAgICAzMDYsICAzMDUsICA5MjcsICA5MjcsICA5MjcsICA5MjcsICA5MjcsICA5MjcsICA2ODksICA3NzQsCisgICAgICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA4NDIsICAzMDQsICAzMDMsICAzMDIsCisKKyAgICAgIDc3NSwgIDMwMSwgIDMwMCwgIDI5OSwgIDI5OCwgMTI1NywgIDc3NSwgIDc3NSwgIDc3NSwgIDc3NSwKKyAgICAgIDc3NSwgIDc3NSwgIDkyOCwgIDkyOSwgIDkyOSwgIDkyOSwgIDkyOSwgIDkyOSwgIDkyOSwgMTQ1OCwKKyAgICAgIDI5NywgIDI5NiwgIDI5NSwgIDkzMCwgIDE0MiwgIDI5NCwgIDI5MywgIDI5MiwgIDI5MSwgIDkzMCwKKyAgICAgIDkzMCwgIDkzMCwgIDkzMCwgIDkzMCwgIDkzMCwgIDY5OCwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwKKyAgICAgIDc4NiwgIDc4NiwgIDc4NiwgIDg0NSwgIDI5MCwgMTQ1OCwgIDI4OSwgIDc4NywgIDI4OCwgIDI4NywKKyAgICAgIDI4NiwgIDI4NSwgMTI1OSwgIDc4NywgIDc4NywgIDc4NywgIDc4NywgIDc4NywgIDc4NywgIDkzMSwKKyAgICAgIDkzMiwgIDkzMiwgIDkzMiwgIDkzMiwgIDkzMiwgIDkzMiwgMTI2MCwgIDI4NCwgIDI4MywgIDI4MiwKKyAgICAgIDkzMywgIDI4MSwgIDI4MCwgIDI3NywgIDI2NSwgIDI3MCwgIDkzMywgIDkzMywgIDkzMywgIDkzMywKKyAgICAgIDkzMywgIDkzMywgIDcwOSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwKKyAgICAgIDg0OCwgIDI1NywgMTI2MCwgIDI1NiwgIDgwMiwgIDI1NSwgIDI1NCwgIDI1MywgIDI1MiwgMTI1OSwKKworICAgICAgODAyLCAgODAyLCAgODAyLCAgODAyLCAgODAyLCAgODAyLCAgOTM0LCAgOTM1LCAgOTM1LCAgOTM1LAorICAgICAgOTM1LCAgOTM1LCAgOTM1LCAxNDU4LCAgMjUxLCAgMjUwLCAgMjQ5LCAgOTM2LCAgMjQ4LCAgMjQ1LAorICAgICAgMjQyLCAgMjM5LCAgMjM4LCAgOTM2LCAgOTM2LCAgOTM2LCAgOTM2LCAgOTM2LCAgOTM2LCAgOTQwLAorICAgICAgOTQxLCAgOTQxLCAgOTQxLCAgOTQxLCAgOTQxLCAgOTQxLCAgNDQ3LCAgMjM3LCAgMjM2LCAxNDU4LAorICAgICAgOTQyLCAgMjMzLCAgMjMyLCAgMjMxLCAgMjMwLCAgMjI5LCAgOTQyLCAgOTQyLCAgOTQyLCAgOTQyLAorICAgICAgOTQyLCAgOTQyLCAgODUzLCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LAorICAgICAgODU1LCAgMjI4LCAgMjI3LCAgMjI2LCAgOTQ2LCAgMjI1LCAgMjI0LCAgMjIzLCAgMjIyLCAgMjIxLAorICAgICAgOTQ2LCAgOTQ2LCAgOTQ2LCAgOTQ2LCAgOTQ2LCAgOTQ2LCAgOTQ3LCAgOTQ4LCAgOTQ4LCAgOTQ4LAorICAgICAgOTQ4LCAgOTQ4LCAgOTQ4LCAgNDQ3LCAgMjIwLCAgMjE5LCAgMjE4LCAgOTQ5LCAgMjE0LCAgMjEzLAorICAgICAgMjAzLCAgMjAyLCAgMjAxLCAgOTQ5LCAgOTQ5LCAgOTQ5LCAgOTQ5LCAgOTQ5LCAgOTQ5LCAgODYyLAorCisgICAgICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA4NjQsICAxOTgsICAxOTcsCisgICAgICAxOTIsICA5NTgsICAxOTEsICAxOTAsICAxODksICAxODgsICAxODcsICA5NTgsICA5NTgsICA5NTgsCisgICAgICA5NTgsICA5NTgsICA5NTgsICA5NTksICA5NjAsICA5NjAsICA5NjAsICA5NjAsICA5NjAsICA5NjAsCisgICAgICA0NDcsICAxODYsICAxODUsICAxODQsICA5NjEsICAxODAsICAxNzksICAxNzgsICAxNzcsICAxNzYsCisgICAgICA5NjEsICA5NjEsICA5NjEsICA5NjEsICA5NjEsICA5NjEsICA4NzMsICA5NzIsICA5NzIsICA5NzIsCisgICAgICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA4NzUsICAxNzUsICAxNzQsICAxNzMsICA5NzMsICAxNzIsCisgICAgICAxNzEsICAxNzAsICAxNjksICAxNjgsICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5NzMsCisgICAgICA5NzQsICA5NzUsICA5NzUsICA5NzUsICA5NzUsICA5NzUsICA5NzUsICA0NDcsICAxNjcsICAxNjYsCisgICAgICAxNjUsICA5NzYsICAxNjQsICAxNTksICAxNTAsICAxNDksICAxNDQsICA5NzYsICA5NzYsICA5NzYsCisgICAgICA5NzYsICA5NzYsICA5NzYsICA4ODUsICA5ODgsICA5ODgsICA5ODgsICA5ODgsICA5ODgsICA5ODgsCisKKyAgICAgIDk4OCwgIDg4NywgICA1OSwgICA0NywgICA0NSwgIDk4OSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk5MCwgIDk5MSwgIDk5MSwKKyAgICAgIDk5MSwgIDk5MSwgIDk5MSwgIDk5MSwgIDQ0NywgMTQ1OCwgMTQ1OCwgMTQ1OCwgIDk5MiwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwKKyAgICAgIDgxNCwgIDk5OSwgIDk5OSwgIDk5OSwgIDk5OSwgIDk5OSwgIDk5OSwgIDk5OSwgIDgxNiwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTAwMCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTAwMCwgMTAwMCwKKyAgICAgMTAwMCwgMTAwMCwgMTAwMCwgMTAwMCwgMTAwMSwgMTAwMiwgMTAwMiwgMTAwMiwgMTAwMiwgMTAwMiwKKyAgICAgMTAwMiwgMTAwMiwgMTAwMywgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTAwNCwgMTQ1OCwgMTAwNSwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTAwNCwgMTAwNCwgMTAwNCwgMTAwNCwgMTAwNCwgMTAwNCwgMTE1OSwgMTE2MCwKKyAgICAgMTE2MCwgMTE2MCwgMTE2MCwgMTE2MCwgMTE2MCwgMTE2MywgMTE2NCwgMTE2NCwgMTE2NCwgMTE2NCwKIAotICAgICAgOTE0LCAgMjQ5LCAgMjQ2LCAgIDQ5LCAgOTE1LCAgMjM5LCAgOTE2LCAgMjMyLCAxMDcwLCAgMjMxLAotICAgICAgOTE1LCAgOTE1LCAgOTE1LCAgOTE1LCAgOTE1LCAgOTE1LCAxMzI5LCAgOTQzLCAgOTQzLCAgOTQzLAotICAgICAgOTQzLCAgOTQzLCAgOTQzLCAgODU1LCAgODU1LCAgODU1LCAgODU1LCAgODU1LCAgODU1LCAxMDcxLAotICAgICAgMjMwLCAgMjI5LCAgOTE2LCAgNzM0LCAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LCAgOTE5LAotICAgICAgODk2LCAgMjI4LCAxMDcyLCAgMjI3LCAgOTIwLCAgMjI2LCAgMjI1LCAgMjI0LCAgMjIxLCAgMjE4LAotICAgICAgOTIwLCAgOTIwLCAgOTIwLCAgOTIwLCAgOTIwLCAgOTIwLCAgOTIxLCAgOTIyLCAgOTIyLCAgOTIyLAotICAgICAgOTIyLCAgOTIyLCAgOTIyLCAgOTIzLCAgMjE1LCAgMjE0LCAgMjEzLCAgOTI0LCAxMDcyLCAgOTI1LAotICAgICAgMjEyLCAgMjA5LCAgMjA4LCAgOTI0LCAgOTI0LCAgOTI0LCAgOTI0LCAgOTI0LCAgOTI0LCAgOTUwLAotICAgICAgODU4LCAgODU4LCAgODU4LCAgODU4LCAgODU4LCAgODU4LCAgNjA2LCAgODYwLCAgODYwLCAgODYwLAotICAgICAgODYwLCAgODYwLCAgODYwLCAgMjA3LCAgMjA2LCAgOTI1LCAgNzQzLCAgOTMwLCAgOTMwLCAgOTMwLAorICAgICAxMTY0LCAxMTY0LCAxNDU4LCAxNDU4LCAxMDA1LCAgIDU1LCAgNTk2LCAxMDE4LCAxMDE4LCAxMDE4LAorICAgICAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMDE5LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAgIDU1LCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LAorICAgICAgIDUzLCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LCAxMDE5LCAgIDU1LCAgMjY1LAorICAgICAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMTcwLCAxMTcxLCAxMTcxLAorICAgICAxMTcxLCAxMTcxLCAxMTcxLCAxMTcxLCAxNDU4LCAxNDU4LCAgIDU1LCAgODUzLCAxMDIzLCAxMDIzLAorICAgICAxMDIzLCAxMDIzLCAxMDIzLCAxMDIzLCAxMDIzLCAxMDI0LCAxNDU4LCAxNDU4LCAxNDU4LCAxMDI1LAorICAgICAxNDU4LCAgODU3LCAxNDU4LCAxNDU4LCAxNDU4LCAxMDI1LCAxMDI1LCAxMDI1LCAxMDI1LCAxMDI1LAorICAgICAxMDI1LCAxMTczLCAxMTc0LCAxMTc0LCAxMTc0LCAxMTc0LCAxMTc0LCAxMTc0LCAxMTc3LCAxMTc4LAorICAgICAxMTc4LCAxMTc4LCAxMTc4LCAxMTc4LCAxMTc4LCAxNDU4LCAxNDU4LCAgODU3LCAgODYyLCAxMDI2LAogCi0gICAgICA5MzAsICA5MzAsICA5MzAsICA4OTksICAyMDUsICAyMDQsICAyMDMsICA5MzEsICAyMDIsICAyMDEsCi0gICAgICAyMDAsICAxOTksICAxOTgsICA5MzEsICA5MzEsICA5MzEsICA5MzEsICA5MzEsICA5MzEsICA5MzIsCi0gICAgICA5MzMsICA5MzMsICA5MzMsICA5MzMsICA5MzMsICA5MzMsICA5MzQsICAxOTcsICAxOTYsICAxOTUsCi0gICAgICA5MzUsICAxOTQsICA5MzYsICAxOTAsICAxODksICAxNzksICA5MzUsICA5MzUsICA5MzUsICA5MzUsCi0gICAgICA5MzUsICA5MzUsICA5NTIsICA4NjIsICA4NjIsICA4NjIsICA4NjIsICA4NjIsICA4NjIsIDEzMjksCi0gICAgICA5NTUsICA5NTUsICA5NTUsICA5NTUsICA5NTUsICA5NTUsICAxNzgsICAxNzcsICA5MzYsICA3NTQsCi0gICAgICA5NDIsICA5NDIsICA5NDIsICA5NDIsICA5NDIsICA5NDIsICA5MDIsICAxNzQsICAxNzMsICAxNzIsCi0gICAgICA5NDMsICAxNzEsICAxNzAsICAxNjksICAxNjcsICAxNjMsICA5NDMsICA5NDMsICA5NDMsICA5NDMsCi0gICAgICA5NDMsICA5NDMsICA5NDQsICA5NDUsICA5NDUsICA5NDUsICA5NDUsICA5NDUsICA5NDUsICA5NDYsCi0gICAgICAxNjIsICAxNjAsICAxNTksICA5NDcsICAxNTgsICA5NDgsICAxNTcsICAxNTYsICAxNTQsICA5NDcsCisgICAgIDEwMjYsIDEwMjYsIDEwMjYsIDEwMjYsIDEwMjYsIDEwMjYsIDEwMjcsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDEwMjgsIDE0NTgsICA4NjYsIDE0NTgsIDE0NTgsIDE0NTgsIDEwMjgsIDEwMjgsIDEwMjgsIDEwMjgsCisgICAgIDEwMjgsIDEwMjgsIDExODQsIDExODUsIDExODUsIDExODUsIDExODUsIDExODUsIDExODUsIDExODcsCisgICAgIDExODgsIDExODgsIDExODgsIDExODgsIDExODgsIDExODgsIDE0NTgsIDE0NTgsICA4NjYsICA4NzMsCisgICAgIDEwMjksIDEwMjksIDEwMjksIDEwMjksIDEwMjksIDEwMjksIDEwMjksIDEwMzAsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDEwMzEsIDE0NTgsICA4NzcsIDE0NTgsIDE0NTgsIDE0NTgsIDEwMzEsIDEwMzEsIDEwMzEsCisgICAgIDEwMzEsIDEwMzEsIDEwMzEsIDExOTEsIDExOTIsIDExOTIsIDExOTIsIDExOTIsIDExOTIsIDExOTIsCisgICAgIDEwOTEsIDEwOTEsIDEwOTEsIDEwOTEsIDEwOTEsIDEwOTEsIDEwOTEsICAgNTUsIDE0NTgsICA4NzcsCisgICAgICA4ODUsIDEwMzIsIDEwMzIsIDEwMzIsIDEwMzIsIDEwMzIsIDEwMzIsIDEwMzIsIDEwMzMsIDE0NTgsCisgICAgIDEyNjUsIDEyNjUsIDEwMzQsIDE0NTgsICA4ODksICAgNTUsIDE0NTgsIDE0NTgsIDEwMzQsIDEwMzQsCiAKLSAgICAgIDk0NywgIDk0NywgIDk0NywgIDk0NywgIDk0NywgIDk2MiwgIDk2MywgIDk2MywgIDk2MywgIDk2MywKLSAgICAgIDk2MywgIDk2NSwgIDk2NiwgIDk2NiwgIDk2NiwgIDk2NiwgIDk2NiwgIDE1MywgMTExNSwgIDE1MiwKLSAgICAgIDE0NSwgIDk0OCwgIDc2NiwgIDk1NCwgIDk1NCwgIDk1NCwgIDk1NCwgIDk1NCwgIDk1NCwgIDkwNSwKLSAgICAgIDEzOCwgMTExNiwgIDEzNywgIDk1NSwgIDEzMiwgICA4NCwgICA1OCwgICA0NywgICA0NSwgIDk1NSwKLSAgICAgIDk1NSwgIDk1NSwgIDk1NSwgIDk1NSwgIDk1NSwgIDk1NiwgIDk1NywgIDk1NywgIDk1NywgIDk1NywKLSAgICAgIDk1NywgIDk1NywgIDk1OCwgMTMyOSwgMTMyOSwgMTMyOSwgIDk1OSwgMTExNiwgIDk2MCwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgIDk1OSwgIDk1OSwgIDk1OSwgIDk1OSwgIDk1OSwgIDk1OSwgIDk2OSwgIDk3MCwKLSAgICAgIDk3MCwgIDk3MCwgIDk3MCwgIDk3MCwgMTMyOSwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwKLSAgICAgIDk3MiwgMTEyMCwgMTEyMiwgMTMyOSwgIDk2MCwgIDg3NiwgIDk3MSwgIDk3MSwgIDk3MSwgIDk3MSwKLSAgICAgIDk3MSwgIDk3MSwgIDg3OCwgMTMyOSwgMTEyMSwgMTEyMywgIDk3MiwgMTMyOSwgMTMyOSwgICA0OCwKKyAgICAgMTAzNCwgMTAzNCwgMTAzNCwgMTAzNCwgMTI2NiwgMTQ1OCwgMTIxNCwgMTIzNiwgMTIzNywgMTIzNywKKyAgICAgMTIzNywgMTIzNywgMTIzNywgMTIzNywgMTQ1OCwgMTI2NywgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTI2NywKKyAgICAgIDg4OSwgMTAzNiwgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzOCwgMTI2OCwKKyAgICAgMTI2NiwgMTQ1OCwgMTAzOSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTAzOSwgMTAzOSwKKyAgICAgMTAzOSwgMTAzOSwgMTAzOSwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MSwgMTA0MSwgMTA0MSwgMTA0MSwKKyAgICAgMTA0MSwgMTA0MSwgMTA0MiwgMTQ1OCwgMTQ1OCwgMTI2OCwgMTA0MywgMTQ1OCwgMTA0NCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTA0MywgMTA0MywgMTA0MywgMTA0MywgMTA0MywgMTA0MywgMTE1NywgMTE1NywKKyAgICAgMTE1NywgMTE1NywgMTE1NywgMTE1NywgMTE1NywgMTE3MSwgMTE3MSwgMTE3MSwgMTE3MSwgMTE3MSwKKyAgICAgMTE3MSwgMTE3MSwgMTI3MywgMTQ1OCwgMTA0NCwgIDg1MywgMTA0NywgMTA0NywgMTA0NywgMTA0NywKKyAgICAgMTA0NywgMTA0NywgMTA0NywgMTAyNCwgMTQ1OCwgMTQ1OCwgMTI3NCwgMTA0OCwgMTQ1OCwgMTQ1OCwKIAotICAgICAxMzI5LCAxMzI5LCAgOTcyLCAgOTcyLCAgOTcyLCAgOTcyLCAgOTcyLCAgOTcyLCAgOTczLCAgOTc0LAotICAgICAgOTc0LCAgOTc0LCAgOTc0LCAgOTc0LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgOTc1LCAxMzI5LAotICAgICAxMTIxLCAxMTIzLCAxMzI5LCAxMzI5LCAgOTc1LCAgOTc1LCAgOTc1LCAgOTc1LCAgOTc1LCAgOTc1LAotICAgICAgOTgwLCAgIDQ4LCAgIDQ4LCAxMzI5LCAgIDQ4LCAxMzI5LCAgODIxLCAgODIxLCAgODIxLCAgODIxLAotICAgICAgODIxLCAgODIxLCAgOTc4LCAgOTc5LCAxMTI4LCAxMTMwLCAxMzI5LCAgIDQ4LCAgOTgzLCAgOTg5LAotICAgICAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAxMzI5LCAxMzI5LCAxMTI5LCAxMTMxLCAgOTkxLAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAgIDQ4LCAgOTkxLCAgOTkxLCAgOTkxLCAgOTkxLCAgOTkxLAotICAgICAgOTkxLCAgNzM0LCAgODIwLCAgODIwLCAgODIwLCAgODIwLCAgODIwLCAgODIwLCAgODk2LCAxMDg3LAotICAgICAxMzI5LCAxMzI5LCAgODIxLCAxMTI5LCAxMTMxLCAxMzI5LCAxMzI5LCAxMTM2LCAgODIxLCAgODIxLAotICAgICAgODIxLCAgODIxLCAgODIxLCAgODIxLCAgOTkyLCAgOTkzLCAgOTkzLCAgOTkzLCAgOTkzLCAgOTkzLAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxMDQ4LCAxMDQ4LCAxMDQ4LCAxMDQ4LCAxMDQ4LCAxMDQ4LCAxMDQ5LAorICAgICAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUxLCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxMDUyLCAxMjc0LCAxMDUzLCAxNDU4LCAxNDU4LCAxMjczLCAxMDUyLCAxMDUyLCAxMDUyLAorICAgICAxMDUyLCAxMDUyLCAxMDUyLCAxMTg1LCAxMTg1LCAxMTg1LCAxMTg1LCAxMTg1LCAxMTg1LCAxMTg1LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMjc1LCAxNDU4LCAxMjc1LCAxNDU4LCAxMDUzLAorICAgICAgODYyLCAxMDU4LCAxMDU4LCAxMDU4LCAxMDU4LCAxMDU4LCAxMDU4LCAxMDU4LCAxMDI3LCAxMjc2LAorICAgICAxNDU4LCAxNDU4LCAxMDU5LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMDU5LCAxMDU5LAorICAgICAxMDU5LCAxMDU5LCAxMDU5LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYxLCAxMDYxLCAxMDYxLCAxMDYxLAorICAgICAxMDYxLCAxMDYxLCAxMDYyLCAxNDU4LCAxNDU4LCAxMjc2LCAxMDYzLCAxNDU4LCAxMDY0LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLCAxMjgxLCAxMjgyLAogCi0gICAgIDExMzcsIDEzMjksIDEzMjksIDEzMjksICA5OTQsIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgICA5OTQsICA5OTQsICA5OTQsICA5OTQsICA5OTQsICA5OTQsICA3NDMsICA4MzIsICA4MzIsICA4MzIsCi0gICAgICA4MzIsICA4MzIsICA4MzIsICA4OTksIDEzMjksIDEzMjksIDExMzcsICA4MzMsIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA5OTUsCi0gICAgICA5OTYsICA5OTYsICA5OTYsICA5OTYsICA5OTYsIDEzMjksIDEzMjksIDEzMjksIDEzMjksICA5OTcsCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksICA5OTcsICA5OTcsICA5OTcsICA5OTcsICA5OTcsCi0gICAgICA5OTcsIDEzMjksICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA3NTQsICA4NDcsCi0gICAgICA4NDcsICA4NDcsICA4NDcsICA4NDcsICA4NDcsICA5MDIsIDEzMjksIDEzMjksIDEzMjksICA4NDgsCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksICA4NDgsICA4NDgsICA4NDgsICA4NDgsICA4NDgsCi0gICAgICA4NDgsICA5OTgsICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksIDEzMjksIDEzMjksIDEzMjksCisgICAgIDEyODIsIDEyODIsIDEyODIsIDEyODIsIDEyODIsIDEyODQsIDEyODUsIDEyODUsIDEyODUsIDEyODUsCisgICAgIDEyODUsIDEyODUsIDEzMDcsIDE0NTgsIDEwNjQsICA4NzMsIDEwNzAsIDEwNzAsIDEwNzAsIDEwNzAsCisgICAgIDEwNzAsIDEwNzAsIDEwNzAsIDEwMzAsIDE0NTgsIDE0NTgsIDEzMDgsIDEwNzEsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDEwNzEsIDEwNzEsIDEwNzEsIDEwNzEsIDEwNzEsIDEwNzEsIDEwNzIsCisgICAgIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzQsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDEwNzUsIDEzMDgsIDEwNzYsIDE0NTgsIDE0NTgsIDEzMDcsIDEwNzUsIDEwNzUsIDEwNzUsCisgICAgIDEwNzUsIDEwNzUsIDEwNzUsIDEyODgsIDEyODksIDEyODksIDEyODksIDEyODksIDEyODksIDEyODksCisgICAgIDE0NTgsIDEzMTMsIDEzMTQsIDEzMTQsIDEzMTQsIDEzMTQsIDEzMTQsIDEzMTQsIDE0NTgsIDEwNzYsCisgICAgICA4ODUsIDEwODIsIDEwODIsIDEwODIsIDEwODIsIDEwODIsIDEwODIsIDEwODIsIDEwMzMsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDEwODMsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsICAgNTUsIDEwODMsIDEwODMsCiAKLSAgICAgMTMyOSwgMTAwMCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTAwMCwgMTAwMCwgMTAwMCwKLSAgICAgMTAwMCwgMTAwMCwgMTAwMCwgMTMyOSwgIDg0OCwgIDg0OCwgIDg0OCwgIDg0OCwgIDg0OCwgIDg0OCwKLSAgICAgIDc2NiwgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDkwNSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgIDg2NCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgIDg2NCwgIDg2NCwgIDg2NCwKLSAgICAgIDg2NCwgIDg2NCwgIDg2NCwgMTAwMSwgMTAwMiwgMTAwMiwgMTAwMiwgMTAwMiwgMTAwMiwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTAwMywgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTAwMywKLSAgICAgMTAwMywgMTAwMywgMTAwMywgMTAwMywgMTAwMywgMTMyOSwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwKLSAgICAgIDg2NCwgIDg2NCwgMTAwNSwgMTAwNiwgMTAwNiwgMTAwNiwgMTAwNiwgMTAwNiwgMTAwNiwgMTAwNywKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTAwOCwgMTMyOSwgMTAwOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTAwOCwKLSAgICAgMTAwOCwgMTAwOCwgMTAwOCwgMTAwOCwgMTAwOCwgMTAxMSwgMTAxMiwgMTAxMiwgMTAxMiwgMTAxMiwKKyAgICAgMTA4MywgMTA4MywgMTA4MywgMTA4MywgMTA4NCwgMTA4NSwgMTA4NSwgMTA4NSwgMTA4NSwgMTA4NSwKKyAgICAgMTA4NSwgMTA4NSwgMTA4NiwgICA1NSwgMTQ1OCwgICA1NSwgMTA4NywgMTQ1OCwgMTA4OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTA4NywgMTA4NywgMTA4NywgMTA4NywgMTA4NywgMTA4NywgMTI5NiwgMTQ1OCwKKyAgICAgMTQ1OCwgICA1NSwgMTMxOCwgMTMxOSwgMTMxOSwgMTMxOSwgMTMxOSwgMTMxOSwgMTMxOSwgMTQ1OCwKKyAgICAgMTQ1OCwgMTM1NCwgMTI5NywgMTQ1OCwgMTA4OCwgMTAwMSwgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwKKyAgICAgMTA5OSwgMTA5OSwgMTA5OSwgMTAwMywgMTQ1OCwgMTM1NSwgMTQ1OCwgMTEwMCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTM1NCwgMTEwMCwgMTEwMCwgMTEwMCwgMTEwMCwgMTEwMCwgMTEwMCwgMTEwMSwKKyAgICAgMTEwMiwgMTEwMiwgMTEwMiwgMTEwMiwgMTEwMiwgMTEwMiwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTEwMywgMTM1NSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTEwMywgMTEwMywgMTEwMywgMTEwMywKKyAgICAgMTEwMywgMTEwMywgICA1NSwgIDU5NiwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwKIAotICAgICAxMDEyLCAxMzI5LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMDA5LCAgOTEyLCAxMDEzLCAxMDEzLCAxMDEzLCAxMDEzLCAxMDEzLCAxMDEzLCAgOTE0LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMDE0LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDE0LAotICAgICAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE3LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LAotICAgICAxMDE4LCAxMDIxLCAxMDIyLCAxMDIyLCAxMDIyLCAxMDIyLCAxMDIyLCAgOTIxLCAxMDIzLCAxMDIzLAotICAgICAxMDIzLCAxMDIzLCAxMDIzLCAxMDIzLCAgOTIzLCAxMzI5LCAxMzI5LCAxMzI5LCAxMDI0LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LAotICAgICAxMzI5LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI3LCAxMDI4LCAxMDI4LAotICAgICAxMDI4LCAxMDI4LCAxMDI4LCAxMDMwLCAxMDMxLCAxMDMxLCAxMDMxLCAxMDMxLCAxMDMxLCAxMDM0LAotICAgICAxMDM1LCAxMDM1LCAxMDM1LCAxMDM1LCAxMDM1LCAgOTMyLCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LAorICAgICAxMTE1LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAgOTIyLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAgIDU1LCAgOTIyLCAgOTIyLCAgOTIyLCAgOTIyLCAgOTIyLCAgOTIyLCAgIDUzLCAgOTIyLCAgOTIyLAorICAgICAgOTIyLCAgOTIyLCAgOTIyLCAgOTIyLCAgOTIyLCAgIDU1LCAgMjY1LCAxMDIwLCAxMDIwLCAxMDIwLAorICAgICAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMzIxLCAxMzIyLCAxMzIyLCAxMzIyLCAxMzIyLCAxMzIyLAorICAgICAxMzIyLCAxNDU4LCAxMzU2LCAgIDU1LCAxMTE4LCAxMTE5LCAxMTE5LCAxMTE5LCAxMTE5LCAxMTE5LAorICAgICAxMTE5LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTIwLCAxMzU3LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxMTIwLCAxMTIwLCAxMTIwLCAxMTIwLCAxMTIwLCAxMTIwLCAgODUzLCAgOTQ1LCAgOTQ1LAorICAgICAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAxMDI0LCAxNDU4LCAxNDU4LCAxNDU4LCAgOTQ2LAorICAgICAxNDU4LCAxNDU4LCAxMzU3LCAxNDU4LCAxMzU2LCAgOTQ2LCAgOTQ2LCAgOTQ2LCAgOTQ2LCAgOTQ2LAorICAgICAgOTQ2LCAxMTIxLCAxMTIyLCAxMTIyLCAxMTIyLCAxMTIyLCAxMTIyLCAxMTIyLCAxNDU4LCAxNDU4LAogCi0gICAgIDEwMzYsIDEwMzYsICA5MzQsIDEzMjksIDEzMjksIDEzMjksIDEwMzcsIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEwMzcsIDEwMzcsIDEwMzcsIDEwMzcsIDEwMzcsIDEwMzcsIDEzMjksIDEwMzcsCi0gICAgIDEwMzcsIDEwMzcsIDEwMzcsIDEwMzcsIDEwMzcsIDEwNDEsIDEwNDIsIDEwNDIsIDEwNDIsIDEwNDIsCi0gICAgIDEwNDIsIDEwNDQsIDEwNDUsIDEwNDUsIDEwNDUsIDEwNDUsIDEwNDUsIDEwNDgsIDEwNDksIDEwNDksCi0gICAgIDEwNDksIDEwNDksIDEwNDksICA5NDQsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsCi0gICAgICA5NDYsIDEzMjksIDEzMjksIDEzMjksIDEwNTEsIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEwNTEsIDEwNTEsIDEwNTEsIDEwNTEsIDEwNTEsIDEwNTEsIDEzMjksIDEwNTEsIDEwNTEsIDEwNTEsCi0gICAgIDEwNTEsIDEwNTEsIDEwNTEsIDEwNTUsIDEwNTYsIDEwNTYsIDEwNTYsIDEwNTYsIDEwNTYsIDEwNTgsCi0gICAgIDEwNTksIDEwNTksIDEwNTksIDEwNTksIDEwNTksIDEwNjIsIDEwNjMsIDEwNjMsIDEwNjMsIDEwNjMsCi0gICAgIDEwNjMsICA5NTYsIDEwNjQsIDEwNjQsIDEwNjQsIDEwNjQsIDEwNjQsIDEwNjQsICA5NTgsIDEzMjksCisgICAgIDE0NTgsIDE0NTgsIDExMjMsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDExMjMsIDExMjMsCisgICAgIDExMjMsIDExMjMsIDExMjMsIDExMjMsICA4NjIsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsCisgICAgICA5NTcsICA5NTcsIDEwMjcsIDE0NTgsIDE0NTgsIDE0NTgsICA5NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDEzNzksICA5NTgsICA5NTgsICA5NTgsICA5NTgsICA5NTgsICA5NTgsIDExMjQsIDExMjUsCisgICAgIDExMjUsIDExMjUsIDExMjUsIDExMjUsIDExMjUsIDEzODAsIDE0NTgsIDE0NTgsIDE0NTgsIDExMjYsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDExMjYsIDExMjYsIDExMjYsIDExMjYsIDExMjYsCisgICAgIDExMjYsICA4NzMsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzIsIDEwMzAsCisgICAgIDE0NTgsIDEzODAsIDE0NTgsICA5NzMsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDEzNzksICA5NzMsCisgICAgICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5NzMsIDExMjcsIDExMjgsIDExMjgsIDExMjgsIDExMjgsCisgICAgIDExMjgsIDExMjgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDExMjksIDE0NTgsIDE0NTgsIDE0NTgsCiAKLSAgICAgMTMyOSwgMTMyOSwgMTA2NSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTA2NSwgMTA2NSwKLSAgICAgMTA2NSwgMTA2NSwgMTA2NSwgMTA2NSwgMTMyOSwgMTA2NSwgMTA2NSwgMTA2NSwgMTA2NSwgMTA2NSwKLSAgICAgMTA2NSwgIDk2MywgIDk2MywgIDk2MywgIDk2MywgIDk2MywgIDk2MywgMTA2OSwgIDk2NiwgIDk2NiwKLSAgICAgIDk2NiwgIDk2NiwgIDk2NiwgIDk2NiwgIDcwMiwgIDk2OCwgIDk2OCwgIDk2OCwgIDk2OCwgIDk2OCwKLSAgICAgIDk2OCwgMTA3MSwgIDk3MCwgIDk3MCwgIDk3MCwgIDk3MCwgIDk3MCwgIDk3MCwgIDg3NiwgMTA3MywKLSAgICAgMTA3MywgMTA3MywgMTA3MywgMTA3MywgMTA3MywgIDg3OCwgMTMyOSwgMTMyOSwgMTMyOSwgMTA3NCwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTA3NCwgMTA3NCwgMTA3NCwgMTA3NCwgMTA3NCwKLSAgICAgMTA3NCwgMTMyOSwgMTA3NCwgMTA3NCwgMTA3NCwgMTA3NCwgMTA3NCwgMTA3NCwgMTA3NSwgMTA3NiwKLSAgICAgMTA3NiwgMTA3NiwgMTA3NiwgMTA3NiwgMTA3NiwgMTA3NywgICA0OCwgMTMyOSwgMTEzOCwgMTA3OCwKLSAgICAgMTMyOSwgMTA3OSwgMTMyOSwgMTMyOSwgMTMyOSwgMTA3OCwgMTA3OCwgMTA3OCwgMTA3OCwgMTA3OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTEyOSwgMTEyOSwgMTEyOSwgMTEyOSwgMTEyOSwgMTEyOSwgIDg4NSwgIDk4OCwKKyAgICAgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgMTAzMywgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgIDk4OSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTM4MywgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwKKyAgICAgIDk4OSwgIDk4OSwgMTEzMCwgMTEzMSwgMTEzMSwgMTEzMSwgMTEzMSwgMTEzMSwgMTEzMSwgMTM4NCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTEzMiwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTEzMiwKKyAgICAgMTEzMiwgMTEzMiwgMTEzMiwgMTEzMiwgMTEzMiwgMTEzNCwgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNSwKKyAgICAgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNiwgMTQ1OCwgMTM4NCwgMTQ1OCwgMTEzNywgMTQ1OCwgMTEzOCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTEzNywgMTEzNywgMTEzNywgMTEzNywgMTEzNywgMTEzNywgMTMyNywKKyAgICAgMTMyOCwgMTMyOCwgMTMyOCwgMTMyOCwgMTMyOCwgMTMyOCwgMTMzMCwgMTMzMSwgMTMzMSwgMTMzMSwKKyAgICAgMTMzMSwgMTMzMSwgMTMzMSwgMTM4MywgMTQ1OCwgMTEzOCwgMTA0MCwgMTE0MiwgMTE0MiwgMTE0MiwKIAotICAgICAxMDc4LCAxMTM5LCAxMzI5LCAgIDQ4LCAxMTA3LCAxMTA4LCAxMTA4LCAxMTA4LCAxMTA4LCAxMTA4LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMTQ0LCAxMDg1LCAxMzI5LCAxMTQ2LCAxMDc5LCAxMDg4LCAxMDg5LAotICAgICAxMDg5LCAxMDg5LCAxMDg5LCAxMDg5LCAxMDkwLCAxMzI5LCAxMTQ1LCAxMTM5LCAxMDkxLCAxMTQ3LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDkxLCAxMDkxLCAxMDkxLCAxMDkxLCAxMDkxLCAxMDkxLAotICAgICAgOTEyLCAxMDkyLCAxMDkyLCAxMDkyLCAxMDkyLCAxMDkyLCAxMDkyLCAxMDkzLCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMDk0LCAxMTQ1LCAgOTE2LCAxMzI5LCAxMTQ3LCAxMzI5LCAxMDk0LCAxMDk0LCAxMDk0LAotICAgICAxMDk0LCAxMDk0LCAxMDk0LCAxMzI5LCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLAotICAgICAxMTE1LCAxMDEyLCAxMDEyLCAxMDEyLCAxMDEyLCAxMDEyLCAxMDEyLCAxMzI5LCAxMzI5LCAgOTE2LAotICAgICAgOTIxLCAxMDk1LCAxMDk1LCAxMDk1LCAxMDk1LCAxMDk1LCAxMDk1LCAxMDk2LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMDk3LCAxMzI5LCAgOTI1LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDk3LCAxMDk3LCAxMDk3LAorICAgICAxMTQyLCAxMTQyLCAxMTQyLCAxMTQyLCAxMDQyLCAxNDU4LCAxNDU4LCAxNDU4LCAxMTQzLCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTQzLCAxMTQzLCAxMTQzLCAxMTQzLCAxMTQzLCAxMTQzLAorICAgICAxMDQ5LCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMDUxLCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxMTUzLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTUzLCAxMTUzLAorICAgICAxMTUzLCAxMTUzLCAxMTUzLCAxMTUzLCAxMDYwLCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LAorICAgICAxMTY1LCAxMTY1LCAxMDYyLCAxNDU4LCAxNDU4LCAxNDU4LCAxMTY2LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxMTY2LCAxMTY2LCAxMTY2LCAxMTY2LCAxMTY2LCAxMTY2LCAxMDcyLCAxMTc5LAorICAgICAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMDc0LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxMTgwLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTgwLCAxMTgwLCAxMTgwLCAxMTgwLAorICAgICAxMTgwLCAxMTgwLCAxMDg0LCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLAogCi0gICAgIDEwOTcsIDEwOTcsIDEwOTcsIDEzMjksIDExMTgsIDExMTgsIDExMTgsIDExMTgsIDExMTgsIDExMTgsCi0gICAgIDExMjAsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEzMjksIDEzMjksICA5MjUsCi0gICAgICA5MzIsIDEwOTgsIDEwOTgsIDEwOTgsIDEwOTgsIDEwOTgsIDEwOTgsIDEwOTksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDExMDAsIDEzMjksICA5MzYsIDEzMjksIDEzMjksIDEzMjksIDExMDAsIDExMDAsIDExMDAsCi0gICAgIDExMDAsIDExMDAsIDExMDAsICA3MzQsIDEwMjAsIDEwMjAsIDEwMjAsIDEwMjAsIDEwMjAsIDEwMjAsCi0gICAgIDExMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDExNzgsIDEzMjksICA5MzYsCi0gICAgICA5NDQsIDExMDEsIDExMDEsIDExMDEsIDExMDEsIDExMDEsIDExMDEsIDExMDIsIDEzMjksIDEzMjksCi0gICAgIDExNzksIDExMDMsIDEzMjksICA5NDgsIDEzMjksIDEzMjksIDEzMjksIDExMDMsIDExMDMsIDExMDMsCi0gICAgIDExMDMsIDExMDMsIDExMDMsIDEzMjksIDExMjUsIDExMjUsIDExMjUsIDExMjUsIDExMjUsIDExMjUsCi0gICAgIDEwMjgsIDEwMjgsIDEwMjgsIDEwMjgsIDEwMjgsIDEwMjgsIDExNzksIDEzMjksIDEzMjksICA5NDgsCisgICAgIDEwODYsIDE0NTgsIDE0NTgsIDE0NTgsIDExOTQsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDExOTQsIDExOTQsIDExOTQsIDExOTQsIDExOTQsIDExOTQsIDEwMDEsIDEyMDIsIDEyMDIsIDEyMDIsCisgICAgIDEyMDIsIDEyMDIsIDEyMDIsIDEyMDIsIDEwMDMsIDE0NTgsIDE0NTgsIDE0NTgsIDEyMDMsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDEyMDMsIDEyMDMsIDEyMDMsIDEyMDMsIDEyMDMsIDEyMDMsCisgICAgIDEyMDQsIDEyMDUsIDEyMDUsIDEyMDUsIDEyMDUsIDEyMDUsIDEyMDUsIDEyMDUsIDEyMDYsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDEyMDcsIDE0NTgsIDEyMDgsIDE0NTgsIDE0NTgsIDE0NTgsIDEyMDcsIDEyMDcsCisgICAgIDEyMDcsIDEyMDcsIDEyMDcsIDEyMDcsIDEzMzYsIDEzMzcsIDEzMzcsIDEzMzcsIDEzMzcsIDEzMzcsCisgICAgIDEzMzcsIDEzMzksIDEzNDAsIDEzNDAsIDEzNDAsIDEzNDAsIDEzNDAsIDEzNDAsIDE0NTgsIDE0NTgsCisgICAgIDEyMDgsICAgNTUsICA1OTYsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTMsICA1MTMsCisgICAgIDEzNDUsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDE0NTgsIDEzODcsICAgNTUsCiAKLSAgICAgIDk1NiwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTEwNiwgMTMyOSwgIDk2MCwgMTMyOSwgMTMyOSwgMTMyOSwgMTEwNiwgMTEwNiwgMTEwNiwKLSAgICAgMTEwNiwgMTEwNiwgMTEwNiwgMTEyOCwgMTAzMSwgMTAzMSwgMTAzMSwgMTAzMSwgMTAzMSwgMTAzMSwKLSAgICAgIDc0MywgMTAzMywgMTAzMywgMTAzMywgMTAzMywgMTAzMywgMTAzMywgMTIyNSwgMTMyOSwgIDk2MCwKLSAgICAgMTAwNSwgMTEwOSwgMTEwOSwgMTEwOSwgMTEwOSwgMTEwOSwgMTEwOSwgMTAwNywgMTMyOSwgMTMyOSwKLSAgICAgMTIyNiwgMTExMCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTExMCwgMTExMCwgMTExMCwKLSAgICAgMTExMCwgMTExMCwgMTExMCwgIDkxMiwgMTExNywgMTExNywgMTExNywgMTExNywgMTExNywgMTExNywKLSAgICAgMTA5MywgMTMyOSwgMTMyOSwgMTMyOSwgMTExOCwgMTMyOSwgMTIyNiwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTExOCwgMTExOCwgMTExOCwgMTExOCwgMTExOCwgMTExOCwgIDkyMSwgMTEyNCwgMTEyNCwgMTEyNCwKLSAgICAgMTEyNCwgMTEyNCwgMTEyNCwgMTA5NiwgMTMyOSwgMTMyOSwgMTMyOSwgMTEyNSwgMTMyOSwgMTMyOSwKKyAgICAgMTIxNywgMTIxOCwgMTIxOCwgMTIxOCwgMTIxOCwgMTIxOCwgMTIxOCwgMTIxOSwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTIyMCwgMTM4OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTIyMCwgMTIyMCwgMTIyMCwKKyAgICAgMTIyMCwgMTIyMCwgMTIyMCwgMTA0MCwgMTIyMSwgMTIyMSwgMTIyMSwgMTIyMSwgMTIyMSwgMTIyMSwKKyAgICAgMTIyMSwgMTIyMiwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTIyMywgMTQ1OCwgMTA0NCwgMTM4OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTIyMywgMTIyMywgMTIyMywgMTIyMywgMTIyMywgMTIyMywgMTM0OCwgMTM0OSwgMTM0OSwKKyAgICAgMTM0OSwgMTM0OSwgMTM0OSwgMTM0OSwgMTI4MiwgMTI4MiwgMTI4MiwgMTI4MiwgMTI4MiwgMTI4MiwKKyAgICAgMTI4MiwgMTQ1OCwgMTQ1OCwgMTA0NCwgMTA0OSwgMTIyNCwgMTIyNCwgMTIyNCwgMTIyNCwgMTIyNCwKKyAgICAgMTIyNCwgMTIyNCwgMTIyNSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTIyNiwgMTQ1OCwgMTA1MywgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTIyNiwgMTIyNiwgMTIyNiwgMTIyNiwgMTIyNiwgMTIyNiwgMTM3MywgMTM3NCwKKyAgICAgMTM3NCwgMTM3NCwgMTM3NCwgMTM3NCwgMTM3NCwgMTMxOSwgMTMxOSwgMTMxOSwgMTMxOSwgMTMxOSwKIAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMTI1LCAxMTI1LCAxMTI1LCAxMTI1LCAxMTI1LCAxMTI1LCAxMTMwLAotICAgICAxMDM1LCAxMDM1LCAxMDM1LCAxMDM1LCAxMDM1LCAxMDM1LCAgOTMyLCAxMTMyLCAxMTMyLCAxMTMyLAotICAgICAxMTMyLCAxMTMyLCAxMTMyLCAxMDk5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMTMzLCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMTMzLCAxMTMzLCAxMTMzLCAxMTMzLCAxMTMzLCAxMTMzLCAxMzI5LAotICAgICAxMTMzLCAxMTMzLCAxMTMzLCAxMTMzLCAxMTMzLCAxMTMzLCAxMDQyLCAxMDQyLCAxMDQyLCAxMDQyLAotICAgICAxMDQyLCAxMDQyLCAxMTM2LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAgNzU0LAotICAgICAxMDQ3LCAxMDQ3LCAxMDQ3LCAxMDQ3LCAxMDQ3LCAxMDQ3LCAxMTM4LCAxMDQ5LCAxMDQ5LCAxMDQ5LAotICAgICAxMDQ5LCAxMDQ5LCAxMDQ5LCAgOTQ0LCAxMTQwLCAxMTQwLCAxMTQwLCAxMTQwLCAxMTQwLCAxMTQwLAotICAgICAxMTAyLCAxMzI5LCAxMzI5LCAxMzI5LCAxMTQxLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMTQxLCAxMTQxLCAxMTQxLCAxMTQxLCAxMTQxLCAxMTQxLCAxMzI5LCAxMTQxLCAxMTQxLCAxMTQxLAorICAgICAxMzE5LCAxMzE5LCAxMzg3LCAxNDU4LCAxMDUzLCAxMDYwLCAxMjI3LCAxMjI3LCAxMjI3LCAxMjI3LAorICAgICAxMjI3LCAxMjI3LCAxMjI3LCAxMjI4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMjI5LCAxNDU4LCAxMDY0LAorICAgICAxNDU4LCAxNDU4LCAxMzkxLCAxMjI5LCAxMjI5LCAxMjI5LCAxMjI5LCAxMjI5LCAxMjI5LCAxMzI4LAorICAgICAxMzI4LCAxMzI4LCAxMzI4LCAxMzI4LCAxMzI4LCAxMzI4LCAxMzkyLCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxMzkxLCAxNDU4LCAxMzk1LCAxNDU4LCAxMDY0LCAxMDcyLCAxMjMwLCAxMjMwLCAxMjMwLAorICAgICAxMjMwLCAxMjMwLCAxMjMwLCAxMjMwLCAxMjMxLCAxNDU4LCAxNDU4LCAxMzk2LCAxMjMyLCAxNDU4LAorICAgICAxMDc2LCAxNDU4LCAxMzkyLCAxMzk1LCAxMjMyLCAxMjMyLCAxMjMyLCAxMjMyLCAxMjMyLCAxMjMyLAorICAgICAxMzM3LCAxMzM3LCAxMzM3LCAxMzM3LCAxMzM3LCAxMzM3LCAxMzM3LCAxNDU4LCAxNDU4LCAxNDU4LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxMzk2LCAxNDU4LCAxNDU4LCAxMDc2LCAxMDg0LCAxMjMzLCAxMjMzLAorICAgICAxMjMzLCAxMjMzLCAxMjMzLCAxMjMzLCAxMjMzLCAxMjM0LCAxNDU4LCAxNDU4LCAxNDU4LCAxMjM1LAogCi0gICAgIDExNDEsIDExNDEsIDExNDEsIDEwNTYsIDEwNTYsIDEwNTYsIDEwNTYsIDEwNTYsIDEwNTYsIDExNDQsCi0gICAgIDEwNTksIDEwNTksIDEwNTksIDEwNTksIDEwNTksIDEwNTksICA3NjYsIDEwNjEsIDEwNjEsIDEwNjEsCi0gICAgIDEwNjEsIDEwNjEsIDEwNjEsIDExNDYsIDEwNjMsIDEwNjMsIDEwNjMsIDEwNjMsIDEwNjMsIDEwNjMsCi0gICAgICA5NTYsIDExNDgsIDExNDgsIDExNDgsIDExNDgsIDExNDgsIDExNDgsIDExMDUsIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDExNDksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDExNDksIDExNDksIDExNDksCi0gICAgIDExNDksIDExNDksIDExNDksIDEzMjksIDExNDksIDExNDksIDExNDksIDExNDksIDExNDksIDExNDksCi0gICAgIDExNTIsIDExNTMsIDExNTMsIDExNTMsIDExNTMsIDExNTMsIDExNTUsIDExNTYsIDExNTYsIDExNTYsCi0gICAgIDExNTYsIDExNTYsIDExNTksIDExNjAsIDExNjAsIDExNjAsIDExNjAsIDExNjAsIDEwNzUsIDExNjEsCi0gICAgIDExNjEsIDExNjEsIDExNjEsIDExNjEsIDExNjEsIDEwNzcsIDEzMjksIDEzMjksIDEzMjksIDExNjIsCi0gICAgIDEzMjksICAgNDgsICAgNDgsIDEzMjksIDEzMjksIDExNjIsIDExNjIsIDExNjIsIDExNjIsIDExNjIsCisgICAgIDE0NTgsIDEwODgsIDE0NTgsIDE0NTgsIDE0NTgsIDEyMzUsIDEyMzUsIDEyMzUsIDEyMzUsIDEyMzUsCisgICAgIDEyMzUsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDEzNDYsIDEzOTksIDE0MDAsCisgICAgIDE0MDAsIDE0MDAsIDE0MDAsIDE0MDAsIDE0MDAsIDE0MTEsIDE0NTgsIDEwODgsIDExMzQsIDEyMzgsCisgICAgIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDEyMzgsIDExMzYsIDE0NTgsIDE0NTgsIDE0MTIsCisgICAgIDEyMzksIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDEyMzksIDEyMzksIDEyMzksIDEyMzksCisgICAgIDEyMzksIDEyMzksIDEwNDAsIDEyNDYsIDEyNDYsIDEyNDYsIDEyNDYsIDEyNDYsIDEyNDYsIDEyNDYsCisgICAgIDEyMjIsIDE0NTgsIDE0NTgsIDE0NTgsIDEyNDcsIDE0MTIsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDEyNDcsIDEyNDcsIDEyNDcsIDEyNDcsIDEyNDcsIDEyNDcsIDEwNDksIDEyNTMsIDEyNTMsIDEyNTMsCisgICAgIDEyNTMsIDEyNTMsIDEyNTMsIDEyNTMsIDEyMjUsIDE0NTgsIDE0NTgsIDE0NTgsIDEyNTQsIDE0NTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDEyNTQsIDEyNTQsIDEyNTQsIDEyNTQsIDEyNTQsIDEyNTQsCiAKLSAgICAgMTE2MiwgMTMyOSwgMTE2MiwgMTE2MiwgMTE2MiwgMTE2MiwgMTE2MiwgMTE2MiwgICA0OCwgICA0OCwKLSAgICAgMTMyOSwgMTAxNCwgMTAxNCwgMTAxNCwgMTAxNCwgMTAxNCwgMTAxNCwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTE2OCwgMTE2NywgMTAwNSwgMTE2OSwgMTE2OSwgMTE2OSwgMTE2OSwgMTE2OSwgMTE2OSwgMTE3MCwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTE3MSwgMTMyOSwgMTAwOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTE3MSwKLSAgICAgMTE3MSwgMTE3MSwgMTE3MSwgMTE3MSwgMTE3MSwgMTMyOSwgMTAyNCwgMTAyNCwgMTAyNCwgMTAyNCwKLSAgICAgMTAyNCwgMTAyNCwgMTMyOSwgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTIyNywKLSAgICAgMTMyOSwgMTAwOSwgIDkxMiwgMTAxMywgMTAxMywgMTAxMywgMTAxMywgMTAxMywgMTAxMywgMTA5MywKLSAgICAgMTMyOSwgMTMyOSwgMTIyOCwgMTAxNCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTAxNCwKLSAgICAgMTAxNCwgMTAxNCwgMTAxNCwgMTAxNCwgMTAxNCwgIDkyMSwgMTAyMywgMTAyMywgMTAyMywgMTAyMywKLSAgICAgMTAyMywgMTAyMywgMTA5NiwgMTMyOSwgMTMyOSwgMTMyOSwgMTAyNCwgMTMyOSwgMTIyOCwgMTMyOSwKKyAgICAgMTA2MCwgMTI2MSwgMTI2MSwgMTI2MSwgMTI2MSwgMTI2MSwgMTI2MSwgMTI2MSwgMTIyOCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTI2MiwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTI2MiwgMTI2MiwKKyAgICAgMTI2MiwgMTI2MiwgMTI2MiwgMTI2MiwgMTA3MiwgMTI2OSwgMTI2OSwgMTI2OSwgMTI2OSwgMTI2OSwKKyAgICAgMTI2OSwgMTI2OSwgMTIzMSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTI3MCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTI3MCwgMTI3MCwgMTI3MCwgMTI3MCwgMTI3MCwgMTI3MCwgMTA4NCwgMTI3NywKKyAgICAgMTI3NywgMTI3NywgMTI3NywgMTI3NywgMTI3NywgMTI3NywgMTIzNCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTI3OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTI3OCwgMTI3OCwgMTI3OCwgMTI3OCwKKyAgICAgMTI3OCwgMTI3OCwgMTIwNCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwKKyAgICAgMTIwNiwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTI5MSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTI5MSwgMTI5MSwgMTI5MSwgMTI5MSwgMTI5MSwgMTI5MSwgMTEzNCwgMTI5OCwgMTI5OCwgMTI5OCwKIAotICAgICAxMzI5LCAxMzI5LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAgOTMyLCAxMDM2LAotICAgICAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAxMDk5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDM3LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDM3LCAxMDM3LCAxMDM3LCAxMDM3LCAxMDM3LAotICAgICAxMDM3LCAgOTQ0LCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMDUwLCAxMTAyLCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMDUxLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDUxLCAxMDUxLAotICAgICAxMDUxLCAxMDUxLCAxMDUxLCAxMDUxLCAxMzI5LCAxMDUxLCAxMDUxLCAxMDUxLCAxMDUxLCAxMDUxLAotICAgICAxMDUxLCAgOTU2LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMTA1LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMDY1LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMDY1LCAxMDY1LAotICAgICAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LCAxMzI5LCAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LAotICAgICAxMDY1LCAxMTc4LCAxMTA4LCAxMTA4LCAxMTA4LCAxMTA4LCAxMTA4LCAxMTA4LCAxMDA1LCAxMTgwLAorICAgICAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LCAxMjk5LCAxNDU4LCAxNDU4LCAxNDU4LCAxMzAwLCAxNDU4LAorICAgICAxMTM4LCAxNDU4LCAxNDU4LCAxNDExLCAxMzAwLCAxMzAwLCAxMzAwLCAxMzAwLCAxMzAwLCAxMzAwLAorICAgICAxNDAyLCAxNDAzLCAxNDAzLCAxNDAzLCAxNDAzLCAxNDAzLCAxNDAzLCAxNDU4LCAxNDEzLCAxNDE0LAorICAgICAxNDE0LCAxNDE0LCAxNDE0LCAxNDE0LCAxNDE0LCAxNDU4LCAxMTM4LCAxMDQwLCAxMTQyLCAxMTQyLAorICAgICAxMTQyLCAxMTQyLCAxMTQyLCAxMTQyLCAxMTQyLCAxMjIyLCAxNDU4LCAxNDU4LCAxNDU4LCAxMTQzLAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTQzLCAxMTQzLCAxMTQzLCAxMTQzLCAxMTQzLAorICAgICAxMTQzLCAxMDQ5LCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMTUyLCAxMjI1LAorICAgICAxNDU4LCAxNDU4LCAxNDU4LCAxMTUzLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTUzLAorICAgICAxMTUzLCAxMTUzLCAxMTUzLCAxMTUzLCAxMTUzLCAxMDYwLCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LAorICAgICAxMTY1LCAxMTY1LCAxMTY1LCAxMjI4LCAxNDU4LCAxNDU4LCAxNDU4LCAxMTY2LCAxNDU4LCAxNDU4LAogCi0gICAgIDExODAsIDExODAsIDExODAsIDExODAsIDExODAsIDExNzAsIDEzMjksIDEzMjksIDEzMjksIDExODEsCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDExODEsIDExODEsIDExODEsIDExODEsIDExODEsCi0gICAgIDExODEsIDEzMjksIDExODEsIDExODEsIDExODEsIDExODEsIDExODEsIDExODEsIDExODQsIDExODUsCi0gICAgIDExODUsIDExODUsIDExODUsIDExODUsIDExODksIDExOTAsIDExOTAsIDExOTAsIDExOTAsIDExOTAsCi0gICAgIDExOTIsIDExOTMsIDExOTMsIDExOTMsIDExOTMsIDExOTMsIDExOTgsIDExOTksIDExOTksIDExOTksCi0gICAgIDExOTksIDExOTksIDEyMDEsIDEyMDIsIDEyMDIsIDEyMDIsIDEyMDIsIDEyMDIsIDEyMDcsIDEyMDgsCi0gICAgIDEyMDgsIDEyMDgsIDEyMDgsIDEyMDgsIDEyMTAsIDEyMTEsIDEyMTEsIDEyMTEsIDEyMTEsIDEyMTEsCi0gICAgIDEyMTYsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTksIDEyMjAsIDEyMjAsIDEyMjAsCi0gICAgIDEyMjAsIDEyMjAsIDExNTMsIDExNTMsIDExNTMsIDExNTMsIDExNTMsIDExNTMsIDEyMjUsIDExNTYsCi0gICAgIDExNTYsIDExNTYsIDExNTYsIDExNTYsIDExNTYsICA4NzYsIDExNTgsIDExNTgsIDExNTgsIDExNTgsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDExNjYsIDExNjYsIDExNjYsIDExNjYsIDExNjYsIDExNjYsIDEwNzIsCisgICAgIDExNzksIDExNzksIDExNzksIDExNzksIDExNzksIDExNzksIDExNzksIDEyMzEsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDExODAsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDExODAsIDExODAsIDExODAsCisgICAgIDExODAsIDExODAsIDExODAsIDEwODQsIDExOTMsIDExOTMsIDExOTMsIDExOTMsIDExOTMsIDExOTMsCisgICAgIDExOTMsIDEyMzQsIDE0NTgsIDE0NTgsIDE0NTgsIDExOTQsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsCisgICAgIDE0NTgsIDExOTQsIDExOTQsIDExOTQsIDExOTQsIDExOTQsIDExOTQsIDExMzQsIDEzMDksIDEzMDksCisgICAgIDEzMDksIDEzMDksIDEzMDksIDEzMDksIDEzMDksIDEyOTksIDE0NTgsIDE0NTgsIDE0NTgsIDEzMTAsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDEzMTAsIDEzMTAsIDEzMTAsIDEzMTAsIDEzMTAsCisgICAgIDEzMTAsIDEyMDQsIDEzNTgsIDEzNTgsIDEzNTgsIDEzNTgsIDEzNTgsIDEzNTgsIDEzNTgsIDEyMDYsCisgICAgIDE0NTgsIDE0NTgsIDE0NTgsIDEzNTksIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDE0NTgsIDEzNTksCiAKLSAgICAgMTE1OCwgMTE1OCwgMTIyNywgMTE2MCwgMTE2MCwgMTE2MCwgMTE2MCwgMTE2MCwgMTE2MCwgMTA3NSwKLSAgICAgMTIyOSwgMTIyOSwgMTIyOSwgMTIyOSwgMTIyOSwgMTIyOSwgMTA3NywgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTIzMCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwKLSAgICAgMTIzMCwgMTIzMCwgMTMyOSwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTAwNSwKLSAgICAgMTEwOSwgMTEwOSwgMTEwOSwgMTEwOSwgMTEwOSwgMTEwOSwgMTE3MCwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTExMCwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTExMCwgMTExMCwgMTExMCwgMTExMCwKLSAgICAgMTExMCwgMTExMCwgMTMyOSwgMTExMCwgMTExMCwgMTExMCwgMTExMCwgMTExMCwgMTExMCwgMTI0NCwKLSAgICAgMTI0NSwgMTI0NSwgMTI0NSwgMTI0NSwgMTI0NSwgMTI1MCwgMTI1MCwgMTE4NSwgMTE4NSwgMTE4NSwKLSAgICAgMTE4NSwgMTE4NSwgMTE4NSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTI1MSwgIDkxMiwKLSAgICAgMTE4NywgMTE4NywgMTE4NywgMTE4NywgMTE4NywgMTE4NywgMTE5MCwgMTE5MCwgMTE5MCwgMTE5MCwKKyAgICAgMTM1OSwgMTM1OSwgMTM1OSwgMTM1OSwgMTM1OSwgMTEzNCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwKKyAgICAgMTIzOCwgMTIzOCwgMTIzOCwgMTI5OSwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTIzOSwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTIzOSwgMTIzOSwgMTIzOSwgMTIzOSwgMTIzOSwgMTIzOSwgMTQxNywKKyAgICAgMTQxOCwgMTQxOCwgMTQxOCwgMTQxOCwgMTQxOCwgMTQxOCwgMTQyMSwgMTQyMiwgMTQyMiwgMTQyMiwKKyAgICAgMTQyMiwgMTQyMiwgMTQyMiwgMTQyNSwgMTQyNiwgMTQyNiwgMTQyNiwgMTQyNiwgMTQyNiwgMTQyNiwKKyAgICAgMTQyOSwgMTQzMCwgMTQzMCwgMTQzMCwgMTQzMCwgMTQzMCwgMTQzMCwgMTQwMCwgMTQwMCwgMTQwMCwKKyAgICAgMTQwMCwgMTQwMCwgMTQwMCwgMTQwMCwgMTQzMywgMTQzMywgMTQzNywgMTQzOCwgMTQzOCwgMTQzOCwKKyAgICAgMTQzOCwgMTQzOCwgMTQzOCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQzNCwgMTQ1OCwKKyAgICAgMTQxNCwgMTQxNCwgMTQxNCwgMTQxNCwgMTQxNCwgMTQxNCwgMTQxNCwgMTQxOCwgMTQxOCwgMTQxOCwKKyAgICAgMTQxOCwgMTQxOCwgMTQxOCwgMTQxOCwgMTQyMiwgMTQyMiwgMTQyMiwgMTQyMiwgMTQyMiwgMTQyMiwKIAotICAgICAxMTkwLCAxMTkwLCAxMjU0LCAxMjU0LCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMjUxLCAxMjU1LCAgOTIxLCAxMTk1LCAxMTk1LCAxMTk1LAotICAgICAxMTk1LCAxMTk1LCAxMTk1LCAxMTk5LCAxMTk5LCAxMTk5LCAxMTk5LCAxMTk5LCAxMTk5LCAxMjU4LAotICAgICAxMjU4LCAxMjAyLCAxMjAyLCAxMjAyLCAxMjAyLCAxMjAyLCAxMjAyLCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMjU1LCAxMjU5LCAgOTMyLCAxMjA0LCAxMjA0LCAxMjA0LCAxMjA0LCAxMjA0LCAxMjA0LAotICAgICAxMjA4LCAxMjA4LCAxMjA4LCAxMjA4LCAxMjA4LCAxMjA4LCAxMjYyLCAxMjYyLCAxMjExLCAxMjExLAotICAgICAxMjExLCAxMjExLCAxMjExLCAxMjExLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMjU5LCAxMjYzLAotICAgICAgOTQ0LCAxMjEzLCAxMjEzLCAxMjEzLCAxMjEzLCAxMjEzLCAxMjEzLCAxMjE3LCAxMjE3LCAxMjE3LAotICAgICAxMjE3LCAxMjE3LCAxMjE3LCAxMjY2LCAxMjY2LCAxMjIwLCAxMjIwLCAxMjIwLCAxMjIwLCAxMjIwLAotICAgICAxMjIwLCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMjYzLCAxMjY3LCAgOTU2LCAxMjIyLCAxMjIyLAorICAgICAxNDIyLCAxNDU4LCAxNDU4LCAxNDU4LCAxNDM0LCAxNDU4LCAxNDI2LCAxNDI2LCAxNDI2LCAxNDI2LAorICAgICAxNDI2LCAxNDI2LCAxNDI2LCAxNDMwLCAxNDMwLCAxNDMwLCAxNDMwLCAxNDMwLCAxNDMwLCAxNDMwLAorICAgICAxNDQ2LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDM4LCAxNDM4LCAxNDM4LAorICAgICAxNDM4LCAxNDM4LCAxNDM4LCAxNDM4LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDQ3LCAxNDQ3LAorICAgICAxNDQ3LCAgIDQ2LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU4LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDY0LAorICAgICAxNDU4LCAgIDY0LCAgIDY0LCAgIDY0LCAgIDY0LCAgIDY0LCAgIDY0LCAgIDY0LCAgMTUxLCAxNDU4LAorICAgICAgMTUxLCAgMTU4LCAgMTU4LCAgMTU4LCAgMjY5LCAgMjY5LCAgMjY5LCAgMjc4LCAgMjc4LCAgMjc4LAorICAgICAgMzU2LCAgMzU2LCAgMzU2LCAgMzU5LCAgMzU5LCAgMzU5LCAgMzYwLCAgMzYwLCAgMzYwLCAgMzY3LAorICAgICAgMzY3LCAgMzY3LCAgMzY1LCAgMzY1LCAgMzY1LCAgMzcxLCAgMzcxLCAgMzcxLCAgMzc1LCAxNDU4LAorICAgICAgMzc1LCAgNDM3LCAgNDM3LCAgNDM3LCAgNDQyLCAgNDQyLCAgNDQyLCAgNDQzLCAgNDQzLCAgNDQzLAogCi0gICAgIDEyMjIsIDEyMjIsIDEyMjIsIDEyMjIsIDEyNzAsIDEyNzEsIDEyNzEsIDEyNzEsIDEyNzEsIDEyNzEsCi0gICAgIDEyNzMsIDEyNzQsIDEyNzQsIDEyNzQsIDEyNzQsIDEyNzQsIDEyODIsIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEyNjcsIDEyODQsIDEyODUsIDEyODUsIDEyODUsIDEyODUsIDEyODUsIDEyODMsCi0gICAgIDEyODIsIDEyNDUsIDEyNDUsIDEyNDUsIDEyNDUsIDEyNDUsIDEyNDUsIDEwMDUsIDEyNDcsIDEyNDcsCi0gICAgIDEyNDcsIDEyNDcsIDEyNDcsIDEyNDcsIDEyODgsIDEyODksIDEyODksIDEyODksIDEyODksIDEyODksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEyODMsIDEyOTIsIDEyOTMsIDEyOTMsIDEyOTMsCi0gICAgIDEyOTMsIDEyOTMsIDEyOTYsIDEyOTcsIDEyOTcsIDEyOTcsIDEyOTcsIDEyOTcsIDEzMDAsIDEzMDEsCi0gICAgIDEzMDEsIDEzMDEsIDEzMDEsIDEzMDEsIDEyNzEsIDEyNzEsIDEyNzEsIDEyNzEsIDEyNzEsIDEyNzEsCi0gICAgIDEzMDQsIDEzMDQsIDEyNzQsIDEyNzQsIDEyNzQsIDEyNzQsIDEyNzQsIDEyNzQsIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMDUsIDEwNzUsIDEyNzYsIDEyNzYsIDEyNzYsIDEyNzYsIDEyNzYsCisgICAgICA0NTIsICA0NTIsICA0NTIsICA0NTYsIDE0NTgsICA0NTYsICA0NTcsICA0NTcsICA0NTcsICAzNjksCisgICAgICAzNjksIDE0NTgsIDE0NTgsICAzNjksICA0NjEsICA0NjEsICA0NjEsICA0NjUsICA0NjUsICA0NjUsCisgICAgICAzNTksICAzNTksICAzNTksICA1MjAsICA1MjAsICA1MjAsICA1MjQsICA1MjQsICA1MjQsICA1MjUsCisgICAgICA1MjUsICA1MjUsICA1MjYsICA1MjYsICA1MjYsICAzNjcsICAzNjcsICAzNjcsICA1MzEsICA1MzEsCisgICAgICA1MzEsICA0NTAsICA0NTAsIDE0NTgsIDE0NTgsICA0NTAsICA1MzYsICA1MzYsICA1MzYsICA1NDAsCisgICAgICA1NDAsICA1NDAsICA1NDQsIDE0NTgsICA1NDQsICA1NDUsICA1NDUsICA1NDUsICA1NDksICA1NDksCisgICAgICA1NDksICA1NTMsIDE0NTgsICA1NTMsICA2MDEsICA2MDEsICA2MDEsICA0NTIsICA0NTIsICA0NTIsCisgICAgICA2MDksICA2MDksICA2MDksICA2MTAsICA2MTAsICA2MTAsICA2MTgsICA2MTgsICA2MTgsICA2MjIsCisgICAgIDE0NTgsICA2MjIsICA2MjUsIDE0NTgsICA2MjUsICA2MjYsICA2MjYsICA2MjYsICA2MzAsICA2MzAsCisgICAgICA2MzAsICA2MzQsIDE0NTgsICA2MzQsICA1NDMsICA1NDMsIDE0NTgsIDE0NTgsICA1NDMsICA1NDcsCiAKLSAgICAgMTI3NiwgMTMwOCwgMTMwOSwgMTMwOSwgMTMwOSwgMTMwOSwgMTMwOSwgMTI4NSwgMTI4NSwgMTI4NSwKLSAgICAgMTI4NSwgMTI4NSwgMTI4NSwgMTI4OSwgMTI4OSwgMTI4OSwgMTI4OSwgMTI4OSwgMTI4OSwgMTMwNSwKLSAgICAgMTI5MywgMTI5MywgMTI5MywgMTI5MywgMTI5MywgMTI5MywgMTI5NywgMTI5NywgMTI5NywgMTI5NywKLSAgICAgMTI5NywgMTI5NywgMTMwMSwgMTMwMSwgMTMwMSwgMTMwMSwgMTMwMSwgMTMwMSwgMTMxNywgMTMxOCwKLSAgICAgMTMxOCwgMTMxOCwgMTMxOCwgMTMxOCwgMTMwOSwgMTMwOSwgMTMwOSwgMTMwOSwgMTMwOSwgMTMwOSwKLSAgICAgMTMxOCwgMTMxOCwgMTMxOCwgMTMxOCwgMTMxOCwgMTMxOCwgICA0NiwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgICA0NiwgICA0NiwgICA0NiwgICA2MiwgMTMyOSwgICA2MiwgICA2MiwgICA2MiwgICA2MiwKLSAgICAgICA2MiwgICA2MiwgICA2MiwgIDEzOSwgMTMyOSwgIDEzOSwgIDE0NCwgIDE0NCwgIDE0NCwgIDIzOCwKLSAgICAgIDIzOCwgIDIzOCwgIDI0NywgIDI0NywgIDI0NywgIDMwNywgIDMwNywgIDMwNywgIDMwOSwgIDMwOSwKLSAgICAgIDMwOSwgIDMxMCwgIDMxMCwgIDMxMCwgIDMxNywgIDMxNywgIDMxNywgIDMxNSwgIDMxNSwgIDMxNSwKKyAgICAgIDU0NywgMTQ1OCwgMTQ1OCwgIDU0NywgIDY0MCwgIDY0MCwgIDY0MCwgIDY0NCwgIDY0NCwgIDY0NCwKKyAgICAgIDU1MywgIDU1MywgMTQ1OCwgIDU1MywgIDUyNSwgIDUyNSwgIDUyNSwgIDY3OCwgIDY3OCwgIDY3OCwKKyAgICAgIDY4MiwgIDY4MiwgIDY4MiwgIDY4NSwgIDY4NSwgIDY4NSwgIDY4NiwgIDY4NiwgIDY4NiwgIDY4NywKKyAgICAgIDY4NywgIDY4NywgIDY5MiwgIDY5MiwgIDY5MiwgIDYxNiwgIDYxNiwgMTQ1OCwgMTQ1OCwgIDYxNiwKKyAgICAgIDY5NywgIDY5NywgIDY5NywgIDcwMSwgIDcwMSwgIDcwMSwgIDYyMiwgIDYyMiwgMTQ1OCwgIDYyMiwKKyAgICAgIDYyNCwgIDYyNCwgMTQ1OCwgMTQ1OCwgIDYyNCwgIDYyNSwgIDYyNSwgMTQ1OCwgIDYyNSwgIDYyNiwKKyAgICAgIDYyNiwgIDYyOCwgIDYyOCwgMTQ1OCwgMTQ1OCwgIDYyOCwgIDcwOCwgIDcwOCwgIDcwOCwgIDcxMiwKKyAgICAgIDcxMiwgIDcxMiwgIDYzNCwgIDYzNCwgMTQ1OCwgIDYzNCwgIDcxNiwgMTQ1OCwgIDcxNiwgIDcxOSwKKyAgICAgMTQ1OCwgIDcxOSwgIDcyMCwgIDcyMCwgIDcyMCwgIDcyNCwgIDcyNCwgIDcyNCwgIDcyOCwgMTQ1OCwKKyAgICAgIDcyOCwgIDc1NSwgIDc1NSwgIDc1NSwgIDYxOCwgIDYxOCwgIDYxOCwgIDYzMCwgIDYzMCwgIDYzMCwKIAotICAgICAgMzI1LCAxMzI5LCAgMzI1LCAgMzY3LCAgMzY3LCAgMzY3LCAgMzcyLCAgMzcyLCAgMzcyLCAgMzczLAotICAgICAgMzczLCAgMzczLCAgMzg2LCAxMzI5LCAgMzg2LCAgMzg3LCAgMzg3LCAgMzg3LCAgMzE5LCAgMzE5LAotICAgICAxMzI5LCAxMzI5LCAgMzE5LCAgMzk1LCAgMzk1LCAgMzk1LCAgNDM5LCAgNDM5LCAgNDM5LCAgNDQzLAotICAgICAgNDQzLCAgNDQzLCAgNDQ0LCAgNDQ0LCAgNDQ0LCAgNDQ1LCAgNDQ1LCAgNDQ1LCAgNDUwLCAgNDUwLAotICAgICAgNDUwLCAgMzgwLCAgMzgwLCAxMzI5LCAxMzI5LCAgMzgwLCAgNDU5LCAgNDU5LCAgNDU5LCAgNDYzLAotICAgICAxMzI5LCAgNDYzLCAgNDY0LCAgNDY0LCAgNDY0LCAgNDcyLCAxMzI5LCAgNDcyLCAgNTA3LCAgNTA3LAotICAgICAgNTA3LCAgNTE1LCAgNTE1LCAgNTE1LCAgNTE2LCAgNTE2LCAgNTE2LCAgNTI4LCAxMzI5LCAgNTI4LAotICAgICAgNTMxLCAxMzI5LCAgNTMxLCAgNTMyLCAgNTMyLCAgNTMyLCAgNTQwLCAxMzI5LCAgNTQwLCAgNDYyLAotICAgICAgNDYyLCAxMzI5LCAxMzI5LCAgNDYyLCAgNDY2LCAgNDY2LCAxMzI5LCAxMzI5LCAgNDY2LCAgNTUwLAotICAgICAgNTUwLCAgNTUwLCAgNDQ0LCAgNDQ0LCAgNDQ0LCAgNTc1LCAgNTc1LCAgNTc1LCAgNTc5LCAgNTc5LAorICAgICAgNzY2LCAgNzY2LCAgNzY2LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzc1LCAgNzc1LCAgNzc1LCAgNzc5LAorICAgICAxNDU4LCAgNzc5LCAgNzgyLCAxNDU4LCAgNzgyLCAgNzgzLCAgNzgzLCAgNzgzLCAgNzg3LCAgNzg3LAorICAgICAgNzg3LCAgNzkxLCAxNDU4LCAgNzkxLCAgNzk0LCAxNDU4LCAgNzk0LCAgNzk3LCAxNDU4LCAgNzk3LAorICAgICAgNzk4LCAgNzk4LCAgNzk4LCAgODAyLCAgODAyLCAgODAyLCAgODA2LCAxNDU4LCAgODA2LCAgNzE1LAorICAgICAxNDU4LCAxNDU4LCAgNzE1LCAgNzE2LCAgNzE2LCAxNDU4LCAgNzE2LCAgNzE4LCAgNzE4LCAxNDU4LAorICAgICAxNDU4LCAgNzE4LCAgNzE5LCAgNzE5LCAxNDU4LCAgNzE5LCAgNzIwLCAgNzIwLCAgNzIyLCAgNzIyLAorICAgICAxNDU4LCAxNDU4LCAgNzIyLCAgODEzLCAgODEzLCAgODEzLCAgODE3LCAgODE3LCAgODE3LCAgNzI4LAorICAgICAgNzI4LCAxNDU4LCAgNzI4LCAgIDUzLCAgIDUzLCAgIDUzLCAxNDU4LCAgIDUzLCAgIDUzLCAgNjg2LAorICAgICAgNjg2LCAgNjg2LCAgODM5LCAgODM5LCAgODM5LCAgODQzLCAgODQzLCAgODQzLCAgODQ2LCAgODQ2LAorICAgICAgODQ2LCAgODQ5LCAgODQ5LCAgODQ5LCAgODUwLCAgODUwLCAgODUwLCAgODUxLCAgODUxLCAgODUxLAogCi0gICAgICA1NzksICA1ODIsICA1ODIsICA1ODIsICA1ODMsICA1ODMsICA1ODMsICA1ODQsICA1ODQsICA1ODQsCi0gICAgICA1ODksICA1ODksICA1ODksICA1MjIsICA1MjIsIDEzMjksIDEzMjksICA1MjIsICA1OTgsICA1OTgsCi0gICAgICA1OTgsICA1MzAsICA1MzAsIDEzMjksIDEzMjksICA1MzAsICA1MzQsICA1MzQsIDEzMjksIDEzMjksCi0gICAgICA1MzQsICA2MDksICA2MDksICA2MDksICA2MTMsIDEzMjksICA2MTMsICA2MTYsIDEzMjksICA2MTYsCi0gICAgICA2MTcsICA2MTcsICA2MTcsICA2MjUsIDEzMjksICA2MjUsICA2NDMsICA2NDMsICA2NDMsICA2NTQsCi0gICAgICA2NTQsICA2NTQsICA2NTUsICA2NTUsICA2NTUsICA2NjcsIDEzMjksICA2NjcsICA2NzAsIDEzMjksCi0gICAgICA2NzAsICA2NzEsICA2NzEsICA2NzEsICA2NzksIDEzMjksICA2NzksICA2ODIsIDEzMjksICA2ODIsCi0gICAgICA2ODUsIDEzMjksICA2ODUsICA2ODYsICA2ODYsICA2ODYsICA2OTQsIDEzMjksICA2OTQsICA2MTIsCi0gICAgIDEzMjksIDEzMjksICA2MTIsICA2MTUsICA2MTUsIDEzMjksIDEzMjksICA2MTUsICA2MTYsICA2MTYsCi0gICAgIDEzMjksICA2MTYsICA2MTksICA2MTksIDEzMjksIDEzMjksICA2MTksICA3MDUsICA3MDUsICA3MDUsCisgICAgICA4NTYsICA4NTYsICA4NTYsICA3NzMsICA3NzMsIDE0NTgsIDE0NTgsICA3NzMsICA4NjEsICA4NjEsCisgICAgICA4NjEsICA4NjUsICA4NjUsICA4NjUsICA3NzksICA3NzksIDE0NTgsICA3NzksICA3ODEsICA3ODEsCisgICAgIDE0NTgsIDE0NTgsICA3ODEsICA3ODIsICA3ODIsIDE0NTgsICA3ODIsICA3ODMsICA3ODMsICA3ODUsCisgICAgICA3ODUsIDE0NTgsIDE0NTgsICA3ODUsICA4NzIsICA4NzIsICA4NzIsICA4NzYsICA4NzYsICA4NzYsCisgICAgICA3OTEsICA3OTEsIDE0NTgsICA3OTEsICA3OTMsIDE0NTgsIDE0NTgsICA3OTMsICA3OTQsICA3OTQsCisgICAgIDE0NTgsICA3OTQsICA3OTYsICA3OTYsIDE0NTgsIDE0NTgsICA3OTYsICA3OTcsICA3OTcsIDE0NTgsCisgICAgICA3OTcsICA3OTgsICA3OTgsICA4MDAsICA4MDAsIDE0NTgsIDE0NTgsICA4MDAsICA4ODQsICA4ODQsCisgICAgICA4ODQsICA4ODgsICA4ODgsICA4ODgsICA4MDYsICA4MDYsIDE0NTgsICA4MDYsICA4OTAsIDE0NTgsCisgICAgICA4OTAsICA4OTMsIDE0NTgsICA4OTMsICA4OTYsIDE0NTgsICA4OTYsICA4OTcsICA4OTcsICA4OTcsCisgICAgICA5MDEsICA5MDEsICA5MDEsICA5MDUsIDE0NTgsICA5MDUsICAgNTMsICAgNTMsICAgNTMsIDE0NTgsCiAKLSAgICAgIDYyNSwgIDYyNSwgMTMyOSwgIDYyNSwgICA1MywgICA1MywgICA1MywgMTMyOSwgICA1MywgICA1MywKLSAgICAgIDU4MywgIDU4MywgIDU4MywgIDcyMCwgIDcyMCwgIDcyMCwgIDcyNCwgIDcyNCwgIDcyNCwgIDcyNywKLSAgICAgIDcyNywgIDcyNywgIDczMCwgIDczMCwgIDczMCwgIDczMSwgIDczMSwgIDczMSwgIDczMiwgIDczMiwKLSAgICAgIDczMiwgIDczNywgIDczNywgIDczNywgIDY2MSwgIDY2MSwgMTMyOSwgMTMyOSwgIDY2MSwgIDc0NiwKLSAgICAgIDc0NiwgIDc0NiwgIDY2NywgIDY2NywgMTMyOSwgIDY2NywgIDY2OSwgIDY2OSwgMTMyOSwgMTMyOSwKLSAgICAgIDY2OSwgIDY3MCwgIDY3MCwgMTMyOSwgIDY3MCwgIDY3MywgIDY3MywgMTMyOSwgMTMyOSwgIDY3MywKLSAgICAgIDc1NywgIDc1NywgIDc1NywgIDY3OSwgIDY3OSwgMTMyOSwgIDY3OSwgIDY4MSwgMTMyOSwgMTMyOSwKLSAgICAgIDY4MSwgIDY4MiwgIDY4MiwgMTMyOSwgIDY4MiwgIDY4NCwgIDY4NCwgMTMyOSwgMTMyOSwgIDY4NCwKLSAgICAgIDY4NSwgIDY4NSwgMTMyOSwgIDY4NSwgIDY4OCwgIDY4OCwgMTMyOSwgMTMyOSwgIDY4OCwgIDc2OSwKLSAgICAgIDc2OSwgIDc2OSwgIDY5NCwgIDY5NCwgMTMyOSwgIDY5NCwgIDc3MSwgMTMyOSwgIDc3MSwgIDc3NCwKKyAgICAgICA1MywgICA1MywgIDkyMywgIDkyMywgIDkyMywgIDc3NSwgIDc3NSwgIDc3NSwgIDc4NywgIDc4NywKKyAgICAgIDc4NywgIDgwMiwgIDgwMiwgIDgwMiwgIDkzNywgIDkzNywgIDkzNywgIDkzOCwgIDkzOCwgIDkzOCwKKyAgICAgIDk0NiwgIDk0NiwgIDk0NiwgIDk1MCwgMTQ1OCwgIDk1MCwgIDk1MywgMTQ1OCwgIDk1MywgIDk1NCwKKyAgICAgIDk1NCwgIDk1NCwgIDk1OCwgIDk1OCwgIDk1OCwgIDk2MiwgMTQ1OCwgIDk2MiwgIDk2NSwgMTQ1OCwKKyAgICAgIDk2NSwgIDk2OCwgMTQ1OCwgIDk2OCwgIDk2OSwgIDk2OSwgIDk2OSwgIDk3MywgIDk3MywgIDk3MywKKyAgICAgIDk3NywgMTQ1OCwgIDk3NywgIDk3OCwgMTQ1OCwgIDk3OCwgIDk4MSwgMTQ1OCwgIDk4MSwgIDk4NCwKKyAgICAgMTQ1OCwgIDk4NCwgIDk4NSwgIDk4NSwgIDk4NSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk5MywgMTQ1OCwKKyAgICAgIDk5MywgIDg5MCwgMTQ1OCwgIDg5MCwgIDg5MiwgMTQ1OCwgMTQ1OCwgIDg5MiwgIDg5MywgIDg5MywKKyAgICAgMTQ1OCwgIDg5MywgIDg5NSwgIDg5NSwgMTQ1OCwgMTQ1OCwgIDg5NSwgIDg5NiwgIDg5NiwgMTQ1OCwKKyAgICAgIDg5NiwgIDg5NywgIDg5NywgIDg5OSwgIDg5OSwgMTQ1OCwgMTQ1OCwgIDg5OSwgMTAwMCwgMTAwMCwKIAotICAgICAxMzI5LCAgNzc0LCAgNzc3LCAxMzI5LCAgNzc3LCAgNzc4LCAgNzc4LCAgNzc4LCAgNzg2LCAxMzI5LAotICAgICAgNzg2LCAgIDUzLCAgIDUzLCAgIDUzLCAxMzI5LCAgIDUzLCAgIDUzLCAgNzk4LCAgNzk4LCAgNzk4LAotICAgICAgODEyLCAgODEyLCAgODEyLCAgODEzLCAgODEzLCAgODEzLCAgODI1LCAxMzI5LCAgODI1LCAgODI4LAotICAgICAxMzI5LCAgODI4LCAgODI5LCAgODI5LCAgODI5LCAgODM3LCAxMzI5LCAgODM3LCAgODQwLCAxMzI5LAotICAgICAgODQwLCAgODQzLCAxMzI5LCAgODQzLCAgODQ0LCAgODQ0LCAgODQ0LCAgODUyLCAxMzI5LCAgODUyLAotICAgICAgODUzLCAxMzI5LCAgODUzLCAgODU2LCAxMzI5LCAgODU2LCAgODU5LCAxMzI5LCAgODU5LCAgODYwLAotICAgICAgODYwLCAgODYwLCAgODY4LCAxMzI5LCAgODY4LCAgNzcxLCAxMzI5LCAgNzcxLCAgNzczLCAxMzI5LAotICAgICAxMzI5LCAgNzczLCAgNzc0LCAgNzc0LCAxMzI5LCAgNzc0LCAgNzc2LCAgNzc2LCAxMzI5LCAxMzI5LAotICAgICAgNzc2LCAgNzc3LCAgNzc3LCAxMzI5LCAgNzc3LCAgNzgwLCAgNzgwLCAxMzI5LCAxMzI5LCAgNzgwLAotICAgICAgODc5LCAgODc5LCAgODc5LCAgNzg2LCAgNzg2LCAxMzI5LCAgNzg2LCAgIDUzLCAgIDUzLCAgIDUzLAorICAgICAxMDAwLCAxMDA0LCAxMDA0LCAxMDA0LCAgOTA1LCAgOTA1LCAxNDU4LCAgOTA1LCAgIDUzLCAgIDUzLAorICAgICAgIDUzLCAxNDU4LCAgIDUzLCAgIDUzLCAgODUwLCAgODUwLCAgODUwLCAxMDIxLCAxMDIxLCAxMDIxLAorICAgICAxMDI1LCAxMDI1LCAxMDI1LCAxMDI4LCAxMDI4LCAxMDI4LCAxMDMxLCAxMDMxLCAxMDMxLCAxMDM0LAorICAgICAxMDM0LCAxMDM0LCAxMDM1LCAxMDM1LCAxMDM1LCAxMDQzLCAxMDQzLCAxMDQzLCAgOTQ0LCAgOTQ0LAorICAgICAxNDU4LCAxNDU4LCAgOTQ0LCAxMDQ4LCAxMDQ4LCAxMDQ4LCAxMDUyLCAxMDUyLCAxMDUyLCAgOTUwLAorICAgICAgOTUwLCAxNDU4LCAgOTUwLCAgOTUyLCAgOTUyLCAxNDU4LCAxNDU4LCAgOTUyLCAgOTUzLCAgOTUzLAorICAgICAxNDU4LCAgOTUzLCAgOTU0LCAgOTU0LCAgOTU2LCAgOTU2LCAxNDU4LCAxNDU4LCAgOTU2LCAxMDU5LAorICAgICAxMDU5LCAxMDU5LCAxMDYzLCAxMDYzLCAxMDYzLCAgOTYyLCAgOTYyLCAxNDU4LCAgOTYyLCAgOTY0LAorICAgICAxNDU4LCAxNDU4LCAgOTY0LCAgOTY1LCAgOTY1LCAxNDU4LCAgOTY1LCAgOTY3LCAgOTY3LCAxNDU4LAorICAgICAxNDU4LCAgOTY3LCAgOTY4LCAgOTY4LCAxNDU4LCAgOTY4LCAgOTY5LCAgOTY5LCAgOTcxLCAgOTcxLAogCi0gICAgIDEzMjksICAgNTMsICAgNTMsICA3MzEsICA3MzEsICA3MzEsICA4OTMsICA4OTMsICA4OTMsICA4OTcsCi0gICAgICA4OTcsICA4OTcsICA5MDAsICA5MDAsICA5MDAsICA5MDMsICA5MDMsICA5MDMsICA5MDYsICA5MDYsCi0gICAgICA5MDYsICA5MDcsICA5MDcsICA5MDcsICA5MTUsICA5MTUsICA5MTUsICA4MTksICA4MTksIDEzMjksCi0gICAgIDEzMjksICA4MTksICA5MjQsICA5MjQsICA5MjQsICA4MjUsICA4MjUsIDEzMjksICA4MjUsICA4MjcsCi0gICAgICA4MjcsIDEzMjksIDEzMjksICA4MjcsICA4MjgsICA4MjgsIDEzMjksICA4MjgsICA4MzEsICA4MzEsCi0gICAgIDEzMjksIDEzMjksICA4MzEsICA5MzUsICA5MzUsICA5MzUsICA4MzcsICA4MzcsIDEzMjksICA4MzcsCi0gICAgICA4MzksIDEzMjksIDEzMjksICA4MzksICA4NDAsICA4NDAsIDEzMjksICA4NDAsICA4NDIsICA4NDIsCi0gICAgIDEzMjksIDEzMjksICA4NDIsICA4NDMsICA4NDMsIDEzMjksICA4NDMsICA4NDYsICA4NDYsIDEzMjksCi0gICAgIDEzMjksICA4NDYsICA5NDcsICA5NDcsICA5NDcsICA4NTIsICA4NTIsIDEzMjksICA4NTIsICA4NTMsCi0gICAgIDEzMjksICA4NTMsICA4NTUsIDEzMjksIDEzMjksICA4NTUsICA4NTYsICA4NTYsIDEzMjksICA4NTYsCisgICAgIDE0NTgsIDE0NTgsICA5NzEsIDEwNzEsIDEwNzEsIDEwNzEsIDEwNzUsIDEwNzUsIDEwNzUsICA5NzcsCisgICAgICA5NzcsIDE0NTgsICA5NzcsICA5NzgsIDE0NTgsICA5NzgsICA5ODAsIDE0NTgsIDE0NTgsICA5ODAsCisgICAgICA5ODEsICA5ODEsIDE0NTgsICA5ODEsICA5ODMsICA5ODMsIDE0NTgsIDE0NTgsICA5ODMsICA5ODQsCisgICAgICA5ODQsIDE0NTgsICA5ODQsICA5ODUsICA5ODUsICA5ODcsICA5ODcsIDE0NTgsIDE0NTgsICA5ODcsCisgICAgIDEwODMsIDEwODMsIDEwODMsIDEwODcsIDEwODcsIDEwODcsICA5OTMsICA5OTMsIDE0NTgsICA5OTMsCisgICAgIDEwODksIDE0NTgsIDEwODksIDEwOTIsIDE0NTgsIDEwOTIsIDEwOTUsIDE0NTgsIDEwOTUsIDEwOTYsCisgICAgIDEwOTYsIDEwOTYsIDExMDAsIDExMDAsIDExMDAsIDExMDQsIDE0NTgsIDExMDQsICAgNTMsICAgNTMsCisgICAgICAgNTMsIDE0NTgsICAgNTMsICAgNTMsIDExMTYsIDExMTYsIDExMTYsICA5NDYsICA5NDYsICA5NDYsCisgICAgICA5NTgsICA5NTgsICA5NTgsICA5NzMsICA5NzMsICA5NzMsICA5ODksICA5ODksICA5ODksIDExMzMsCisgICAgIDExMzMsIDExMzMsIDExMzksIDExMzksIDExMzksIDExMzcsIDExMzcsIDExMzcsIDExNDQsIDExNDQsCiAKLSAgICAgIDg1OCwgIDg1OCwgMTMyOSwgMTMyOSwgIDg1OCwgIDg1OSwgIDg1OSwgMTMyOSwgIDg1OSwgIDg2MiwKLSAgICAgIDg2MiwgMTMyOSwgMTMyOSwgIDg2MiwgIDk1OSwgIDk1OSwgIDk1OSwgIDg2OCwgIDg2OCwgMTMyOSwKLSAgICAgIDg2OCwgIDk2MSwgMTMyOSwgIDk2MSwgIDk2NCwgMTMyOSwgIDk2NCwgIDk2NywgMTMyOSwgIDk2NywKLSAgICAgIDk2OCwgIDk2OCwgIDk2OCwgIDk3NiwgMTMyOSwgIDk3NiwgICA1MywgICA1MywgICA1MywgMTMyOSwKLSAgICAgICA1MywgICA1MywgIDk4NywgIDk4NywgIDk4NywgMTAwNCwgMTAwNCwgMTAwNCwgMTAxMCwgMTAxMCwKLSAgICAgMTAxMCwgMTAwOCwgMTAwOCwgMTAwOCwgMTAxNSwgMTAxNSwgMTAxNSwgMTAxNiwgMTMyOSwgMTAxNiwKLSAgICAgMTAxOSwgMTMyOSwgMTAxOSwgMTAyMCwgMTAyMCwgMTAyMCwgMTAyNSwgMTAyNSwgMTAyNSwgMTAyNiwKLSAgICAgMTMyOSwgMTAyNiwgMTAyOSwgMTMyOSwgMTAyOSwgMTAzMiwgMTMyOSwgMTAzMiwgMTAzMywgMTAzMywKLSAgICAgMTAzMywgMTAzOCwgMTAzOCwgMTAzOCwgMTAzOSwgMTMyOSwgMTAzOSwgMTA0MCwgMTMyOSwgMTA0MCwKLSAgICAgMTA0MywgMTMyOSwgMTA0MywgMTA0NiwgMTMyOSwgMTA0NiwgMTA0NywgMTA0NywgMTA0NywgMTA1MiwKKyAgICAgMTE0NCwgMTE0MywgMTE0MywgMTE0MywgMTE0NSwgMTQ1OCwgMTE0NSwgMTE0OCwgMTQ1OCwgMTE0OCwKKyAgICAgMTE0OSwgMTE0OSwgMTE0OSwgMTE1NCwgMTE1NCwgMTE1NCwgMTE1MywgMTE1MywgMTE1MywgMTE1NSwKKyAgICAgMTQ1OCwgMTE1NSwgMTE1OCwgMTQ1OCwgMTE1OCwgMTE2MSwgMTQ1OCwgMTE2MSwgMTE2MiwgMTE2MiwKKyAgICAgMTE2MiwgMTE2NywgMTE2NywgMTE2NywgMTE2NiwgMTE2NiwgMTE2NiwgMTE2OCwgMTQ1OCwgMTE2OCwKKyAgICAgMTE2OSwgMTQ1OCwgMTE2OSwgMTE3MiwgMTQ1OCwgMTE3MiwgMTE3NSwgMTQ1OCwgMTE3NSwgMTE3NiwKKyAgICAgMTE3NiwgMTE3NiwgMTE4MSwgMTE4MSwgMTE4MSwgMTE4MCwgMTE4MCwgMTE4MCwgMTE4MiwgMTQ1OCwKKyAgICAgMTE4MiwgMTE4MywgMTQ1OCwgMTE4MywgMTE4NiwgMTQ1OCwgMTE4NiwgMTE4OSwgMTQ1OCwgMTE4OSwKKyAgICAgMTE5MCwgMTE5MCwgMTE5MCwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NCwgMTE5NCwgMTE5NCwgMTE5NiwKKyAgICAgMTQ1OCwgMTE5NiwgMTA4OSwgMTQ1OCwgMTA4OSwgMTA5MSwgMTQ1OCwgMTQ1OCwgMTA5MSwgMTA5MiwKKyAgICAgMTA5MiwgMTQ1OCwgMTA5MiwgMTA5NCwgMTA5NCwgMTQ1OCwgMTQ1OCwgMTA5NCwgMTA5NSwgMTA5NSwKIAotICAgICAxMDUyLCAxMDUyLCAxMDUzLCAxMzI5LCAxMDUzLCAxMDU0LCAxMzI5LCAxMDU0LCAxMDU3LCAxMzI5LAotICAgICAxMDU3LCAxMDYwLCAxMzI5LCAxMDYwLCAxMDYxLCAxMDYxLCAxMDYxLCAxMDY2LCAxMDY2LCAxMDY2LAotICAgICAxMDY3LCAxMzI5LCAxMDY3LCAgOTYxLCAxMzI5LCAgOTYxLCAgOTYzLCAxMzI5LCAxMzI5LCAgOTYzLAotICAgICAgOTY0LCAgOTY0LCAxMzI5LCAgOTY0LCAgOTY2LCAgOTY2LCAxMzI5LCAxMzI5LCAgOTY2LCAgOTY3LAotICAgICAgOTY3LCAxMzI5LCAgOTY3LCAgOTcwLCAgOTcwLCAxMzI5LCAxMzI5LCAgOTcwLCAxMDc4LCAxMDc4LAotICAgICAxMDc4LCAgOTc2LCAgOTc2LCAxMzI5LCAgOTc2LCAgIDUzLCAgIDUzLCAgIDUzLCAxMzI5LCAgIDUzLAotICAgICAgIDUzLCAgOTA3LCAgOTA3LCAgOTA3LCAxMDk0LCAxMDk0LCAxMDk0LCAxMDk3LCAxMDk3LCAxMDk3LAotICAgICAxMTAwLCAxMTAwLCAxMTAwLCAxMTAzLCAxMTAzLCAxMTAzLCAxMTA2LCAxMTA2LCAxMTA2LCAxMTExLAotICAgICAxMTExLCAxMTExLCAxMTEzLCAxMzI5LCAxMTEzLCAxMTE0LCAxMTE0LCAxMTE0LCAxMDEyLCAxMDEyLAotICAgICAxMzI5LCAxMzI5LCAxMDEyLCAxMTE5LCAxMTE5LCAxMTE5LCAxMDE2LCAxMDE2LCAxMzI5LCAxMDE2LAorICAgICAxNDU4LCAxMDk1LCAxMDk2LCAxMDk2LCAxMDk4LCAxMDk4LCAxNDU4LCAxNDU4LCAxMDk4LCAxMjAzLAorICAgICAxMjAzLCAxMjAzLCAxMjA3LCAxMjA3LCAxMjA3LCAxMTA0LCAxMTA0LCAxNDU4LCAxMTA0LCAgIDUzLAorICAgICAgIDUzLCAgIDUzLCAxNDU4LCAgIDUzLCAgIDUzLCAxMDM1LCAxMDM1LCAxMDM1LCAxMjIzLCAxMjIzLAorICAgICAxMjIzLCAxMjI2LCAxMjI2LCAxMjI2LCAxMjI5LCAxMjI5LCAxMjI5LCAxMjMyLCAxMjMyLCAxMjMyLAorICAgICAxMjM1LCAxMjM1LCAxMjM1LCAxMjQwLCAxMjQwLCAxMjQwLCAxMjM5LCAxMjM5LCAxMjM5LCAxMjQyLAorICAgICAxNDU4LCAxMjQyLCAxMjQzLCAxMjQzLCAxMjQzLCAxMTQxLCAxMTQxLCAxNDU4LCAxNDU4LCAxMTQxLAorICAgICAxMjQ3LCAxMjQ3LCAxMjQ3LCAxMjQ4LCAxMjQ4LCAxMjQ4LCAxMTQ1LCAxMTQ1LCAxNDU4LCAxMTQ1LAorICAgICAxMTQ3LCAxMTQ3LCAxNDU4LCAxNDU4LCAxMTQ3LCAxMTQ4LCAxMTQ4LCAxNDU4LCAxMTQ4LCAxMTQ5LAorICAgICAxMTQ5LCAxMTUxLCAxMTUxLCAxNDU4LCAxNDU4LCAxMTUxLCAxMjU0LCAxMjU0LCAxMjU0LCAxMjU1LAorICAgICAxMjU1LCAxMjU1LCAxMTU1LCAxMTU1LCAxNDU4LCAxMTU1LCAxMTU3LCAxNDU4LCAxNDU4LCAxMTU3LAogCi0gICAgIDEwMTgsIDEwMTgsIDEzMjksIDEzMjksIDEwMTgsIDEwMTksIDEwMTksIDEzMjksIDEwMTksIDEwMjIsCi0gICAgIDEwMjIsIDEzMjksIDEzMjksIDEwMjIsIDExMjYsIDExMjYsIDExMjYsIDEwMjYsIDEwMjYsIDEzMjksCi0gICAgIDEwMjYsIDEwMjgsIDEzMjksIDEzMjksIDEwMjgsIDEwMjksIDEwMjksIDEzMjksIDEwMjksIDEwMzEsCi0gICAgIDEwMzEsIDEzMjksIDEzMjksIDEwMzEsIDEwMzIsIDEwMzIsIDEzMjksIDEwMzIsIDEwMzUsIDEwMzUsCi0gICAgIDEzMjksIDEzMjksIDEwMzUsIDExMzQsIDExMzQsIDExMzQsIDEwMzksIDEwMzksIDEzMjksIDEwMzksCi0gICAgIDEwNDAsIDEzMjksIDEwNDAsIDEwNDIsIDEzMjksIDEzMjksIDEwNDIsIDEwNDMsIDEwNDMsIDEzMjksCi0gICAgIDEwNDMsIDEwNDUsIDEwNDUsIDEzMjksIDEzMjksIDEwNDUsIDEwNDYsIDEwNDYsIDEzMjksIDEwNDYsCi0gICAgIDEwNDksIDEwNDksIDEzMjksIDEzMjksIDEwNDksIDExNDIsIDExNDIsIDExNDIsIDEwNTMsIDEwNTMsCi0gICAgIDEzMjksIDEwNTMsIDEwNTQsIDEzMjksIDEwNTQsIDEwNTYsIDEzMjksIDEzMjksIDEwNTYsIDEwNTcsCi0gICAgIDEwNTcsIDEzMjksIDEwNTcsIDEwNTksIDEwNTksIDEzMjksIDEzMjksIDEwNTksIDEwNjAsIDEwNjAsCisgICAgIDExNTgsIDExNTgsIDE0NTgsIDExNTgsIDExNjAsIDExNjAsIDE0NTgsIDE0NTgsIDExNjAsIDExNjEsCisgICAgIDExNjEsIDE0NTgsIDExNjEsIDExNjIsIDExNjIsIDExNjQsIDExNjQsIDE0NTgsIDE0NTgsIDExNjQsCisgICAgIDEyNjIsIDEyNjIsIDEyNjIsIDEyNjMsIDEyNjMsIDEyNjMsIDExNjgsIDExNjgsIDE0NTgsIDExNjgsCisgICAgIDExNjksIDE0NTgsIDExNjksIDExNzEsIDE0NTgsIDE0NTgsIDExNzEsIDExNzIsIDExNzIsIDE0NTgsCisgICAgIDExNzIsIDExNzQsIDExNzQsIDE0NTgsIDE0NTgsIDExNzQsIDExNzUsIDExNzUsIDE0NTgsIDExNzUsCisgICAgIDExNzYsIDExNzYsIDExNzgsIDExNzgsIDE0NTgsIDE0NTgsIDExNzgsIDEyNzAsIDEyNzAsIDEyNzAsCisgICAgIDEyNzEsIDEyNzEsIDEyNzEsIDExODIsIDExODIsIDE0NTgsIDExODIsIDExODMsIDE0NTgsIDExODMsCisgICAgIDExODUsIDE0NTgsIDE0NTgsIDExODUsIDExODYsIDExODYsIDE0NTgsIDExODYsIDExODgsIDExODgsCisgICAgIDE0NTgsIDE0NTgsIDExODgsIDExODksIDExODksIDE0NTgsIDExODksIDExOTAsIDExOTAsIDExOTIsCisgICAgIDExOTIsIDE0NTgsIDE0NTgsIDExOTIsIDEyNzgsIDEyNzgsIDEyNzgsIDEyNzksIDEyNzksIDEyNzksCiAKLSAgICAgMTMyOSwgMTA2MCwgMTA2MywgMTA2MywgMTMyOSwgMTMyOSwgMTA2MywgMTE1MCwgMTE1MCwgMTE1MCwKLSAgICAgMTA2NywgMTA2NywgMTMyOSwgMTA2NywgMTE1MSwgMTMyOSwgMTE1MSwgMTE1NCwgMTMyOSwgMTE1NCwKLSAgICAgMTE1NywgMTMyOSwgMTE1NywgMTE1OCwgMTE1OCwgMTE1OCwgMTE2MywgMTMyOSwgMTE2MywgMTE2NCwKLSAgICAgMTMyOSwgMTE2NCwgICA1MywgICA1MywgICA1MywgMTMyOSwgICA1MywgICA1MywgMTE3MiwgMTMyOSwKLSAgICAgMTE3MiwgMTE3MSwgMTE3MSwgMTE3MSwgMTE3MywgMTMyOSwgMTE3MywgMTE3NCwgMTMyOSwgMTE3NCwKLSAgICAgMTE3NSwgMTMyOSwgMTE3NSwgMTE3NiwgMTMyOSwgMTE3NiwgMTE3NywgMTMyOSwgMTE3NywgMTEwOCwKLSAgICAgMTEwOCwgMTMyOSwgMTMyOSwgMTEwOCwgMTE4MiwgMTE4MiwgMTE4MiwgIDMxNywgIDMxNywgIDMxNywKLSAgICAgMTExMywgMTExMywgMTMyOSwgMTExMywgMTE4MywgMTE4MywgMTE4MywgMTE4NiwgMTMyOSwgMTE4NiwKLSAgICAgMTE4NywgMTE4NywgMTE4NywgMTE4OCwgMTE4OCwgMTE4OCwgMTE5MSwgMTMyOSwgMTE5MSwgMTE5NCwKLSAgICAgMTMyOSwgMTE5NCwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NiwgMTE5NiwgMTE5NiwgMTE5NywgMTMyOSwKKyAgICAgMTE5NiwgMTE5NiwgMTQ1OCwgMTE5NiwgMTI4MCwgMTQ1OCwgMTI4MCwgMTI4MywgMTQ1OCwgMTI4MywKKyAgICAgMTI4NiwgMTQ1OCwgMTI4NiwgMTI4NywgMTI4NywgMTI4NywgMTI5MiwgMTQ1OCwgMTI5MiwgMTI5MSwKKyAgICAgMTI5MSwgMTI5MSwgMTI5MywgMTQ1OCwgMTI5MywgICA1MywgICA1MywgICA1MywgMTQ1OCwgICA1MywKKyAgICAgICA1MywgMTMwMSwgMTQ1OCwgMTMwMSwgMTMwMCwgMTMwMCwgMTMwMCwgMTMwMiwgMTQ1OCwgMTMwMiwKKyAgICAgMTE0MywgMTE0MywgMTE0MywgMTMwMywgMTQ1OCwgMTMwMywgMTE1MywgMTE1MywgMTE1MywgMTMwNCwKKyAgICAgMTQ1OCwgMTMwNCwgMTE2NiwgMTE2NiwgMTE2NiwgMTMwNSwgMTQ1OCwgMTMwNSwgMTE4MCwgMTE4MCwKKyAgICAgMTE4MCwgMTMwNiwgMTQ1OCwgMTMwNiwgMTE5NCwgMTE5NCwgMTE5NCwgMTIzNywgMTIzNywgMTQ1OCwKKyAgICAgMTQ1OCwgMTIzNywgMTMxMCwgMTMxMCwgMTMxMCwgMTMxMSwgMTMxMSwgMTMxMSwgIDM2NywgIDM2NywKKyAgICAgIDM2NywgMTI0MiwgMTI0MiwgMTQ1OCwgMTI0MiwgMTMxMiwgMTMxMiwgMTMxMiwgMTMxNSwgMTQ1OCwKKyAgICAgMTMxNSwgMTMxNiwgMTMxNiwgMTMxNiwgMTMxNywgMTMxNywgMTMxNywgMTMyMCwgMTQ1OCwgMTMyMCwKIAotICAgICAxMTk3LCAxMjAwLCAxMzI5LCAxMjAwLCAxMjAzLCAxMzI5LCAxMjAzLCAxMjA0LCAxMjA0LCAxMjA0LAotICAgICAxMjA1LCAxMjA1LCAxMjA1LCAxMjA2LCAxMzI5LCAxMjA2LCAxMjA5LCAxMzI5LCAxMjA5LCAxMjEyLAotICAgICAxMzI5LCAxMjEyLCAxMjEzLCAxMjEzLCAxMjEzLCAxMjE0LCAxMjE0LCAxMjE0LCAxMjE1LCAxMzI5LAotICAgICAxMjE1LCAxMjE4LCAxMzI5LCAxMjE4LCAxMjIxLCAxMzI5LCAxMjIxLCAxMjIyLCAxMjIyLCAxMjIyLAotICAgICAxMjIzLCAxMjIzLCAxMjIzLCAxMTUxLCAxMzI5LCAxMTUxLCAxMTUzLCAxMzI5LCAxMzI5LCAxMTUzLAotICAgICAxMTU0LCAxMTU0LCAxMzI5LCAxMTU0LCAxMTU2LCAxMTU2LCAxMzI5LCAxMzI5LCAxMTU2LCAxMTU3LAotICAgICAxMTU3LCAxMzI5LCAxMTU3LCAxMTYwLCAxMTYwLCAxMzI5LCAxMzI5LCAxMTYwLCAxMjMxLCAxMzI5LAotICAgICAxMjMxLCAxMTY0LCAxMTY0LCAxMzI5LCAxMTY0LCAgIDUzLCAgIDUzLCAgIDUzLCAxMzI5LCAgIDUzLAotICAgICAgIDUzLCAxMjM2LCAxMjM2LCAxMjM2LCAxMjM4LCAxMzI5LCAxMjM4LCAxMjM5LCAxMzI5LCAxMjM5LAotICAgICAxMjQwLCAxMzI5LCAxMjQwLCAxMjQxLCAxMzI5LCAxMjQxLCAxMjQyLCAxMzI5LCAxMjQyLCAxMjQzLAorICAgICAxMzIzLCAxNDU4LCAxMzIzLCAxMzI0LCAxMzI0LCAxMzI0LCAxMzI1LCAxMzI1LCAxMzI1LCAxMzI2LAorICAgICAxNDU4LCAxMzI2LCAxMzI5LCAxNDU4LCAxMzI5LCAxMzMyLCAxNDU4LCAxMzMyLCAxMzMzLCAxMzMzLAorICAgICAxMzMzLCAxMzM0LCAxMzM0LCAxMzM0LCAxMzM1LCAxNDU4LCAxMzM1LCAxMzM4LCAxNDU4LCAxMzM4LAorICAgICAxMzQxLCAxNDU4LCAxMzQxLCAxMzQyLCAxMzQyLCAxMzQyLCAxMzQzLCAxMzQzLCAxMzQzLCAxMzQ0LAorICAgICAxNDU4LCAxMzQ0LCAxMzQ3LCAxNDU4LCAxMzQ3LCAxMzUwLCAxNDU4LCAxMzUwLCAxMzUxLCAxMzUxLAorICAgICAxMzUxLCAxMzUyLCAxMzUyLCAxMzUyLCAxMjgwLCAxNDU4LCAxMjgwLCAxMjgyLCAxNDU4LCAxNDU4LAorICAgICAxMjgyLCAxMjgzLCAxMjgzLCAxNDU4LCAxMjgzLCAxMjg1LCAxMjg1LCAxNDU4LCAxNDU4LCAxMjg1LAorICAgICAxMjg2LCAxMjg2LCAxNDU4LCAxMjg2LCAxMjg3LCAxMjg3LCAxMjg5LCAxMjg5LCAxNDU4LCAxNDU4LAorICAgICAxMjg5LCAxMzU5LCAxMzU5LCAxMzU5LCAxMzYwLCAxNDU4LCAxMzYwLCAxMjkzLCAxMjkzLCAxNDU4LAorICAgICAxMjkzLCAgIDUzLCAgIDUzLCAgIDUzLCAxNDU4LCAgIDUzLCAgIDUzLCAxMzY1LCAxMzY1LCAxMzY1LAogCi0gICAgIDEzMjksIDEyNDMsIDEyNDYsIDEzMjksIDEyNDYsIDEyNDcsIDEyNDcsIDEyNDcsIDEyNDgsIDEyNDgsCi0gICAgIDEyNDgsIDEyNDksIDEzMjksIDEyNDksIDExODUsIDExODUsIDEzMjksIDEzMjksIDExODUsIDExODYsCi0gICAgIDExODYsIDEzMjksIDExODYsIDEyNTIsIDEzMjksIDEyNTIsIDExOTAsIDEzMjksIDEzMjksIDExOTAsCi0gICAgIDExOTEsIDExOTEsIDEzMjksIDExOTEsIDExOTMsIDExOTMsIDEzMjksIDEzMjksIDExOTMsIDExOTQsCi0gICAgIDExOTQsIDEzMjksIDExOTQsIDEyNTYsIDEzMjksIDEyNTYsIDExOTcsIDEzMjksIDExOTcsIDExOTksCi0gICAgIDEzMjksIDEzMjksIDExOTksIDEyMDAsIDEyMDAsIDEzMjksIDEyMDAsIDEyMDIsIDEyMDIsIDEzMjksCi0gICAgIDEzMjksIDEyMDIsIDEyMDMsIDEyMDMsIDEzMjksIDEyMDMsIDEyNjAsIDEzMjksIDEyNjAsIDEyMDYsCi0gICAgIDEzMjksIDEyMDYsIDEyMDgsIDEzMjksIDEzMjksIDEyMDgsIDEyMDksIDEyMDksIDEzMjksIDEyMDksCi0gICAgIDEyMTEsIDEyMTEsIDEzMjksIDEzMjksIDEyMTEsIDEyMTIsIDEyMTIsIDEzMjksIDEyMTIsIDEyNjQsCi0gICAgIDEzMjksIDEyNjQsIDEyMTUsIDEzMjksIDEyMTUsIDEyMTcsIDEzMjksIDEzMjksIDEyMTcsIDEyMTgsCisgICAgIDEyMzksIDEyMzksIDEyMzksIDEzNjcsIDE0NTgsIDEzNjcsIDEzNjgsIDE0NTgsIDEzNjgsIDEzNjksCisgICAgIDE0NTgsIDEzNjksIDEzNzAsIDE0NTgsIDEzNzAsIDEzNzEsIDE0NTgsIDEzNzEsIDEzNzIsIDE0NTgsCisgICAgIDEzNzIsIDEzNzUsIDE0NTgsIDEzNzUsIDEzNzYsIDEzNzYsIDEzNzYsIDEzNzcsIDEzNzcsIDEzNzcsCisgICAgIDEzNzgsIDE0NTgsIDEzNzgsIDEzMTQsIDEzMTQsIDE0NTgsIDE0NTgsIDEzMTQsIDEzMTUsIDEzMTUsCisgICAgIDE0NTgsIDEzMTUsIDEzMTYsIDEzMTYsIDEzODEsIDE0NTgsIDEzODEsIDEzMTksIDE0NTgsIDE0NTgsCisgICAgIDEzMTksIDEzMjAsIDEzMjAsIDE0NTgsIDEzMjAsIDEzMjIsIDEzMjIsIDE0NTgsIDE0NTgsIDEzMjIsCisgICAgIDEzMjMsIDEzMjMsIDE0NTgsIDEzMjMsIDEzMjQsIDEzMjQsIDEzODUsIDE0NTgsIDEzODUsIDEzMjYsCisgICAgIDE0NTgsIDEzMjYsIDEzMjgsIDE0NTgsIDE0NTgsIDEzMjgsIDEzMjksIDEzMjksIDE0NTgsIDEzMjksCisgICAgIDEzMzEsIDEzMzEsIDE0NTgsIDE0NTgsIDEzMzEsIDEzMzIsIDEzMzIsIDE0NTgsIDEzMzIsIDEzMzMsCisgICAgIDEzMzMsIDEzODksIDE0NTgsIDEzODksIDEzMzUsIDE0NTgsIDEzMzUsIDEzMzcsIDE0NTgsIDE0NTgsCiAKLSAgICAgMTIxOCwgMTMyOSwgMTIxOCwgMTIyMCwgMTIyMCwgMTMyOSwgMTMyOSwgMTIyMCwgMTIyMSwgMTIyMSwKLSAgICAgMTMyOSwgMTIyMSwgMTI2OCwgMTMyOSwgMTI2OCwgMTI2OSwgMTMyOSwgMTI2OSwgMTI3MiwgMTMyOSwKLSAgICAgMTI3MiwgMTI3NSwgMTMyOSwgMTI3NSwgMTI3NiwgMTI3NiwgMTI3NiwgMTI3NywgMTMyOSwgMTI3NywKLSAgICAgICA1MywgICA1MywgICA1MywgMTMyOSwgICA1MywgICA1MywgMTI4MSwgMTMyOSwgMTI4MSwgMTE4MywKLSAgICAgMTMyOSwgMTE4MywgMTE4OCwgMTMyOSwgMTE4OCwgMTE5NiwgMTMyOSwgMTE5NiwgMTIwNSwgMTMyOSwKLSAgICAgMTIwNSwgMTIxNCwgMTMyOSwgMTIxNCwgMTIyMywgMTMyOSwgMTIyMywgMTI0NSwgMTI0NSwgMTMyOSwKLSAgICAgMTMyOSwgMTI0NSwgMTI0NiwgMTI0NiwgMTMyOSwgMTI0NiwgMTIzNywgMTMyOSwgMTIzNywgMTI4NiwKLSAgICAgMTMyOSwgMTI4NiwgMTI4NywgMTMyOSwgMTI4NywgMTI5MCwgMTMyOSwgMTI5MCwgMTI5MSwgMTMyOSwKLSAgICAgMTI5MSwgMTI5NCwgMTMyOSwgMTI5NCwgMTI5NSwgMTMyOSwgMTI5NSwgMTI5OCwgMTMyOSwgMTI5OCwKLSAgICAgMTI5OSwgMTMyOSwgMTI5OSwgMTMwMiwgMTMyOSwgMTMwMiwgMTI3MSwgMTMyOSwgMTMyOSwgMTI3MSwKKyAgICAgMTMzNywgMTMzOCwgMTMzOCwgMTQ1OCwgMTMzOCwgMTM0MCwgMTM0MCwgMTQ1OCwgMTQ1OCwgMTM0MCwKKyAgICAgMTM0MSwgMTM0MSwgMTQ1OCwgMTM0MSwgMTM0MiwgMTM0MiwgMTM5MywgMTQ1OCwgMTM5MywgMTM0NCwKKyAgICAgMTQ1OCwgMTM0NCwgMTM0NiwgMTQ1OCwgMTQ1OCwgMTM0NiwgMTM0NywgMTM0NywgMTQ1OCwgMTM0NywKKyAgICAgMTM0OSwgMTM0OSwgMTQ1OCwgMTQ1OCwgMTM0OSwgMTM1MCwgMTM1MCwgMTQ1OCwgMTM1MCwgMTM1MSwKKyAgICAgMTM1MSwgMTM5NywgMTQ1OCwgMTM5NywgMTM5OCwgMTQ1OCwgMTM5OCwgMTQwMSwgMTQ1OCwgMTQwMSwKKyAgICAgMTQwNCwgMTQ1OCwgMTQwNCwgMTQwNSwgMTQwNSwgMTQwNSwgMTQwNiwgMTQ1OCwgMTQwNiwgICA1MywKKyAgICAgICA1MywgICA1MywgMTQ1OCwgICA1MywgICA1MywgMTQxMCwgMTQ1OCwgMTQxMCwgMTMxMiwgMTQ1OCwKKyAgICAgMTMxMiwgMTMxNywgMTQ1OCwgMTMxNywgMTMyNSwgMTQ1OCwgMTMyNSwgMTMzNCwgMTQ1OCwgMTMzNCwKKyAgICAgMTM0MywgMTQ1OCwgMTM0MywgMTM1MiwgMTQ1OCwgMTM1MiwgMTM3NCwgMTM3NCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTM3NCwgMTM3NSwgMTM3NSwgMTQ1OCwgMTM3NSwgMTM3NiwgMTM3NiwgMTM2NiwgMTQ1OCwgMTM2NiwKIAotICAgICAxMjc0LCAxMjc0LCAxMzI5LCAxMzI5LCAxMjc0LCAxMzA2LCAxMzI5LCAxMzA2LCAxMjQ4LCAxMzI5LAotICAgICAxMjQ4LCAxMzEwLCAxMzI5LCAxMzEwLCAxMjg1LCAxMzI5LCAxMzI5LCAxMjg1LCAxMjg5LCAxMzI5LAotICAgICAxMzI5LCAxMjg5LCAxMjkzLCAxMzI5LCAxMzI5LCAxMjkzLCAxMjk3LCAxMzI5LCAxMzI5LCAxMjk3LAotICAgICAxMzAxLCAxMzI5LCAxMzI5LCAxMzAxLCAxMzE2LCAxMzI5LCAxMzE2LCAxMzE5LCAxMzI5LCAxMzE5LAotICAgICAxMzA5LCAxMzI5LCAxMzI5LCAxMzA5LCAxMzIxLCAxMzI5LCAxMzIxLCAxMzIyLCAxMzI5LCAxMzIyLAotICAgICAxMzIzLCAxMzI5LCAxMzIzLCAxMzI0LCAxMzI5LCAxMzI0LCAxMzI1LCAxMzI5LCAxMzI1LCAxMzE4LAotICAgICAxMzI5LCAxMzI5LCAxMzE4LCAxMzI3LCAxMzI5LCAxMzI3LCAxMzI4LCAxMzI5LCAxMzI4LCAgICAzLAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAorICAgICAxNDE1LCAxNDU4LCAxNDE1LCAxNDE2LCAxNDU4LCAxNDE2LCAxNDE5LCAxNDU4LCAxNDE5LCAxNDIwLAorICAgICAxNDU4LCAxNDIwLCAxNDIzLCAxNDU4LCAxNDIzLCAxNDI0LCAxNDU4LCAxNDI0LCAxNDI3LCAxNDU4LAorICAgICAxNDI3LCAxNDI4LCAxNDU4LCAxNDI4LCAxNDMxLCAxNDU4LCAxNDMxLCAxNDAwLCAxNDU4LCAxNDU4LAorICAgICAxNDAwLCAxNDAzLCAxNDAzLCAxNDU4LCAxNDU4LCAxNDAzLCAxNDM1LCAxNDU4LCAxNDM1LCAxMzc3LAorICAgICAxNDU4LCAxMzc3LCAxNDM5LCAxNDU4LCAxNDM5LCAxNDE0LCAxNDU4LCAxNDU4LCAxNDE0LCAxNDE4LAorICAgICAxNDU4LCAxNDU4LCAxNDE4LCAxNDIyLCAxNDU4LCAxNDU4LCAxNDIyLCAxNDI2LCAxNDU4LCAxNDU4LAorICAgICAxNDI2LCAxNDMwLCAxNDU4LCAxNDU4LCAxNDMwLCAxNDQ1LCAxNDU4LCAxNDQ1LCAxNDQ4LCAxNDU4LAorICAgICAxNDQ4LCAxNDM4LCAxNDU4LCAxNDU4LCAxNDM4LCAxNDUwLCAxNDU4LCAxNDUwLCAxNDUxLCAxNDU4LAorICAgICAxNDUxLCAxNDUyLCAxNDU4LCAxNDUyLCAxNDUzLCAxNDU4LCAxNDUzLCAxNDU0LCAxNDU4LCAxNDU0LAorICAgICAxNDQ3LCAxNDU4LCAxNDU4LCAxNDQ3LCAxNDU2LCAxNDU4LCAxNDU2LCAxNDU3LCAxNDU4LCAxNDU3LAogCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksIDEzMjksCi0gICAgIDEzMjksIDEzMjkKKyAgICAgICAgMywgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OAogICAgIH0gOwogCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfY2hrWzY2MjNdID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9jaGtbNzQ1NV0gPQogICAgIHsgICAwLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICA0LCAgICA3LCAgIDkxLCAgICA0LCAgICA3LCAgICA0LCAgICA3LCAgICA5LAotICAgICAgICA0LCAgICA3LCAgICA5LCAgIDEyLCAgICA5LCAgIDI0LCAgIDEyLCAgICA5LCAgIDEyLCAgICA0LAotICAgICAgICA3LCAgIDEyLCAgIDE1LCAgIDE3LCAgIDE3LCAxMzE5LCAgICA5LCAgICA0LCAgICA3LCAgIDI0LAotICAgICAgIDEyLCAgIDE5LCAgIDE5LCAgIDY0LCAgICA5LCAgIDY0LCAgIDI0LCAgIDkxLCAgIDEyLCAgIDE0LAotICAgICAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE1LCAgIDI3LAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICA0LCAgICA3LCAgIDE1LCAgICA0LCAgICA3LCAgICA0LCAgICA3LAorICAgICAgICA5LCAgICA0LCAgICA3LCAgICA5LCAgIDM0LCAgICA5LCAgIDE3LCAgIDE3LCAgICA5LCAgIDE5LAorICAgICAgIDE5LCAgICA0LCAgICA3LCAgIDM0LCAgIDI0LCAgIDI3LCAgIDI3LCAgMTA1LCAgICA5LCAgICA0LAorICAgICAgICA3LCAgIDE1LCAgIDEyLCAgMTA1LCAgMTMzLCAgIDEyLCAgICA5LCAgIDEyLCAgIDI0LCAgIDIzLAorICAgICAgIDEyLCAgIDIzLCAgIDIzLCAgIDI2LCAgIDI4LCAgIDI0LCAgIDIzLCAgIDI2LCAxMjQyLCAgIDI4LAogCi0gICAgICAgMjcsICAgMTQsICAgMTQsICAgMTQsIDEzMTAsIDEzMDIsICAgMTQsICAgMTQsICAgMTQsICAgMTQsCisgICAgICAgMTIsICAgMjMsICAxMzMsICAgMjYsICAgMjksICAgMjMsICAgMjYsICAgMjMsICAgMTIsICAgMTQsCisgICAgICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgOTQsCisgICAgICAgMjksICAgOTQsICAgMTQsICAgMTQsICAgMTQsICAyNjUsICAyNjUsICAgMTQsICAgMTQsICAgMTQsCiAgICAgICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsCiAgICAgICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTQsCi0gICAgICAgMTQsICAgMTYsICAgMjgsICAgMjMsICAgMTYsICAgMjMsICAgMTYsICAgMjgsICAgMjksICAgMTYsCi0gICAgICAgMjMsICAgODcsIDEyOTgsIDEyOTQsICAgMzQsICAgMjMsICAgODcsICAgMjIsICAgMTYsICAgMjMsCi0gICAgICAgMjIsICAgMjMsICAgMjIsICAgMzQsICAgMjksICAgMjIsICAgMTYsICAgMjAsICAgMjAsICAgMjAsCi0gICAgICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjIsICAgMjYsICAgMjUsICAgMzMsICAgMzksICAgMjUsCi0gICAgICAgMjAsICAgMzMsICAgMjIsICAgMjUsICAgOTYsICAgMjYsICAgMzUsICAgMzgsICAgMjYsICAgOTYsCi0gICAgICAgMzMsICAgMzMsICAgMzksICAgMzgsICAgMzMsICAgMzgsICAgMzMsICAgMzgsICAgMzUsIDEyOTAsCi0gICAgICAgMzUsICAgMzgsICAgMzUsICAgMzgsICAgMzgsICAgMzUsICAgMjAsICAgMjEsICAgMjEsICAgMjEsCisgICAgICAgMTQsICAgMTQsICAgMTYsICAgMzYsICAgMjUsICAgMTYsIDEyNDMsICAgMTYsICAgMzYsICAgMzYsCisgICAgICAgMTYsICAgMzYsICAgMzYsICAgOTMsICAgMjUsICAxMDEsICAgOTMsICAgMjUsICAgOTcsICAgMjIsCisgICAgICAgMTYsICAgMjUsICAgMjIsICAgOTcsICAgMjIsICA0MzEsICA0MzEsICAgMjIsICAgMTYsICAgMjAsCisgICAgICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjIsICAgMzMsICAgMzAsCisgICAgICAxMzcsICAgMzAsICAgMzMsICAgMjAsICAgMzUsICAgMjIsICAgMzAsICAgMzAsICAxMDEsICAgMzAsCiAKLSAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICA5NSwgICAzMiwgICAzMiwgICAyMSwgMTI4NiwgMTI3NSwKLSAgICAgICA5NSwgMTI3MiwgICA2OSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAzMSwKLSAgICAgICAzMiwgICA3NSwgICAzMSwgICAzMSwgICAzMiwgICAzMSwgICA2OSwgICAzMSwgICAzMiwgICAzMSwKLSAgICAgICAzMiwgICAzMSwgICAzNywgICAzNiwgICAzMSwgICA3NSwgICAzNywgICAzMiwgICAzNiwgICAzNiwKLSAgICAgICA0MSwgICAzNiwgICAzNiwgICA4MCwgICAzNywgMTI0NiwgMTIzMCwgIDEyMywgICA0MSwgICAzNywKLSAgICAgICA0NCwgICAzNywgICA0MSwgICA0NCwgICA0MSwgICA0NCwgICA4MCwgICA3OCwgICA0NCwgICA0OSwKLSAgICAgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA0OSwgIDEyMywgIDE0MSwgICA0NCwgICA1MiwgICA1MiwKLSAgICAgICA1MiwgICA1MiwgICA1MiwgICA1MiwgICA1MiwgICA0NCwgICA1MCwgICA1MCwgICA1MCwgICA1MCwKLSAgICAgICA1MCwgICA1MCwgICA1MCwgICA3OCwgMTIyMSwgICA5OSwgIDI5NSwgICA1MCwgICA5OSwgICA3OCwKLSAgICAgICA5OSwgIDI5NSwgIDE0MSwgICA1MCwgICA1MCwgICA1MCwgICA1MCwgICA1MCwgICA1MCwgICA1NCwKKyAgICAgIDEzNywgICAzMywgICAzMywgICAzMCwgICA0MSwgICAzMywgICAzNSwgICAzMywgICAzNSwgIDEwNiwKKyAgICAgICAzNSwgIDI1MCwgICA0MSwgICAzNSwgIDEwNiwgIDI0OSwgICA0MSwgIDI0OSwgICA0MSwgICAyMCwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwKKyAgICAgICAzMiwgICAzMiwgMTI0NywgICAyMSwgICA4MywgIDI1MCwgICAzOSwgIDEwMiwgICAzOSwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAzMSwgICAzMiwgMTI0OCwgICAzMSwgICAzMSwKKyAgICAgICAzMiwgICAzMSwgICAzOSwgICAzMSwgICAzMiwgICAzMSwgICAzMiwgICAzMSwgICAzNywgICAzOSwKKyAgICAgICAzMSwgICA4MywgICAzNywgICAzMiwgIDEwMiwgIDEyOCwgICAzOCwgICA4MywgIDEwOSwgIDEwMiwKKyAgICAgICAzNywgIDEwOSwgICAzOCwgIDEwOSwgICAzOCwgICAzNywgICAzOCwgICAzNywgIDEyOCwgIDEzNSwKKyAgICAgICAzOCwgICA0NCwgICAzOCwgICAzOCwgICA0NCwgIDY1NSwgICA0NCwgIDY1NSwgIDEzNSwgICA0NCwKKyAgICAgICA2MiwgICA2MiwgICA2MiwgICA2MiwgICA2MiwgICA2MiwgICA2MiwgICA2MywgIDE1NCwgICA0NCwKIAotICAgICAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDYxLCAgNjI2LCAgMTY4LCAgIDYxLCAgIDU0LAotICAgICAgIDYxLCAgMTY4LCAgMTE4LCAgIDYxLCAgIDkyLCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LAotICAgICAgIDU0LCAgIDU1LCAgIDYxLCAgNjI2LCAgIDU1LCAgMTE4LCAgIDU1LCAgNjM0LCAxMjE4LCAgIDU1LAotICAgICAgIDYxLCAgMTI3LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDU1LCAxMjEyLAotICAgICAgIDkyLCAgMTI3LCAgIDU1LCAgMTQ4LCAgNjM0LCAgIDkyLCAgIDU1LCAgNjM0LCAgIDU1LCAgIDU1LAotICAgICAgIDU1LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDYzLCAgIDYzLCAgIDYzLCAgIDYzLCAgIDYzLCAgIDYzLAotICAgICAgIDYzLCAgMTI1LCAgMTQzLCAgMTQzLCAgMTQzLCAgMTQzLCAgMTQzLCAgMTQzLCAgMTQzLCAgMTQ4LAotICAgICAgMTI1LCAgMTU1LCAgMTU1LCAgMTU1LCAgMTU1LCAgMTU1LCAgMTU1LCAgMTU1LCAxMjA5LCAgMjI2LAotICAgICAxMjAzLCAxMjAwLCAgMTk2LCAgMjQxLCAxMTk0LCAgMzE4LCAgMzUxLCAgIDYzLCAgMTQwLCAgMTQwLAotICAgICAgMTQwLCAgMTQwLCAgMTQwLCAgMTQwLCAgMTQwLCAgMTk2LCAxMTkxLCAgMzA0LCAgMzE4LCAgMzIzLAorICAgICAgIDYzLCAgMzM2LCAgIDYzLCAgMjIwLCAgNjUyLCAgIDYzLCAgMzM2LCAgIDQ0LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDYzLCAgMjIwLCAgMTYyLCAgMjcyLCAgIDQ4LAorICAgICAgMzQ4LCAgMzczLCAgNjUyLCAgIDYzLCAgMTU0LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgNDMzLCAgNDQwLAorICAgICAxMjU0LCAgNDQ2LCAgIDQ5LCAgMTYyLCAgMjcyLCAgNDU0LCAgMzQ4LCAgMzczLCAgIDQ5LCAgIDQ5LAorICAgICAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLAorICAgICAgIDUwLCAgIDUwLCAgNDYwLCAxMjU1LCAgNDMzLCAgNDQwLCAgIDUwLCAgNDQ2LCAgNTk2LCAgNTk2LAorICAgICAgNDYwLCAgNDU0LCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUyLCAgIDUyLAorICAgICAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDUyLCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LAorICAgICAgIDU0LCAgIDU0LCAgIDU0LCAgMjgyLCAgMjgyLCAgMjgyLCAgMjgyLCAgIDU0LCAgNDA2LCAgNjQ3LAogCi0gICAgICAzNTEsICAxNDAsICAyMjYsICAyMzMsICAyMzMsICAyMzMsICAyMzMsICAyMzMsICAyMzMsICAyNDEsCi0gICAgICAyNDQsICAyNDQsICAyNDQsICAyNDQsICAyNDQsICAyNDQsICAyNDcsICAyNDcsICAyNDcsICAyNDcsCi0gICAgICAyNDcsICAyNDcsICAyNDcsICAzMDQsICAzMTgsICAzMjMsICAzNDgsICAxNDAsICAxNDIsICAxNDIsCi0gICAgICAxNDIsICAxNDIsICAxNDIsICAxNDIsICAxNDIsICAzNzAsICAzNzYsICAzODQsICAxNDIsICAzNDgsCi0gICAgIDExODYsIDExODIsICA2MzksIDExODEsICAxNDIsICAxNDIsICAxNDIsICAxNDIsICAxNDIsICAxNDIsCi0gICAgICAxNDUsICAxNDUsICAxNDUsICAxNDUsICAxNDUsICAxNDUsICAxNDUsICAzOTAsICA0NTQsICA2MzksCi0gICAgICAxNDUsICAzNzAsICAzNzYsICAzODQsICAzOTAsICA0NTQsICAxNDUsICAxNDUsICAxNDUsICAxNDUsCi0gICAgICAxNDUsICAxNDUsICAxNDcsICAxNDcsICAxNDcsICAxNDcsICAxNDcsICAxNDcsICAxNDcsICAxNDcsCi0gICAgIDExNzAsIDExNjQsICAyOTksICAxNDcsICAzNzksICAxNDcsIDExNTcsICAyOTksICAyNjUsICAxNDcsCi0gICAgICAxNDcsICAxNDcsICAxNDcsICAxNDcsICAxNDcsICAyNjUsICAyOTksICAzNzksICAyOTksICAyOTksCisgICAgICA2NDcsICA0NzksICA0MDksICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTYsCisgICAgICA0NzksICA0MDYsICAgNTYsICAyODIsICAgNTYsICAzNTIsICA0MDksICAgNTYsICAzNjgsICAzNjksCisgICAgICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICA1MTEsICAzNTIsCisgICAgICA2NDgsICAgNTYsICAzNjgsICAzNjksIDEyNjIsICAgNTYsICA2NDgsICAgNTYsICAgNTYsICAgNTYsCisgICAgICAgNTYsICAgNTYsICAgNTYsICAxNTIsICA0ODEsICAxNTIsICAxNTIsICAxNTIsICAxNTIsICAxNTIsCisgICAgICAxNTIsICAxNTIsICA1MzUsICA0ODEsICA1MTEsICAzNTIsICAxNTIsICA1NTEsICAzNjgsICAzNjksCisgICAgICA1MzUsICA2NTcsICAxNTIsICAxNTIsICAxNTIsICAxNTIsICAxNTIsICAxNTIsICAxNTMsICAxNTMsCisgICAgICAxNTMsICAxNTMsICAxNTMsICAxNTMsICAxNTMsICAxNTMsICA1NDUsICA2MzksIDEyNjMsICA2NTcsCisgICAgICAxNTMsICA2MDQsICAxNTMsICA1NTEsICA1NDUsICA2MzksICAxNTMsICAxNTMsICAxNTMsICAxNTMsCisgICAgICAxNTMsICAxNTMsICAyNjQsICAyNjQsICAyNjQsICAyNjQsICAyNjQsICAyNjQsICAyNjQsICAyNzUsCiAKLSAgICAgIDQwNywgIDI5OSwgIDMxMiwgIDMxMiwgIDMxMiwgIDMxMiwgIDMxMiwgIDMxMiwgIDI2NSwgIDQwNywKLSAgICAgIDQwOSwgIDE0NywgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDQwOSwKLSAgICAgMTE1NCwgMTE1MCwgIDQzNywgIDM3OSwgIDI2NSwgIDMxNSwgIDMxNSwgIDMxNSwgIDMxNSwgIDMxNSwKLSAgICAgIDMxNSwgIDMxNSwgIDMxOSwgIDMxOSwgIDMxOSwgIDMxOSwgIDMxOSwgIDMxOSwgIDMxOSwgMTE0OSwKLSAgICAgMTE0MiwgIDE2MSwgIDIzNCwgIDIzNCwgIDIzNCwgIDIzNCwgIDIzNCwgIDIzNCwgIDQzNywgMTE0MSwKLSAgICAgIDU0NSwgMTEzNCwgIDIzNCwgMTEzMywgIDQ3MCwgIDUxMCwgIDUxMywgIDU0NSwgIDIzNCwgIDIzNCwKLSAgICAgIDIzNCwgIDIzNCwgIDIzNCwgIDIzNCwgIDIzNSwgIDIzNSwgIDIzNSwgIDIzNSwgIDIzNSwgIDIzNSwKLSAgICAgIDIzNSwgIDIzNSwgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwKLSAgICAgIDQ3MCwgIDUxMCwgIDUxMywgIDI0MCwgIDUxOSwgIDI0MCwgMTEyNiwgMTEyNSwgMTExOSwgIDI0MCwKLSAgICAgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwgIDI0MCwgIDMyMSwgIDMyMSwgIDMyMSwgIDMyMSwgIDMyMSwKKyAgICAgIDI3NSwgIDI3NSwgIDI3NSwgIDI3NSwgIDI3NSwgIDI3NSwgIDQ0OSwgIDYwNCwgIDE1MywgIDE1NSwKKyAgICAgIDE1NSwgIDE1NSwgIDE1NSwgIDE1NSwgIDE1NSwgIDE1NSwgIDE1NSwgIDYwNywgIDYxMywgMTI3MCwKKyAgICAgIDQ0OSwgIDE1NSwgIDU1NCwgIDU1NCwgIDU1NCwgIDU1NCwgMTI3MSwgIDE1NSwgIDE1NSwgIDE1NSwKKyAgICAgIDE1NSwgIDE1NSwgIDE1NSwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwKKyAgICAgIDE1NiwgIDE1NiwgMTI3OCwgIDYwNywgIDYxMywgIDE1NiwgIDQ0OSwgIDYyMCwgIDYzMiwgIDY2NiwKKyAgICAgIDY2NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NiwgIDE1NywgIDE1NywgIDE1NywKKyAgICAgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE1NywgIDE1OSwgIDE1OSwgIDE1OSwgIDE1OSwgIDE1OSwKKyAgICAgIDE1OSwgIDE1OSwgIDE1OSwgIDYyMCwgIDYzMiwgIDY0OSwgIDE1OSwgIDY3MywgIDY1MCwgIDcxNCwKKyAgICAgIDY0OSwgIDY1MCwgIDE1OSwgIDE1OSwgIDE1OSwgIDE1OSwgIDE1OSwgIDE1OSwgIDE2MSwgIDE2MSwKKyAgICAgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDE2MSwgIDY1NiwgMTI3OSwgMTI4MywKIAotICAgICAgMzIxLCAgMzIxLCAgMzY1LCAgMzY1LCAgMzY1LCAgMzY1LCAgMzY1LCAgMzY1LCAgNDYxLCAgNDY1LAotICAgICAgNTE5LCAgMjQwLCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LAotICAgICAgNTI2LCAgNDYxLCAgNDY1LCAgMjQ1LCAgNTM4LCAxMTE4LCAgNjM3LCAxMTE0LCAxMTEzLCAgMjQ1LAotICAgICAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ1LCAgMjQ2LCAgMjQ2LCAgMjQ2LCAgMjQ2LCAgMjQ2LAotICAgICAgMjQ2LCAxMTEyLCAgNTkzLCAgNjM3LCAgNjM3LCAgMjQ2LCAgNTI2LCAgNDYxLCAgNDY1LCAgNTkzLAotICAgICAgNTM4LCAgMjQ2LCAgMjQ2LCAgMjQ2LCAgMjQ2LCAgMjQ2LCAgMjQ2LCAgMzAzLCAgMzAzLCAgMzAzLAotICAgICAgMzAzLCAgMzAzLCAgMzAzLCAgMzAzLCAgMzg4LCAgMzg4LCAgMzg4LCAgMzg4LCAgMzg4LCAgMzg4LAotICAgICAgMzAzLCAgMzgwLCAgMzgwLCAgMzgwLCAgMzgwLCAgMzgwLCAgMzgwLCAgMzgwLCAgMzgyLCAgMzgyLAotICAgICAgMzgyLCAgMzgyLCAgMzgyLCAgMzgyLCAgMzgyLCAgMzkyLCAgMzkyLCAgMzkyLCAgMzkyLCAgMzkyLAotICAgICAgMzkyLCAgNTIxLCAgNTI5LCAgNTMzLCAgNjI4LCAgNjQwLCAgMzAzLCAgMzA4LCAgMzA4LCAgMzA4LAorICAgICAgMTYxLCAgNjU2LCAgMTYxLCAgNjczLCAgMzA2LCAgNzE0LCAgMTYxLCAgMTYxLCAgMTYxLCAgMTYxLAorICAgICAgMTYxLCAgMTYxLCAgMzA2LCAgMzU4LCAgMzU4LCAgMzU4LCAgMzU4LCAgMzU4LCAgMzU4LCAgMzU4LAorICAgICAxMjg2LCAxMjg3LCAgNDUwLCAxMjkxLCAgNTE1LCAgMzA2LCAgNzI5LCAgNjUzLCAgMTYxLCAgMjU4LAorICAgICAgMjU4LCAgMjU4LCAgMjU4LCAgMjU4LCAgMjU4LCAgMjU4LCAgNDUwLCAgNjUzLCAgNTE1LCAgNzI2LAorICAgICAgMjU4LCAgMzA2LCAxMjkzLCAgNzMxLCAgNzI5LCAxMjk5LCAgMjU4LCAgMjU4LCAgMjU4LCAgMjU4LAorICAgICAgMjU4LCAgMjU4LCAgMjYwLCAgMjYwLCAgMjYwLCAgMjYwLCAgMjYwLCAgMjYwLCAgMjYwLCAgNjUxLAorICAgICAgNjc1LCAgNzMxLCAgNDUwLCAgMjYwLCAgNTE1LCAgNzI2LCAgNzU4LCAgNzYxLCAgNjUxLCAgMjYwLAorICAgICAgMjYwLCAgMjYwLCAgMjYwLCAgMjYwLCAgMjYwLCAgMjYxLCAgMjYxLCAgMjYxLCAgMjYxLCAgMjYxLAorICAgICAgMjYxLCAgMjYxLCAgMjYxLCAgMjYzLCAgMjYzLCAgMjYzLCAgMjYzLCAgMjYzLCAgMjYzLCAgMjYzLAorICAgICAgNjk2LCAgNzA3LCAgNzU4LCAgNzYxLCAgMjYzLCAgNzY0LCAgNjc1LCAgNzMwLCAgNjk2LCAgNzA3LAogCi0gICAgICAzMDgsICAzMDgsICAzMDgsICA2MDQsICA1MjEsICA1MjksICA1MzMsICAzMDgsICA2MTEsICA2MjcsCi0gICAgICA2MDQsICA2MjgsICA2NDAsICAzMDgsICAzMDgsICAzMDgsICAzMDgsICAzMDgsICAzMDgsICAzMTEsCi0gICAgICAzMTEsICAzMTEsICAzMTEsICAzMTEsICAzMTEsICAzMTEsICA2MjcsICA2MjMsICA2MjgsICAzMTEsCi0gICAgICA1MjEsICA1MjksICA1MzMsICA2MjcsICA2MTEsICAzMTEsICAzMTEsICAzMTEsICAzMTEsICAzMTEsCi0gICAgICAzMTEsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTMsICA3MDAsCi0gICAgICA3NDEsICA2NDYsICAzMTMsICA2MjMsICA2MzMsICA2MzUsICA3MDAsICA3NDEsICAzMTMsICAzMTMsCi0gICAgICAzMTMsICAzMTMsICAzMTMsICAzMTMsICAzMTQsICAzMTQsICAzMTQsICAzMTQsICAzMTQsICAzMTQsCi0gICAgICAzMTQsICA2MzMsICA2MzUsICA2NDksICAzMTQsICA2MzUsICA2MzMsICA2NDYsICA2MzgsICA3MDcsCi0gICAgICAzMTQsICAzMTQsICAzMTQsICAzMTQsICAzMTQsICAzMTQsICAzMjAsICAzMjAsICAzMjAsICAzMjAsCi0gICAgICAzMjAsICAzMjAsICAzMjAsICAzMjAsIDExMTEsICA2MzgsICA3MDcsICAzMjAsICA2MzgsICA2NDksCisgICAgICAyNjMsICAyNjMsICAyNjMsICAyNjMsICAyNjMsICAyNjMsICAyNjYsICAyNjYsICAyNjYsICAyNjYsCisgICAgICAyNjYsICAyNjYsICAyNjYsICAyNjYsIDEzMDAsICA3MzAsIDEzMTAsIDEzMTEsICAyNjYsIDEzMTUsCisgICAgIDEzMTYsICA3NjQsICA3MzAsIDEzMjAsICAyNjYsICAyNjYsICAyNjYsICAyNjYsICAyNjYsICAyNjYsCisgICAgICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNjgsICAyNzEsICAyNzEsCisgICAgICAyNzEsICAyNzEsICAyNzEsICAyNzEsICAyNzEsICAyNzEsICAyNzEsICA4MTIsICAzNDEsICA1NDIsCisgICAgICAyNzEsIDEzMjMsICAyNzEsICAzNDEsIDEzMjQsICA4MTIsICAyNzEsICAyNzEsICAyNzEsICAyNzEsCisgICAgICAyNzEsICAyNzEsICAzNDEsICA1NDIsICAzNDEsICAzNDEsICA3NzAsICAzNDEsICAzNjIsICAzNjIsCisgICAgICAzNjIsICAzNjIsICAzNjIsICAzNjIsICAzNjIsICA3NDEsICA1NDMsICA3MzIsICAyNzEsICAyNzYsCisgICAgICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzYsICAyNzYsIDEzMjksICA1NDIsCisgICAgICA1NDMsICAyNzYsICA3NzAsICA3NDEsICA3NDEsICA3MzIsICA1NDYsICAyNzYsICAyNzYsICAyNzYsCiAKLSAgICAgIDcxOSwgIDcwOCwgMTA5MSwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMCwgIDMyMiwKLSAgICAgIDMyMiwgIDMyMiwgIDMyMiwgIDMyMiwgIDMyMiwgIDMyMiwgIDMyMiwgIDcxOSwgIDcwOCwgIDY1MiwKLSAgICAgIDMyMiwgIDY1OCwgIDMyMiwgIDcwOCwgIDY2NSwgIDY3NywgIDMyMiwgIDMyMiwgIDMyMiwgIDMyMiwKLSAgICAgIDMyMiwgIDMyMiwgIDM5NSwgIDM5NSwgIDM5NSwgIDM5NSwgIDM5NSwgIDM5NSwgIDM5NSwgIDQ0NywKLSAgICAgIDQ0NywgIDQ0NywgIDQ0NywgIDQ0NywgIDQ0NywgIDY1MiwgIDY4MCwgIDY1OCwgIDMyMiwgIDMzNCwKLSAgICAgIDY2NSwgIDY3NywgIDY5MiwgIDMzNCwgIDc3MiwgMTA3NCwgIDMzNCwgIDcwOSwgIDYxNCwgIDMzNCwKLSAgICAgIDYxOCwgIDMzNCwgIDMzNCwgIDMzNCwgIDMzNCwgIDM2NiwgIDM2NiwgIDM2NiwgIDM2NiwgIDM2NiwKLSAgICAgIDM2NiwgIDYxNCwgIDY4MCwgIDYxOCwgIDcwOSwgIDM2NiwgMTA2NywgMTA2NiwgIDY5MiwgIDcwOSwKLSAgICAgIDc3MiwgIDM2NiwgIDM2NiwgIDM2NiwgIDM2NiwgIDM2NiwgIDM2NiwgIDM2OSwgIDM2OSwgIDM2OSwKLSAgICAgIDM2OSwgIDM2OSwgIDM2OSwgIDM2OSwgIDM2OSwgIDc1MiwgIDc2NCwgIDYxNCwgIDM2OSwgIDYxOCwKKyAgICAgIDI3NiwgIDI3NiwgIDI3NiwgIDI3NywgIDI3NywgIDI3NywgIDI3NywgIDI3NywgIDI3NywgIDI3NywKKyAgICAgIDU0NiwgMTMzMiwgIDczMiwgMTMzMywgIDI3NywgMTMzOCwgIDU0MywgIDczNywgMTM0MSwgIDc0MywKKyAgICAgIDI3NywgIDI3NywgIDI3NywgIDI3NywgIDI3NywgIDI3NywgIDM0NiwgIDU0NywgIDM0NiwgIDM0NiwKKyAgICAgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwgIDczNywgIDU0NiwgIDc0MywgMTM0MiwgIDM0NiwKKyAgICAgIDczNywgIDU0NywgIDc0NCwgIDczOCwgIDc0OCwgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwgIDM0NiwKKyAgICAgIDM0NiwgIDM0NywgIDM0NywgIDM0NywgIDM0NywgIDM0NywgIDM0NywgIDM0NywgIDM0NywgMTM0NywKKyAgICAgIDc0NCwgIDczOCwgIDc0OCwgIDM0NywgIDczOCwgIDM0NywgMTM1MCwgIDU0NywgMTM1MSwgIDM0NywKKyAgICAgIDM0NywgIDM0NywgIDM0NywgIDM0NywgIDM0NywgIDQzMCwgIDQzMCwgIDQzMCwgIDQzMCwgIDQzMCwKKyAgICAgIDQzMCwgIDQzMCwgIDQ1OCwgIDQ1OCwgIDQ1OCwgIDQ1OCwgIDQ1OCwgIDQ1OCwgIDQ1OCwgIDYxNSwKKyAgICAgIDY2NSwgIDM0NywgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwgIDM0OSwKIAotICAgICAgMzY5LCAxMDYwLCAgNzUyLCAgNzY0LCAgMzY5LCAgMzY5LCAgMzY5LCAgMzY5LCAgMzY5LCAgMzY5LAotICAgICAgNDUwLCAgNDUwLCAgNDUwLCAgNDUwLCAgNDUwLCAgNDUwLCAgNDUwLCAgNDUyLCAgNDUyLCAgNDUyLAotICAgICAgNDUyLCAgNDUyLCAgNDUyLCAxMDU3LCAgNjYwLCAgNzk3LCAgMzY5LCAgMzc1LCAgMzc1LCAgMzc1LAotICAgICAgMzc1LCAgMzc1LCAgMzc1LCAgMzc1LCAgMzc1LCAxMDUzLCAgODc0LCAgNjYwLCAgMzc1LCAxMDUyLAotICAgICAgMzc1LCAxMDQ2LCAgNzk3LCAgODc0LCAgMzc1LCAgMzc1LCAgMzc1LCAgMzc1LCAgMzc1LCAgMzc1LAotICAgICAgNDU2LCAgNDU2LCAgNDU2LCAgNDU2LCAgNDU2LCAgNDU2LCAgNDU5LCAgNDU5LCAgNDU5LCAgNDU5LAotICAgICAgNDU5LCAgNDU5LCAgNDU5LCAgNjYwLCAgNjI5LCAgNjMwLCAgMzc1LCAgMzgxLCAgMzgxLCAgMzgxLAotICAgICAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAxMDQzLCAgNzg0LCAxMDM5LCAgMzgxLCAxMDM4LAotICAgICAgODAxLCAgNjI5LCAgNjMwLCAgNzEwLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLCAgMzgxLAotICAgICAgMzgzLCAgMzgzLCAgMzgzLCAgMzgzLCAgMzgzLCAgMzgzLCAgMzgzLCAgMzgzLCAgNjI5LCAgNjMwLAorICAgICAgNjY1LCAxMzU5LCAxMzc1LCAgNjE1LCAgMzQ5LCAxMzc2LCAgODE5LCAgNzM5LCAxNDAxLCAgNjE2LAorICAgICAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzQ5LCAgMzUzLCAgMzUzLCAgMzUzLCAgMzUzLAorICAgICAgMzUzLCAgMzUzLCAgMzUzLCAgNjE2LCAgODE5LCAgNzM5LCAgNzc3LCAgMzUzLCAgNzM5LCAgNjE1LAorICAgICAgNzUwLCAgNzUwLCAgNzQyLCAgMzUzLCAgMzUzLCAgMzUzLCAgMzUzLCAgMzUzLCAgMzUzLCAgMzU0LAorICAgICAgMzU0LCAgMzU0LCAgMzU0LCAgMzU0LCAgMzU0LCAgMzU0LCAgMzU0LCAxNDA0LCAgNzUwLCAgNjE2LAorICAgICAgNzQyLCAgMzU0LCAgNzc3LCAgNzQyLCAgNzg5LCAgNzkyLCAxNDE1LCAgMzU0LCAgMzU0LCAgMzU0LAorICAgICAgMzU0LCAgMzU0LCAgMzU0LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LCAgMzU1LAorICAgICAgMzU1LCAgMzU3LCAgMzU3LCAgMzU3LCAgMzU3LCAgMzU3LCAgMzU3LCAgMzU3LCAgODA0LCAgODYwLAorICAgICAgNzg5LCAgNzkyLCAgMzU3LCAxNDE5LCAgODIwLCAgODIxLCAxNDIzLCAgODYwLCAgMzU3LCAgMzU3LAorICAgICAgMzU3LCAgMzU3LCAgMzU3LCAgMzU3LCAgMzYxLCAgMzYxLCAgMzYxLCAgMzYxLCAgMzYxLCAgMzYxLAogCi0gICAgICA3MTAsICAzODMsICA3ODQsICAzODMsIDEwMzIsICA3MTAsICA4MDEsICAzODMsICAzODMsICAzODMsCi0gICAgICAzODMsICAzODMsICAzODMsICA0NjIsICA0NjIsICA0NjIsICA0NjIsICA0NjIsICA0NjIsICA0NjIsCi0gICAgICA0NjQsICA0NjQsICA0NjQsICA0NjQsICA0NjQsICA0NjQsICA0NjQsICA2MzIsICA3MTEsICAzODMsCi0gICAgICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTMsICAzOTMsIDEwMjksICA4MDQsCi0gICAgICA4MDcsICAzOTMsICA3MTIsIDEwMjYsICA2MzIsICA3MTEsIDEwMjUsICAzOTMsICAzOTMsICAzOTMsCi0gICAgICAzOTMsICAzOTMsICAzOTMsICAzOTQsICAzOTQsICAzOTQsICAzOTQsICAzOTQsICAzOTQsICA3MTIsCi0gICAgICA3MTEsICA2MzIsIDEwMTksICAzOTQsICA3MTIsICA4MDQsICA4MDcsIDEwMTYsIDEwMTUsICAzOTQsCi0gICAgICAzOTQsICAzOTQsICAzOTQsICAzOTQsICAzOTQsICA0MzYsICA0MzYsICA0MzYsICA0MzYsICA0MzYsCi0gICAgICA0MzYsICA1NDEsICA1NDEsICA1NDEsICA1NDEsICA1NDEsICA1NDEsICA0MzYsICA0NjYsICA0NjYsCi0gICAgICA0NjYsICA0NjYsICA0NjYsICA0NjYsICA0NjYsICA0NjgsICA0NjgsICA0NjgsICA0NjgsICA0NjgsCisgICAgICAzNjEsICAzNjEsICA4MjAsICA4MjEsICA4MDQsICAzNjEsIDE0MjcsICA4MjAsICA4MjEsICA4MjIsCisgICAgICA4MjQsICAzNjEsICAzNjEsICAzNjEsICAzNjEsICAzNjEsICAzNjEsICAzNjMsICAzNjMsICAzNjMsCisgICAgICAzNjMsICAzNjMsICAzNjMsICAzNjMsICAzNjMsICAzNjMsICA4NzEsICA4MjIsICA4MjQsICAzNjMsCisgICAgIDE0MzEsICA4MjYsICA4MjIsICA4MjQsICA4NzEsICAzNjMsICAzNjMsICAzNjMsICAzNjMsICAzNjMsCisgICAgICAzNjMsICAzNjQsICAzNjQsICAzNjQsICAzNjQsICAzNjQsICAzNjQsICAzNjQsICAzNjQsICA4MjYsCisgICAgIDE0MzksIDE0NDgsICAzNjQsICA4MzUsICA4MjYsICA4MjcsICA4MjksICA4MzEsICAzNjQsICAzNjQsCisgICAgICAzNjQsICAzNjQsICAzNjQsICAzNjQsICAzNzAsICAzNzAsICAzNzAsICAzNzAsICAzNzAsICAzNzAsCisgICAgICAzNzAsICAzNzAsICAzNzAsICA4MjcsICA4MjksICA4MzEsICAzNzAsICA4MjksICA4MjcsICA4MzUsCisgICAgICA5MTMsICA5MTYsICAzNzAsICAzNzAsICAzNzAsICAzNzAsICAzNzAsICAzNzAsICAzNzIsICAzNzIsCisgICAgICAzNzIsICAzNzIsICAzNzIsICAzNzIsICAzNzIsICAzNzIsICAzNzIsICA4ODMsICA5MTMsICA5MTYsCiAKLSAgICAgIDQ2OCwgIDQ2OCwgIDUyMiwgIDUyMiwgIDUyMiwgIDUyMiwgIDUyMiwgIDUyMiwgIDUyMiwgIDY2OCwKLSAgICAgIDY3MiwgIDcxMywgIDY0MSwgIDQzNiwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwKLSAgICAgMTAxMCwgMTAwNywgIDY2OCwgIDY3MiwgIDQ0MCwgMTAwNCwgIDc5NiwgIDcxNywgIDcxMywgIDY0MSwKLSAgICAgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MCwgIDQ0MiwgIDQ0MiwgIDQ0MiwgIDQ0MiwKLSAgICAgIDQ0MiwgIDQ0MiwgIDY0MSwgIDc5NiwgIDcxNywgIDcxMywgIDQ0MiwgIDcxNywgIDY2OCwgIDY3MiwKLSAgICAgIDcxNCwgIDc5NiwgIDQ0MiwgIDQ0MiwgIDQ0MiwgIDQ0MiwgIDQ0MiwgIDQ0MiwgIDQ0NiwgIDQ0NiwKLSAgICAgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwgMTAwMywgIDgxMCwgIDcxNCwgIDQ0NiwgMTAwMCwKLSAgICAgIDgxNiwgIDcxNSwgIDcxNCwgIDc5NCwgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwgIDQ0NiwKLSAgICAgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDQ0OCwgIDcxNSwgIDgyMywKLSAgICAgIDc5NCwgIDQ0OCwgIDgxMCwgIDcxNSwgIDc5MSwgIDc5NCwgIDgxNiwgIDQ0OCwgIDQ0OCwgIDQ0OCwKKyAgICAgIDM3MiwgIDg5MSwgIDM3MiwgIDkxMywgIDkwMywgIDg4MywgIDM3MiwgIDM3MiwgIDM3MiwgIDM3MiwKKyAgICAgIDM3MiwgIDM3MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDQ2MiwgIDUyOCwKKyAgICAgIDUyOCwgIDUyOCwgIDUyOCwgIDUyOCwgIDUyOCwgIDUyOCwgMTI0MSwgIDg5MSwgIDM3MiwgIDM5MiwKKyAgICAgIDkwMywgIDkyNiwgMTI0MCwgIDM5MiwgIDkyOSwgIDkxNywgIDM5MiwgIDkxMCwgIDYyMywgIDM5MiwKKyAgICAgIDYyNCwgIDM5MiwgIDM5MiwgIDM5MiwgIDM5MiwgIDQyNCwgIDQyNCwgIDQyNCwgIDQyNCwgIDQyNCwKKyAgICAgIDQyNCwgIDQyNCwgIDYyMywgIDkxNywgIDYyNCwgIDkxMCwgIDQyNCwgIDkyNiwgIDkxMCwgIDkxOCwKKyAgICAgIDkyOSwgIDY1OCwgIDQyNCwgIDQyNCwgIDQyNCwgIDQyNCwgIDQyNCwgIDQyNCwgIDQyNiwgIDQyNiwKKyAgICAgIDQyNiwgIDQyNiwgIDQyNiwgIDQyNiwgIDQyNiwgIDY1OCwgIDk5OSwgIDkxOCwgIDYyMywgIDQyNiwKKyAgICAgIDYyNCwgIDkzMiwgIDkzNSwgIDk0MSwgIDk5OSwgIDQyNiwgIDQyNiwgIDQyNiwgIDQyNiwgIDQyNiwKKyAgICAgIDQyNiwgIDQyNywgIDQyNywgIDQyNywgIDQyNywgIDQyNywgIDQyNywgIDQyNywgIDQyNywgIDQyOSwKIAotICAgICAgNDQ4LCAgNDQ4LCAgNDQ4LCAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDQ5LAotICAgICAgOTE5LCAgNzkxLCAgODM1LCAgNDQ5LCAgNzkxLCAgODIzLCAgOTk3LCAgOTE5LCAgOTk0LCAgNDQ5LAotICAgICAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDQ5LCAgNDU3LCAgNDU3LCAgNDU3LCAgNDU3LCAgNDU3LAotICAgICAgNDU3LCAgNDU3LCAgNDU3LCAgODM4LCAgODUwLCAgODU0LCAgNDU3LCAgODY2LCAgODM1LCAgODg0LAotICAgICAgODkyLCAgOTkxLCAgNDU3LCAgNDU3LCAgNDU3LCAgNDU3LCAgNDU3LCAgNDU3LCAgNDU4LCAgNDU4LAotICAgICAgNDU4LCAgNDU4LCAgNDU4LCAgNDU4LCAgNDU4LCAgOTg3LCAgODg0LCAgODkyLCAgNDU4LCAgODM4LAotICAgICAgODUwLCAgODU0LCAgODg3LCAgODY2LCAgNDU4LCAgNDU4LCAgNDU4LCAgNDU4LCAgNDU4LCAgNDU4LAotICAgICAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgNDY3LCAgOTc2LCAgODg3LAotICAgICAgOTc1LCAgNDY3LCAgOTA5LCAgODg3LCAgODkwLCAgODkxLCAgOTgxLCAgNDY3LCAgNDY3LCAgNDY3LAotICAgICAgNDY3LCAgNDY3LCAgNDY3LCAgNDY5LCAgNDY5LCAgNDY5LCAgNDY5LCAgNDY5LCAgNDY5LCAgNDY5LAorICAgICAgNDI5LCAgNDI5LCAgNDI5LCAgNDI5LCAgNDI5LCAgNDI5LCAgOTQ4LCAgOTMyLCAgOTM1LCAgOTQxLAorICAgICAgNDI5LCAgOTYwLCAgOTE1LCAgOTIyLCAxMjM5LCAxMDA5LCAgNDI5LCAgNDI5LCAgNDI5LCAgNDI5LAorICAgICAgNDI5LCAgNDI5LCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLAorICAgICAgOTE1LCAgOTIyLCAgOTQ4LCAxMDA5LCAgNDMyLCAxMjM1LCAgNDMyLCAgOTYwLCAgOTE1LCAxMjMyLAorICAgICAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNDMyLCAgNTMzLCAgNTMzLCAgNTMzLCAgNTMzLAorICAgICAgNTMzLCAgNTMzLCAgNTMzLCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LAorICAgICAgNzMzLCAgNjI3LCAgNDMyLCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LAorICAgICAgOTYzLCAxMjI5LCAgOTc1LCAgOTc5LCAgNDM0LCAgNjI3LCAgOTkxLCAxMjI2LCAgNzMzLCAgNjYxLAorICAgICAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM0LCAgNDM1LCAgNDM1LCAgNDM1LCAgNDM1LAorICAgICAgNDM1LCAgNDM1LCAgNDM1LCAgNjYxLCAxMjIzLCAgNzMzLCAgOTYzLCAgNDM1LCAgOTc1LCAgOTc5LAogCi0gICAgICA0NjksICA4OTAsICA4OTEsICA5ODEsICA0NjksICA4OTAsICA0NjksICA4OTEsICA5MDksICA5NjcsCi0gICAgICA0NjksICA0NjksICA0NjksICA0NjksICA0NjksICA0NjksICA1MjQsICA1MjQsICA1MjQsICA1MjQsCi0gICAgICA1MjQsICA1MjQsICA1MjQsICA1MzAsICA1MzAsICA1MzAsICA1MzAsICA1MzAsICA1MzAsICA1MzAsCi0gICAgICA3OTAsICA2ODMsICA0NjksICA1MDYsICA1MDYsICA1MDYsICA1MDYsICA1MDYsICA1MDYsICA5MzAsCi0gICAgICA5NjQsICA5NDIsICA5NTgsICA1MDYsICA2ODMsICA5NjIsICA5MzAsICA3OTAsICA5NDIsICA1MDYsCi0gICAgICA1MDYsICA1MDYsICA1MDYsICA1MDYsICA1MDYsICA1MDksICA1MDksICA1MDksICA1MDksICA1MDksCi0gICAgICA1MDksICA1MDksICA1MDksICA5NTUsICA3OTAsICA5NDYsICA1MDksICA5NzQsICA1MDksICA5NDMsCi0gICAgICA2ODMsICA5NjIsICA1MDksICA1MDksICA1MDksICA1MDksICA1MDksICA1MDksICA1MzIsICA1MzIsCi0gICAgICA1MzIsICA1MzIsICA1MzIsICA1MzIsICA1MzIsICA1MzQsICA1MzQsICA1MzQsICA1MzQsICA1MzQsCi0gICAgICA1MzQsICA1MzQsICA2ODcsICA5NzQsICA1MDksICA1MTIsICA1MTIsICA1MTIsICA1MTIsICA1MTIsCisgICAgIDEwMzcsICA2MjcsICA5OTEsICA0MzUsICA0MzUsICA0MzUsICA0MzUsICA0MzUsICA0MzUsICA0MzYsCisgICAgICA0MzYsICA0MzYsICA0MzYsICA0MzYsICA0MzYsICA0MzYsICA0MzYsICA0MzksICA0MzksICA0MzksCisgICAgICA0MzksICA0MzksICA0MzksICA0MzksICA0MzksICA0MzksIDEwMzcsICA2MjgsIDEyMjAsICA0MzksCisgICAgIDEyMDcsICA0MzksIDEyMDMsIDExOTYsIDExOTUsICA0MzksICA0MzksICA0MzksICA0MzksICA0MzksCisgICAgICA0MzksICA2MjgsICA2MzUsICA2MzUsICA2MzUsICA2MzUsICA2MzUsICA2MzUsICA2MzUsICA2MzcsCisgICAgICA2MzcsICA2MzcsICA2MzcsICA2MzcsICA2MzcsICA2MzcsIDEwMTcsICA0MzksICA0NDUsICA0NDUsCisgICAgICA0NDUsICA0NDUsICA0NDUsICA0NDUsICA0NDUsICA0NDUsICA0NDUsICA2MjgsIDExOTQsIDExOTAsCisgICAgICA0NDUsIDExODksICA0NDUsIDExODYsIDEwMTcsICA2NjQsICA0NDUsICA0NDUsICA0NDUsICA0NDUsCisgICAgICA0NDUsICA0NDUsICA2NDEsICA2NDEsICA2NDEsICA2NDEsICA2NDEsICA2NDEsICA2NDEsICA2NjQsCisgICAgICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksICA3MzQsICA0NDUsICA0NTEsCiAKLSAgICAgIDUxMiwgIDUxMiwgIDUxMiwgIDk1NCwgMTA3MywgIDY4NywgIDUxMiwgIDkzNCwgIDUxMiwgIDkzMSwKLSAgICAgIDk1NCwgMTA3MywgIDUxMiwgIDUxMiwgIDUxMiwgIDUxMiwgIDUxMiwgIDUxMiwgIDUzNiwgIDUzNiwKLSAgICAgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgIDUzNiwgIDU0MywgIDU0MywgIDU0MywgIDU0MywgIDU0MywKLSAgICAgIDU0MywgIDY4NywgIDk4MCwgIDk4NSwgIDUxMiwgIDUxOCwgIDUxOCwgIDUxOCwgIDUxOCwgIDUxOCwKLSAgICAgIDUxOCwgIDUxOCwgIDUxOCwgIDkyMywgIDkyMCwgIDkxNCwgIDUxOCwgIDkxMSwgIDUxOCwgIDk4MCwKLSAgICAgIDk4NSwgIDk4MCwgIDUxOCwgIDUxOCwgIDUxOCwgIDUxOCwgIDUxOCwgIDUxOCwgIDU0NywgIDU0NywKLSAgICAgIDU0NywgIDU0NywgIDU0NywgIDU0NywgIDU1MCwgIDU1MCwgIDU1MCwgIDU1MCwgIDU1MCwgIDU1MCwKLSAgICAgIDU1MCwgIDcxOCwgIDc5NSwgIDc5MiwgIDUxOCwgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyMywKLSAgICAgIDUyMywgIDUyMywgIDUyMywgIDkxMCwgIDk5MCwgIDkwNywgIDUyMywgIDk5MywgIDcxOCwgIDc5NSwKLSAgICAgIDc5MiwgIDc5MiwgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyNSwgIDUyNSwKKyAgICAgIDQ1MSwgIDQ1MSwgIDQ1MSwgIDQ1MSwgIDQ1MSwgIDQ1MSwgIDQ1MSwgIDQ1MSwgMTE4MiwgMTE4MSwKKyAgICAgMTA5MCwgIDQ1MSwgMTE4MCwgMTEwMiwgMTExOSwgIDczNCwgMTAxMiwgIDQ1MSwgIDQ1MSwgIDQ1MSwKKyAgICAgIDQ1MSwgIDQ1MSwgIDQ1MSwgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywKKyAgICAgIDQ1MywgIDQ1MywgIDczNCwgMTE3NiwgMTAxMiwgIDQ1MywgMTA5MCwgIDQ1MywgMTAxMiwgMTEwMiwKKyAgICAgMTExOSwgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDQ1MywgIDY5NCwgIDY5NCwgIDY5NCwKKyAgICAgIDY5NCwgIDY5NCwgIDY5NCwgIDY5NCwgIDY5OCwgIDY5OCwgIDY5OCwgIDY5OCwgIDY5OCwgIDY5OCwKKyAgICAgIDY5OCwgIDcxNywgIDczNiwgIDQ1MywgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2MywKKyAgICAgIDQ2MywgIDQ2MywgIDQ2MywgMTE3NSwgMTE3MiwgIDcxNywgIDQ2MywgMTEyMiwgMTAxNSwgMTE2OCwKKyAgICAgIDczNiwgIDcxOCwgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2MywgIDQ2NCwgIDQ2NCwKKyAgICAgIDQ2NCwgIDQ2NCwgIDQ2NCwgIDQ2NCwgIDQ2NCwgIDcxOCwgMTAxNSwgIDczNiwgMTE2NywgIDQ2NCwKIAotICAgICAgNTI1LCAgNTI1LCAgNTI1LCAgNTI1LCAgNTI1LCAgNTI1LCAgNzk1LCAgNzE4LCAgNzkyLCAgNTI1LAotICAgICAgOTkwLCAgNTI1LCAgODkzLCAgOTkzLCAgODc1LCAgNTI1LCAgNTI1LCAgNTI1LCAgNTI1LCAgNTI1LAotICAgICAgNTI1LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTc5LCAgNTgyLCAgNTgyLAotICAgICAgNTgyLCAgNTgyLCAgNTgyLCAgNTgyLCAgNTgyLCAgODg2LCAgNzkzLCAgNTI1LCAgNTM1LCAgNTM1LAotICAgICAgNTM1LCAgNTM1LCAgNTM1LCAgNTM1LCAgNTM1LCAgNTM1LCAgODY4LCAgOTk2LCAgODY3LCAgNTM1LAotICAgICAgOTk5LCAxMDAyLCAgODg2LCAgNzkzLCAgODU5LCAgNTM1LCAgNTM1LCAgNTM1LCAgNTM1LCAgNTM1LAotICAgICAgNTM1LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNzkzLAotICAgICAgODU2LCAgODg2LCAgNTM3LCAgOTk2LCAgNTM3LCAgODUyLCAgOTk5LCAxMDAyLCAgNTM3LCAgNTM3LAotICAgICAgNTM3LCAgNTM3LCAgNTM3LCAgNTM3LCAgNTg2LCAgNTg2LCAgNTg2LCAgNTg2LCAgNTg2LCAgNTg2LAotICAgICAgNTg5LCAgNTg5LCAgNTg5LCAgNTg5LCAgNTg5LCAgNTg5LCAgNTg5LCAgNzc1LCAgNzE2LCAgNzg3LAorICAgICAxMDE1LCAgNzE3LCAxMDE2LCAxMTIyLCAxMTA1LCAgNDY0LCAgNDY0LCAgNDY0LCAgNDY0LCAgNDY0LAorICAgICAgNDY0LCAgNTA5LCAgNzIxLCAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LAorICAgICAxMDE2LCAgNzE4LCAxMTA1LCAxMTY2LCAgNTA5LCAxMDE2LCAgNzIxLCAxMTYyLCAxMTYxLCAxMTA4LAorICAgICAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LCAgNTA5LCAgNTEwLCAgNTEwLCAgNTEwLCAgNTEwLAorICAgICAgNTEwLCAgNTEwLCAgNTEwLCAgNTEwLCAxMTU4LCAxMDQ3LCAxMTA1LCAxMTA4LCAgNTEwLCAxMTA4LAorICAgICAgNTEwLCAxMTU1LCAgNzIxLCAxMDQ3LCAgNTEwLCAgNTEwLCAgNTEwLCAgNTEwLCAgNTEwLCAgNTEwLAorICAgICAgNzAzLCAgNzAzLCAgNzAzLCAgNzAzLCAgNzAzLCAgNzAzLCAgNzAzLCAgNzA1LCAgNzA1LCAgNzA1LAorICAgICAgNzA1LCAgNzA1LCAgNzA1LCAgNzA1LCAgNzIyLCAgODI1LCAgNTEwLCAgNTEyLCAgNTEyLCAgNTEyLAorICAgICAgNTEyLCAgNTEyLCAgNTEyLCAgNTEyLCAgNTEyLCAxMTI1LCAxMDU4LCAxMTU0LCAgNzIyLCAgNTEyLAorICAgICAxMTI4LCAxMTUzLCAxMTMxLCAgODI1LCAxMDU4LCAgNTEyLCAgNTEyLCAgNTEyLCAgNTEyLCAgNTEyLAogCi0gICAgICA1MzcsICA1NDgsICA1NDgsICA1NDgsICA1NDgsICA1NDgsICA1NDgsICA1NDgsICA1NDgsIDEwMjcsCi0gICAgICA3NzUsIDEwNDEsICA1NDgsICA4NTEsICA4NDMsICA3MTYsICA3ODcsICA4NDAsICA1NDgsICA1NDgsCi0gICAgICA1NDgsICA1NDgsICA1NDgsICA1NDgsICA1NDksICA1NDksICA1NDksICA1NDksICA1NDksICA1NDksCi0gICAgICA3MTYsICA3ODcsIDEwNTUsICA4MzcsICA1NDksIDEwMjcsICA3NzUsIDEwNDEsIDEwODAsICA3NzksCi0gICAgICA1NDksICA1NDksICA1NDksICA1NDksICA1NDksICA1NDksICA1NzYsICA1NzYsICA1NzYsICA1NzYsCi0gICAgICA1NzYsICA1NzYsICA3NzksICA4MzYsIDEwODksIDEwODAsICA1NzYsIDExNTIsIDEwNTUsICA5NzcsCi0gICAgICA5ODIsICA4MjgsICA1NzYsICA1NzYsICA1NzYsICA1NzYsICA1NzYsICA1NzYsICA1NzcsICA1NzcsCi0gICAgICA1NzcsICA1NzcsICA1NzcsICA1NzcsICA1NzcsICA1NzcsICA5NzcsICA5ODIsICA3NzksICA1NzcsCi0gICAgIDEwODksICA4MjUsIDEwODEsIDExNTIsICA4MTgsICA1NzcsICA1NzcsICA1NzcsICA1NzcsICA1NzcsCi0gICAgICA1NzcsICA1NzgsICA1NzgsICA1NzgsICA1NzgsICA1NzgsICA1NzgsICA4MTgsICA5ODIsIDEwODEsCisgICAgICA1MTIsICA1MTYsICA1MTYsICA1MTYsICA1MTYsICA1MTYsICA1MTYsICA1MTYsICA1MTYsIDEwNzAsCisgICAgICA4MjUsIDExMjUsIDExNDksICA1MTYsICA3MjIsIDExNTYsIDExMjgsIDEwNzAsIDExMzEsICA1MTYsCisgICAgICA1MTYsICA1MTYsICA1MTYsICA1MTYsICA1MTYsICA1MTcsICA1MTcsICA1MTcsICA1MTcsICA1MTcsCisgICAgICA1MTcsICA1MTcsICA1MTcsICA1MTgsICA1MTgsICA1MTgsICA1MTgsICA1MTgsICA1MTgsICA1MTgsCisgICAgIDEwODIsIDExNTYsIDExNDgsIDExNDUsICA1MTgsIDExNzAsIDExODQsIDEyMTgsIDEwODIsIDExNDQsCisgICAgICA1MTgsICA1MTgsICA1MTgsICA1MTgsICA1MTgsICA1MTgsICA1MTksICA1MTksICA1MTksICA1MTksCisgICAgICA1MTksICA1MTksICA1MTksICA1MTksICA1MjEsICA1MjEsICA1MjEsICA1MjEsICA1MjEsICA1MjEsCisgICAgICA1MjEsIDExNzAsIDExODQsIDEyMTgsIDEyODEsICA1MjEsIDEzMTgsIDEzMjcsIDExMDYsIDExMDcsCisgICAgIDExMDksICA1MjEsICA1MjEsICA1MjEsICA1MjEsICA1MjEsICA1MjEsICA1MjIsICA1MjIsICA1MjIsCisgICAgICA1MjIsICA1MjIsICA1MjIsICA1MjIsICA1MjIsICA1MjIsIDExMDYsIDExMDcsIDExMDksICA1MjIsCiAKLSAgICAgIDk3NywgIDU3OCwgMTE4OSwgMTE5OCwgIDk3OCwgIDg4OSwgIDgyNCwgIDU3OCwgIDU3OCwgIDU3OCwKLSAgICAgIDU3OCwgIDU3OCwgIDU3OCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwKLSAgICAgIDU4MCwgIDk3OCwgIDg4OSwgIDgxOCwgIDU4MCwgMTIwNywgIDk3OSwgIDk4NCwgMTE4OSwgMTE5OCwKLSAgICAgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MCwgIDU4MSwgIDU4MSwgIDU4MSwgIDU4MSwKLSAgICAgIDU4MSwgIDU4MSwgIDg4OSwgIDk3OSwgIDk4NCwgIDk3OCwgIDU4MSwgIDgxNywgMTA4MiwgIDk4NCwKLSAgICAgIDgxMywgMTIwNywgIDU4MSwgIDU4MSwgIDU4MSwgIDU4MSwgIDU4MSwgIDU4MSwgIDU4NSwgIDU4NSwKLSAgICAgIDU4NSwgIDU4NSwgIDU4NSwgIDU4NSwgIDU4NSwgMTA4MiwgMTExNywgIDk3OSwgIDU4NSwgIDgxMiwKLSAgICAgMTIxNiwgMTA4MywgMTA4NCwgMTExNywgIDU4NSwgIDU4NSwgIDU4NSwgIDU4NSwgIDU4NSwgIDU4NSwKLSAgICAgIDU4NywgIDU4NywgIDU4NywgIDU4NywgIDU4NywgIDU4NywgIDU4NywgIDU4NywgMTA4MywgMTA4NCwKLSAgICAgMTI3MCwgIDU4NywgIDgxMSwgIDgwOCwgMTA4NCwgMTE2NiwgMTIxNiwgIDU4NywgIDU4NywgIDU4NywKKyAgICAgMTI4MSwgMTExMiwgMTMxOCwgMTMyNywgIDc3MiwgIDUyMiwgIDUyMiwgIDUyMiwgIDUyMiwgIDUyMiwKKyAgICAgIDUyMiwgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDc3MiwgMTExMiwKKyAgICAgMTEwNiwgMTEwNywgIDUyMywgMTE0MywgMTExMiwgMTExMywgMTEzOSwgMTEzNywgIDUyMywgIDUyMywKKyAgICAgIDUyMywgIDUyMywgIDUyMywgIDUyMywgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDUyNywKKyAgICAgIDUyNywgIDUyNywgMTEzNiwgMTExMywgIDc3MiwgIDUyNywgMTEzMywgMTEzMiwgMTEyOSwgMTIwOSwKKyAgICAgMTExMCwgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDUyNywgIDUyOSwgIDUyOSwgIDUyOSwKKyAgICAgIDUyOSwgIDUyOSwgIDUyOSwgIDUyOSwgIDUyOSwgIDUyOSwgMTIwMiwgMTIwOSwgMTExMCwgIDUyOSwKKyAgICAgMTEyNiwgMTEyMywgMTIxMCwgMTIxMSwgMTIwMiwgIDUyOSwgIDUyOSwgIDUyOSwgIDUyOSwgIDUyOSwKKyAgICAgIDUyOSwgIDUzMCwgIDUzMCwgIDUzMCwgIDUzMCwgIDUzMCwgIDUzMCwgIDUzMCwgIDUzMCwgMTExMCwKKyAgICAgMTIxMCwgMTIxMSwgIDUzMCwgMTEyMCwgMTExNiwgMTIxMiwgMTIxMywgMTI5NSwgIDUzMCwgIDUzMCwKIAotICAgICAgNTg3LCAgNTg3LCAgNTg3LCAgNTg4LCAgNTg4LCAgNTg4LCAgNTg4LCAgNTg4LCAgNTg4LCAgNTg4LAotICAgICAxMTI0LCAxMTMyLCAxMTY2LCAgNTg4LCAgODA1LCAxMTY2LCAxMjcwLCAxMTI0LCAxMTMyLCAgNTg4LAotICAgICAgNTg4LCAgNTg4LCAgNTg4LCAgNTg4LCAgNTg4LCAgNTkxLCAgNTkxLCAgNTkxLCAgNTkxLCAgNTkxLAotICAgICAgNTkxLCAgNTk1LCAgNTk1LCAgNTk1LCAgNTk1LCAgNTk1LCAgNTk1LCAgNTk2LCAgNTk2LCAgNTk2LAotICAgICAgNTk2LCAgNTk2LCAgNTk2LCAgNTk2LCAgNTk2LCAxMTQwLCAxMTQ4LCAxMjg0LCAgNTk2LCAxMjg4LAotICAgICAgODAyLCAxMTY3LCAxMTQwLCAxMTQ4LCAgNTk2LCAgNTk2LCAgNTk2LCAgNTk2LCAgNTk2LCAgNTk2LAotICAgICAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LCAxMTgwLCAxMTY3LCAgNzk5LAotICAgICAgNTk3LCAxMTY3LCAgNzk4LCAxMjg0LCAxMTgwLCAxMjg4LCAgNTk3LCAgNTk3LCAgNTk3LCAgNTk3LAotICAgICAgNTk3LCAgNTk3LCAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LCAgNTk4LCAgNjAwLAotICAgICAgNjAwLCAgNjAwLCAgNjAwLCAgNjAwLCAgNjAwLCAgNjAyLCAgNjAyLCAgNjAyLCAgNjAyLCAgNjAyLAorICAgICAgNTMwLCAgNTMwLCAgNTMwLCAgNTMwLCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM4LAorICAgICAgNTM4LCAgNTM4LCAgNTM4LCAxMjEyLCAxMjEzLCAxMjk1LCAgNTM4LCAxMTA0LCAxMjk1LCAxMjEzLAorICAgICAxMjk2LCAxMTAzLCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM4LCAgNTM5LCAgNTM5LAorICAgICAgNTM5LCAgNTM5LCAgNTM5LCAgNTM5LCAgNTM5LCAgNTM5LCAxMjQ2LCAxMTAwLCAxMjk2LCAgNTM5LAorICAgICAxMzM2LCAxMjk2LCAxMDk2LCAxMjk3LCAxMjQ2LCAgNTM5LCAgNTM5LCAgNTM5LCAgNTM5LCAgNTM5LAorICAgICAgNTM5LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LAorICAgICAxMjUzLCAxMjk3LCAxMzQ1LCAgNTQ4LCAxMzk5LCAxNDEzLCAxMzM2LCAxMDk1LCAxMjUzLCAgNTQ4LAorICAgICAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTQ4LCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLAorICAgICAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAxMjYxLCAxMjk3LCAxMDkyLCAgNTUwLCAxMzQ1LCAgNTUwLAorICAgICAxMzk5LCAxNDEzLCAxMjYxLCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAgNTUwLCAgNzA5LAogCi0gICAgICA2MDIsICA2MDYsICA2MDYsICA2MDYsICA2MDYsICA2MDYsICA2MDYsICA2MDcsICA2MDcsICA2MDcsCi0gICAgICA2MDcsICA2MDcsICA2MDcsICA2MDcsICA2MDcsIDEyMjksIDEyOTIsIDEyOTYsICA2MDcsICA3ODYsCi0gICAgIDEyMzQsIDEyMzUsIDEyMjksICA3ODUsICA2MDcsICA2MDcsICA2MDcsICA2MDcsICA2MDcsICA2MDcsCi0gICAgICA2MDgsICA2MDgsICA2MDgsICA2MDgsICA2MDgsICA2MDgsICA2MDgsIDEyMzQsIDEyMzUsICA3NzcsCi0gICAgICA2MDgsICA3NzQsIDEyOTIsIDEyOTYsICA3NjUsIDEyMzQsICA2MDgsICA2MDgsICA2MDgsICA2MDgsCi0gICAgICA2MDgsICA2MDgsICA2MDksICA2MDksICA2MDksICA2MDksICA2MDksICA2MDksICA2MDksICA2MTIsCi0gICAgICA2MTIsICA2MTIsICA2MTIsICA2MTIsICA2MTIsICA2MTUsICA2MTUsICA2MTUsICA2MTUsICA2MTUsCi0gICAgICA2MTUsICA2MTUsICA2MTcsICA2MTcsICA2MTcsICA2MTcsICA2MTcsICA2MTcsICA2MTcsICA2MTksCi0gICAgICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksICA2MjAsICA2MjAsICA2MjAsICA2MjAsCi0gICAgICA2MjAsICA2MjAsICA2MjAsICA2MjAsICA3NTMsICA3NDIsICA3MzIsICA2MjAsICA3MzEsICA3MjAsCisgICAgICA3MDksICA3MDksICA3MDksICA3MDksICA3MDksICA3MDksICA3MTUsICA3MTUsICA3MTUsICA3MTUsCisgICAgICA3MTUsICA3MTUsICA3MTUsICA4MjMsICA3NzMsICA1NTAsICA1OTAsICA1OTAsICA1OTAsICA1OTAsCisgICAgICA1OTAsICA1OTAsICA1OTAsIDE0MTcsIDEyNjksIDE0MjEsIDE0MjUsICA1OTAsICA3NzMsIDEwODcsCisgICAgIDEzNjQsICA4MjMsIDEyNjksICA1OTAsICA1OTAsICA1OTAsICA1OTAsICA1OTAsICA1OTAsICA1OTIsCisgICAgICA1OTIsICA1OTIsICA1OTIsICA1OTIsICA1OTIsICA1OTIsICA4MjMsIDEyNzcsIDEzNjQsIDE0MTcsCisgICAgICA1OTIsIDE0MjEsIDE0MjUsIDE0MjksICA3NzMsIDEyNzcsICA1OTIsICA1OTIsICA1OTIsICA1OTIsCisgICAgICA1OTIsICA1OTIsICA1OTMsICA1OTMsICA1OTMsICA1OTMsICA1OTMsICA1OTMsICA1OTMsICA1OTMsCisgICAgICA1OTUsICA1OTUsICA1OTUsICA1OTUsICA1OTUsICA1OTUsICA1OTUsIDEzMDksIDEzNTgsIDE0MjksCisgICAgIDE0MzcsICA1OTUsIDE0NDYsIDEyMTQsIDE0MDcsIDEzMDksIDEzNTgsICA1OTUsICA1OTUsICA1OTUsCisgICAgICA1OTUsICA1OTUsICA1OTUsICA1OTcsICA1OTcsICA1OTcsICA1OTcsICA1OTcsICA1OTcsICA1OTcsCiAKLSAgICAgIDcwMSwgIDY5NCwgIDY5MywgIDYyMCwgIDYyMCwgIDYyMCwgIDYyMCwgIDYyMCwgIDYyMCwgIDYyMSwKLSAgICAgIDYyMSwgIDYyMSwgIDYyMSwgIDYyMSwgIDYyMSwgIDYyMSwgIDYyMiwgIDYyMiwgIDYyMiwgIDYyMiwKLSAgICAgIDYyMiwgIDYyMiwgIDYyMiwgIDYyMiwgIDYzMSwgIDYzNiwgMTI3OCwgIDYyMiwgIDY0MiwgIDYyMiwKLSAgICAgIDY4NSwgIDgyNiwgIDY4MiwgIDYyMiwgIDYyMiwgIDYyMiwgIDYyMiwgIDYyMiwgIDYyMiwgIDg4MSwKLSAgICAgMTMwMCwgIDYzMSwgIDYzNiwgMTI3OCwgIDgyNiwgIDY0MiwgIDY2MSwgIDY2MSwgIDY2MSwgIDY2MSwKLSAgICAgIDY2MSwgIDY2MSwgIDY2MSwgIDYzMSwgIDYzNiwgIDYyMiwgIDg4MSwgIDY0MiwgIDY0NSwgIDY0NSwKLSAgICAgIDY0NSwgIDY0NSwgIDY0NSwgIDY0NSwgIDY0NSwgIDY0NSwgMTMwMCwgIDg4MSwgIDY3OSwgIDY0NSwKLSAgICAgIDgyNiwgIDY0NSwgIDY3OCwgIDY3MCwgIDY2NywgIDY0NSwgIDY0NSwgIDY0NSwgIDY0NSwgIDY0NSwKLSAgICAgIDY0NSwgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2MywgIDY2OSwgIDY2OSwKLSAgICAgIDY2OSwgIDY2OSwgIDY2OSwgIDY2OSwgIDY2OSwgMTE2OCwgMTI4MCwgIDY0NSwgIDY0OCwgIDY0OCwKKyAgICAgIDU5NywgMTIxNCwgMTQwNywgMTA4NiwgMTA4MywgIDU5NywgMTQzNywgMTA3NSwgMTQ0NiwgMTA3NCwKKyAgICAgMTIxNCwgIDU5NywgIDU5NywgIDU5NywgIDU5NywgIDU5NywgIDU5NywgIDU5OCwgIDU5OCwgIDU5OCwKKyAgICAgIDU5OCwgIDU5OCwgIDU5OCwgIDU5OCwgIDU5OCwgIDU5OSwgIDU5OSwgIDU5OSwgIDU5OSwgIDU5OSwKKyAgICAgIDU5OSwgIDU5OSwgMTQwNSwgMTA3MSwgMTA2MywgMTA2MiwgIDU5OSwgMTA1OSwgMTA1MiwgMTA1MSwKKyAgICAgMTQwNSwgMTA0OCwgIDU5OSwgIDU5OSwgIDU5OSwgIDU5OSwgIDU5OSwgIDU5OSwgIDYwMCwgIDYwMCwKKyAgICAgIDYwMCwgIDYwMCwgIDYwMCwgIDYwMCwgIDYwMCwgIDYwMCwgIDYwMywgIDYwMywgIDYwMywgIDYwMywKKyAgICAgIDYwMywgIDYwMywgIDYwMywgIDYwMywgIDYwMywgIDczNSwgIDc4MCwgIDc4MSwgIDYwMywgMTA0MywKKyAgICAgIDYwMywgMTQwOSwgMTA0MiwgIDc4NCwgIDYwMywgIDYwMywgIDYwMywgIDYwMywgIDYwMywgIDYwMywKKyAgICAgIDc4MCwgIDc4MSwgMTAzOSwgIDczNSwgMTAzOCwgMTAzNSwgMTAzNCwgIDc4NCwgMTAzMSwgMTQwOSwKKyAgICAgIDc0NSwgMTAyOCwgIDc0MCwgMTAyNSwgIDc0NiwgIDczNSwgIDYwMywgIDYwNiwgIDYwNiwgIDYwNiwKIAotICAgICAgNjQ4LCAgNjQ4LCAgNjQ4LCAgNjQ4LCAgNjQ4LCAgNjQ4LCAgNjY2LCAgNjU5LCAgNjU2LCAgNjQ4LAotICAgICAgNjU1LCAgNjQ4LCAxMTY4LCAxMjgwLCAgNjU0LCAgNjQ4LCAgNjQ4LCAgNjQ4LCAgNjQ4LCAgNjQ4LAotICAgICAgNjQ4LCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgNjczLCAgNjczLAotICAgICAgNjczLCAgNjczLCAgNjczLCAgNjczLCAgNjczLCAgODMwLCAxMTY4LCAgNjQ4LCAgNjUxLCAgNjUxLAotICAgICAgNjUxLCAgNjUxLCAgNjUxLCAgNjUxLCAgNjUxLCAgNjUxLCAgNjUzLCAgNjUwLCAgODMwLCAgNjUxLAotICAgICAxMzA4LCAgNjUxLCAgNjQ3LCAgNjQ0LCAgNjQzLCAgNjUxLCAgNjUxLCAgNjUxLCAgNjUxLCAgNjUxLAotICAgICAgNjUxLCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjc1LCAgNjgxLCAgNjgxLAotICAgICAgNjgxLCAgNjgxLCAgNjgxLCAgNjgxLCAgODMwLCAxMzA3LCAxMzA4LCAgNjUxLCAgNjU3LCAgNjU3LAotICAgICAgNjU3LCAgNjU3LCAgNjU3LCAgNjU3LCAgNjU3LCAgNjU3LCAgNjI1LCAgNjI0LCAgNjE2LCAgNjU3LAotICAgICAxMzE3LCAgNjU3LCAxMzA3LCAgNjEzLCAgNjA1LCAgNjU3LCAgNjU3LCAgNjU3LCAgNjU3LCAgNjU3LAorICAgICAgNjA2LCAgNjA2LCAgNjA2LCAgNjA2LCAgNjA2LCAgNjA2LCAgNzgwLCAgNzgxLCAgNzQ1LCAgNjA2LAorICAgICAgNzQwLCAgNjA2LCAgNzQ2LCAgNzg0LCAgODMwLCAgNjA2LCAgNjA2LCAgNjA2LCAgNjA2LCAgNjA2LAorICAgICAgNjA2LCAgNzQ1LCAgNzQwLCAxMDIxLCAgNzQ2LCAgNzUyLCAgNzUyLCAgNzUyLCAgNzUyLCAgNzUyLAorICAgICAgNzUyLCAgNzUyLCAgODMwLCAgNzg1LCAgNzk1LCAgNzk2LCAgOTA5LCAgNjA2LCAgNjEyLCAgNjEyLAorICAgICAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLCAgNzg1LCAgNzk1LCAgNzk2LAorICAgICAgNjEyLCAgODMwLCAgNjEyLCAxMDA0LCAgOTA5LCAgNzk5LCAgNjEyLCAgNjEyLCAgNjEyLCAgNjEyLAorICAgICAgNjEyLCAgNjEyLCAgNzkzLCAgNzkzLCAgNzkzLCAgNzkzLCAgNzkzLCAgNzkzLCAgNzkzLCAgNzk5LAorICAgICAxMzYzLCAgOTA5LCAxMDAwLCAgNzg1LCAgNzk1LCAgNzk2LCAgODAwLCAgOTkzLCAgNjEyLCAgNjE3LAorICAgICAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAgNjE3LCAxMzYzLCAgOTkyLAorICAgICAgODAwLCAgNjE3LCAgOTg5LCAgOTg1LCAxNDM2LCAgNzk5LCAxMzYzLCAgNjE3LCAgNjE3LCAgNjE3LAogCi0gICAgICA2NTcsICA2ODQsICA2ODQsICA2ODQsICA2ODQsICA2ODQsICA2ODQsICA2ODQsICA2ODYsICA2ODYsCi0gICAgICA2ODYsICA2ODYsICA2ODYsICA2ODYsICA2ODYsIDExNjUsIDEzMTcsICA2NTcsICA2NjIsICA2NjIsCi0gICAgICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA1OTQsICA1ODQsICA1ODMsICA2NjIsCi0gICAgICA1NzUsICA1NzEsIDExNjUsICA1NzAsICA1NjksICA2NjIsICA2NjIsICA2NjIsICA2NjIsICA2NjIsCi0gICAgICA2NjIsICA2NjQsICA2NjQsICA2NjQsICA2NjQsICA2NjQsICA2NjQsICA2NjQsICA2NjQsIDExNjUsCi0gICAgICA1NjcsICA1NjYsICA2NjQsICA1NjMsICA2NjQsICA1NjIsICA1NjEsICA1NjAsICA2NjQsICA2NjQsCi0gICAgICA2NjQsICA2NjQsICA2NjQsICA2NjQsICA2ODgsICA2ODgsICA2ODgsICA2ODgsICA2ODgsICA2ODgsCi0gICAgICA2ODgsICA2OTAsICA2OTAsICA2OTAsICA2OTAsICA2OTAsICA2OTAsICA2OTAsIDEyMzIsICA1NTksCi0gICAgICA2NjQsICA2NzQsICA2NzQsICA2NzQsICA2NzQsICA2NzQsICA2NzQsICA2NzQsICA2NzQsICA1NTgsCi0gICAgICA1NTcsICA1NTYsICA2NzQsICA1NTUsICA1NTQsIDEyMzIsICA1NTMsICA1NTIsICA2NzQsICA2NzQsCisgICAgICA2MTcsICA2MTcsICA2MTcsICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksCisgICAgICA2MTksICA2MTksIDE0MzYsICA5ODQsICA5ODEsICA2MTksICA4MDAsICA2MTksICA5NzcsICA5NzYsCisgICAgICA5NzMsICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksICA2MTksICA4MDgsICA4MDgsICA4MDgsCisgICAgICA4MDgsICA4MDgsICA4MDgsICA4MDgsICA4MTAsICA4MTAsICA4MTAsICA4MTAsICA4MTAsICA4MTAsCisgICAgICA4MTAsICA4OTQsICA5MTEsICA2MTksICA2MjksICA2MjksICA2MjksICA2MjksICA2MjksICA2MjksCisgICAgICA2MjksICA2MjksICA2MjksICA5NjksICA5NjgsICA4OTQsICA2MjksICA5NjUsICA5NjIsICA5NjEsCisgICAgICA5MTEsICA5MTEsICA2MjksICA2MjksICA2MjksICA2MjksICA2MjksICA2MjksICA2MzEsICA2MzEsCisgICAgICA2MzEsICA2MzEsICA2MzEsICA2MzEsICA2MzEsICA2MzEsICA2MzEsICA5NTgsICA5MTEsICA5NTQsCisgICAgICA2MzEsICA4OTQsICA2MzEsICA5NTMsIDEwMTQsICA4MjgsICA2MzEsICA2MzEsICA2MzEsICA2MzEsCisgICAgICA2MzEsICA2MzEsICA4MTQsICA4MTQsICA4MTQsICA4MTQsICA4MTQsICA4MTQsICA4MTQsICA5NTAsCiAKKyAgICAgIDk0OSwgIDk0NiwgMTAxNCwgIDgyOCwgIDk0MiwgIDg5NSwgIDg5OCwgIDkxMiwgIDYzMSwgIDY0MiwKKyAgICAgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MiwgIDgyOCwgIDg5NSwKKyAgICAgIDg5OCwgIDY0MiwgMTAxNCwgIDkzOCwgIDkzNywgIDkxMiwgIDg5OSwgIDY0MiwgIDY0MiwgIDY0MiwKKyAgICAgIDY0MiwgIDY0MiwgIDY0MiwgIDY0MywgIDY0MywgIDY0MywgIDY0MywgIDY0MywgIDY0MywgIDY0MywKKyAgICAgIDg5OSwgIDkxMiwgIDkzNiwgIDkzMywgIDY0MywgIDg5NSwgIDg5OCwgIDkzMCwgIDkyNywgIDkyNCwKKyAgICAgIDY0MywgIDY0MywgIDY0MywgIDY0MywgIDY0MywgIDY0MywgIDY0NiwgIDY0NiwgIDY0NiwgIDY0NiwKKyAgICAgIDY0NiwgIDY0NiwgIDY0NiwgIDkyMywgIDkwNSwgIDkwNCwgIDg5OSwgIDY0NiwgIDkwNiwgIDkwNywKKyAgICAgIDkwOCwgIDkxNCwgMTAxMSwgIDY0NiwgIDY0NiwgIDY0NiwgIDY0NiwgIDY0NiwgIDY0NiwgIDg1MywKKyAgICAgIDg1MywgIDg1MywgIDg1MywgIDg1MywgIDg1MywgIDg1MywgIDkwNiwgIDkwNywgIDkwOCwgIDkxNCwKKyAgICAgMTAxMSwgIDY0NiwgIDY2OSwgIDkwMSwgIDY2OSwgIDY2OSwgIDY2OSwgIDY2OSwgIDY2OSwgIDY2OSwKKworICAgICAgNjY5LCAgOTA2LCAgOTA3LCAgOTA4LCAgOTA4LCAgNjY5LCAgOTE0LCAgODk3LCAxMDEwLCAxMDExLAorICAgICAxMTE0LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LCAgNjY5LCAgODU4LCAgODU4LCAgODU4LAorICAgICAgODU4LCAgODU4LCAgODU4LCAgODU4LCAgOTQzLCAgOTQ0LCAxMDEwLCAxMjk0LCAxMTE0LCAgNjY5LAorICAgICAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgOTQzLCAgOTQ0LAorICAgICAxMDEwLCAgODk2LCAgNjcwLCAxMTE0LCAgODkzLCAxMjk0LCAgODg4LCAgODg0LCAgNjcwLCAgNjcwLAorICAgICAgNjcwLCAgNjcwLCAgNjcwLCAgNjcwLCAgODYyLCAgODYyLCAgODYyLCAgODYyLCAgODYyLCAgODYyLAorICAgICAgODYyLCAgODc2LCAxMjk0LCAgODcyLCAgOTQzLCAgOTQ0LCAgNjcwLCAgNjcxLCAgNjcxLCAgNjcxLAorICAgICAgNjcxLCAgNjcxLCAgNjcxLCAgNjcxLCAgODY3LCAgODY3LCAgODY3LCAgODY3LCAgODY3LCAgODY3LAorICAgICAgODY3LCAgODY5LCAgODY5LCAgODY5LCAgODY5LCAgODY5LCAgODY5LCAgODY5LCAgODczLCAgODczLAorICAgICAgODczLCAgODczLCAgODczLCAgODczLCAgODczLCAgODc5LCAgODc5LCAgODc5LCAgODc5LCAgODc5LAorCisgICAgICA4NzksICA4NzksICA2NzEsICA2NzIsICA2NzIsICA2NzIsICA2NzIsICA2NzIsICA2NzIsICA2NzIsCisgICAgICA4NjUsICA4NjEsICA4NTYsICA4NTEsICA2NzIsICA4NTAsICA4NDksICA4NDYsICA4NDMsICA4MzksCisgICAgICA2NzIsICA2NzIsICA2NzIsICA2NzIsICA2NzIsICA2NzIsICA2NzQsICA2NzQsICA2NzQsICA2NzQsCiAgICAgICA2NzQsICA2NzQsICA2NzQsICA2NzQsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsCi0gICAgICA2NzYsICA2NzYsICA1NDYsICA1NDAsIDEyMzIsICA2NzYsICA1MzksICA2NzYsICA1MzEsICA1MjgsCi0gICAgICA1MjcsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2OTYsICA2OTYsICA2OTYsCi0gICAgICA2OTYsICA2OTYsICA2OTYsICA2OTgsICA2OTgsICA2OTgsICA2OTgsICA2OTgsICA2OTgsIDEyNzksCi0gICAgICA4NDEsICA1MjAsICA1MTcsICA2NzYsICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksCi0gICAgICA2ODksICA2ODksICA1MTYsICA4NDEsICA1MTUsICA2ODksIDEyNzksICA1MTQsICA1MTEsICA1MDgsCi0gICAgICA1MDcsICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksICA2ODksICA2OTEsICA2OTEsICA2OTEsCi0gICAgICA2OTEsICA2OTEsICA2OTEsICA2OTEsICA2OTEsIDEyNzksICA1MDUsICA1MDEsICA2OTEsICA4NDEsCi0gICAgICA2OTEsICA0OTgsICA0OTcsICA0OTYsICA2OTEsICA2OTEsICA2OTEsICA2OTEsICA2OTEsICA2OTEsCi0gICAgICA3MDIsICA3MDIsICA3MDIsICA3MDIsICA3MDIsICA3MDIsICA3MDUsICA3MDUsICA3MDUsICA3MDUsCisgICAgICA2NzYsICA2NzYsICA4MTcsICA4MTMsICA4MDYsICA4MDUsICA2NzYsICA4MDIsICA3OTgsICA3OTcsCisgICAgICA3OTQsICA3OTEsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzYsICA2NzcsICA2NzcsCisgICAgICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzcsICA2NzksICA2NzksICA2NzksICA2NzksCisgICAgICA2NzksICA2NzksICA2NzksICA3OTAsICA3ODcsICA3ODMsICA3ODIsICA2NzksICA3NzksICA3NzgsCisgICAgICA3NzUsICA3NzEsICA3NjgsICA2NzksICA2NzksICA2NzksICA2NzksICA2NzksICA2NzksICA2ODAsCisgICAgICA2ODAsICA2ODAsICA2ODAsICA2ODAsICA2ODAsICA2ODAsICA2ODAsICA2ODAsICA3NjcsICA3NjYsCiAKLSAgICAgIDcwNSwgIDcwNSwgIDcwNSwgIDg0NSwgIDc4OCwgIDc4OSwgIDY5MSwgIDcwMywgIDcwMywgIDcwMywKLSAgICAgIDcwMywgIDcwMywgIDcwMywgIDcwMywgIDcwMywgIDQ5NSwgIDg0NSwgIDQ5MSwgIDcwMywgIDQ5MCwKLSAgICAgIDQ4OCwgIDc4OCwgIDc4OSwgIDQ4NywgIDcwMywgIDcwMywgIDcwMywgIDcwMywgIDcwMywgIDcwMywKLSAgICAgIDcwNCwgIDcwNCwgIDcwNCwgIDcwNCwgIDcwNCwgIDcwNCwgIDc4OCwgIDc4OSwgIDc4OSwgIDQ4NiwKLSAgICAgIDcwNCwgIDQ4NSwgIDg0NSwgIDQ4NCwgIDQ4MywgIDg1NywgIDcwNCwgIDcwNCwgIDcwNCwgIDcwNCwKLSAgICAgIDcwNCwgIDcwNCwgIDcyMSwgIDcyMSwgIDcyMSwgIDcyMSwgIDcyMSwgIDcyMSwgIDg1NywgIDQ4MiwKLSAgICAgIDQ4MSwgIDQ4MCwgIDcyMSwgIDQ3OSwgIDQ3OCwgIDQ3NywgIDQ3NCwgIDQ3MywgIDcyMSwgIDcyMSwKLSAgICAgIDcyMSwgIDcyMSwgIDcyMSwgIDcyMSwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMiwKLSAgICAgIDcyMiwgIDcyMiwgIDQ3MiwgIDQ3MSwgIDg1NywgIDcyMiwgMTA4NSwgIDQ2MywgIDQ1NSwgIDQ0NSwKLSAgICAgIDQ0NCwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMiwgIDcyMywgIDcyMywgIDcyMywKKyAgICAgIDc2NSwgIDY4MCwgIDc2MiwgIDc1OSwgIDc1NiwgIDc1NSwgIDk1MSwgIDY4MCwgIDY4MCwgIDY4MCwKKyAgICAgIDY4MCwgIDY4MCwgIDY4MCwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwKKyAgICAgIDk1MSwgIDcyOCwgIDcyNywgIDcyNCwgIDY4MSwgIDcyMCwgIDcxOSwgIDcxNiwgIDcxMiwgIDcwOCwKKyAgICAgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MSwgIDY4MywgIDY4MywgIDY4MywgIDY4MywKKyAgICAgIDY4MywgIDY4MywgIDY4MywgIDY4MywgIDY4MywgIDcwMSwgIDk1MSwgIDY5NywgIDY4MywgIDY5MiwKKyAgICAgIDY4NywgIDY4NiwgIDY4NSwgIDk1MiwgIDY4MywgIDY4MywgIDY4MywgIDY4MywgIDY4MywgIDY4MywKKyAgICAgIDY4NCwgIDY4NCwgIDY4NCwgIDY4NCwgIDY4NCwgIDY4NCwgIDY4NCwgIDk1MiwgIDY4MiwgIDY3OCwKKyAgICAgIDY2OCwgIDY4NCwgIDY2NywgIDY2MywgIDY2MiwgIDY2MCwgIDY1OSwgIDY4NCwgIDY4NCwgIDY4NCwKKyAgICAgIDY4NCwgIDY4NCwgIDY4NCwgIDY4OCwgIDY4OCwgIDY4OCwgIDY4OCwgIDY4OCwgIDY4OCwgIDY4OCwKKyAgICAgIDY4OCwgIDY1NCwgIDY0NCwgIDk1MiwgIDY4OCwgIDY0MCwgIDYzNCwgIDYzMywgIDYzMCwgIDYyNiwKIAotICAgICAgNzIzLCAgNzIzLCAgNzIzLCAxMDg1LCAgNDQzLCAgNDQxLCAgNDM5LCAgNzIzLCAgNDM4LCAgNDM1LAotICAgICAgNDM0LCAgNDMzLCAxMDg1LCAgNzIzLCAgNzIzLCAgNzIzLCAgNzIzLCAgNzIzLCAgNzIzLCAgNzI0LAotICAgICAgNzI0LCAgNzI0LCAgNzI0LCAgNzI0LCAgNzI0LCAgNzI0LCAgNzI1LCAgNzI1LCAgNzI1LCAgNzI1LAotICAgICAgNzI1LCAgNzI1LCAgNzI1LCAgNzI1LCAgNDMyLCAgNDMxLCAgNDMwLCAgNzI1LCAxMjMzLCAgNDI5LAotICAgICAgNDI4LCAgNDI3LCAgNDI2LCAgNzI1LCAgNzI1LCAgNzI1LCAgNzI1LCAgNzI1LCAgNzI1LCAgNzI2LAotICAgICAgNzI2LCAgNzI2LCAgNzI2LCAgNzI2LCAgNzI2LCAxMjMzLCAgNDI0LCAgNDIxLCAgNDIwLCAgNzI2LAotICAgICAgNDE5LCAgNDE4LCAgNDE3LCAgNDE2LCAxMjMzLCAgNzI2LCAgNzI2LCAgNzI2LCAgNzI2LCAgNzI2LAotICAgICAgNzI2LCAgNzI3LCAgNzI3LCAgNzI3LCAgNzI3LCAgNzI3LCAgNzI3LCAgNzI3LCAgNzI4LCAgNzI4LAotICAgICAgNzI4LCAgNzI4LCAgNzI4LCAgNzI4LCAgNzI4LCAgNzI4LCAgNDE1LCAgNDEzLCAgNDEyLCAgNzI4LAotICAgICAgNDExLCAgNDEwLCAgNDA4LCAgNDA2LCAgNDA1LCAgNzI4LCAgNzI4LCAgNzI4LCAgNzI4LCAgNzI4LAorICAgICAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjg4LCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLAorICAgICAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjI1LCAgNjIyLCAgNjIxLCAgNjkwLCAgNjE4LAorICAgICAgNjE0LCAgNjExLCAgNjEwLCAgNjA5LCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLCAgNjkwLAorICAgICAgNjkxLCAgNjkxLCAgNjkxLCAgNjkxLCAgNjkxLCAgNjkxLCAgNjkxLCAgNjkxLCAgNjA4LCAgNjA1LAorICAgICAgNjAyLCAgNjkxLCAgNjAxLCAgNTk0LCAgNTkxLCAgNTg5LCAgNTg1LCAgNjkxLCAgNjkxLCAgNjkxLAorICAgICAgNjkxLCAgNjkxLCAgNjkxLCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LAorICAgICAgNjk5LCAgNjk5LCAgNTgxLCAgNTgwLCAgNTc5LCAgNjk5LCAgNTc4LCAgNTc0LCAgNTczLCAgNTcxLAorICAgICAgNTcwLCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNjk5LCAgNzAwLCAgNzAwLCAgNzAwLAorICAgICAgNzAwLCAgNzAwLCAgNzAwLCAgNzAwLCAgNzAwLCAgNTY5LCAgNTY4LCAgNTY3LCAgNzAwLCAgNTY2LAorICAgICAgNTY1LCAgNTY0LCAgNTYzLCAgNTYyLCAgNzAwLCAgNzAwLCAgNzAwLCAgNzAwLCAgNzAwLCAgNzAwLAogCi0gICAgICA3MjgsICA3MjksICA3MjksICA3MjksICA3MjksICA3MjksICA3MjksICA0MDQsICA0MDMsICA0MDIsCi0gICAgICA0MDEsICA3MjksICAzOTksICAzOTgsICAzOTEsICAzODcsICAzODYsICA3MjksICA3MjksICA3MjksCi0gICAgICA3MjksICA3MjksICA3MjksICA3MzAsICA3MzAsICA3MzAsICA3MzAsICA3MzAsICA3MzAsICA3MzAsCi0gICAgICA3MzMsICA3MzMsICA3MzMsICA3MzMsICA3MzMsICA3MzMsICA3MzMsICAzODUsICAzNzgsICAzNzcsCi0gICAgICA3MzMsICAzNzQsICAzNzMsICAzNzIsICAzNzEsICAzNjgsICA3MzMsICA3MzMsICA3MzMsICA3MzMsCi0gICAgICA3MzMsICA3MzMsICA3MzQsICA3MzQsICA3MzQsICA3MzQsICA3MzQsICA3MzQsICA3MzUsICA3MzUsCi0gICAgICA3MzUsICA3MzUsICA3MzUsICA3MzUsICA3MzUsICA3MzUsICAzNjcsICAzNjQsICAzNjMsICA3MzUsCi0gICAgICAzNjIsICAzNjEsICAzNjAsICAzNTksICAzNTgsICA3MzUsICA3MzUsICA3MzUsICA3MzUsICA3MzUsCi0gICAgICA3MzUsICA3MzYsICA3MzYsICA3MzYsICA3MzYsICA3MzYsICA3MzYsICA3MzYsICAzNTcsICAzNTYsCi0gICAgICAzNTUsICA3MzYsICAzNTQsICAzNTIsICAzNTAsICAzNDksICAzNDcsICA3MzYsICA3MzYsICA3MzYsCisgICAgICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA1NjEsCisgICAgICA1NjAsICA1NTcsICA3MTAsICA1NTYsICA1NTUsICA1NTMsICA1NTIsICA1NDksICA3MTAsICA3MTAsCisgICAgICA3MTAsICA3MTAsICA3MTAsICA3MTAsICA3MTEsICA3MTEsICA3MTEsICA3MTEsICA3MTEsICA3MTEsCisgICAgICA3MTEsICA3MTEsICA1NDQsICA1NDAsICA1MzYsICA3MTEsICA1MzEsICA1MjYsICA1MjUsICA1MjQsCisgICAgICA1MjAsICA3MTEsICA3MTEsICA3MTEsICA3MTEsICA3MTEsICA3MTEsICA3MjMsICA3MjMsICA3MjMsCisgICAgICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA1MTQsICA1MTMsICA1MDgsICA3MjMsCisgICAgICA1MDcsICA1MDYsICA1MDUsICA1MDQsICA1MDMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsICA3MjMsCisgICAgICA3MjMsICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA3MjUsCisgICAgICA1MDIsICA1MDEsICA1MDAsICA3MjUsICA0OTksICA3MjUsICA0OTgsICA0OTYsICA0OTMsICA3MjUsCisgICAgICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA3MjUsICA4ODEsICA4ODEsICA4ODEsICA4ODEsICA4ODEsCiAKLSAgICAgIDczNiwgIDczNiwgIDczNiwgIDczNywgIDczNywgIDczNywgIDczNywgIDczNywgIDczNywgIDczNywKLSAgICAgIDczOSwgIDczOSwgIDczOSwgIDczOSwgIDczOSwgIDczOSwgIDc0MywgIDc0MywgIDc0MywgIDc0MywKLSAgICAgIDc0MywgIDc0MywgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwKLSAgICAgIDM0NiwgIDM0MywgIDM0MiwgIDc0NCwgIDM0MCwgIDMzOCwgIDMzNywgIDMzNiwgIDMzMywgIDc0NCwKLSAgICAgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NCwgIDc0NSwgIDc0NSwgIDc0NSwgIDc0NSwgIDc0NSwKLSAgICAgIDc0NSwgIDc0NSwgIDMzMiwgIDMzMCwgIDMyOSwgIDc0NSwgIDMyOCwgIDMyNiwgIDMyNSwgIDMyNCwKLSAgICAgIDMxNywgIDc0NSwgIDc0NSwgIDc0NSwgIDc0NSwgIDc0NSwgIDc0NSwgIDc0NiwgIDc0NiwgIDc0NiwKLSAgICAgIDc0NiwgIDc0NiwgIDc0NiwgIDc0NiwgIDc0OCwgIDc0OCwgIDc0OCwgIDc0OCwgIDc0OCwgIDc0OCwKLSAgICAgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1MCwgIDc1NCwgIDc1NCwgIDc1NCwgIDc1NCwKLSAgICAgIDc1NCwgIDc1NCwgIDc1NSwgIDc1NSwgIDc1NSwgIDc1NSwgIDc1NSwgIDc1NSwgIDc1NSwgIDc1NSwKKyAgICAgIDg4MSwgIDg4MSwgIDg4NSwgIDg4NSwgIDg4NSwgIDg4NSwgIDg4NSwgIDg4NSwgIDg4NSwgIDk1NSwKKyAgICAgIDk1NiwgIDcyNSwgIDc0NywgIDk2NiwgIDc0NywgIDc0NywgIDc0NywgIDc0NywgIDc0NywgIDc0NywKKyAgICAgIDc0NywgIDQ5MiwgIDQ5MSwgIDk1NSwgIDk1NiwgIDc0NywgIDQ5MCwgIDk2NiwgIDQ4OSwgIDQ4OCwKKyAgICAgIDc0NywgIDc0NywgIDc0NywgIDc0NywgIDc0NywgIDc0NywgIDc0NywgIDc0OSwgIDc0OSwgIDc0OSwKKyAgICAgIDc0OSwgIDc0OSwgIDc0OSwgIDc0OSwgIDQ4NywgIDQ4NSwgIDQ4NCwgIDQ4MywgIDc0OSwgIDk1NSwKKyAgICAgIDk1NiwgIDQ4MiwgIDQ4MCwgIDk2NiwgIDc0OSwgIDc0OSwgIDc0OSwgIDc0OSwgIDc0OSwgIDc0OSwKKyAgICAgIDc1MSwgIDc1MSwgIDc1MSwgIDc1MSwgIDc1MSwgIDc1MSwgIDc1MSwgIDQ3OCwgIDQ3NywgIDQ3NiwKKyAgICAgIDQ3NSwgIDc1MSwgIDQ3NCwgMTM2MiwgIDQ3MywgIDQ3MiwgIDQ3MCwgIDc1MSwgIDc1MSwgIDc1MSwKKyAgICAgIDc1MSwgIDc1MSwgIDc1MSwgIDc1MywgIDc1MywgIDc1MywgIDc1MywgIDc1MywgIDc1MywgIDc1MywKKyAgICAgIDc1MywgMTM2MiwgIDQ2OSwgIDQ2OCwgIDQ2NSwgIDc1MywgIDQ2MSwgIDQ1NywgIDQ1NiwgIDQ1NSwKIAotICAgICAgMzEwLCAgMzA5LCAgMzA3LCAgNzU1LCAgMzA2LCAgMzA1LCAgMzAwLCAgMjk4LCAgMjkzLCAgNzU1LAotICAgICAgNzU1LCAgNzU1LCAgNzU1LCAgNzU1LCAgNzU1LCAgNzU2LCAgNzU2LCAgNzU2LCAgNzU2LCAgNzU2LAotICAgICAgNzU2LCAgNzU2LCAgMjkxLCAgMjg5LCAgMjg4LCAgNzU2LCAgMjg3LCAgMjg2LCAgMjg1LCAgMjg0LAotICAgICAgMjgzLCAgNzU2LCAgNzU2LCAgNzU2LCAgNzU2LCAgNzU2LCAgNzU2LCAgNzU3LCAgNzU3LCAgNzU3LAotICAgICAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLAotICAgICAgNzYyLCAgNzYyLCAgNzYyLCAgNzYyLCAgNzYyLCAgNzYyLCAgNzY2LCAgNzY2LCAgNzY2LCAgNzY2LAotICAgICAgNzY2LCAgNzY2LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LAotICAgICAgMjgxLCAgMjgwLCAgMjc5LCAgNzY3LCAgMjc0LCAgMjcxLCAgMjcwLCAgMjY5LCAgMjY2LCAgNzY3LAotICAgICAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY3LCAgNzY4LCAgNzY4LCAgNzY4LCAgNzY4LCAgNzY4LAotICAgICAgNzY4LCAgNzY4LCAgMjYzLCAgMjYyLCAgMjYwLCAgNzY4LCAgMjU4LCAgMjU3LCAgMjU1LCAgMjUyLAorICAgICAxMzYyLCAgNzUzLCAgNzUzLCAgNzUzLCAgNzUzLCAgNzUzLCAgNzUzLCAgNzU0LCAgNzU0LCAgNzU0LAorICAgICAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU0LCAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LAorICAgICAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LCAgNDUyLCAgNDQ4LCAgNDQ3LCAgNzU3LCAgNDQ0LCAgNzU3LAorICAgICAgNDQzLCAgNDQyLCAgNDQxLCAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LCAgNzU3LCAgODkyLAorICAgICAgODkyLCAgODkyLCAgODkyLCAgODkyLCAgODkyLCAgODkyLCAgOTY0LCAgOTY0LCAgOTY0LCAgOTY0LAorICAgICAgOTY0LCAgOTY0LCAgOTY0LCAgOTY3LCAgNDM4LCAgNzU3LCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLAorICAgICAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLCAgNDM3LCAgOTcwLCAgOTY3LCAgNzYwLCAgNDI4LAorICAgICAgNzYwLCAgNDI1LCAgOTcxLCAgOTgyLCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLCAgNzYwLAorICAgICAgOTcwLCAgNDIzLCAgNDIyLCAgNDIxLCAgNDIwLCAgNDE5LCAgOTcxLCAgOTgyLCAgNDE4LCAgNDE3LAorICAgICAgNDE2LCAgNDE1LCAxMzYxLCAgOTY3LCAgOTgzLCAgNDE0LCAgNzYwLCAgNzYzLCAgNzYzLCAgNzYzLAogCi0gICAgICAyNTEsICA3NjgsICA3NjgsICA3NjgsICA3NjgsICA3NjgsICA3NjgsICA3NjksICA3NjksICA3NjksCi0gICAgICA3NjksICA3NjksICA3NjksICA3NjksICA3NzMsICA3NzMsICA3NzMsICA3NzMsICA3NzMsICA3NzMsCi0gICAgICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzYsICA3NzgsICA3NzgsICA3NzgsCi0gICAgICA3NzgsICA3NzgsICA3NzgsICA3NzgsICA3ODAsICA3ODAsICA3ODAsICA3ODAsICA3ODAsICA3ODAsCi0gICAgICA3ODAsICA3ODEsICA3ODEsICA3ODEsICA3ODEsICA3ODEsICA3ODEsICA3ODEsICA3ODEsICAyNTAsCi0gICAgICAyNDMsICAyNDIsICA3ODEsICAyMzksICAyMzgsICAyMzcsICAyMzYsICAyMzIsICA3ODEsICA3ODEsCi0gICAgICA3ODEsICA3ODEsICA3ODEsICA3ODEsICA3ODIsICA3ODIsICA3ODIsICA3ODIsICA3ODIsICA3ODIsCi0gICAgICA3ODIsICA3ODMsICA3ODMsICA3ODMsICA3ODMsICA3ODMsICA3ODMsICA3ODMsICA3ODMsICAyMzEsCi0gICAgICAyMjksICAyMjUsICA3ODMsICAyMjMsICA3ODMsICAyMTksICAyMTcsICAyMTUsICA3ODMsICA3ODMsCi0gICAgICA3ODMsICA3ODMsICA3ODMsICA3ODMsICA4MTksICA4MTksICA4MTksICA4MTksICA4MTksICA4MTksCisgICAgICA3NjMsICA3NjMsICA3NjMsICA3NjMsICA3NjMsICA3NjMsICA5NzAsICA0MTMsICA5ODMsICA3NjMsCisgICAgIDEzNjEsICA3NjMsICA5NzEsICA5ODIsICA5ODYsICA3NjMsICA3NjMsICA3NjMsICA3NjMsICA3NjMsCisgICAgICA3NjMsICA5ODAsICA5ODAsICA5ODAsICA5ODAsICA5ODAsICA5ODAsICA5ODAsICA5ODYsIDEzNjEsCisgICAgICA0MTIsICA0MTAsICA0MDgsICA5ODcsICA5ODMsIDEwOTMsICA0MDcsICA3NjMsICA3NjksICA3NjksCisgICAgICA3NjksICA3NjksICA3NjksICA3NjksICA3NjksICA3NjksICA3NjksICA5ODcsICA0MDUsIDEwOTMsCisgICAgICA3NjksICA0MDQsICA3NjksICA0MDEsICA5ODYsIDEwOTQsICA3NjksICA3NjksICA3NjksICA3NjksCisgICAgICA3NjksICA3NjksICA5OTUsICA5OTUsICA5OTUsICA5OTUsICA5OTUsICA5OTUsICA5OTUsIDEwOTQsCisgICAgICA0MDAsICAzOTgsICAzOTYsICA5ODcsIDEwOTcsIDEwOTMsIDEwOTgsICAzOTUsICA3NjksICA3NzQsCisgICAgICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA3NzQsICA3NzQsIDEwOTcsICAzOTQsCisgICAgIDEwOTgsICA3NzQsICAzODksICAzODgsICAzODYsIDEwOTQsICAzODUsICA3NzQsICA3NzQsICA3NzQsCiAKLSAgICAgIDgxOSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwgIDgyMSwgIDIxNCwgIDIxMiwKLSAgICAgIDc4MywgIDgwMCwgIDgwMCwgIDgwMCwgIDgwMCwgIDgwMCwgIDgwMCwgIDgwMCwgIDgwMCwgIDIxMSwKLSAgICAgIDIxMCwgIDIwOSwgIDgwMCwgIDIwOCwgIDgwMCwgIDIwNywgIDIwNiwgIDIwNCwgIDgwMCwgIDgwMCwKLSAgICAgIDgwMCwgIDgwMCwgIDgwMCwgIDgwMCwgIDgyNywgIDgyNywgIDgyNywgIDgyNywgIDgyNywgIDgyNywKLSAgICAgIDgyNywgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDgyOSwgIDIwMiwgIDIwMCwKLSAgICAgIDgwMCwgIDgwMywgIDgwMywgIDgwMywgIDgwMywgIDgwMywgIDgwMywgIDgwMywgIDgwMywgIDE5OSwKLSAgICAgIDE5NywgIDE5NSwgIDgwMywgIDE5NCwgIDgwMywgIDE5MiwgIDE4OSwgIDE4OCwgIDgwMywgIDgwMywKLSAgICAgIDgwMywgIDgwMywgIDgwMywgIDgwMywgIDgzMSwgIDgzMSwgIDgzMSwgIDgzMSwgIDgzMSwgIDgzMSwKLSAgICAgIDgzMSwgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDgzMywgIDg2MSwgIDE4NywKLSAgICAgIDgwMywgIDgwNiwgIDgwNiwgIDgwNiwgIDgwNiwgIDgwNiwgIDgwNiwgIDgwNiwgIDgwNiwgIDE4NSwKKyAgICAgIDc3NCwgIDc3NCwgIDc3NCwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwKKyAgICAgIDc3NiwgIDc3NiwgIDM4NCwgIDM4MywgMTA5NywgIDc3NiwgMTA5OCwgIDc3NiwgIDM4MSwgIDM3NiwKKyAgICAgIDM3NSwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwgIDc3NiwgIDk5NywgIDk5NywgIDk5NywKKyAgICAgIDk5NywgIDk5NywgIDk5NywgIDk5NywgMTAwMSwgMTAwMSwgMTAwMSwgMTAwMSwgMTAwMSwgMTAwMSwKKyAgICAgMTAwMSwgMTE0MCwgIDM3NCwgIDc3NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwKKyAgICAgIDc4NiwgIDc4NiwgIDc4NiwgIDM3MSwgIDM2NywgMTE0MCwgIDc4NiwgIDM2NSwgIDM2MCwgIDM1OSwKKyAgICAgIDM1NiwgMTAxMywgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4NiwgIDc4OCwgIDc4OCwKKyAgICAgIDc4OCwgIDc4OCwgIDc4OCwgIDc4OCwgIDc4OCwgIDc4OCwgIDc4OCwgMTAwNiwgMTAwNywgMTAxMywKKyAgICAgIDc4OCwgMTE0MCwgIDc4OCwgIDM1MSwgIDM1MCwgIDM0MiwgIDc4OCwgIDc4OCwgIDc4OCwgIDc4OCwKKyAgICAgIDc4OCwgIDc4OCwgIDM0MCwgMTAxMywgIDMzOSwgMTAwNiwgMTAwNywgMTA0MCwgMTA0MCwgMTA0MCwKIAotICAgICAgMTgzLCAgODYxLCAgODA2LCAgMTgyLCAgODA2LCAgMTc5LCAgMTc4LCAgMTc2LCAgODA2LCAgODA2LAotICAgICAgODA2LCAgODA2LCAgODA2LCAgODA2LCAgODM5LCAgODM5LCAgODM5LCAgODM5LCAgODM5LCAgODM5LAotICAgICAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODYxLCAgMTc1LCAgMTc0LAotICAgICAgODA2LCAgODA5LCAgODA5LCAgODA5LCAgODA5LCAgODA5LCAgODA5LCAgODA5LCAgODA5LCAgMTczLAotICAgICAgMTcyLCAgMTcxLCAgODA5LCAgMTcwLCAgODA5LCAgMTY5LCAgMTY3LCAgMTY1LCAgODA5LCAgODA5LAotICAgICAgODA5LCAgODA5LCAgODA5LCAgODA5LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LAotICAgICAgODQ0LCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgODQ2LCAgMTY0LCAgOTY1LAotICAgICAgODA5LCAgODE0LCAgODE0LCAgODE0LCAgODE0LCAgODE0LCAgODE0LCAgODE0LCAgMTYwLCAgMTU5LAotICAgICAgMTU4LCAgODE0LCAgOTY1LCAgMTU3LCAgMTU2LCAgMTU0LCAgMTUxLCAgODE0LCAgODE0LCAgODE0LAotICAgICAgODE0LCAgODE0LCAgODE0LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LAorICAgICAxMDQwLCAxMDQwLCAxMDQwLCAxMDQwLCAxMTQxLCAgMzM0LCAxMDA2LCAxMDA3LCAgNzg4LCAgODAxLAorICAgICAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAgODAxLCAxMTQxLCAgMzMyLAorICAgICAgMzMwLCAgODAxLCAgMzI5LCAgMzI4LCAgMzI3LCAgMzI2LCAgMzI1LCAgODAxLCAgODAxLCAgODAxLAorICAgICAgODAxLCAgODAxLCAgODAxLCAgODAzLCAgODAzLCAgODAzLCAgODAzLCAgODAzLCAgODAzLCAgODAzLAorICAgICAgODAzLCAgODAzLCAxMDA4LCAxMTQ2LCAxMTQxLCAgODAzLCAgMzI0LCAgODAzLCAgMzIyLCAgMzIxLAorICAgICAxNDA4LCAgODAzLCAgODAzLCAgODAzLCAgODAzLCAgODAzLCAgODAzLCAxMTQ2LCAgMzIwLCAgMzE1LAorICAgICAxMDA4LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxMDQ1LCAxNDA4LCAgMzEyLAorICAgICAxMTQ3LCAxMDA4LCAgMzExLCAgODAzLCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LAorICAgICAgODE1LCAgODE1LCAgODE1LCAxMTQ2LCAxMTQ3LCAgMzEwLCAgODE1LCAxNDA4LCAgMzA3LCAgMzAwLAorICAgICAgMjk5LCAxMTUwLCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE1LCAgODE2LCAgODE2LAogCi0gICAgICA4MTUsICAxNTAsICAxNDksICAxNDYsICA4MTUsICAxNDQsICA4MTUsICAxMzcsICA5NjUsICAxMzYsCi0gICAgICA4MTUsICA4MTUsICA4MTUsICA4MTUsICA4MTUsICA4MTUsICA4NDgsICA4NDgsICA4NDgsICA4NDgsCi0gICAgICA4NDgsICA4NDgsICA4NDgsICA4NTUsICA4NTUsICA4NTUsICA4NTUsICA4NTUsICA4NTUsICA5NjksCi0gICAgICAxMzUsICAxMzQsICA4MTUsICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjAsCi0gICAgICA4MjAsICAxMzMsICA5NjksICAxMzIsICA4MjAsICAxMzAsICAxMjksICAxMjgsICAxMjYsICAxMjQsCi0gICAgICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjAsICA4MjIsICA4MjIsICA4MjIsICA4MjIsCi0gICAgICA4MjIsICA4MjIsICA4MjIsICA4MjIsICAxMjIsICAxMjEsICAxMjAsICA4MjIsICA5NjksICA4MjIsCi0gICAgICAxMTksICAxMTcsICAxMTYsICA4MjIsICA4MjIsICA4MjIsICA4MjIsICA4MjIsICA4MjIsICA4NTgsCi0gICAgICA4NTgsICA4NTgsICA4NTgsICA4NTgsICA4NTgsICA4NTgsICA4NjAsICA4NjAsICA4NjAsICA4NjAsCi0gICAgICA4NjAsICA4NjAsICA4NjAsICAxMTUsICAxMTQsICA4MjIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsCisgICAgICA4MTYsICA4MTYsICA4MTYsICA4MTYsICA4MTYsIDExNTAsICAyOTcsICAyOTYsICAyOTQsICA4MTYsCisgICAgIDExNDcsICAyOTIsICAyOTEsICAyOTAsICAyODgsICA4MTYsICA4MTYsICA4MTYsICA4MTYsICA4MTYsCisgICAgICA4MTYsICA4MzIsIDExNTEsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsCisgICAgICAyODQsIDExNTAsICAyODMsICAyODEsICA4MzIsICAyNzgsIDExNTEsICAyNzQsICAyNzMsICA4MzIsCisgICAgICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzIsICA4MzMsICA4MzMsICA4MzMsICA4MzMsCisgICAgICA4MzMsICA4MzMsICA4MzMsICAyNzAsICAyNjksICAyNjcsICAyNjIsICA4MzMsICAyNTksICAyNTcsCisgICAgICAyNTYsICAyNTQsIDExNTEsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzMsICA4MzQsCisgICAgICA4MzQsICA4MzQsICA4MzQsICA4MzQsICA4MzQsICA4MzQsICA4MzQsICAyNTEsICAyNDcsICAyNDMsCisgICAgICAyNDEsICA4MzQsICAyMzksICA4MzQsICAyMzgsICAyMzYsICAyMzUsICA4MzQsICA4MzQsICA4MzQsCisgICAgICA4MzQsICA4MzQsICA4MzQsIDEwNDksIDEwNDksIDEwNDksIDEwNDksIDEwNDksIDEwNDksIDEwNDksCiAKLSAgICAgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDExMywgIDExMiwgIDExMCwgIDgzMiwgIDEwOCwgIDEwNywKLSAgICAgIDEwNiwgIDEwNSwgIDEwNCwgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDgzMiwgIDgzNCwKLSAgICAgIDgzNCwgIDgzNCwgIDgzNCwgIDgzNCwgIDgzNCwgIDgzNCwgIDgzNCwgIDEwMywgIDEwMiwgIDEwMSwKLSAgICAgIDgzNCwgIDEwMCwgIDgzNCwgICA5OCwgICA5NywgICA5MCwgIDgzNCwgIDgzNCwgIDgzNCwgIDgzNCwKLSAgICAgIDgzNCwgIDgzNCwgIDg2MiwgIDg2MiwgIDg2MiwgIDg2MiwgIDg2MiwgIDg2MiwgIDg2MiwgIDg2NCwKLSAgICAgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgICA4OSwgICA4OCwgIDgzNCwgIDg0NywKLSAgICAgIDg0NywgIDg0NywgIDg0NywgIDg0NywgIDg0NywgIDg0NywgIDg0NywgICA4NiwgICA4NSwgICA4NCwKLSAgICAgIDg0NywgICA4MywgICA4MiwgICA4MSwgICA3OSwgICA3NywgIDg0NywgIDg0NywgIDg0NywgIDg0NywKLSAgICAgIDg0NywgIDg0NywgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwgIDg0OSwKLSAgICAgICA3NiwgICA3NCwgICA3MywgIDg0OSwgICA3MiwgIDg0OSwgICA3MSwgICA3MCwgICA2OCwgIDg0OSwKKyAgICAgMTA1NCwgMTA1NCwgMTA1NCwgMTA1NCwgMTA1NCwgMTA1NCwgMTA1NCwgIDIzNCwgMTE1OSwgIDgzNCwKKyAgICAgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNiwgIDIzMywgIDIzMiwgIDIzMSwKKyAgICAgIDIzMCwgIDgzNiwgMTE1OSwgIDIyOCwgIDIyNiwgIDIyNCwgIDIyMywgIDgzNiwgIDgzNiwgIDgzNiwKKyAgICAgIDgzNiwgIDgzNiwgIDgzNiwgIDgzNywgIDgzNywgIDgzNywgIDgzNywgIDgzNywgIDgzNywgIDgzNywKKyAgICAgIDgzNywgIDIyMSwgIDIxOSwgIDIxOCwgIDIxNiwgIDgzNywgIDIxMywgIDIxMiwgMTE1OSwgIDIxMSwKKyAgICAgIDIwOSwgIDgzNywgIDgzNywgIDgzNywgIDgzNywgIDgzNywgIDgzNywgIDgzOCwgIDgzOCwgIDgzOCwKKyAgICAgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDgzOCwgIDg0MCwgIDg0MCwgIDg0MCwgIDg0MCwgIDg0MCwKKyAgICAgIDg0MCwgIDg0MCwgIDIwNywgIDIwNiwgIDIwMywgIDIwMiwgIDg0MCwgIDIwMCwgIDE5OSwgIDE5OCwKKyAgICAgIDE5NywgIDE5NiwgIDg0MCwgIDg0MCwgIDg0MCwgIDg0MCwgIDg0MCwgIDg0MCwgIDg0MSwgIDg0MSwKKyAgICAgIDg0MSwgIDg0MSwgIDg0MSwgIDg0MSwgIDg0MSwgIDg0MSwgIDg0MSwgIDE5NSwgIDE5NCwgIDE5MywKIAotICAgICAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODQ5LCAgODcwLCAgODcwLCAgODcwLCAgODcwLCAgODcwLAotICAgICAgODcwLCAgODcyLCAgODcyLCAgODcyLCAgODcyLCAgODcyLCAgODcyLCAgIDY3LCAxMDExLCAgIDY2LAotICAgICAgIDUxLCAgODQ5LCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLAotICAgICAgIDQzLCAxMDExLCAgIDQyLCAgODYzLCAgIDQwLCAgIDMwLCAgIDE4LCAgIDEwLCAgICA4LCAgODYzLAotICAgICAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODYzLCAgODY1LCAgODY1LCAgODY1LCAgODY1LCAgODY1LAotICAgICAgODY1LCAgODY1LCAgODY1LCAgICAzLCAgICAwLCAgICAwLCAgODY1LCAxMDExLCAgODY1LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgODY1LCAgODY1LCAgODY1LCAgODY1LCAgODY1LCAgODY1LCAgODc2LCAgODc2LAotICAgICAgODc2LCAgODc2LCAgODc2LCAgODc2LCAgODc5LCAgODc5LCAgODc5LCAgODc5LCAgODc5LCAgODc5LAotICAgICAgODc5LCAxMDE3LCAxMDIxLCAgICAwLCAgODY1LCAgODc3LCAgODc3LCAgODc3LCAgODc3LCAgODc3LAotICAgICAgODc3LCAgODc3LCAgODc3LCAgICAwLCAxMDE3LCAxMDIxLCAgODc3LCAgICAwLCAgICAwLCAgODg1LAorICAgICAgODQxLCAgMTkyLCAgMTkxLCAgMTkwLCAgMTg5LCAxMTYwLCAgODQxLCAgODQxLCAgODQxLCAgODQxLAorICAgICAgODQxLCAgODQxLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAxMTYwLAorICAgICAgMTg4LCAgMTg3LCAgMTg2LCAgODQyLCAgMTg1LCAgMTg0LCAgMTgyLCAgMTgxLCAgMTc4LCAgODQyLAorICAgICAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQyLCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LAorICAgICAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgMTc3LCAxMTYwLCAgMTc2LCAgODQ0LCAgMTc1LCAgMTc0LAorICAgICAgMTczLCAgMTcyLCAxMTYzLCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ0LCAgODQ1LAorICAgICAgODQ1LCAgODQ1LCAgODQ1LCAgODQ1LCAgODQ1LCAgODQ1LCAxMTYzLCAgMTcxLCAgMTY5LCAgMTY2LAorICAgICAgODQ1LCAgMTY1LCAgMTY0LCAgMTYzLCAgMTYwLCAgMTU4LCAgODQ1LCAgODQ1LCAgODQ1LCAgODQ1LAorICAgICAgODQ1LCAgODQ1LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LCAgODQ3LAorICAgICAgODQ3LCAgMTQ5LCAxMTYzLCAgMTQ4LCAgODQ3LCAgMTQ3LCAgMTQ2LCAgMTQ1LCAgMTQ0LCAxMTY0LAogCi0gICAgICAgIDAsICAgIDAsICA4NzcsICA4NzcsICA4NzcsICA4NzcsICA4NzcsICA4NzcsICA4NzgsICA4NzgsCi0gICAgICA4NzgsICA4NzgsICA4NzgsICA4NzgsICA4ODIsICA4ODMsICA4ODUsICA4ODgsICA4NzgsICAgIDAsCi0gICAgIDEwMTcsIDEwMjEsICAgIDAsICAgIDAsICA4NzgsICA4NzgsICA4NzgsICA4NzgsICA4NzgsICA4NzgsCi0gICAgICA4ODUsICA4ODIsICA4ODMsICAgIDAsICA4ODgsICA4OTcsICA4OTcsICA4OTcsICA4OTcsICA4OTcsCi0gICAgICA4OTcsICA4OTcsICA4ODIsICA4ODMsIDEwMzAsIDEwMzQsICAgIDAsICA5ODYsICA4ODgsICA4OTQsCi0gICAgICA4OTQsICA4OTQsICA4OTQsICA4OTQsICA4OTQsICAgIDAsICAgIDAsIDEwMzAsIDEwMzQsICA4OTQsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA5ODYsICA4OTQsICA4OTQsICA4OTQsICA4OTQsICA4OTQsCi0gICAgICA4OTQsICA4OTUsICA4OTUsICA4OTUsICA4OTUsICA4OTUsICA4OTUsICA4OTUsICA4OTUsICA5ODYsCi0gICAgICAgIDAsICAgIDAsICA4OTUsIDEwMzAsIDEwMzQsICAgIDAsICAgIDAsIDEwNDQsICA4OTUsICA4OTUsCi0gICAgICA4OTUsICA4OTUsICA4OTUsICA4OTUsICA4OTYsICA4OTYsICA4OTYsICA4OTYsICA4OTYsICA4OTYsCisgICAgICA4NDcsICA4NDcsICA4NDcsICA4NDcsICA4NDcsICA4NDcsICA4NDgsICA4NDgsICA4NDgsICA4NDgsCisgICAgICA4NDgsICA4NDgsICA4NDgsIDExNjQsICAxNDMsICAxNDEsICAxMzksICA4NDgsICAxMzgsICAxMzYsCisgICAgICAxMzQsICAxMzIsICAxMzEsICA4NDgsICA4NDgsICA4NDgsICA4NDgsICA4NDgsICA4NDgsICA4NTIsCisgICAgICA4NTIsICA4NTIsICA4NTIsICA4NTIsICA4NTIsICA4NTIsICA4NTIsICAxMzAsICAxMjksIDExNjQsCisgICAgICA4NTIsICAxMjcsICAxMjYsICAxMjUsICAxMjQsICAxMjMsICA4NTIsICA4NTIsICA4NTIsICA4NTIsCisgICAgICA4NTIsICA4NTIsICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTQsCisgICAgICA4NTQsICAxMjIsICAxMjAsICAxMTgsICA4NTQsICAxMTcsICAxMTYsICAxMTUsICAxMTQsICAxMTMsCisgICAgICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTQsICA4NTUsICA4NTUsICA4NTUsICA4NTUsCisgICAgICA4NTUsICA4NTUsICA4NTUsICA4NTUsICAxMTIsICAxMTEsICAxMTAsICA4NTUsICAxMDgsICAxMDcsCisgICAgICAxMDAsICAgOTksICAgOTgsICA4NTUsICA4NTUsICA4NTUsICA4NTUsICA4NTUsICA4NTUsICA4NjMsCiAKLSAgICAgMTA0NCwgICAgMCwgICAgMCwgICAgMCwgIDg5NiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgIDg5NiwgIDg5NiwgIDg5NiwgIDg5NiwgIDg5NiwgIDg5NiwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwKLSAgICAgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgICAgMCwgICAgMCwgMTA0NCwgIDg5OCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OCwgIDg5OSwKLSAgICAgIDg5OSwgIDg5OSwgIDg5OSwgIDg5OSwgIDg5OSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDg5OSwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDg5OSwgIDg5OSwgIDg5OSwgIDg5OSwgIDg5OSwKLSAgICAgIDg5OSwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMCwgIDkwMSwgIDkwMSwKLSAgICAgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgICAgMCwgICAgMCwgICAgMCwgIDkwMSwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwgIDkwMSwKLSAgICAgIDkwMSwgIDkwMiwgIDkwMiwgIDkwMiwgIDkwMiwgIDkwMiwgIDkwMiwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDg2MywgIDg2MywgICA5NiwgICA5NSwKKyAgICAgICA5MiwgIDg2MywgICA5MSwgICA5MCwgICA4OSwgICA4OCwgICA4NywgIDg2MywgIDg2MywgIDg2MywKKyAgICAgIDg2MywgIDg2MywgIDg2MywgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwKKyAgICAgIDg2NCwgICA4NiwgICA4NSwgICA4NCwgIDg2NCwgICA4MiwgICA4MSwgICA4MCwgICA3OSwgICA3OCwKKyAgICAgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg2NCwgIDg3NCwgIDg3NCwgIDg3NCwgIDg3NCwKKyAgICAgIDg3NCwgIDg3NCwgIDg3NCwgIDg3NCwgIDg3NCwgICA3NywgICA3NiwgICA3NSwgIDg3NCwgICA3NCwKKyAgICAgICA3MywgICA3MiwgICA3MSwgICA3MCwgIDg3NCwgIDg3NCwgIDg3NCwgIDg3NCwgIDg3NCwgIDg3NCwKKyAgICAgIDg3NSwgIDg3NSwgIDg3NSwgIDg3NSwgIDg3NSwgIDg3NSwgIDg3NSwgIDg3NSwgICA2OSwgICA2NywKKyAgICAgICA2NiwgIDg3NSwgICA2NSwgICA1MSwgICA0MywgICA0MiwgICA0MCwgIDg3NSwgIDg3NSwgIDg3NSwKKyAgICAgIDg3NSwgIDg3NSwgIDg3NSwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwgIDg4NiwKIAotICAgICAgICAwLCAgOTAyLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgOTAyLCAgOTAyLCAgOTAyLAotICAgICAgOTAyLCAgOTAyLCAgOTAyLCAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLCAgOTAzLAotICAgICAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgOTA0LCAgICAwLCAgICAwLAotICAgICAgICAwLCAgOTA0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgOTA0LCAgOTA0LCAgOTA0LAotICAgICAgOTA0LCAgOTA0LCAgOTA0LCAgOTA1LCAgOTA1LCAgOTA1LCAgOTA1LCAgOTA1LCAgOTA1LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgOTA1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgOTA1LAotICAgICAgOTA1LCAgOTA1LCAgOTA1LCAgOTA1LCAgOTA1LCAgOTA2LCAgOTA2LCAgOTA2LCAgOTA2LCAgOTA2LAotICAgICAgOTA2LCAgOTA2LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LAotICAgICAgICAwLCAgICAwLCAgICAwLCAgOTA4LCAgICAwLCAgOTA4LCAgICAwLCAgICAwLCAgICAwLCAgOTA4LAotICAgICAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTA4LCAgOTEyLCAgOTEyLCAgOTEyLCAgOTEyLCAgOTEyLAorICAgICAgODg2LCAgODg2LCAgIDE4LCAgIDEwLCAgICA4LCAgODg2LCAgICAzLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgODg2LCAgODg2LCAgODg2LCAgODg2LCAgODg2LCAgODg2LCAgODg3LCAgODg3LCAgODg3LAorICAgICAgODg3LCAgODg3LCAgODg3LCAgODg3LCAgODg3LCAgICAwLCAgICAwLCAgICAwLCAgODg3LCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgODg3LCAgODg3LCAgODg3LCAgODg3LCAgODg3LCAgODg3LAorICAgICAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgOTAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgOTAwLCAgOTAwLAorICAgICAgOTAwLCAgOTAwLCAgOTAwLCAgOTAwLCAgOTAyLCAgOTAyLCAgOTAyLCAgOTAyLCAgOTAyLCAgOTAyLAorICAgICAgOTAyLCAgOTAyLCAgOTAyLCAgICAwLCAgICAwLCAgICAwLCAgOTAyLCAgICAwLCAgOTAyLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgOTAyLCAgOTAyLCAgOTAyLCAgOTAyLCAgOTAyLCAgOTAyLCAxMDU2LCAxMDU2LAorICAgICAxMDU2LCAxMDU2LCAxMDU2LCAxMDU2LCAxMDU2LCAxMDYwLCAxMDYwLCAxMDYwLCAxMDYwLCAxMDYwLAogCi0gICAgICA5MTIsICA5MTUsICA5MTUsICA5MTUsICA5MTUsICA5MTUsICA5MTUsICA5MTUsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICA5MDgsICA5MTMsICA5MTMsICA5MTMsICA5MTMsICA5MTMsICA5MTMsICA5MTMsICA5MTMsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICA5MTMsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA5MTMsCi0gICAgICA5MTMsICA5MTMsICA5MTMsICA5MTMsICA5MTMsICA5MTcsICA5MTcsICA5MTcsICA5MTcsICA5MTcsCi0gICAgICA5MTcsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjIsICA5MjIsICA5MjIsCi0gICAgICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICAgIDAsICAgIDAsICAgIDAsICA5MjIsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjIsICA5MjIsCi0gICAgICA5MjQsICA5MjQsICA5MjQsICA5MjQsICA5MjQsICA5MjQsICA5MjQsICA5MjYsICA5MjYsICA5MjYsCi0gICAgICA5MjYsICA5MjYsICA5MjYsICA5MjgsICA5MjgsICA5MjgsICA5MjgsICA5MjgsICA5MjgsICA5MzIsCi0gICAgICA5MzIsICA5MzIsICA5MzIsICA5MzIsICA5MzIsICA5MzMsICA5MzMsICA5MzMsICA5MzMsICA5MzMsCisgICAgIDEwNjAsIDEwNjAsICAgIDAsICAgIDAsICA5MDIsICA5MTksICA5MTksICA5MTksICA5MTksICA5MTksCisgICAgICA5MTksICA5MTksICA5MTksICA5MTksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA5MTksICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICA5MTksICA5MTksICA5MTksICA5MTksICA5MTksICA5MTksICA5MTksCisgICAgICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjAsICA5MjEsICA5MjEsCisgICAgICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsICA5MjEsIDEwNjYsIDEwNjYsIDEwNjYsCisgICAgIDEwNjYsIDEwNjYsIDEwNjYsIDEwNjYsICAgIDAsICAgIDAsICA5MjEsICA5MjUsICA5MjUsICA5MjUsCisgICAgICA5MjUsICA5MjUsICA5MjUsICA5MjUsICA5MjUsICA5MjUsICAgIDAsICAgIDAsICAgIDAsICA5MjUsCisgICAgICAgIDAsICA5MjUsICAgIDAsICAgIDAsICAgIDAsICA5MjUsICA5MjUsICA5MjUsICA5MjUsICA5MjUsCisgICAgICA5MjUsIDEwNjgsIDEwNjgsIDEwNjgsIDEwNjgsIDEwNjgsIDEwNjgsIDEwNjgsIDEwNzIsIDEwNzIsCisgICAgIDEwNzIsIDEwNzIsIDEwNzIsIDEwNzIsIDEwNzIsICAgIDAsICAgIDAsICA5MjUsICA5MjgsICA5MjgsCiAKLSAgICAgIDkzMywgIDkzMywgIDkzMywgICAgMCwgICAgMCwgICAgMCwgIDkzMywgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgIDkzMywgIDkzMywgIDkzMywgIDkzMywgIDkzMywgIDkzMywgIDkzNSwgIDkzNSwKLSAgICAgIDkzNSwgIDkzNSwgIDkzNSwgIDkzNSwgIDkzNSwgIDkzOCwgIDkzOCwgIDkzOCwgIDkzOCwgIDkzOCwKLSAgICAgIDkzOCwgIDk0MCwgIDk0MCwgIDk0MCwgIDk0MCwgIDk0MCwgIDk0MCwgIDk0NCwgIDk0NCwgIDk0NCwKLSAgICAgIDk0NCwgIDk0NCwgIDk0NCwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwKLSAgICAgIDk0NSwgICAgMCwgICAgMCwgICAgMCwgIDk0NSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NSwgIDk0NywgIDk0NywgIDk0NywgIDk0NywKLSAgICAgIDk0NywgIDk0NywgIDk0NywgIDk1MCwgIDk1MCwgIDk1MCwgIDk1MCwgIDk1MCwgIDk1MCwgIDk1MiwKLSAgICAgIDk1MiwgIDk1MiwgIDk1MiwgIDk1MiwgIDk1MiwgIDk1NiwgIDk1NiwgIDk1NiwgIDk1NiwgIDk1NiwKLSAgICAgIDk1NiwgIDk1NywgIDk1NywgIDk1NywgIDk1NywgIDk1NywgIDk1NywgIDk1NywgIDk1NywgICAgMCwKKyAgICAgIDkyOCwgIDkyOCwgIDkyOCwgIDkyOCwgIDkyOCwgIDkyOCwgIDkyOCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgIDkyOCwgICAgMCwgIDkyOCwgICAgMCwgICAgMCwgICAgMCwgIDkyOCwgIDkyOCwgIDkyOCwgIDkyOCwKKyAgICAgIDkyOCwgIDkyOCwgMTA3OCwgMTA3OCwgMTA3OCwgMTA3OCwgMTA3OCwgMTA3OCwgMTA3OCwgMTA4MCwKKyAgICAgMTA4MCwgMTA4MCwgMTA4MCwgMTA4MCwgMTA4MCwgMTA4MCwgICAgMCwgICAgMCwgIDkyOCwgIDkzMSwKKyAgICAgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgIDkzMSwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgIDkzMSwgICAgMCwgIDkzMSwgICAgMCwgICAgMCwgICAgMCwgIDkzMSwgIDkzMSwgIDkzMSwKKyAgICAgIDkzMSwgIDkzMSwgIDkzMSwgMTA4NCwgMTA4NCwgMTA4NCwgMTA4NCwgMTA4NCwgMTA4NCwgMTA4NCwKKyAgICAgMTA5MSwgMTA5MSwgMTA5MSwgMTA5MSwgMTA5MSwgMTA5MSwgMTA5MSwgMTExMSwgICAgMCwgIDkzMSwKKyAgICAgIDkzNCwgIDkzNCwgIDkzNCwgIDkzNCwgIDkzNCwgIDkzNCwgIDkzNCwgIDkzNCwgIDkzNCwgICAgMCwKKyAgICAgMTE3MywgMTE3NCwgIDkzNCwgICAgMCwgIDkzNCwgMTExMSwgICAgMCwgICAgMCwgIDkzNCwgIDkzNCwKIAotICAgICAgICAwLCAgICAwLCAgOTU3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgOTU3LCAgOTU3LAorICAgICAgOTM0LCAgOTM0LCAgOTM0LCAgOTM0LCAxMTczLCAxMTc0LCAxMTExLCAxMTM0LCAxMTM0LCAxMTM0LAorICAgICAxMTM0LCAxMTM0LCAxMTM0LCAxMTM0LCAgICAwLCAxMTc3LCAgICAwLCAgICAwLCAgICAwLCAxMTc4LAorICAgICAgOTM0LCAgOTM5LCAgOTM5LCAgOTM5LCAgOTM5LCAgOTM5LCAgOTM5LCAgOTM5LCAgOTM5LCAxMTc3LAorICAgICAxMTczLCAxMTc0LCAgOTM5LCAxMTc4LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgOTM5LCAgOTM5LAorICAgICAgOTM5LCAgOTM5LCAgOTM5LCAgOTM5LCAgOTQwLCAgOTQwLCAgOTQwLCAgOTQwLCAgOTQwLCAgOTQwLAorICAgICAgOTQwLCAgOTQwLCAgOTQwLCAgICAwLCAgICAwLCAxMTc3LCAgOTQwLCAgICAwLCAgOTQwLCAxMTc4LAorICAgICAgICAwLCAgICAwLCAgOTQwLCAgOTQwLCAgOTQwLCAgOTQwLCAgOTQwLCAgOTQwLCAxMTU3LCAxMTU3LAorICAgICAxMTU3LCAxMTU3LCAxMTU3LCAxMTU3LCAxMTU3LCAxMTcxLCAxMTcxLCAxMTcxLCAxMTcxLCAxMTcxLAorICAgICAxMTcxLCAxMTcxLCAxMTg3LCAgICAwLCAgOTQwLCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LAorICAgICAgOTQ1LCAgOTQ1LCAgOTQ1LCAgOTQ1LCAgICAwLCAgICAwLCAxMTg3LCAgOTQ1LCAgICAwLCAgICAwLAorCisgICAgICAgIDAsICAgIDAsICAgIDAsICA5NDUsICA5NDUsICA5NDUsICA5NDUsICA5NDUsICA5NDUsICA5NDcsCisgICAgICA5NDcsICA5NDcsICA5NDcsICA5NDcsICA5NDcsICA5NDcsICA5NDcsICA5NDcsICAgIDAsICAgIDAsCisgICAgICAgIDAsICA5NDcsIDExODcsICA5NDcsICAgIDAsICAgIDAsIDExODgsICA5NDcsICA5NDcsICA5NDcsCisgICAgICA5NDcsICA5NDcsICA5NDcsIDExODUsIDExODUsIDExODUsIDExODUsIDExODUsIDExODUsIDExODUsCisgICAgIDExODgsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDExOTEsICAgIDAsIDExOTIsICAgIDAsICA5NDcsCisgICAgICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTcsIDExOTEsCisgICAgICAgIDAsIDExOTIsICA5NTcsICAgIDAsICAgIDAsICAgIDAsIDExODgsICAgIDAsICA5NTcsICA5NTcsCiAgICAgICA5NTcsICA5NTcsICA5NTcsICA5NTcsICA5NTksICA5NTksICA5NTksICA5NTksICA5NTksICA5NTksCi0gICAgICA5NTksICA5NjMsICA5NjMsICA5NjMsICA5NjMsICA5NjMsICA5NjMsICA5NjYsICA5NjYsICA5NjYsCi0gICAgICA5NjYsICA5NjYsICA5NjYsICA5NjYsICA5NjgsICA5NjgsICA5NjgsICA5NjgsICA5NjgsICA5NjgsCi0gICAgICA5NjgsICA5NzAsICA5NzAsICA5NzAsICA5NzAsICA5NzAsICA5NzAsICA5NzAsICA5NzEsICA5NzEsCi0gICAgICA5NzEsICA5NzEsICA5NzEsICA5NzEsICA5NzEsICA5NzEsICAgIDAsICAgIDAsICAgIDAsICA5NzEsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICA5NzEsICA5NzEsICA5NzEsICA5NzEsICA5NzEsCi0gICAgICA5NzEsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzIsICA5NzMsICA5NzMsCi0gICAgICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5ODMsICAgIDAsIDEwNDgsICA5NzMsCi0gICAgICAgIDAsICA5NzMsICAgIDAsICAgIDAsICAgIDAsICA5NzMsICA5NzMsICA5NzMsICA5NzMsICA5NzMsCisgICAgICA5NTksICA5NTksICA5NTksICAgIDAsICAgIDAsIDExOTEsICA5NTksIDExOTIsICA5NTksICAgIDAsCisgICAgICAgIDAsICAgIDAsICA5NTksICA5NTksICA5NTksICA5NTksICA5NTksICA5NTksIDExOTgsIDExOTgsCiAKLSAgICAgIDk3MywgMTA0OCwgICAgMCwgIDk4MywgMTAwNSwgMTAwNSwgMTAwNSwgMTAwNSwgMTAwNSwgMTAwNSwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgMTA1OCwgIDk4MywgICAgMCwgMTA2MiwgIDk3MywgIDk4OCwgIDk4OCwKLSAgICAgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgICAgMCwgMTA1OCwgMTA0OCwgIDk4OCwgMTA2MiwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwKLSAgICAgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgIDk4OSwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgIDk4OSwgMTA1OCwgIDk4OSwgICAgMCwgMTA2MiwgICAgMCwgIDk4OSwgIDk4OSwgIDk4OSwKLSAgICAgIDk4OSwgIDk4OSwgIDk4OSwgMTAwOCwgMTAwOCwgMTAwOCwgMTAwOCwgMTAwOCwgMTAwOCwgMTAwOCwKLSAgICAgMTAxMiwgMTAxMiwgMTAxMiwgMTAxMiwgMTAxMiwgMTAxMiwgMTAxMiwgICAgMCwgICAgMCwgIDk4OSwKLSAgICAgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgIDk5MiwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgIDk5MiwgICAgMCwgIDk5MiwgICAgMCwgICAgMCwgICAgMCwgIDk5MiwgIDk5MiwgIDk5MiwKKyAgICAgMTE5OCwgMTE5OCwgMTE5OCwgMTE5OCwgMTE5OCwgMTIwMCwgMTIwMCwgMTIwMCwgMTIwMCwgMTIwMCwKKyAgICAgMTIwMCwgMTIwMCwgMTIzNiwgICAgMCwgIDk1OSwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwKKyAgICAgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwgICAgMCwgICAgMCwgMTIzNiwgIDk3MiwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3MiwgIDk3NCwKKyAgICAgIDk3NCwgIDk3NCwgIDk3NCwgIDk3NCwgIDk3NCwgIDk3NCwgIDk3NCwgIDk3NCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgIDk3NCwgMTIzNiwgIDk3NCwgICAgMCwgICAgMCwgMTIzNywgIDk3NCwgIDk3NCwgIDk3NCwKKyAgICAgIDk3NCwgIDk3NCwgIDk3NCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwKKyAgICAgMTIzNywgMTI0NCwgMTI0NCwgMTI0NCwgMTI0NCwgMTI0NCwgMTI0NCwgMTI0NCwgICAgMCwgIDk3NCwKKyAgICAgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgIDk4OCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgIDk4OCwgICAgMCwgICAgMCwgICAgMCwgMTIzNywgMTIxNSwgIDk4OCwgIDk4OCwKIAotICAgICAgOTkyLCAgOTkyLCAgOTkyLCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LCAxMDE0LAotICAgICAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAgICAwLCAgICAwLCAgOTkyLAotICAgICAgOTk1LCAgOTk1LCAgOTk1LCAgOTk1LCAgOTk1LCAgOTk1LCAgOTk1LCAgOTk1LCAgICAwLCAgICAwLAotICAgICAgICAwLCAgOTk1LCAgICAwLCAgOTk1LCAgICAwLCAgICAwLCAgICAwLCAgOTk1LCAgOTk1LCAgOTk1LAotICAgICAgOTk1LCAgOTk1LCAgOTk1LCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLCAxMDIwLAotICAgICAxMDIyLCAxMDIyLCAxMDIyLCAxMDIyLCAxMDIyLCAxMDIyLCAxMDIyLCAxMTA3LCAgICAwLCAgOTk1LAotICAgICAgOTk4LCAgOTk4LCAgOTk4LCAgOTk4LCAgOTk4LCAgOTk4LCAgOTk4LCAgOTk4LCAgICAwLCAgICAwLAotICAgICAxMTA3LCAgOTk4LCAgICAwLCAgOTk4LCAgICAwLCAgICAwLCAgICAwLCAgOTk4LCAgOTk4LCAgOTk4LAotICAgICAgOTk4LCAgOTk4LCAgOTk4LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0LAotICAgICAxMDI4LCAxMDI4LCAxMDI4LCAxMDI4LCAxMDI4LCAxMDI4LCAxMTA3LCAgICAwLCAgICAwLCAgOTk4LAorICAgICAgOTg4LCAgOTg4LCAgOTg4LCAgOTg4LCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLAorICAgICAgOTkwLCAgOTkwLCAgOTkwLCAxMjE2LCAgICAwLCAxMjE1LCAgOTkwLCAgICAwLCAgOTkwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAgOTkwLCAxMjE1LCAgICAwLAorICAgICAgICAwLCAxMjE2LCAxMjQ5LCAxMjQ5LCAxMjQ5LCAxMjQ5LCAxMjQ5LCAxMjQ5LCAxMjQ5LCAgICAwLAorICAgICAgICAwLCAxMjg0LCAxMjE2LCAgICAwLCAgOTkwLCAxMDAyLCAxMDAyLCAxMDAyLCAxMDAyLCAxMDAyLAorICAgICAxMDAyLCAxMDAyLCAxMDAyLCAxMDAyLCAgICAwLCAxMjg0LCAgICAwLCAxMDAyLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAxMjg1LCAxMDAyLCAxMDAyLCAxMDAyLCAxMDAyLCAxMDAyLCAxMDAyLCAxMDAzLAorICAgICAxMDAzLCAxMDAzLCAxMDAzLCAxMDAzLCAxMDAzLCAxMDAzLCAxMjg1LCAgICAwLCAgICAwLCAgICAwLAorICAgICAxMDAzLCAxMjg0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMDAzLCAxMDAzLCAxMDAzLCAxMDAzLAorICAgICAxMDAzLCAxMDAzLCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LCAxMDE4LAogCi0gICAgIDEwMDEsIDEwMDEsIDEwMDEsIDEwMDEsIDEwMDEsIDEwMDEsIDEwMDEsIDEwMDEsICAgIDAsICAgIDAsCi0gICAgICAgIDAsIDEwMDEsICAgIDAsIDEwMDEsICAgIDAsICAgIDAsICAgIDAsIDEwMDEsIDEwMDEsIDEwMDEsCi0gICAgIDEwMDEsIDEwMDEsIDEwMDEsIDEwMzEsIDEwMzEsIDEwMzEsIDEwMzEsIDEwMzEsIDEwMzEsIDEwMzEsCi0gICAgIDEwMzMsIDEwMzMsIDEwMzMsIDEwMzMsIDEwMzMsIDEwMzMsIDEwMzMsIDExNTUsICAgIDAsIDEwMDEsCi0gICAgIDEwMDYsIDEwMDYsIDEwMDYsIDEwMDYsIDEwMDYsIDEwMDYsIDEwMDYsIDEwMDYsICAgIDAsICAgIDAsCi0gICAgIDExNTUsIDEwMDYsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEwMDYsIDEwMDYsIDEwMDYsCi0gICAgIDEwMDYsIDEwMDYsIDEwMDYsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsCi0gICAgIDEwMTMsICAgIDAsICAgIDAsICAgIDAsIDEwMTMsICAgIDAsIDExNTUsICAgIDAsICAgIDAsICAgIDAsCi0gICAgIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMTMsIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsCi0gICAgIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsICAgIDAsICAgIDAsICAgIDAsIDEwMjMsICAgIDAsICAgIDAsCisgICAgIDEwMTgsICAgIDAsIDEyODUsICAgIDAsICAgIDAsIDEwMTgsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTgsIDEwMTksIDEwMTksIDEwMTksCisgICAgIDEwMTksIDEwMTksIDEwMTksIDEwMTksIDEwMTksIDEwMjAsIDEwMjAsIDEwMjAsIDEwMjAsIDEwMjAsCisgICAgIDEwMjAsIDEwMjAsIDEwMjAsIDEwMjAsIDEyNTEsIDEyNTEsIDEyNTEsIDEyNTEsIDEyNTEsIDEyNTEsCisgICAgIDEyNTEsICAgIDAsIDEyODgsIDEwMjAsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsCisgICAgIDEwMjIsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEwMjIsIDEyODgsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjIsIDEwMjMsIDEwMjMsIDEwMjMsCisgICAgIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsICAgIDAsICAgIDAsICAgIDAsIDEwMjMsCisgICAgICAgIDAsICAgIDAsIDEyODgsICAgIDAsIDEyODksIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsIDEwMjMsCisgICAgIDEwMjMsIDEwMjQsIDEwMjQsIDEwMjQsIDEwMjQsIDEwMjQsIDEwMjQsIDEwMjQsIDEyODksICAgIDAsCiAKLSAgICAgICAgMCwgICAgMCwgICAgMCwgMTAyMywgMTAyMywgMTAyMywgMTAyMywgMTAyMywgMTAyMywgMTAzNSwKLSAgICAgMTAzNSwgMTAzNSwgMTAzNSwgMTAzNSwgMTAzNSwgMTAzNSwgMTAzNiwgMTAzNiwgMTAzNiwgMTAzNiwKLSAgICAgMTAzNiwgMTAzNiwgMTAzNiwgMTAzNiwgICAgMCwgICAgMCwgICAgMCwgMTAzNiwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgMTAzNiwgMTAzNiwgMTAzNiwgMTAzNiwgMTAzNiwgMTAzNiwgMTAzNywKLSAgICAgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTAzNywgMTA0MiwgMTA0MiwgMTA0MiwgMTA0MiwKLSAgICAgMTA0MiwgMTA0MiwgMTA0NSwgMTA0NSwgMTA0NSwgMTA0NSwgMTA0NSwgMTA0NSwgMTA0NSwgMTA0NywKLSAgICAgMTA0NywgMTA0NywgMTA0NywgMTA0NywgMTA0NywgMTA0NywgMTA0OSwgMTA0OSwgMTA0OSwgMTA0OSwKLSAgICAgMTA0OSwgMTA0OSwgMTA0OSwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwKLSAgICAgMTA1MCwgICAgMCwgICAgMCwgICAgMCwgMTA1MCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MCwgMTA1MSwgMTA1MSwgMTA1MSwgMTA1MSwKKyAgICAgICAgMCwgICAgMCwgMTAyNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTAyNCwgMTAyNCwKKyAgICAgMTAyNCwgMTAyNCwgMTAyNCwgMTAyNCwgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNiwKKyAgICAgMTAyNiwgMTAyNiwgMTAyNiwgICAgMCwgMTI4OSwgICAgMCwgMTAyNiwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgMTMxMywgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNiwgMTAyNywgMTAyNywKKyAgICAgMTAyNywgMTAyNywgMTAyNywgMTAyNywgMTAyNywgMTMxMywgICAgMCwgICAgMCwgICAgMCwgMTAyNywKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTAyNywgMTAyNywgMTAyNywgMTAyNywgMTAyNywKKyAgICAgMTAyNywgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwKKyAgICAgICAgMCwgMTMxMywgICAgMCwgMTAyOSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTMxNCwgMTAyOSwKKyAgICAgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAyOSwgMTAzMCwgMTAzMCwgMTAzMCwgMTAzMCwgMTAzMCwKKyAgICAgMTAzMCwgMTAzMCwgMTMxNCwgICAgMCwgICAgMCwgICAgMCwgMTAzMCwgICAgMCwgICAgMCwgICAgMCwKIAotICAgICAxMDUxLCAxMDUxLCAxMDUxLCAxMDU2LCAxMDU2LCAxMDU2LCAxMDU2LCAxMDU2LCAxMDU2LCAxMDU5LAotICAgICAxMDU5LCAxMDU5LCAxMDU5LCAxMDU5LCAxMDU5LCAxMDU5LCAxMDYxLCAxMDYxLCAxMDYxLCAxMDYxLAotICAgICAxMDYxLCAxMDYxLCAxMDYxLCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLCAxMDYzLAotICAgICAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAxMDY0LCAgICAwLCAgICAwLAotICAgICAgICAwLCAxMDY0LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMDY0LCAxMDY0LCAxMDY0LAotICAgICAxMDY0LCAxMDY0LCAxMDY0LCAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LCAxMDY1LAotICAgICAxMDY5LCAxMDY5LCAxMDY5LCAxMDY5LCAxMDY5LCAxMDY5LCAxMDcxLCAxMDcxLCAxMDcxLCAxMDcxLAotICAgICAxMDcxLCAxMDcxLCAxMDc1LCAxMDc1LCAxMDc1LCAxMDc1LCAxMDc1LCAxMDc1LCAxMDc2LCAxMDc2LAotICAgICAxMDc2LCAxMDc2LCAxMDc2LCAxMDc2LCAxMDc2LCAxMDc2LCAgICAwLCAgICAwLCAgICAwLCAxMDc2LAotICAgICAgICAwLCAxMDg2LCAxMDg3LCAgICAwLCAgICAwLCAxMDc2LCAxMDc2LCAxMDc2LCAxMDc2LCAxMDc2LAorICAgICAgICAwLCAgICAwLCAxMDMwLCAxMDMwLCAxMDMwLCAxMDMwLCAxMDMwLCAxMDMwLCAxMDMyLCAxMDMyLAorICAgICAxMDMyLCAxMDMyLCAxMDMyLCAxMDMyLCAxMDMyLCAxMDMyLCAxMDMyLCAgICAwLCAxMzE0LCAgICAwLAorICAgICAxMDMyLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMzIxLCAxMDMyLCAxMDMyLCAxMDMyLCAxMDMyLAorICAgICAxMDMyLCAxMDMyLCAxMDMzLCAxMDMzLCAxMDMzLCAxMDMzLCAxMDMzLCAxMDMzLCAxMDMzLCAxMzIxLAorICAgICAgICAwLCAgICAwLCAgICAwLCAxMDMzLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMDMzLAorICAgICAxMDMzLCAxMDMzLCAxMDMzLCAxMDMzLCAxMDMzLCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LAorICAgICAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAgICAwLCAxMzIxLCAgICAwLCAxMDM2LCAgICAwLCAxMDM2LAorICAgICAgICAwLCAgICAwLCAgICAwLCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAxMDM2LCAxMjU3LAorICAgICAxMjU3LCAxMjU3LCAxMjU3LCAxMjU3LCAxMjU3LCAxMjU3LCAxMjU5LCAxMjU5LCAxMjU5LCAxMjU5LAorICAgICAxMjU5LCAxMjU5LCAxMjU5LCAxMzIyLCAgICAwLCAxMDM2LCAxMDQxLCAxMDQxLCAxMDQxLCAxMDQxLAogCi0gICAgIDEwNzYsIDEwNzgsIDEwNzgsIDEwNzgsIDEwNzgsIDEwNzgsIDEwNzgsIDEwNzgsIDEwODYsIDEwODcsCi0gICAgIDEwOTQsIDEwOTQsIDEwOTQsIDEwOTQsIDEwOTQsIDEwOTQsIDEwOTQsICAgIDAsICAgIDAsICAgIDAsCi0gICAgIDEwODcsIDEwODYsIDEwODgsIDEwODgsIDEwODgsIDEwODgsIDEwODgsIDEwODgsIDEwODgsIDEwODgsCi0gICAgICAgIDAsICAgIDAsICAgIDAsIDEwODgsICAgIDAsIDEwODgsICAgIDAsICAgIDAsICAgIDAsIDEwODgsCi0gICAgIDEwODgsIDEwODgsIDEwODgsIDEwODgsIDEwODgsIDEwOTcsIDEwOTcsIDEwOTcsIDEwOTcsIDEwOTcsCi0gICAgIDEwOTcsIDEwOTcsIDExMDAsIDExMDAsIDExMDAsIDExMDAsIDExMDAsIDExMDAsIDExMDAsIDExNTksCi0gICAgICAgIDAsIDEwODgsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsCi0gICAgICAgIDAsICAgIDAsIDExNTksIDEwOTIsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEwOTIsCi0gICAgIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTIsIDEwOTUsIDEwOTUsIDEwOTUsIDEwOTUsIDEwOTUsCi0gICAgIDEwOTUsIDEwOTUsIDEwOTUsICAgIDAsICAgIDAsICAgIDAsIDEwOTUsICAgIDAsIDExNTksICAgIDAsCisgICAgIDEwNDEsIDEwNDEsIDEwNDEsIDEwNDEsIDEwNDEsICAgIDAsICAgIDAsIDEzMjIsIDEwNDEsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEwNDEsIDEwNDEsIDEwNDEsIDEwNDEsIDEwNDEsIDEwNDEsCisgICAgIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsICAgIDAsCisgICAgICAgIDAsICAgIDAsIDEwNTAsIDEzMjIsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEwNTAsIDEwNTAsCisgICAgIDEwNTAsIDEwNTAsIDEwNTAsIDEwNTAsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNjEsCisgICAgIDEwNjEsIDEwNjEsIDEwNjEsICAgIDAsICAgIDAsICAgIDAsIDEwNjEsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNjEsIDEwNzMsIDEwNzMsCisgICAgIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsICAgIDAsICAgIDAsICAgIDAsCisgICAgIDEwNzMsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEwNzMsIDEwNzMsIDEwNzMsIDEwNzMsCisgICAgIDEwNzMsIDEwNzMsIDEwODUsIDEwODUsIDEwODUsIDEwODUsIDEwODUsIDEwODUsIDEwODUsIDEwODUsCiAKLSAgICAgICAgMCwgICAgMCwgMTA5NSwgMTA5NSwgMTA5NSwgMTA5NSwgMTA5NSwgMTA5NSwgMTA5OCwgMTA5OCwKLSAgICAgMTA5OCwgMTA5OCwgMTA5OCwgMTA5OCwgMTA5OCwgMTA5OCwgICAgMCwgICAgMCwgICAgMCwgMTA5OCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTA5OCwgMTA5OCwgMTA5OCwgMTA5OCwgMTA5OCwKLSAgICAgMTA5OCwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgMTEwMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTEwMSwgMTEwMSwKLSAgICAgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMywgMTEwMywgMTEwMywgMTEwMywgMTEwMywgMTEwMywKLSAgICAgMTEwMywgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgMTEwNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTEwNCwgMTEwNCwKLSAgICAgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNCwgMTEwNiwgMTEwNiwgMTEwNiwgMTEwNiwgMTEwNiwgMTEwNiwKLSAgICAgMTEwNiwgMTEwOCwgMTEwOCwgMTEwOCwgMTEwOCwgMTEwOCwgMTEwOCwgMTEwOCwgMTEwOSwgMTEwOSwKKyAgICAgMTA4NSwgICAgMCwgICAgMCwgICAgMCwgMTA4NSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgMTA4NSwgMTA4NSwgMTA4NSwgMTA4NSwgMTA4NSwgMTA4NSwgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwKKyAgICAgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwgICAgMCwgICAgMCwgICAgMCwgMTA5OSwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwgMTA5OSwKKyAgICAgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgMTEwMSwgICAgMCwgMTEwMSwgICAgMCwgICAgMCwgICAgMCwgMTEwMSwgMTEwMSwKKyAgICAgMTEwMSwgMTEwMSwgMTEwMSwgMTEwMSwgMTI2NSwgMTI2NSwgMTI2NSwgMTI2NSwgMTI2NSwgMTI2NSwKKyAgICAgMTI2NSwgMTI2NywgMTI2NywgMTI2NywgMTI2NywgMTI2NywgMTI2NywgMTI2NywgICAgMCwgICAgMCwKKyAgICAgMTEwMSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwgMTExNSwKKyAgICAgMTI3MywgMTI3MywgMTI3MywgMTI3MywgMTI3MywgMTI3MywgMTI3MywgICAgMCwgMTMzMCwgMTExNSwKIAotICAgICAxMTA5LCAxMTA5LCAxMTA5LCAxMTA5LCAxMTA5LCAxMTA5LCAgICAwLCAgICAwLCAgICAwLCAxMTA5LAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMTA5LCAxMTA5LCAxMTA5LCAxMTA5LCAxMTA5LAotICAgICAxMTA5LCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLCAxMTEwLCAxMTE1LCAxMTE1LAotICAgICAxMTE1LCAxMTE1LCAxMTE1LCAxMTE1LCAxMTIwLCAxMTIwLCAxMTIwLCAxMTIwLCAxMTIwLCAxMTIwLAotICAgICAxMTIyLCAxMTIyLCAxMTIyLCAxMTIyLCAxMTIyLCAxMTIyLCAxMTI4LCAxMTI4LCAxMTI4LCAxMTI4LAotICAgICAxMTI4LCAxMTI4LCAxMTMwLCAxMTMwLCAxMTMwLCAxMTMwLCAxMTMwLCAxMTMwLCAxMTM2LCAxMTM2LAotICAgICAxMTM2LCAxMTM2LCAxMTM2LCAxMTM2LCAxMTM4LCAxMTM4LCAxMTM4LCAxMTM4LCAxMTM4LCAxMTM4LAotICAgICAxMTQ0LCAxMTQ0LCAxMTQ0LCAxMTQ0LCAxMTQ0LCAxMTQ0LCAxMTQ2LCAxMTQ2LCAxMTQ2LCAxMTQ2LAotICAgICAxMTQ2LCAxMTQ2LCAxMTUzLCAxMTUzLCAxMTUzLCAxMTUzLCAxMTUzLCAxMTUzLCAxMTU2LCAxMTU2LAotICAgICAxMTU2LCAxMTU2LCAxMTU2LCAxMTU2LCAxMTU2LCAxMTU4LCAxMTU4LCAxMTU4LCAxMTU4LCAxMTU4LAorICAgICAxMTE3LCAxMTE3LCAxMTE3LCAxMTE3LCAxMTE3LCAxMTE3LCAxMTE3LCAxMTE3LCAgICAwLCAgICAwLAorICAgICAgICAwLCAxMTE3LCAxMzMwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMTE3LCAxMTE3LCAxMTE3LAorICAgICAxMTE3LCAxMTE3LCAxMTE3LCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LAorICAgICAxMTE4LCAxMTE4LCAgICAwLCAgICAwLCAgICAwLCAxMTE4LCAgICAwLCAxMTE4LCAxMzMwLCAgICAwLAorICAgICAgICAwLCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LCAxMTE4LCAxMjc1LCAxMjc1LCAxMjc1LAorICAgICAxMjc1LCAxMjc1LCAxMjc1LCAxMjc1LCAxMjgyLCAxMjgyLCAxMjgyLCAxMjgyLCAxMjgyLCAxMjgyLAorICAgICAxMjgyLCAgICAwLCAgICAwLCAxMTE4LCAxMTIxLCAxMTIxLCAxMTIxLCAxMTIxLCAxMTIxLCAxMTIxLAorICAgICAxMTIxLCAxMTIxLCAxMTIxLCAgICAwLCAgICAwLCAgICAwLCAxMTIxLCAgICAwLCAxMTIxLCAgICAwLAorICAgICAgICAwLCAgICAwLCAxMTIxLCAxMTIxLCAxMTIxLCAxMTIxLCAxMTIxLCAxMTIxLCAxMzA3LCAxMzA3LAorICAgICAxMzA3LCAxMzA3LCAxMzA3LCAxMzA3LCAxMzA3LCAxMzE5LCAxMzE5LCAxMzE5LCAxMzE5LCAxMzE5LAogCi0gICAgIDExNTgsIDExNTgsIDExNjAsIDExNjAsIDExNjAsIDExNjAsIDExNjAsIDExNjAsIDExNjAsIDExNjEsCi0gICAgIDExNjEsIDExNjEsIDExNjEsIDExNjEsIDExNjEsIDExNjEsIDExNjEsICAgIDAsICAgIDAsICAgIDAsCi0gICAgIDExNjEsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDExNjEsIDExNjEsIDExNjEsIDExNjEsCi0gICAgIDExNjEsIDExNjEsIDExNjIsIDExNjIsIDExNjIsIDExNjIsIDExNjIsIDExNjIsIDExNjIsIDExNjksCi0gICAgIDExNjksIDExNjksIDExNjksIDExNjksIDExNjksIDExNjksIDExNjksICAgIDAsICAgIDAsICAgIDAsCi0gICAgIDExNjksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDExNjksIDExNjksIDExNjksIDExNjksCi0gICAgIDExNjksIDExNjksIDExNzEsIDExNzEsIDExNzEsIDExNzEsIDExNzEsIDExNzEsIDExNzEsIDExNzgsCi0gICAgIDExNzgsIDExNzgsIDExNzgsIDExNzgsIDExNzgsIDExODQsIDExODUsIDExODUsIDExODUsIDExODUsCi0gICAgIDExODUsIDExODUsIDExODUsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDExODQsIDExODcsCi0gICAgIDExODcsIDExODcsIDExODcsIDExODcsIDExODcsIDExODcsIDExOTAsIDExOTAsIDExOTAsIDExOTAsCisgICAgIDEzMTksIDEzMTksIDEzMzEsICAgIDAsIDExMjEsIDExMjQsIDExMjQsIDExMjQsIDExMjQsIDExMjQsCisgICAgIDExMjQsIDExMjQsIDExMjQsIDExMjQsICAgIDAsICAgIDAsIDEzMzEsIDExMjQsICAgIDAsIDExMjQsCisgICAgICAgIDAsICAgIDAsIDEzMzksIDExMjQsIDExMjQsIDExMjQsIDExMjQsIDExMjQsIDExMjQsIDEzMjgsCisgICAgIDEzMjgsIDEzMjgsIDEzMjgsIDEzMjgsIDEzMjgsIDEzMjgsIDEzMzksICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsIDEzNDAsIDEzMzEsIDEzNDgsICAgIDAsIDExMjQsIDExMjcsIDExMjcsIDExMjcsIDExMjcsCisgICAgIDExMjcsIDExMjcsIDExMjcsIDExMjcsIDExMjcsIDEzNDAsICAgIDAsIDEzNDgsIDExMjcsICAgIDAsCisgICAgIDExMjcsICAgIDAsIDEzMzksIDEzNDksIDExMjcsIDExMjcsIDExMjcsIDExMjcsIDExMjcsIDExMjcsCisgICAgIDEzMzcsIDEzMzcsIDEzMzcsIDEzMzcsIDEzMzcsIDEzMzcsIDEzMzcsIDEzNDksICAgIDAsICAgIDAsCisgICAgICAgIDAsIDEzNDAsICAgIDAsIDEzNDgsICAgIDAsICAgIDAsIDExMjcsIDExMzAsIDExMzAsIDExMzAsCisgICAgIDExMzAsIDExMzAsIDExMzAsIDExMzAsIDExMzAsIDExMzAsICAgIDAsICAgIDAsICAgIDAsIDExMzAsCiAKLSAgICAgMTE5MCwgMTE5MCwgMTE5MiwgMTE5MywgMTE5MywgMTE5MywgMTE5MywgMTE5MywgMTE5MywgMTE5MywKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTE4NCwgMTE5MiwgMTE5NSwgMTE5NSwgMTE5NSwgMTE5NSwKLSAgICAgMTE5NSwgMTE5NSwgMTE5NSwgMTE5OSwgMTE5OSwgMTE5OSwgMTE5OSwgMTE5OSwgMTE5OSwgMTIwMSwKLSAgICAgMTIwMiwgMTIwMiwgMTIwMiwgMTIwMiwgMTIwMiwgMTIwMiwgMTIwMiwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgMTE5MiwgMTIwMSwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwgMTIwNCwKLSAgICAgMTIwOCwgMTIwOCwgMTIwOCwgMTIwOCwgMTIwOCwgMTIwOCwgMTIxMCwgMTIxMSwgMTIxMSwgMTIxMSwKLSAgICAgMTIxMSwgMTIxMSwgMTIxMSwgMTIxMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTIwMSwgMTIxMCwKLSAgICAgMTIxMywgMTIxMywgMTIxMywgMTIxMywgMTIxMywgMTIxMywgMTIxMywgMTIxNywgMTIxNywgMTIxNywKLSAgICAgMTIxNywgMTIxNywgMTIxNywgMTIxOSwgMTIyMCwgMTIyMCwgMTIyMCwgMTIyMCwgMTIyMCwgMTIyMCwKLSAgICAgMTIyMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTIxMCwgMTIxOSwgMTIyMiwgMTIyMiwgMTIyMiwKKyAgICAgICAgMCwgMTEzMCwgICAgMCwgMTM0OSwgICAgMCwgMTEzMCwgMTEzMCwgMTEzMCwgMTEzMCwgMTEzMCwKKyAgICAgMTEzMCwgMTM0NiwgMTM0NiwgMTM0NiwgMTM0NiwgMTM0NiwgMTM0NiwgMTM0NiwgMTM1NCwgMTM1NCwKKyAgICAgMTM1NCwgMTM1NCwgMTM1NCwgMTM1NCwgMTM1NCwgMTM3MywgICAgMCwgMTEzMCwgMTEzNSwgMTEzNSwKKyAgICAgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNSwgICAgMCwgICAgMCwgMTM3MywKKyAgICAgMTEzNSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTEzNSwgMTEzNSwgMTEzNSwgMTEzNSwKKyAgICAgMTEzNSwgMTEzNSwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwKKyAgICAgMTE0MiwgICAgMCwgICAgMCwgICAgMCwgMTE0MiwgMTM3MywgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE0MiwgMTE1MiwgMTE1MiwgMTE1MiwgMTE1MiwKKyAgICAgMTE1MiwgMTE1MiwgMTE1MiwgMTE1MiwgMTE1MiwgICAgMCwgICAgMCwgICAgMCwgMTE1MiwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTE1MiwgMTE1MiwgMTE1MiwgMTE1MiwgMTE1MiwgMTE1MiwKIAotICAgICAxMjIyLCAxMjIyLCAxMjIyLCAxMjIyLCAxMjI1LCAxMjI1LCAxMjI1LCAxMjI1LCAxMjI1LCAxMjI1LAotICAgICAxMjI3LCAxMjI3LCAxMjI3LCAxMjI3LCAxMjI3LCAxMjI3LCAxMjQ0LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAxMjE5LCAxMjUwLCAxMjUwLCAxMjUwLCAxMjUwLCAxMjUwLCAxMjUwLCAxMjQ0LAotICAgICAxMjQ1LCAxMjQ1LCAxMjQ1LCAxMjQ1LCAxMjQ1LCAxMjQ1LCAxMjQ1LCAxMjQ3LCAxMjQ3LCAxMjQ3LAotICAgICAxMjQ3LCAxMjQ3LCAxMjQ3LCAxMjQ3LCAxMjU0LCAxMjU0LCAxMjU0LCAxMjU0LCAxMjU0LCAxMjU0LAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMjQ0LCAxMjU4LCAxMjU4LCAxMjU4LCAxMjU4LAotICAgICAxMjU4LCAxMjU4LCAxMjYyLCAxMjYyLCAxMjYyLCAxMjYyLCAxMjYyLCAxMjYyLCAxMjY2LCAxMjY2LAotICAgICAxMjY2LCAxMjY2LCAxMjY2LCAxMjY2LCAxMjcxLCAxMjcxLCAxMjcxLCAxMjcxLCAxMjcxLCAxMjcxLAotICAgICAxMjczLCAxMjc0LCAxMjc0LCAxMjc0LCAxMjc0LCAxMjc0LCAxMjc0LCAxMjc0LCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAxMjczLCAxMjc2LCAxMjc2LCAxMjc2LCAxMjc2LCAxMjc2LCAxMjc2LAorICAgICAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAgICAwLAorICAgICAgICAwLCAgICAwLCAxMTY1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMTY1LCAxMTY1LAorICAgICAxMTY1LCAxMTY1LCAxMTY1LCAxMTY1LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LAorICAgICAxMTc5LCAxMTc5LCAxMTc5LCAgICAwLCAgICAwLCAgICAwLCAxMTc5LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTc5LCAxMTkzLCAxMTkzLAorICAgICAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLCAgICAwLCAgICAwLCAgICAwLAorICAgICAxMTkzLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxMTkzLCAxMTkzLCAxMTkzLCAxMTkzLAorICAgICAxMTkzLCAxMTkzLCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LAorICAgICAxMjA1LCAgICAwLCAgICAwLCAgICAwLCAxMjA1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjA1LCAxMjE3LCAxMjE3LCAxMjE3LCAxMjE3LAogCi0gICAgIDEyNzYsIDEyODIsIDEyODIsIDEyODIsIDEyODIsIDEyODIsIDEyODIsIDEyODUsIDEyODUsIDEyODUsCi0gICAgIDEyODUsIDEyODUsIDEyODUsIDEyODksIDEyODksIDEyODksIDEyODksIDEyODksIDEyODksIDEyNzMsCi0gICAgIDEyOTMsIDEyOTMsIDEyOTMsIDEyOTMsIDEyOTMsIDEyOTMsIDEyOTcsIDEyOTcsIDEyOTcsIDEyOTcsCi0gICAgIDEyOTcsIDEyOTcsIDEzMDEsIDEzMDEsIDEzMDEsIDEzMDEsIDEzMDEsIDEzMDEsIDEzMDQsIDEzMDQsCi0gICAgIDEzMDQsIDEzMDQsIDEzMDQsIDEzMDQsIDEzMDksIDEzMDksIDEzMDksIDEzMDksIDEzMDksIDEzMDksCi0gICAgIDEzMTgsIDEzMTgsIDEzMTgsIDEzMTgsIDEzMTgsIDEzMTgsIDEzMzAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsIDEzMzAsIDEzMzAsIDEzMzAsIDEzMzEsICAgIDAsIDEzMzEsIDEzMzEsIDEzMzEsIDEzMzEsCi0gICAgIDEzMzEsIDEzMzEsIDEzMzEsIDEzMzIsICAgIDAsIDEzMzIsIDEzMzMsIDEzMzMsIDEzMzMsIDEzMzQsCi0gICAgIDEzMzQsIDEzMzQsIDEzMzUsIDEzMzUsIDEzMzUsIDEzMzYsIDEzMzYsIDEzMzYsIDEzMzcsIDEzMzcsCi0gICAgIDEzMzcsIDEzMzgsIDEzMzgsIDEzMzgsIDEzMzksIDEzMzksIDEzMzksIDEzNDAsIDEzNDAsIDEzNDAsCisgICAgIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsICAgIDAsICAgIDAsICAgIDAsIDEyMTcsICAgIDAsCisgICAgIDEyMTcsICAgIDAsICAgIDAsIDEzNzQsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsIDEyMTcsCisgICAgIDEzNTYsIDEzNTYsIDEzNTYsIDEzNTYsIDEzNTYsIDEzNTYsIDEzNTYsIDEzNzQsIDEzNzksIDEzNzksCisgICAgIDEzNzksIDEzNzksIDEzNzksIDEzNzksIDEzNzksICAgIDAsIDEyMTcsIDEyMjEsIDEyMjEsIDEyMjEsCisgICAgIDEyMjEsIDEyMjEsIDEyMjEsIDEyMjEsIDEyMjEsIDEyMjEsICAgIDAsICAgIDAsICAgIDAsIDEyMjEsCisgICAgICAgIDAsICAgIDAsICAgIDAsIDEzNzQsICAgIDAsIDEyMjEsIDEyMjEsIDEyMjEsIDEyMjEsIDEyMjEsCisgICAgIDEyMjEsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsCisgICAgICAgIDAsICAgIDAsICAgIDAsIDEyMjQsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDEyMjQsCisgICAgIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjQsIDEyMjcsIDEyMjcsIDEyMjcsIDEyMjcsIDEyMjcsCisgICAgIDEyMjcsIDEyMjcsIDEyMjcsIDEyMjcsICAgIDAsICAgIDAsICAgIDAsIDEyMjcsICAgIDAsICAgIDAsCiAKLSAgICAgMTM0MSwgICAgMCwgMTM0MSwgMTM0MiwgMTM0MiwgMTM0MiwgMTM0MywgMTM0MywgMTM0MywgMTM0NCwKLSAgICAgMTM0NCwgMTM0NCwgMTM0NSwgICAgMCwgMTM0NSwgMTM0NiwgMTM0NiwgMTM0NiwgMTM0NywgMTM0NywKLSAgICAgICAgMCwgICAgMCwgMTM0NywgMTM0OCwgMTM0OCwgMTM0OCwgMTM0OSwgMTM0OSwgMTM0OSwgMTM1MCwKLSAgICAgMTM1MCwgMTM1MCwgMTM1MSwgMTM1MSwgMTM1MSwgMTM1MiwgMTM1MiwgMTM1MiwgMTM1MywgMTM1MywKLSAgICAgMTM1MywgMTM1NCwgMTM1NCwgICAgMCwgICAgMCwgMTM1NCwgMTM1NSwgMTM1NSwgMTM1NSwgMTM1NiwKLSAgICAgICAgMCwgMTM1NiwgMTM1NywgMTM1NywgMTM1NywgMTM1OCwgICAgMCwgMTM1OCwgMTM1OSwgMTM1OSwKLSAgICAgMTM1OSwgMTM2MCwgMTM2MCwgMTM2MCwgMTM2MSwgMTM2MSwgMTM2MSwgMTM2MiwgICAgMCwgMTM2MiwKLSAgICAgMTM2MywgICAgMCwgMTM2MywgMTM2NCwgMTM2NCwgMTM2NCwgMTM2NSwgICAgMCwgMTM2NSwgMTM2NiwKLSAgICAgMTM2NiwgICAgMCwgICAgMCwgMTM2NiwgMTM2NywgMTM2NywgICAgMCwgICAgMCwgMTM2NywgMTM2OCwKLSAgICAgMTM2OCwgMTM2OCwgMTM2OSwgMTM2OSwgMTM2OSwgMTM3MCwgMTM3MCwgMTM3MCwgMTM3MSwgMTM3MSwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgMTIyNywgMTIyNywgMTIyNywgMTIyNywgMTIyNywgMTIyNywgMTIzMCwKKyAgICAgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgMTIzMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTIzMCwgMTIzMCwgMTIzMCwKKyAgICAgMTIzMCwgMTIzMCwgMTIzMCwgMTIzMywgMTIzMywgMTIzMywgMTIzMywgMTIzMywgMTIzMywgMTIzMywKKyAgICAgMTIzMywgMTIzMywgICAgMCwgICAgMCwgICAgMCwgMTIzMywgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgMTIzMywgMTIzMywgMTIzMywgMTIzMywgMTIzMywgMTIzMywgMTIzOCwgMTIzOCwgMTIzOCwKKyAgICAgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgICAgMCwgICAgMCwgICAgMCwgMTIzOCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwgMTIzOCwKKyAgICAgMTIzOCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwgMTI5MCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgMTI5MCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgMTI5MCwKIAotICAgICAxMzcxLCAxMzcyLCAxMzcyLCAxMzcyLCAxMzczLCAxMzczLCAxMzczLCAxMzc0LCAxMzc0LCAxMzc0LAotICAgICAxMzc1LCAxMzc1LCAxMzc1LCAxMzc2LCAxMzc2LCAgICAwLCAgICAwLCAxMzc2LCAxMzc3LCAxMzc3LAotICAgICAxMzc3LCAxMzc4LCAxMzc4LCAgICAwLCAgICAwLCAxMzc4LCAxMzc5LCAxMzc5LCAgICAwLCAgICAwLAotICAgICAxMzc5LCAxMzgwLCAxMzgwLCAxMzgwLCAxMzgxLCAgICAwLCAxMzgxLCAxMzgyLCAgICAwLCAxMzgyLAotICAgICAxMzgzLCAxMzgzLCAxMzgzLCAxMzg0LCAgICAwLCAxMzg0LCAxMzg1LCAxMzg1LCAxMzg1LCAxMzg2LAotICAgICAxMzg2LCAxMzg2LCAxMzg3LCAxMzg3LCAxMzg3LCAxMzg4LCAgICAwLCAxMzg4LCAxMzg5LCAgICAwLAotICAgICAxMzg5LCAxMzkwLCAxMzkwLCAxMzkwLCAxMzkxLCAgICAwLCAxMzkxLCAxMzkyLCAgICAwLCAxMzkyLAotICAgICAxMzkzLCAgICAwLCAxMzkzLCAxMzk0LCAxMzk0LCAxMzk0LCAxMzk1LCAgICAwLCAxMzk1LCAxMzk2LAotICAgICAgICAwLCAgICAwLCAxMzk2LCAxMzk3LCAxMzk3LCAgICAwLCAgICAwLCAxMzk3LCAxMzk4LCAxMzk4LAotICAgICAgICAwLCAxMzk4LCAxMzk5LCAxMzk5LCAgICAwLCAgICAwLCAxMzk5LCAxNDAwLCAxNDAwLCAxNDAwLAorICAgICAxMjkwLCAxMjkwLCAxMjkwLCAxMjkwLCAxMjkwLCAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LAorICAgICAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LCAgICAwLCAgICAwLCAgICAwLCAxMjk4LCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LCAxMjk4LCAxMzgzLAorICAgICAxMzgzLCAxMzgzLCAxMzgzLCAxMzgzLCAxMzgzLCAxMzgzLCAxMzg3LCAxMzg3LCAxMzg3LCAxMzg3LAorICAgICAxMzg3LCAxMzg3LCAxMzg3LCAxMzkxLCAxMzkxLCAxMzkxLCAxMzkxLCAxMzkxLCAxMzkxLCAxMzkxLAorICAgICAxMzk1LCAxMzk1LCAxMzk1LCAxMzk1LCAxMzk1LCAxMzk1LCAxMzk1LCAxNDAwLCAxNDAwLCAxNDAwLAorICAgICAxNDAwLCAxNDAwLCAxNDAwLCAxNDAwLCAxNDAyLCAxNDAzLCAxNDExLCAxNDExLCAxNDExLCAxNDExLAorICAgICAxNDExLCAxNDExLCAxNDExLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAxNDAyLCAxNDAzLAorICAgICAxNDE0LCAxNDE0LCAxNDE0LCAxNDE0LCAxNDE0LCAxNDE0LCAxNDE0LCAxNDE4LCAxNDE4LCAxNDE4LAorICAgICAxNDE4LCAxNDE4LCAxNDE4LCAxNDE4LCAxNDIyLCAxNDIyLCAxNDIyLCAxNDIyLCAxNDIyLCAxNDIyLAogCi0gICAgIDE0MDEsIDE0MDEsICAgIDAsIDE0MDEsIDE0MDIsIDE0MDIsIDE0MDIsICAgIDAsIDE0MDIsIDE0MDIsCi0gICAgIDE0MDMsIDE0MDMsIDE0MDMsIDE0MDQsIDE0MDQsIDE0MDQsIDE0MDUsIDE0MDUsIDE0MDUsIDE0MDYsCi0gICAgIDE0MDYsIDE0MDYsIDE0MDcsIDE0MDcsIDE0MDcsIDE0MDgsIDE0MDgsIDE0MDgsIDE0MDksIDE0MDksCi0gICAgIDE0MDksIDE0MTAsIDE0MTAsIDE0MTAsIDE0MTEsIDE0MTEsICAgIDAsICAgIDAsIDE0MTEsIDE0MTIsCi0gICAgIDE0MTIsIDE0MTIsIDE0MTMsIDE0MTMsICAgIDAsIDE0MTMsIDE0MTQsIDE0MTQsICAgIDAsICAgIDAsCi0gICAgIDE0MTQsIDE0MTUsIDE0MTUsICAgIDAsIDE0MTUsIDE0MTYsIDE0MTYsICAgIDAsICAgIDAsIDE0MTYsCi0gICAgIDE0MTcsIDE0MTcsIDE0MTcsIDE0MTgsIDE0MTgsICAgIDAsIDE0MTgsIDE0MTksICAgIDAsICAgIDAsCi0gICAgIDE0MTksIDE0MjAsIDE0MjAsICAgIDAsIDE0MjAsIDE0MjEsIDE0MjEsICAgIDAsICAgIDAsIDE0MjEsCi0gICAgIDE0MjIsIDE0MjIsICAgIDAsIDE0MjIsIDE0MjMsIDE0MjMsICAgIDAsICAgIDAsIDE0MjMsIDE0MjQsCi0gICAgIDE0MjQsIDE0MjQsIDE0MjUsIDE0MjUsICAgIDAsIDE0MjUsIDE0MjYsICAgIDAsIDE0MjYsIDE0MjcsCisgICAgIDE0MjIsICAgIDAsICAgIDAsICAgIDAsIDE0MDIsIDE0MDMsIDE0MjYsIDE0MjYsIDE0MjYsIDE0MjYsCisgICAgIDE0MjYsIDE0MjYsIDE0MjYsIDE0MzAsIDE0MzAsIDE0MzAsIDE0MzAsIDE0MzAsIDE0MzAsIDE0MzAsCisgICAgIDE0MzMsIDE0MzMsIDE0MzMsIDE0MzMsIDE0MzMsIDE0MzMsIDE0MzMsIDE0MzgsIDE0MzgsIDE0MzgsCisgICAgIDE0MzgsIDE0MzgsIDE0MzgsIDE0MzgsIDE0NDcsIDE0NDcsIDE0NDcsIDE0NDcsIDE0NDcsIDE0NDcsCisgICAgIDE0NDcsIDE0NTksICAgIDAsICAgIDAsICAgIDAsICAgIDAsIDE0NTksIDE0NTksIDE0NTksIDE0NjAsCisgICAgICAgIDAsIDE0NjAsIDE0NjAsIDE0NjAsIDE0NjAsIDE0NjAsIDE0NjAsIDE0NjAsIDE0NjEsICAgIDAsCisgICAgIDE0NjEsIDE0NjIsIDE0NjIsIDE0NjIsIDE0NjMsIDE0NjMsIDE0NjMsIDE0NjQsIDE0NjQsIDE0NjQsCisgICAgIDE0NjUsIDE0NjUsIDE0NjUsIDE0NjYsIDE0NjYsIDE0NjYsIDE0NjcsIDE0NjcsIDE0NjcsIDE0NjgsCisgICAgIDE0NjgsIDE0NjgsIDE0NjksIDE0NjksIDE0NjksIDE0NzAsIDE0NzAsIDE0NzAsIDE0NzEsICAgIDAsCisgICAgIDE0NzEsIDE0NzIsIDE0NzIsIDE0NzIsIDE0NzMsIDE0NzMsIDE0NzMsIDE0NzQsIDE0NzQsIDE0NzQsCiAKLSAgICAgICAgMCwgMTQyNywgMTQyOCwgICAgMCwgMTQyOCwgMTQyOSwgMTQyOSwgMTQyOSwgMTQzMCwgICAgMCwKLSAgICAgMTQzMCwgMTQzMSwgMTQzMSwgMTQzMSwgICAgMCwgMTQzMSwgMTQzMSwgMTQzMiwgMTQzMiwgMTQzMiwKLSAgICAgMTQzMywgMTQzMywgMTQzMywgMTQzNCwgMTQzNCwgMTQzNCwgMTQzNSwgICAgMCwgMTQzNSwgMTQzNiwKLSAgICAgICAgMCwgMTQzNiwgMTQzNywgMTQzNywgMTQzNywgMTQzOCwgICAgMCwgMTQzOCwgMTQzOSwgICAgMCwKLSAgICAgMTQzOSwgMTQ0MCwgICAgMCwgMTQ0MCwgMTQ0MSwgMTQ0MSwgMTQ0MSwgMTQ0MiwgICAgMCwgMTQ0MiwKLSAgICAgMTQ0MywgICAgMCwgMTQ0MywgMTQ0NCwgICAgMCwgMTQ0NCwgMTQ0NSwgICAgMCwgMTQ0NSwgMTQ0NiwKLSAgICAgMTQ0NiwgMTQ0NiwgMTQ0NywgICAgMCwgMTQ0NywgMTQ0OCwgICAgMCwgMTQ0OCwgMTQ0OSwgICAgMCwKLSAgICAgICAgMCwgMTQ0OSwgMTQ1MCwgMTQ1MCwgICAgMCwgMTQ1MCwgMTQ1MSwgMTQ1MSwgICAgMCwgICAgMCwKLSAgICAgMTQ1MSwgMTQ1MiwgMTQ1MiwgICAgMCwgMTQ1MiwgMTQ1MywgMTQ1MywgICAgMCwgICAgMCwgMTQ1MywKLSAgICAgMTQ1NCwgMTQ1NCwgMTQ1NCwgMTQ1NSwgMTQ1NSwgICAgMCwgMTQ1NSwgMTQ1NiwgMTQ1NiwgMTQ1NiwKKyAgICAgMTQ3NSwgMTQ3NSwgMTQ3NSwgMTQ3NiwgICAgMCwgMTQ3NiwgMTQ3NywgMTQ3NywgMTQ3NywgMTQ3OCwKKyAgICAgMTQ3OCwgICAgMCwgICAgMCwgMTQ3OCwgMTQ3OSwgMTQ3OSwgMTQ3OSwgMTQ4MCwgMTQ4MCwgMTQ4MCwKKyAgICAgMTQ4MSwgMTQ4MSwgMTQ4MSwgMTQ4MiwgMTQ4MiwgMTQ4MiwgMTQ4MywgMTQ4MywgMTQ4MywgMTQ4NCwKKyAgICAgMTQ4NCwgMTQ4NCwgMTQ4NSwgMTQ4NSwgMTQ4NSwgMTQ4NiwgMTQ4NiwgMTQ4NiwgMTQ4NywgMTQ4NywKKyAgICAgMTQ4NywgMTQ4OCwgMTQ4OCwgICAgMCwgICAgMCwgMTQ4OCwgMTQ4OSwgMTQ4OSwgMTQ4OSwgMTQ5MCwKKyAgICAgMTQ5MCwgMTQ5MCwgMTQ5MSwgICAgMCwgMTQ5MSwgMTQ5MiwgMTQ5MiwgMTQ5MiwgMTQ5MywgMTQ5MywKKyAgICAgMTQ5MywgMTQ5NCwgICAgMCwgMTQ5NCwgMTQ5NSwgMTQ5NSwgMTQ5NSwgMTQ5NiwgMTQ5NiwgMTQ5NiwKKyAgICAgMTQ5NywgMTQ5NywgMTQ5NywgMTQ5OCwgMTQ5OCwgMTQ5OCwgMTQ5OSwgMTQ5OSwgMTQ5OSwgMTUwMCwKKyAgICAgICAgMCwgMTUwMCwgMTUwMSwgICAgMCwgMTUwMSwgMTUwMiwgMTUwMiwgMTUwMiwgMTUwMywgMTUwMywKKyAgICAgMTUwMywgMTUwNCwgICAgMCwgMTUwNCwgMTUwNSwgMTUwNSwgICAgMCwgICAgMCwgMTUwNSwgMTUwNiwKIAotICAgICAgICAwLCAxNDU2LCAxNDU2LCAxNDU3LCAxNDU3LCAxNDU3LCAxNDU4LCAxNDU4LCAxNDU4LCAxNDU5LAotICAgICAxNDU5LCAxNDU5LCAxNDYwLCAxNDYwLCAxNDYwLCAxNDYxLCAxNDYxLCAxNDYxLCAxNDYyLCAxNDYyLAotICAgICAxNDYyLCAxNDYzLCAxNDYzLCAxNDYzLCAxNDY0LCAxNDY0LCAxNDY0LCAxNDY1LCAxNDY1LCAgICAwLAotICAgICAgICAwLCAxNDY1LCAxNDY2LCAxNDY2LCAxNDY2LCAxNDY3LCAxNDY3LCAgICAwLCAxNDY3LCAxNDY4LAotICAgICAxNDY4LCAgICAwLCAgICAwLCAxNDY4LCAxNDY5LCAxNDY5LCAgICAwLCAxNDY5LCAxNDcwLCAxNDcwLAotICAgICAgICAwLCAgICAwLCAxNDcwLCAxNDcxLCAxNDcxLCAxNDcxLCAxNDcyLCAxNDcyLCAgICAwLCAxNDcyLAotICAgICAxNDczLCAgICAwLCAgICAwLCAxNDczLCAxNDc0LCAxNDc0LCAgICAwLCAxNDc0LCAxNDc1LCAxNDc1LAotICAgICAgICAwLCAgICAwLCAxNDc1LCAxNDc2LCAxNDc2LCAgICAwLCAxNDc2LCAxNDc3LCAxNDc3LCAgICAwLAotICAgICAgICAwLCAxNDc3LCAxNDc4LCAxNDc4LCAxNDc4LCAxNDc5LCAxNDc5LCAgICAwLCAxNDc5LCAxNDgwLAotICAgICAgICAwLCAxNDgwLCAxNDgxLCAgICAwLCAgICAwLCAxNDgxLCAxNDgyLCAxNDgyLCAgICAwLCAxNDgyLAorICAgICAxNTA2LCAgICAwLCAgICAwLCAxNTA2LCAxNTA3LCAxNTA3LCAxNTA3LCAxNTA4LCAxNTA4LCAxNTA4LAorICAgICAxNTA5LCAxNTA5LCAgICAwLCAxNTA5LCAxNTEwLCAxNTEwLCAxNTEwLCAxNTExLCAxNTExLCAxNTExLAorICAgICAxNTEyLCAxNTEyLCAxNTEyLCAxNTEzLCAxNTEzLCAxNTEzLCAxNTE0LCAxNTE0LCAxNTE0LCAxNTE1LAorICAgICAxNTE1LCAxNTE1LCAxNTE2LCAxNTE2LCAxNTE2LCAxNTE3LCAxNTE3LCAgICAwLCAgICAwLCAxNTE3LAorICAgICAxNTE4LCAxNTE4LCAxNTE4LCAxNTE5LCAxNTE5LCAxNTE5LCAxNTIwLCAxNTIwLCAgICAwLCAxNTIwLAorICAgICAxNTIxLCAxNTIxLCAgICAwLCAgICAwLCAxNTIxLCAxNTIyLCAxNTIyLCAgICAwLCAxNTIyLCAxNTIzLAorICAgICAxNTIzLCAxNTI0LCAxNTI0LCAgICAwLCAgICAwLCAxNTI0LCAxNTI1LCAxNTI1LCAxNTI1LCAxNTI2LAorICAgICAxNTI2LCAxNTI2LCAxNTI3LCAxNTI3LCAgICAwLCAxNTI3LCAxNTI4LCAgICAwLCAxNTI4LCAxNTI5LAorICAgICAgICAwLCAxNTI5LCAxNTMwLCAxNTMwLCAxNTMwLCAxNTMxLCAxNTMxLCAxNTMxLCAxNTMyLCAgICAwLAorICAgICAxNTMyLCAxNTMzLCAxNTMzLCAxNTMzLCAxNTM0LCAxNTM0LCAxNTM0LCAxNTM1LCAxNTM1LCAxNTM1LAogCi0gICAgIDE0ODMsIDE0ODMsICAgIDAsICAgIDAsIDE0ODMsIDE0ODQsIDE0ODQsICAgIDAsIDE0ODQsIDE0ODUsCi0gICAgIDE0ODUsICAgIDAsICAgIDAsIDE0ODUsIDE0ODYsIDE0ODYsIDE0ODYsIDE0ODcsIDE0ODcsICAgIDAsCi0gICAgIDE0ODcsIDE0ODgsICAgIDAsIDE0ODgsIDE0ODksICAgIDAsIDE0ODksIDE0OTAsICAgIDAsIDE0OTAsCi0gICAgIDE0OTEsIDE0OTEsIDE0OTEsIDE0OTIsICAgIDAsIDE0OTIsIDE0OTMsIDE0OTMsIDE0OTMsICAgIDAsCi0gICAgIDE0OTMsIDE0OTMsIDE0OTQsIDE0OTQsIDE0OTQsIDE0OTUsIDE0OTUsIDE0OTUsIDE0OTYsIDE0OTYsCi0gICAgIDE0OTYsIDE0OTcsIDE0OTcsIDE0OTcsIDE0OTgsIDE0OTgsIDE0OTgsIDE0OTksICAgIDAsIDE0OTksCi0gICAgIDE1MDAsICAgIDAsIDE1MDAsIDE1MDEsIDE1MDEsIDE1MDEsIDE1MDIsIDE1MDIsIDE1MDIsIDE1MDMsCi0gICAgICAgIDAsIDE1MDMsIDE1MDQsICAgIDAsIDE1MDQsIDE1MDUsICAgIDAsIDE1MDUsIDE1MDYsIDE1MDYsCi0gICAgIDE1MDYsIDE1MDcsIDE1MDcsIDE1MDcsIDE1MDgsICAgIDAsIDE1MDgsIDE1MDksICAgIDAsIDE1MDksCi0gICAgIDE1MTAsICAgIDAsIDE1MTAsIDE1MTEsICAgIDAsIDE1MTEsIDE1MTIsIDE1MTIsIDE1MTIsIDE1MTMsCisgICAgIDE1MzYsIDE1MzYsIDE1MzYsIDE1MzcsIDE1MzcsIDE1MzcsIDE1MzgsIDE1MzgsIDE1MzgsIDE1MzksCisgICAgICAgIDAsIDE1MzksIDE1NDAsICAgIDAsIDE1NDAsIDE1NDEsIDE1NDEsIDE1NDEsIDE1NDIsIDE1NDIsCisgICAgIDE1NDIsIDE1NDMsICAgIDAsIDE1NDMsIDE1NDQsICAgIDAsIDE1NDQsIDE1NDUsICAgIDAsIDE1NDUsCisgICAgIDE1NDYsIDE1NDYsIDE1NDYsIDE1NDcsIDE1NDcsIDE1NDcsIDE1NDgsICAgIDAsIDE1NDgsIDE1NDksCisgICAgICAgIDAsICAgIDAsIDE1NDksIDE1NTAsIDE1NTAsICAgIDAsIDE1NTAsIDE1NTEsIDE1NTEsICAgIDAsCisgICAgICAgIDAsIDE1NTEsIDE1NTIsIDE1NTIsICAgIDAsIDE1NTIsIDE1NTMsIDE1NTMsIDE1NTQsIDE1NTQsCisgICAgICAgIDAsICAgIDAsIDE1NTQsIDE1NTUsIDE1NTUsIDE1NTUsIDE1NTYsIDE1NTYsIDE1NTYsIDE1NTcsCisgICAgIDE1NTcsICAgIDAsIDE1NTcsIDE1NTgsIDE1NTgsIDE1NTgsICAgIDAsIDE1NTgsIDE1NTgsIDE1NTksCisgICAgIDE1NTksIDE1NTksIDE1NjAsIDE1NjAsIDE1NjAsIDE1NjEsIDE1NjEsIDE1NjEsIDE1NjIsIDE1NjIsCisgICAgIDE1NjIsIDE1NjMsIDE1NjMsIDE1NjMsIDE1NjQsIDE1NjQsIDE1NjQsIDE1NjUsIDE1NjUsIDE1NjUsCiAKLSAgICAgMTUxMywgMTUxMywgMTUxNCwgICAgMCwgMTUxNCwgMTUxNSwgICAgMCwgMTUxNSwgMTUxNiwgICAgMCwKLSAgICAgMTUxNiwgMTUxNywgICAgMCwgMTUxNywgMTUxOCwgMTUxOCwgMTUxOCwgMTUxOSwgMTUxOSwgMTUxOSwKLSAgICAgMTUyMCwgICAgMCwgMTUyMCwgMTUyMSwgICAgMCwgMTUyMSwgMTUyMiwgICAgMCwgICAgMCwgMTUyMiwKLSAgICAgMTUyMywgMTUyMywgICAgMCwgMTUyMywgMTUyNCwgMTUyNCwgICAgMCwgICAgMCwgMTUyNCwgMTUyNSwKLSAgICAgMTUyNSwgICAgMCwgMTUyNSwgMTUyNiwgMTUyNiwgICAgMCwgICAgMCwgMTUyNiwgMTUyNywgMTUyNywKLSAgICAgMTUyNywgMTUyOCwgMTUyOCwgICAgMCwgMTUyOCwgMTUyOSwgMTUyOSwgMTUyOSwgICAgMCwgMTUyOSwKLSAgICAgMTUyOSwgMTUzMCwgMTUzMCwgMTUzMCwgMTUzMSwgMTUzMSwgMTUzMSwgMTUzMiwgMTUzMiwgMTUzMiwKLSAgICAgMTUzMywgMTUzMywgMTUzMywgMTUzNCwgMTUzNCwgMTUzNCwgMTUzNSwgMTUzNSwgMTUzNSwgMTUzNiwKLSAgICAgMTUzNiwgMTUzNiwgMTUzNywgICAgMCwgMTUzNywgMTUzOCwgMTUzOCwgMTUzOCwgMTUzOSwgMTUzOSwKLSAgICAgICAgMCwgICAgMCwgMTUzOSwgMTU0MCwgMTU0MCwgMTU0MCwgMTU0MSwgMTU0MSwgICAgMCwgMTU0MSwKKyAgICAgMTU2NiwgMTU2NiwgMTU2NiwgMTU2NywgMTU2NywgICAgMCwgICAgMCwgMTU2NywgMTU2OCwgMTU2OCwKKyAgICAgMTU2OCwgMTU2OSwgMTU2OSwgMTU2OSwgMTU3MCwgMTU3MCwgICAgMCwgMTU3MCwgMTU3MSwgMTU3MSwKKyAgICAgICAgMCwgICAgMCwgMTU3MSwgMTU3MiwgMTU3MiwgICAgMCwgMTU3MiwgMTU3MywgMTU3MywgMTU3NCwKKyAgICAgMTU3NCwgICAgMCwgICAgMCwgMTU3NCwgMTU3NSwgMTU3NSwgMTU3NSwgMTU3NiwgMTU3NiwgMTU3NiwKKyAgICAgMTU3NywgMTU3NywgICAgMCwgMTU3NywgMTU3OCwgICAgMCwgICAgMCwgMTU3OCwgMTU3OSwgMTU3OSwKKyAgICAgICAgMCwgMTU3OSwgMTU4MCwgMTU4MCwgICAgMCwgICAgMCwgMTU4MCwgMTU4MSwgMTU4MSwgICAgMCwKKyAgICAgMTU4MSwgMTU4MiwgMTU4MiwgMTU4MywgMTU4MywgICAgMCwgICAgMCwgMTU4MywgMTU4NCwgMTU4NCwKKyAgICAgMTU4NCwgMTU4NSwgMTU4NSwgMTU4NSwgMTU4NiwgMTU4NiwgICAgMCwgMTU4NiwgMTU4NywgICAgMCwKKyAgICAgMTU4NywgMTU4OCwgICAgMCwgMTU4OCwgMTU4OSwgICAgMCwgMTU4OSwgMTU5MCwgMTU5MCwgMTU5MCwKKyAgICAgMTU5MSwgMTU5MSwgMTU5MSwgMTU5MiwgICAgMCwgMTU5MiwgMTU5MywgMTU5MywgMTU5MywgICAgMCwKIAotICAgICAxNTQyLCAxNTQyLCAgICAwLCAgICAwLCAxNTQyLCAxNTQzLCAxNTQzLCAgICAwLCAxNTQzLCAxNTQ0LAotICAgICAxNTQ0LCAgICAwLCAgICAwLCAxNTQ0LCAxNTQ1LCAxNTQ1LCAxNTQ1LCAxNTQ2LCAxNTQ2LCAgICAwLAotICAgICAxNTQ2LCAxNTQ3LCAgICAwLCAgICAwLCAxNTQ3LCAxNTQ4LCAxNTQ4LCAgICAwLCAxNTQ4LCAxNTQ5LAotICAgICAxNTQ5LCAgICAwLCAgICAwLCAxNTQ5LCAxNTUwLCAxNTUwLCAgICAwLCAxNTUwLCAxNTUxLCAxNTUxLAotICAgICAgICAwLCAgICAwLCAxNTUxLCAxNTUyLCAxNTUyLCAxNTUyLCAxNTUzLCAxNTUzLCAgICAwLCAxNTUzLAotICAgICAxNTU0LCAgICAwLCAxNTU0LCAxNTU1LCAgICAwLCAgICAwLCAxNTU1LCAxNTU2LCAxNTU2LCAgICAwLAotICAgICAxNTU2LCAxNTU3LCAxNTU3LCAgICAwLCAgICAwLCAxNTU3LCAxNTU4LCAxNTU4LCAgICAwLCAxNTU4LAotICAgICAxNTU5LCAxNTU5LCAgICAwLCAgICAwLCAxNTU5LCAxNTYwLCAxNTYwLCAxNTYwLCAxNTYxLCAxNTYxLAotICAgICAgICAwLCAxNTYxLCAxNTYyLCAgICAwLCAxNTYyLCAxNTYzLCAgICAwLCAgICAwLCAxNTYzLCAxNTY0LAotICAgICAxNTY0LCAgICAwLCAxNTY0LCAxNTY1LCAxNTY1LCAgICAwLCAgICAwLCAxNTY1LCAxNTY2LCAxNTY2LAotCi0gICAgICAgIDAsIDE1NjYsIDE1NjcsIDE1NjcsICAgIDAsICAgIDAsIDE1NjcsIDE1NjgsIDE1NjgsIDE1NjgsCi0gICAgIDE1NjksIDE1NjksICAgIDAsIDE1NjksIDE1NzAsICAgIDAsIDE1NzAsIDE1NzEsICAgIDAsIDE1NzEsCi0gICAgIDE1NzIsICAgIDAsIDE1NzIsIDE1NzMsIDE1NzMsIDE1NzMsIDE1NzQsICAgIDAsIDE1NzQsIDE1NzUsCi0gICAgICAgIDAsIDE1NzUsIDE1NzYsIDE1NzYsIDE1NzYsICAgIDAsIDE1NzYsIDE1NzYsIDE1NzcsICAgIDAsCi0gICAgIDE1NzcsIDE1NzgsIDE1NzgsIDE1NzgsIDE1NzksICAgIDAsIDE1NzksIDE1ODAsICAgIDAsIDE1ODAsCi0gICAgIDE1ODEsICAgIDAsIDE1ODEsIDE1ODIsICAgIDAsIDE1ODIsIDE1ODMsICAgIDAsIDE1ODMsIDE1ODQsCi0gICAgIDE1ODQsICAgIDAsICAgIDAsIDE1ODQsIDE1ODUsIDE1ODUsIDE1ODUsIDE1ODYsIDE1ODYsIDE1ODYsCi0gICAgIDE1ODcsIDE1ODcsICAgIDAsIDE1ODcsIDE1ODgsIDE1ODgsIDE1ODgsIDE1ODksICAgIDAsIDE1ODksCi0gICAgIDE1OTAsIDE1OTAsIDE1OTAsIDE1OTEsIDE1OTEsIDE1OTEsIDE1OTIsICAgIDAsIDE1OTIsIDE1OTMsCi0gICAgICAgIDAsIDE1OTMsIDE1OTQsIDE1OTQsIDE1OTQsIDE1OTUsIDE1OTUsIDE1OTUsIDE1OTYsICAgIDAsCi0KLSAgICAgMTU5NiwgMTU5NywgICAgMCwgMTU5NywgMTU5OCwgICAgMCwgMTU5OCwgMTU5OSwgMTU5OSwgMTU5OSwKKyAgICAgMTU5MywgMTU5MywgMTU5NCwgMTU5NCwgMTU5NCwgMTU5NSwgMTU5NSwgMTU5NSwgMTU5NiwgMTU5NiwKKyAgICAgMTU5NiwgMTU5NywgMTU5NywgMTU5NywgMTU5OCwgMTU5OCwgMTU5OCwgMTU5OSwgMTU5OSwgMTU5OSwKICAgICAgMTYwMCwgMTYwMCwgMTYwMCwgMTYwMSwgICAgMCwgMTYwMSwgMTYwMiwgICAgMCwgMTYwMiwgMTYwMywKLSAgICAgICAgMCwgMTYwMywgMTYwNCwgMTYwNCwgMTYwNCwgMTYwNSwgMTYwNSwgMTYwNSwgMTYwNiwgICAgMCwKLSAgICAgMTYwNiwgMTYwNywgICAgMCwgMTYwNywgMTYwOCwgICAgMCwgMTYwOCwgMTYwOSwgMTYwOSwgMTYwOSwKLSAgICAgMTYxMCwgMTYxMCwgMTYxMCwgMTYxMSwgICAgMCwgMTYxMSwgMTYxMiwgICAgMCwgICAgMCwgMTYxMiwKLSAgICAgMTYxMywgMTYxMywgICAgMCwgMTYxMywgMTYxNCwgMTYxNCwgICAgMCwgICAgMCwgMTYxNCwgMTYxNSwKLSAgICAgMTYxNSwgICAgMCwgMTYxNSwgMTYxNiwgMTYxNiwgICAgMCwgICAgMCwgMTYxNiwgMTYxNywgICAgMCwKLSAgICAgMTYxNywgMTYxOCwgMTYxOCwgICAgMCwgMTYxOCwgMTYxOSwgMTYxOSwgMTYxOSwgICAgMCwgMTYxOSwKLSAgICAgMTYxOSwgMTYyMCwgMTYyMCwgMTYyMCwgMTYyMSwgICAgMCwgMTYyMSwgMTYyMiwgICAgMCwgMTYyMiwKLSAgICAgMTYyMywgICAgMCwgMTYyMywgMTYyNCwgICAgMCwgMTYyNCwgMTYyNSwgICAgMCwgMTYyNSwgMTYyNiwKKyAgICAgMTYwMywgMTYwMywgMTYwNCwgMTYwNCwgMTYwNCwgMTYwNSwgICAgMCwgMTYwNSwgMTYwNiwgICAgMCwKKyAgICAgMTYwNiwgMTYwNywgICAgMCwgMTYwNywgMTYwOCwgMTYwOCwgMTYwOCwgMTYwOSwgMTYwOSwgMTYwOSwKKyAgICAgMTYxMCwgICAgMCwgMTYxMCwgMTYxMSwgICAgMCwgMTYxMSwgMTYxMiwgICAgMCwgMTYxMiwgMTYxMywKKyAgICAgICAgMCwgMTYxMywgMTYxNCwgMTYxNCwgMTYxNCwgMTYxNSwgMTYxNSwgMTYxNSwgMTYxNiwgICAgMCwKKyAgICAgMTYxNiwgMTYxNywgICAgMCwgMTYxNywgMTYxOCwgICAgMCwgICAgMCwgMTYxOCwgMTYxOSwgMTYxOSwKKyAgICAgICAgMCwgMTYxOSwgMTYyMCwgMTYyMCwgICAgMCwgICAgMCwgMTYyMCwgMTYyMSwgMTYyMSwgICAgMCwKKyAgICAgMTYyMSwgMTYyMiwgMTYyMiwgMTYyMywgMTYyMywgICAgMCwgICAgMCwgMTYyMywgMTYyNCwgMTYyNCwKIAotICAgICAgICAwLCAxNjI2LCAxNjI3LCAgICAwLCAxNjI3LCAxNjI4LCAxNjI4LCAxNjI4LCAxNjI5LCAxNjI5LAotICAgICAxNjI5LCAxNjMwLCAgICAwLCAxNjMwLCAxNjMxLCAxNjMxLCAgICAwLCAgICAwLCAxNjMxLCAxNjMyLAotICAgICAxNjMyLCAgICAwLCAxNjMyLCAxNjMzLCAgICAwLCAxNjMzLCAxNjM0LCAgICAwLCAgICAwLCAxNjM0LAotICAgICAxNjM1LCAxNjM1LCAgICAwLCAxNjM1LCAxNjM2LCAxNjM2LCAgICAwLCAgICAwLCAxNjM2LCAxNjM3LAotICAgICAxNjM3LCAgICAwLCAxNjM3LCAxNjM4LCAgICAwLCAxNjM4LCAxNjM5LCAgICAwLCAxNjM5LCAxNjQwLAotICAgICAgICAwLCAgICAwLCAxNjQwLCAxNjQxLCAxNjQxLCAgICAwLCAxNjQxLCAxNjQyLCAxNjQyLCAgICAwLAotICAgICAgICAwLCAxNjQyLCAxNjQzLCAxNjQzLCAgICAwLCAxNjQzLCAxNjQ0LCAgICAwLCAxNjQ0LCAxNjQ1LAotICAgICAgICAwLCAxNjQ1LCAxNjQ2LCAgICAwLCAgICAwLCAxNjQ2LCAxNjQ3LCAxNjQ3LCAgICAwLCAxNjQ3LAotICAgICAxNjQ4LCAxNjQ4LCAgICAwLCAgICAwLCAxNjQ4LCAxNjQ5LCAxNjQ5LCAgICAwLCAxNjQ5LCAxNjUwLAotICAgICAgICAwLCAxNjUwLCAxNjUxLCAgICAwLCAxNjUxLCAxNjUyLCAgICAwLCAgICAwLCAxNjUyLCAxNjUzLAorICAgICAxNjI0LCAxNjI1LCAxNjI1LCAxNjI1LCAxNjI2LCAxNjI2LCAgICAwLCAxNjI2LCAxNjI3LCAxNjI3LAorICAgICAxNjI3LCAgICAwLCAxNjI3LCAxNjI3LCAxNjI4LCAxNjI4LCAxNjI4LCAxNjI5LCAxNjI5LCAxNjI5LAorICAgICAxNjMwLCAxNjMwLCAxNjMwLCAxNjMxLCAxNjMxLCAxNjMxLCAxNjMyLCAxNjMyLCAxNjMyLCAxNjMzLAorICAgICAxNjMzLCAxNjMzLCAxNjM0LCAxNjM0LCAxNjM0LCAxNjM1LCAxNjM1LCAxNjM1LCAxNjM2LCAxNjM2LAorICAgICAgICAwLCAgICAwLCAxNjM2LCAxNjM3LCAxNjM3LCAxNjM3LCAxNjM4LCAxNjM4LCAxNjM4LCAxNjM5LAorICAgICAxNjM5LCAgICAwLCAxNjM5LCAxNjQwLCAxNjQwLCAgICAwLCAgICAwLCAxNjQwLCAxNjQxLCAxNjQxLAorICAgICAgICAwLCAxNjQxLCAxNjQyLCAxNjQyLCAxNjQzLCAxNjQzLCAgICAwLCAgICAwLCAxNjQzLCAxNjQ0LAorICAgICAxNjQ0LCAxNjQ0LCAxNjQ1LCAxNjQ1LCAxNjQ1LCAxNjQ2LCAxNjQ2LCAgICAwLCAxNjQ2LCAxNjQ3LAorICAgICAgICAwLCAgICAwLCAxNjQ3LCAxNjQ4LCAxNjQ4LCAgICAwLCAxNjQ4LCAxNjQ5LCAxNjQ5LCAgICAwLAorICAgICAgICAwLCAxNjQ5LCAxNjUwLCAxNjUwLCAgICAwLCAxNjUwLCAxNjUxLCAxNjUxLCAxNjUyLCAxNjUyLAogCi0gICAgIDE2NTMsICAgIDAsIDE2NTMsIDE2NTQsIDE2NTQsICAgIDAsICAgIDAsIDE2NTQsIDE2NTUsIDE2NTUsCi0gICAgICAgIDAsIDE2NTUsIDE2NTYsICAgIDAsIDE2NTYsIDE2NTcsICAgIDAsIDE2NTcsIDE2NTgsICAgIDAsCi0gICAgIDE2NTgsIDE2NTksICAgIDAsIDE2NTksIDE2NjAsIDE2NjAsIDE2NjAsIDE2NjEsICAgIDAsIDE2NjEsCi0gICAgIDE2NjIsIDE2NjIsIDE2NjIsICAgIDAsIDE2NjIsIDE2NjIsIDE2NjMsICAgIDAsIDE2NjMsIDE2NjQsCi0gICAgICAgIDAsIDE2NjQsIDE2NjUsICAgIDAsIDE2NjUsIDE2NjYsICAgIDAsIDE2NjYsIDE2NjcsICAgIDAsCi0gICAgIDE2NjcsIDE2NjgsICAgIDAsIDE2NjgsIDE2NjksICAgIDAsIDE2NjksIDE2NzAsIDE2NzAsICAgIDAsCi0gICAgICAgIDAsIDE2NzAsIDE2NzEsIDE2NzEsICAgIDAsIDE2NzEsIDE2NzIsICAgIDAsIDE2NzIsIDE2NzMsCi0gICAgICAgIDAsIDE2NzMsIDE2NzQsICAgIDAsIDE2NzQsIDE2NzUsICAgIDAsIDE2NzUsIDE2NzYsICAgIDAsCi0gICAgIDE2NzYsIDE2NzcsICAgIDAsIDE2NzcsIDE2NzgsICAgIDAsIDE2NzgsIDE2NzksICAgIDAsIDE2NzksCi0gICAgIDE2ODAsICAgIDAsIDE2ODAsIDE2ODEsICAgIDAsIDE2ODEsIDE2ODIsICAgIDAsICAgIDAsIDE2ODIsCisgICAgICAgIDAsICAgIDAsIDE2NTIsIDE2NTMsIDE2NTMsIDE2NTMsIDE2NTQsIDE2NTQsIDE2NTQsIDE2NTUsCisgICAgIDE2NTUsICAgIDAsIDE2NTUsIDE2NTYsICAgIDAsIDE2NTYsIDE2NTcsICAgIDAsICAgIDAsIDE2NTcsCisgICAgIDE2NTgsIDE2NTgsICAgIDAsIDE2NTgsIDE2NTksIDE2NTksICAgIDAsICAgIDAsIDE2NTksIDE2NjAsCisgICAgIDE2NjAsICAgIDAsIDE2NjAsIDE2NjEsIDE2NjEsIDE2NjIsIDE2NjIsICAgIDAsICAgIDAsIDE2NjIsCisgICAgIDE2NjMsIDE2NjMsIDE2NjMsIDE2NjQsIDE2NjQsIDE2NjQsIDE2NjUsIDE2NjUsICAgIDAsIDE2NjUsCisgICAgIDE2NjYsICAgIDAsIDE2NjYsIDE2NjcsICAgIDAsIDE2NjcsIDE2NjgsICAgIDAsIDE2NjgsIDE2NjksCisgICAgIDE2NjksIDE2NjksIDE2NzAsIDE2NzAsIDE2NzAsIDE2NzEsICAgIDAsIDE2NzEsIDE2NzIsIDE2NzIsCisgICAgIDE2NzIsICAgIDAsIDE2NzIsIDE2NzIsIDE2NzMsIDE2NzMsIDE2NzMsIDE2NzQsIDE2NzQsIDE2NzQsCisgICAgIDE2NzUsIDE2NzUsIDE2NzUsIDE2NzYsIDE2NzYsIDE2NzYsIDE2NzcsIDE2NzcsIDE2NzcsIDE2NzgsCisgICAgIDE2NzgsIDE2NzgsIDE2NzksIDE2NzksIDE2NzksIDE2ODAsIDE2ODAsIDE2ODAsIDE2ODEsIDE2ODEsCiAKLSAgICAgMTY4MywgMTY4MywgICAgMCwgICAgMCwgMTY4MywgMTY4NCwgICAgMCwgMTY4NCwgMTY4NSwgICAgMCwKLSAgICAgMTY4NSwgMTY4NiwgICAgMCwgMTY4NiwgMTY4NywgICAgMCwgICAgMCwgMTY4NywgMTY4OCwgICAgMCwKLSAgICAgICAgMCwgMTY4OCwgMTY4OSwgICAgMCwgICAgMCwgMTY4OSwgMTY5MCwgICAgMCwgICAgMCwgMTY5MCwKLSAgICAgMTY5MSwgICAgMCwgICAgMCwgMTY5MSwgMTY5MiwgICAgMCwgMTY5MiwgMTY5MywgICAgMCwgMTY5MywKLSAgICAgMTY5NCwgICAgMCwgICAgMCwgMTY5NCwgMTY5NSwgICAgMCwgMTY5NSwgMTY5NiwgICAgMCwgMTY5NiwKLSAgICAgMTY5NywgICAgMCwgMTY5NywgMTY5OCwgICAgMCwgMTY5OCwgMTY5OSwgICAgMCwgMTY5OSwgMTcwMCwKLSAgICAgICAgMCwgICAgMCwgMTcwMCwgMTcwMSwgICAgMCwgMTcwMSwgMTcwMiwgICAgMCwgMTcwMiwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKLSAgICAgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwgMTMyOSwKKyAgICAgMTY4MSwgMTY4MiwgMTY4MiwgMTY4MiwgMTY4MywgICAgMCwgMTY4MywgMTY4NCwgICAgMCwgMTY4NCwKKyAgICAgMTY4NSwgMTY4NSwgMTY4NSwgMTY4NiwgMTY4NiwgMTY4NiwgMTY4NywgMTY4NywgMTY4NywgMTY4OCwKKyAgICAgICAgMCwgMTY4OCwgMTY4OSwgICAgMCwgMTY4OSwgMTY5MCwgICAgMCwgMTY5MCwgMTY5MSwgMTY5MSwKKyAgICAgMTY5MSwgMTY5MiwgMTY5MiwgMTY5MiwgMTY5MywgMTY5MywgMTY5MywgMTY5NCwgICAgMCwgMTY5NCwKKyAgICAgMTY5NSwgICAgMCwgMTY5NSwgMTY5NiwgICAgMCwgMTY5NiwgMTY5NywgICAgMCwgMTY5NywgMTY5OCwKKyAgICAgMTY5OCwgMTY5OCwgMTY5OSwgMTY5OSwgMTY5OSwgMTcwMCwgMTcwMCwgMTcwMCwgMTcwMSwgICAgMCwKKyAgICAgMTcwMSwgMTcwMiwgICAgMCwgMTcwMiwgMTcwMywgICAgMCwgMTcwMywgMTcwNCwgICAgMCwgMTcwNCwKKyAgICAgMTcwNSwgMTcwNSwgMTcwNSwgMTcwNiwgMTcwNiwgMTcwNiwgMTcwNywgMTcwNywgMTcwNywgMTcwOCwKKyAgICAgICAgMCwgMTcwOCwgMTcwOSwgICAgMCwgMTcwOSwgMTcxMCwgICAgMCwgICAgMCwgMTcxMCwgMTcxMSwKKyAgICAgMTcxMSwgICAgMCwgMTcxMSwgMTcxMiwgMTcxMiwgICAgMCwgICAgMCwgMTcxMiwgMTcxMywgMTcxMywKIAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LCAxMzI5LAotICAgICAxMzI5LCAxMzI5CisgICAgICAgIDAsIDE3MTMsIDE3MTQsIDE3MTQsIDE3MTUsIDE3MTUsICAgIDAsICAgIDAsIDE3MTUsIDE3MTYsCisgICAgIDE3MTYsIDE3MTYsIDE3MTcsIDE3MTcsIDE3MTcsIDE3MTgsIDE3MTgsICAgIDAsIDE3MTgsIDE3MTksCisgICAgIDE3MTksIDE3MTksICAgIDAsIDE3MTksIDE3MTksIDE3MjAsIDE3MjAsIDE3MjAsIDE3MjEsIDE3MjEsCisgICAgIDE3MjEsIDE3MjIsIDE3MjIsIDE3MjIsIDE3MjMsIDE3MjMsIDE3MjMsIDE3MjQsIDE3MjQsIDE3MjQsCisgICAgIDE3MjUsIDE3MjUsIDE3MjUsIDE3MjYsIDE3MjYsIDE3MjYsIDE3MjcsIDE3MjcsIDE3MjcsIDE3MjgsCisgICAgICAgIDAsIDE3MjgsIDE3MjksIDE3MjksIDE3MjksIDE3MzAsIDE3MzAsICAgIDAsICAgIDAsIDE3MzAsCisgICAgIDE3MzEsIDE3MzEsIDE3MzEsIDE3MzIsIDE3MzIsIDE3MzIsIDE3MzMsIDE3MzMsICAgIDAsIDE3MzMsCisgICAgIDE3MzQsIDE3MzQsICAgIDAsICAgIDAsIDE3MzQsIDE3MzUsIDE3MzUsICAgIDAsIDE3MzUsIDE3MzYsCisgICAgIDE3MzYsIDE3MzcsIDE3MzcsICAgIDAsICAgIDAsIDE3MzcsIDE3MzgsIDE3MzgsIDE3MzgsIDE3MzksCisgICAgIDE3MzksIDE3MzksIDE3NDAsIDE3NDAsICAgIDAsIDE3NDAsIDE3NDEsICAgIDAsICAgIDAsIDE3NDEsCisKKyAgICAgMTc0MiwgMTc0MiwgICAgMCwgMTc0MiwgMTc0MywgMTc0MywgICAgMCwgICAgMCwgMTc0MywgMTc0NCwKKyAgICAgMTc0NCwgICAgMCwgMTc0NCwgMTc0NSwgMTc0NSwgMTc0NiwgMTc0NiwgICAgMCwgICAgMCwgMTc0NiwKKyAgICAgMTc0NywgMTc0NywgMTc0NywgMTc0OCwgMTc0OCwgMTc0OCwgMTc0OSwgMTc0OSwgICAgMCwgMTc0OSwKKyAgICAgMTc1MCwgICAgMCwgMTc1MCwgMTc1MSwgICAgMCwgICAgMCwgMTc1MSwgMTc1MiwgMTc1MiwgICAgMCwKKyAgICAgMTc1MiwgMTc1MywgMTc1MywgICAgMCwgICAgMCwgMTc1MywgMTc1NCwgMTc1NCwgICAgMCwgMTc1NCwKKyAgICAgMTc1NSwgMTc1NSwgMTc1NiwgMTc1NiwgICAgMCwgICAgMCwgMTc1NiwgMTc1NywgMTc1NywgMTc1NywKKyAgICAgMTc1OCwgMTc1OCwgMTc1OCwgMTc1OSwgMTc1OSwgICAgMCwgMTc1OSwgMTc2MCwgICAgMCwgMTc2MCwKKyAgICAgMTc2MSwgICAgMCwgICAgMCwgMTc2MSwgMTc2MiwgMTc2MiwgICAgMCwgMTc2MiwgMTc2MywgMTc2MywKKyAgICAgICAgMCwgICAgMCwgMTc2MywgMTc2NCwgMTc2NCwgICAgMCwgMTc2NCwgMTc2NSwgMTc2NSwgMTc2NiwKKyAgICAgMTc2NiwgICAgMCwgICAgMCwgMTc2NiwgMTc2NywgMTc2NywgMTc2NywgMTc2OCwgMTc2OCwgMTc2OCwKKworICAgICAxNzY5LCAxNzY5LCAgICAwLCAxNzY5LCAxNzcwLCAgICAwLCAxNzcwLCAxNzcxLCAgICAwLCAxNzcxLAorICAgICAxNzcyLCAgICAwLCAxNzcyLCAxNzczLCAxNzczLCAxNzczLCAxNzc0LCAgICAwLCAxNzc0LCAxNzc1LAorICAgICAxNzc1LCAxNzc1LCAxNzc2LCAgICAwLCAxNzc2LCAxNzc3LCAxNzc3LCAxNzc3LCAgICAwLCAxNzc3LAorICAgICAxNzc3LCAxNzc4LCAgICAwLCAxNzc4LCAxNzc5LCAxNzc5LCAxNzc5LCAxNzgwLCAgICAwLCAxNzgwLAorICAgICAxNzgxLCAxNzgxLCAxNzgxLCAxNzgyLCAgICAwLCAxNzgyLCAxNzgzLCAxNzgzLCAxNzgzLCAxNzg0LAorICAgICAgICAwLCAxNzg0LCAxNzg1LCAxNzg1LCAxNzg1LCAxNzg2LCAgICAwLCAxNzg2LCAxNzg3LCAxNzg3LAorICAgICAxNzg3LCAxNzg4LCAgICAwLCAxNzg4LCAxNzg5LCAxNzg5LCAxNzg5LCAxNzkwLCAxNzkwLCAgICAwLAorICAgICAgICAwLCAxNzkwLCAxNzkxLCAxNzkxLCAxNzkxLCAxNzkyLCAxNzkyLCAxNzkyLCAxNzkzLCAxNzkzLAorICAgICAxNzkzLCAxNzk0LCAxNzk0LCAgICAwLCAxNzk0LCAxNzk1LCAxNzk1LCAxNzk1LCAxNzk2LCAgICAwLAorICAgICAxNzk2LCAxNzk3LCAxNzk3LCAxNzk3LCAxNzk4LCAxNzk4LCAxNzk4LCAxNzk5LCAgICAwLCAxNzk5LAorCisgICAgIDE4MDAsICAgIDAsIDE4MDAsIDE4MDEsIDE4MDEsIDE4MDEsIDE4MDIsIDE4MDIsIDE4MDIsIDE4MDMsCisgICAgICAgIDAsIDE4MDMsIDE4MDQsICAgIDAsIDE4MDQsIDE4MDUsICAgIDAsIDE4MDUsIDE4MDYsIDE4MDYsCisgICAgIDE4MDYsIDE4MDcsIDE4MDcsIDE4MDcsIDE4MDgsICAgIDAsIDE4MDgsIDE4MDksICAgIDAsIDE4MDksCisgICAgIDE4MTAsICAgIDAsIDE4MTAsIDE4MTEsIDE4MTEsIDE4MTEsIDE4MTIsIDE4MTIsIDE4MTIsIDE4MTMsCisgICAgICAgIDAsIDE4MTMsIDE4MTQsICAgIDAsIDE4MTQsIDE4MTUsICAgIDAsIDE4MTUsIDE4MTYsIDE4MTYsCisgICAgIDE4MTYsIDE4MTcsIDE4MTcsIDE4MTcsIDE4MTgsICAgIDAsIDE4MTgsIDE4MTksICAgIDAsICAgIDAsCisgICAgIDE4MTksIDE4MjAsIDE4MjAsICAgIDAsIDE4MjAsIDE4MjEsIDE4MjEsICAgIDAsICAgIDAsIDE4MjEsCisgICAgIDE4MjIsIDE4MjIsICAgIDAsIDE4MjIsIDE4MjMsIDE4MjMsIDE4MjQsIDE4MjQsICAgIDAsICAgIDAsCisgICAgIDE4MjQsIDE4MjUsIDE4MjUsIDE4MjUsIDE4MjYsICAgIDAsIDE4MjYsIDE4MjcsIDE4MjcsICAgIDAsCisgICAgIDE4MjcsIDE4MjgsIDE4MjgsIDE4MjgsICAgIDAsIDE4MjgsIDE4MjgsIDE4MjksIDE4MjksIDE4MjksCisKKyAgICAgMTgzMCwgMTgzMCwgMTgzMCwgMTgzMSwgICAgMCwgMTgzMSwgMTgzMiwgICAgMCwgMTgzMiwgMTgzMywKKyAgICAgICAgMCwgMTgzMywgMTgzNCwgICAgMCwgMTgzNCwgMTgzNSwgICAgMCwgMTgzNSwgMTgzNiwgICAgMCwKKyAgICAgMTgzNiwgMTgzNywgICAgMCwgMTgzNywgMTgzOCwgMTgzOCwgMTgzOCwgMTgzOSwgMTgzOSwgMTgzOSwKKyAgICAgMTg0MCwgICAgMCwgMTg0MCwgMTg0MSwgMTg0MSwgICAgMCwgICAgMCwgMTg0MSwgMTg0MiwgMTg0MiwKKyAgICAgICAgMCwgMTg0MiwgMTg0MywgMTg0MywgMTg0NCwgICAgMCwgMTg0NCwgMTg0NSwgICAgMCwgICAgMCwKKyAgICAgMTg0NSwgMTg0NiwgMTg0NiwgICAgMCwgMTg0NiwgMTg0NywgMTg0NywgICAgMCwgICAgMCwgMTg0NywKKyAgICAgMTg0OCwgMTg0OCwgICAgMCwgMTg0OCwgMTg0OSwgMTg0OSwgMTg1MCwgICAgMCwgMTg1MCwgMTg1MSwKKyAgICAgICAgMCwgMTg1MSwgMTg1MiwgICAgMCwgICAgMCwgMTg1MiwgMTg1MywgMTg1MywgICAgMCwgMTg1MywKKyAgICAgMTg1NCwgMTg1NCwgICAgMCwgICAgMCwgMTg1NCwgMTg1NSwgMTg1NSwgICAgMCwgMTg1NSwgMTg1NiwKKyAgICAgMTg1NiwgMTg1NywgICAgMCwgMTg1NywgMTg1OCwgICAgMCwgMTg1OCwgMTg1OSwgICAgMCwgICAgMCwKKworICAgICAxODU5LCAxODYwLCAxODYwLCAgICAwLCAxODYwLCAxODYxLCAxODYxLCAgICAwLCAgICAwLCAxODYxLAorICAgICAxODYyLCAxODYyLCAgICAwLCAxODYyLCAxODYzLCAxODYzLCAxODY0LCAgICAwLCAxODY0LCAxODY1LAorICAgICAgICAwLCAxODY1LCAxODY2LCAgICAwLCAgICAwLCAxODY2LCAxODY3LCAxODY3LCAgICAwLCAxODY3LAorICAgICAxODY4LCAxODY4LCAgICAwLCAgICAwLCAxODY4LCAxODY5LCAxODY5LCAgICAwLCAxODY5LCAxODcwLAorICAgICAxODcwLCAxODcxLCAgICAwLCAxODcxLCAxODcyLCAgICAwLCAxODcyLCAxODczLCAgICAwLCAxODczLAorICAgICAxODc0LCAgICAwLCAxODc0LCAxODc1LCAxODc1LCAxODc1LCAxODc2LCAgICAwLCAxODc2LCAxODc3LAorICAgICAxODc3LCAxODc3LCAgICAwLCAxODc3LCAxODc3LCAxODc4LCAgICAwLCAxODc4LCAxODc5LCAgICAwLAorICAgICAxODc5LCAxODgwLCAgICAwLCAxODgwLCAxODgxLCAgICAwLCAxODgxLCAxODgyLCAgICAwLCAxODgyLAorICAgICAxODgzLCAgICAwLCAxODgzLCAxODg0LCAgICAwLCAxODg0LCAxODg1LCAxODg1LCAgICAwLCAgICAwLAorICAgICAxODg1LCAxODg2LCAxODg2LCAgICAwLCAxODg2LCAxODg3LCAxODg3LCAxODg4LCAgICAwLCAxODg4LAorCisgICAgIDE4ODksICAgIDAsIDE4ODksIDE4OTAsICAgIDAsIDE4OTAsIDE4OTEsICAgIDAsIDE4OTEsIDE4OTIsCisgICAgICAgIDAsIDE4OTIsIDE4OTMsICAgIDAsIDE4OTMsIDE4OTQsICAgIDAsIDE4OTQsIDE4OTUsICAgIDAsCisgICAgIDE4OTUsIDE4OTYsICAgIDAsIDE4OTYsIDE4OTcsICAgIDAsIDE4OTcsIDE4OTgsICAgIDAsICAgIDAsCisgICAgIDE4OTgsIDE4OTksIDE4OTksICAgIDAsICAgIDAsIDE4OTksIDE5MDAsICAgIDAsIDE5MDAsIDE5MDEsCisgICAgICAgIDAsIDE5MDEsIDE5MDIsICAgIDAsIDE5MDIsIDE5MDMsICAgIDAsICAgIDAsIDE5MDMsIDE5MDQsCisgICAgICAgIDAsICAgIDAsIDE5MDQsIDE5MDUsICAgIDAsICAgIDAsIDE5MDUsIDE5MDYsICAgIDAsICAgIDAsCisgICAgIDE5MDYsIDE5MDcsICAgIDAsICAgIDAsIDE5MDcsIDE5MDgsICAgIDAsIDE5MDgsIDE5MDksICAgIDAsCisgICAgIDE5MDksIDE5MTAsICAgIDAsICAgIDAsIDE5MTAsIDE5MTEsICAgIDAsIDE5MTEsIDE5MTIsICAgIDAsCisgICAgIDE5MTIsIDE5MTMsICAgIDAsIDE5MTMsIDE5MTQsICAgIDAsIDE5MTQsIDE5MTUsICAgIDAsIDE5MTUsCisgICAgIDE5MTYsICAgIDAsICAgIDAsIDE5MTYsIDE5MTcsICAgIDAsIDE5MTcsIDE5MTgsICAgIDAsIDE5MTgsCisKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OCwKKyAgICAgMTQ1OCwgMTQ1OCwgMTQ1OCwgMTQ1OAogICAgIH0gOwogCiBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKQEAgLTI0NDEsMTMgKzI3MjAsMjcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvc2Nhbm5lci5sLHYgMS45OS4yLjkgMjAwNy8wNi8xMSAwOTo1MjowNSBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3NjYW5uZXIubCx2IDEuMTEyIDIwMDgtMDItMDYgMTA6MjE6MzAgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKwogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTI0NTksNyArMjc1Miw3IEBACiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KIAogI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSAiSVA2X21pc2MuaCIKKyNpbmNsdWRlICJpcDZfbWlzYy5oIgogI2VuZGlmCiAjZWxzZSAvKiBXSU4zMiAqLwogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4JLyogZm9yICJzdHJ1Y3Qgc29ja2FkZHIiIGluICJzdHJ1Y3QgYWRkcmluZm8iICovCkBAIC0yNDcxLDcgKzI3NjQsNyBAQAogI2RlZmluZSBBSV9OVU1FUklDSE9TVCAweDA0CiAjZW5kaWYKICNlbmRpZiAvKklORVQ2Ki8KLSNpbmNsdWRlIDxwY2FwLW5hbWVkYi5oPgorI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CiAjaW5jbHVkZSAidG9rZGVmcy5oIgogCiAjaWZkZWYgSEFWRV9PU19QUk9UT19ICkBAIC0yNDgyLDEwICsyNzc1LDExIEBACiBzdGF0aWMgaW5saW5lIGludCB4ZHRvaShpbnQpOwogCiAjaWZkZWYgRkxFWF9TQ0FOTkVSCisjZGVmaW5lIFlZX05PX0lOUFVUCiAjZGVmaW5lIFlZX05PX1VOUFVUCiBzdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluX2J1ZmZlcjsKICNlbHNlCi1zdGF0aWMgY2hhciAqaW5fYnVmZmVyOworc3RhdGljIGNvbnN0IGNoYXIgKmluX2J1ZmZlcjsKIAogI3VuZGVmIGdldGMKICNkZWZpbmUgZ2V0YyhmcCkgICgqaW5fYnVmZmVyID09IDAgPyBFT0YgOiAqaW5fYnVmZmVyKyspCkBAIC0yNDk0LDcgKzI3ODgsNyBAQAogI2RlZmluZSB5eWx2YWwgcGNhcF9sdmFsCiBleHRlcm4gWVlTVFlQRSB5eWx2YWw7CiAKLSNsaW5lIDI0OTggIjxzdGRvdXQ+IgorI2xpbmUgMjc5MiAic2Nhbm5lci5jIgogCiAjZGVmaW5lIElOSVRJQUwgMAogCkBAIC0yNTEwLDYgKzI4MDQsMjEgQEAKICNkZWZpbmUgWVlfRVhUUkFfVFlQRSB2b2lkICoKICNlbmRpZgogCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAodm9pZCApOworCisvKiBBY2Nlc3NvciBtZXRob2RzIHRvIGdsb2JhbHMuCisgICBUaGVzZSBhcmUgbWFkZSB2aXNpYmxlIHRvIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMgZm9yIGNvbnZlbmllbmNlLiAqLworCitpbnQgcGNhcF9sZXhfZGVzdHJveSAodm9pZCApOworCitpbnQgcGNhcF9nZXRfZGVidWcgKHZvaWQgKTsKKwordm9pZCBwY2FwX3NldF9kZWJ1ZyAoaW50IGRlYnVnX2ZsYWcgICk7CisKK1lZX0VYVFJBX1RZUEUgcGNhcF9nZXRfZXh0cmEgKHZvaWQgKTsKKwordm9pZCBwY2FwX3NldF9leHRyYSAoWVlfRVhUUkFfVFlQRSB1c2VyX2RlZmluZWQgICk7CisKIC8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCiAgKiBzZWN0aW9uIDEuCiAgKi8KQEAgLTI1MjIsOCArMjgzMSw2IEBACiAjZW5kaWYKICNlbmRpZgogCi0gICAgc3RhdGljIHZvaWQgeXl1bnB1dCAoaW50IGMsY2hhciAqYnVmX3B0ciAgKTsKLSAgICAKICNpZm5kZWYgeXl0ZXh0X3B0cgogc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyICoseXljb25zdCBjaGFyICosaW50ICk7CiAjZW5kaWYKQEAgLTI1NDQsNyArMjg1MSwxMiBAQAogCiAvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCiAjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKKyNpZmRlZiBfX2lhNjRfXworLyogT24gSUEtNjQsIHRoZSBidWZmZXIgc2l6ZSBpcyAxNmssIG5vdCA4ayAqLworI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDE2Mzg0CisjZWxzZQogI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKKyNlbmRpZiAvKiBfX2lhNjRfXyAqLwogI2VuZGlmCiAKIC8qIENvcHkgd2hhdGV2ZXIgdGhlIGxhc3QgcnVsZSBtYXRjaGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICovCkBAIC0yNTUyLDcgKzI4NjQsNyBAQAogLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCiAgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgogICovCi0jZGVmaW5lIEVDSE8gKHZvaWQpIGZ3cml0ZSggcGNhcF90ZXh0LCBwY2FwX2xlbmcsIDEsIHBjYXBfb3V0ICkKKyNkZWZpbmUgRUNITyBkbyB7IGlmIChmd3JpdGUoIHBjYXBfdGV4dCwgcGNhcF9sZW5nLCAxLCBwY2FwX291dCApKSB7fSB9IHdoaWxlICgwKQogI2VuZGlmCiAKIC8qIEdldHMgaW5wdXQgYW5kIHN0dWZmcyBpdCBpbnRvICJidWYiLiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgWVlfTlVMTCwKQEAgLTI2NDUsMTMgKzI5NTcsMTMgQEAKIAlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOwogCXJlZ2lzdGVyIGludCB5eV9hY3Q7CiAgICAgCi0jbGluZSAxNjkgInNjYW5uZXIubCIKKyNsaW5lIDE4OSAic2Nhbm5lci5sIgogCi0jbGluZSAyNjUxICI8c3Rkb3V0PiIKKyNsaW5lIDI5NjMgInNjYW5uZXIuYyIKIAotCWlmICggKHl5X2luaXQpICkKKwlpZiAoICEoeXlfaW5pdCkgKQogCQl7Ci0JCSh5eV9pbml0KSA9IDA7CisJCSh5eV9pbml0KSA9IDE7CiAKICNpZmRlZiBZWV9VU0VSX0lOSVQKIAkJWVlfVVNFUl9JTklUOwpAQCAtMjcwMCwxMyArMzAxMiwxMyBAQAogCQkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQogCQkJCXsKIAkJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSAxMzMwICkKKwkJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTQ1OSApCiAJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQkJCX0KIAkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQkJKyt5eV9jcDsKIAkJCX0KLQkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDY1NzAgKTsKKwkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDc0MDEgKTsKIAogeXlfZmluZF9hY3Rpb246CiAJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKQEAgLTI3MzIsMjY0ICszMDQ0LDI1NyBAQAogCiBjYXNlIDE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNzAgInNjYW5uZXIubCIKKyNsaW5lIDE5MCAic2Nhbm5lci5sIgogcmV0dXJuIERTVDsKIAlZWV9CUkVBSwogY2FzZSAyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTcxICJzY2FubmVyLmwiCisjbGluZSAxOTEgInNjYW5uZXIubCIKIHJldHVybiBTUkM7CiAJWVlfQlJFQUsKIGNhc2UgMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE3MyAic2Nhbm5lci5sIgorI2xpbmUgMTkzICJzY2FubmVyLmwiCiByZXR1cm4gTElOSzsKIAlZWV9CUkVBSwogY2FzZSA0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTc0ICJzY2FubmVyLmwiCisjbGluZSAxOTQgInNjYW5uZXIubCIKIHJldHVybiBMSU5LOwogCVlZX0JSRUFLCiBjYXNlIDU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNzUgInNjYW5uZXIubCIKKyNsaW5lIDE5NSAic2Nhbm5lci5sIgogcmV0dXJuIEFSUDsKIAlZWV9CUkVBSwogY2FzZSA2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTc2ICJzY2FubmVyLmwiCisjbGluZSAxOTYgInNjYW5uZXIubCIKIHJldHVybiBSQVJQOwogCVlZX0JSRUFLCiBjYXNlIDc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNzcgInNjYW5uZXIubCIKKyNsaW5lIDE5NyAic2Nhbm5lci5sIgogcmV0dXJuIElQOwogCVlZX0JSRUFLCiBjYXNlIDg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNzggInNjYW5uZXIubCIKKyNsaW5lIDE5OCAic2Nhbm5lci5sIgogcmV0dXJuIFNDVFA7CiAJWVlfQlJFQUsKIGNhc2UgOToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE3OSAic2Nhbm5lci5sIgorI2xpbmUgMTk5ICJzY2FubmVyLmwiCiByZXR1cm4gVENQOwogCVlZX0JSRUFLCiBjYXNlIDEwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTgwICJzY2FubmVyLmwiCisjbGluZSAyMDAgInNjYW5uZXIubCIKIHJldHVybiBVRFA7CiAJWVlfQlJFQUsKIGNhc2UgMTE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODEgInNjYW5uZXIubCIKKyNsaW5lIDIwMSAic2Nhbm5lci5sIgogcmV0dXJuIElDTVA7CiAJWVlfQlJFQUsKIGNhc2UgMTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODIgInNjYW5uZXIubCIKKyNsaW5lIDIwMiAic2Nhbm5lci5sIgogcmV0dXJuIElHTVA7CiAJWVlfQlJFQUsKIGNhc2UgMTM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODMgInNjYW5uZXIubCIKKyNsaW5lIDIwMyAic2Nhbm5lci5sIgogcmV0dXJuIElHUlA7CiAJWVlfQlJFQUsKIGNhc2UgMTQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODQgInNjYW5uZXIubCIKKyNsaW5lIDIwNCAic2Nhbm5lci5sIgogcmV0dXJuIFBJTTsKIAlZWV9CUkVBSwogY2FzZSAxNToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4NSAic2Nhbm5lci5sIgorI2xpbmUgMjA1ICJzY2FubmVyLmwiCiByZXR1cm4gVlJSUDsKIAlZWV9CUkVBSwogY2FzZSAxNjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4NiAic2Nhbm5lci5sIgotcmV0dXJuIFJBRElPOworI2xpbmUgMjA2ICJzY2FubmVyLmwiCityZXR1cm4gQ0FSUDsKIAlZWV9CUkVBSwogY2FzZSAxNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4OCAic2Nhbm5lci5sIgotewotI2lmZGVmIElORVQ2Ci0JCXJldHVybiBJUFY2OwotI2Vsc2UKLQkJYnBmX2Vycm9yKCIlcyBub3Qgc3VwcG9ydGVkIiwgcGNhcF90ZXh0KTsKLSNlbmRpZgotCQl9CisjbGluZSAyMDcgInNjYW5uZXIubCIKK3JldHVybiBSQURJTzsKIAlZWV9CUkVBSwogY2FzZSAxODoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5NSAic2Nhbm5lci5sIgotewotI2lmZGVmIElORVQ2Ci0JCXJldHVybiBJQ01QVjY7Ci0jZWxzZQotCQlicGZfZXJyb3IoIiVzIG5vdCBzdXBwb3J0ZWQiLCBwY2FwX3RleHQpOwotI2VuZGlmCi0JCX0KKyNsaW5lIDIwOSAic2Nhbm5lci5sIgorcmV0dXJuIElQVjY7CiAJWVlfQlJFQUsKIGNhc2UgMTk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDIgInNjYW5uZXIubCIKLXJldHVybiBBSDsKKyNsaW5lIDIxMCAic2Nhbm5lci5sIgorcmV0dXJuIElDTVBWNjsKIAlZWV9CUkVBSwogY2FzZSAyMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwMyAic2Nhbm5lci5sIgotcmV0dXJuIEVTUDsKKyNsaW5lIDIxMSAic2Nhbm5lci5sIgorcmV0dXJuIEFIOwogCVlZX0JSRUFLCiBjYXNlIDIxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjA1ICJzY2FubmVyLmwiCi1yZXR1cm4gQVRBTEs7CisjbGluZSAyMTIgInNjYW5uZXIubCIKK3JldHVybiBFU1A7CiAJWVlfQlJFQUsKIGNhc2UgMjI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDYgInNjYW5uZXIubCIKLXJldHVybiBBQVJQOworI2xpbmUgMjE0ICJzY2FubmVyLmwiCityZXR1cm4gQVRBTEs7CiAJWVlfQlJFQUsKIGNhc2UgMjM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDcgInNjYW5uZXIubCIKLXJldHVybiBERUNORVQ7CisjbGluZSAyMTUgInNjYW5uZXIubCIKK3JldHVybiBBQVJQOwogCVlZX0JSRUFLCiBjYXNlIDI0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjA4ICJzY2FubmVyLmwiCi1yZXR1cm4gTEFUOworI2xpbmUgMjE2ICJzY2FubmVyLmwiCityZXR1cm4gREVDTkVUOwogCVlZX0JSRUFLCiBjYXNlIDI1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjA5ICJzY2FubmVyLmwiCi1yZXR1cm4gU0NBOworI2xpbmUgMjE3ICJzY2FubmVyLmwiCityZXR1cm4gTEFUOwogCVlZX0JSRUFLCiBjYXNlIDI2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjEwICJzY2FubmVyLmwiCi1yZXR1cm4gTU9QUkM7CisjbGluZSAyMTggInNjYW5uZXIubCIKK3JldHVybiBTQ0E7CiAJWVlfQlJFQUsKIGNhc2UgMjc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTEgInNjYW5uZXIubCIKLXJldHVybiBNT1BETDsKKyNsaW5lIDIxOSAic2Nhbm5lci5sIgorcmV0dXJuIE1PUFJDOwogCVlZX0JSRUFLCiBjYXNlIDI4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjEzICJzY2FubmVyLmwiCi1yZXR1cm4gSVNPOworI2xpbmUgMjIwICJzY2FubmVyLmwiCityZXR1cm4gTU9QREw7CiAJWVlfQlJFQUsKIGNhc2UgMjk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTQgInNjYW5uZXIubCIKLXJldHVybiBFU0lTOworI2xpbmUgMjIyICJzY2FubmVyLmwiCityZXR1cm4gSVNPOwogCVlZX0JSRUFLCiBjYXNlIDMwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjE1ICJzY2FubmVyLmwiCisjbGluZSAyMjMgInNjYW5uZXIubCIKIHJldHVybiBFU0lTOwogCVlZX0JSRUFLCiBjYXNlIDMxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjE2ICJzY2FubmVyLmwiCi1yZXR1cm4gSVNJUzsKKyNsaW5lIDIyNCAic2Nhbm5lci5sIgorcmV0dXJuIEVTSVM7CiAJWVlfQlJFQUsKIGNhc2UgMzI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTcgInNjYW5uZXIubCIKKyNsaW5lIDIyNSAic2Nhbm5lci5sIgogcmV0dXJuIElTSVM7CiAJWVlfQlJFQUsKIGNhc2UgMzM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTggInNjYW5uZXIubCIKLXJldHVybiBMMTsKKyNsaW5lIDIyNiAic2Nhbm5lci5sIgorcmV0dXJuIElTSVM7CiAJWVlfQlJFQUsKIGNhc2UgMzQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTkgInNjYW5uZXIubCIKLXJldHVybiBMMjsKKyNsaW5lIDIyNyAic2Nhbm5lci5sIgorcmV0dXJuIEwxOwogCVlZX0JSRUFLCiBjYXNlIDM1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjIwICJzY2FubmVyLmwiCi1yZXR1cm4gSUlIOworI2xpbmUgMjI4ICJzY2FubmVyLmwiCityZXR1cm4gTDI7CiAJWVlfQlJFQUsKIGNhc2UgMzY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMjEgInNjYW5uZXIubCIKLXJldHVybiBMU1A7CisjbGluZSAyMjkgInNjYW5uZXIubCIKK3JldHVybiBJSUg7CiAJWVlfQlJFQUsKIGNhc2UgMzc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMjIgInNjYW5uZXIubCIKLXJldHVybiBTTlA7CisjbGluZSAyMzAgInNjYW5uZXIubCIKK3JldHVybiBMU1A7CiAJWVlfQlJFQUsKIGNhc2UgMzg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMjMgInNjYW5uZXIubCIKLXJldHVybiBDU05QOworI2xpbmUgMjMxICJzY2FubmVyLmwiCityZXR1cm4gU05QOwogCVlZX0JSRUFLCiBjYXNlIDM5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjI0ICJzY2FubmVyLmwiCi1yZXR1cm4gUFNOUDsKKyNsaW5lIDIzMiAic2Nhbm5lci5sIgorcmV0dXJuIENTTlA7CiAJWVlfQlJFQUsKIGNhc2UgNDA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMjYgInNjYW5uZXIubCIKLXJldHVybiBDTE5QOworI2xpbmUgMjMzICJzY2FubmVyLmwiCityZXR1cm4gUFNOUDsKIAlZWV9CUkVBSwogY2FzZSA0MToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIyOCAic2Nhbm5lci5sIgotcmV0dXJuIFNUUDsKKyNsaW5lIDIzNSAic2Nhbm5lci5sIgorcmV0dXJuIENMTlA7CiAJWVlfQlJFQUsKIGNhc2UgNDI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMzAgInNjYW5uZXIubCIKLXJldHVybiBJUFg7CisjbGluZSAyMzcgInNjYW5uZXIubCIKK3JldHVybiBTVFA7CiAJWVlfQlJFQUsKIGNhc2UgNDM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMzIgInNjYW5uZXIubCIKLXJldHVybiBORVRCRVVJOworI2xpbmUgMjM5ICJzY2FubmVyLmwiCityZXR1cm4gSVBYOwogCVlZX0JSRUFLCiBjYXNlIDQ0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM0ICJzY2FubmVyLmwiCi1yZXR1cm4gSE9TVDsKKyNsaW5lIDI0MSAic2Nhbm5lci5sIgorcmV0dXJuIE5FVEJFVUk7CiAJWVlfQlJFQUsKIGNhc2UgNDU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMzUgInNjYW5uZXIubCIKLXJldHVybiBORVQ7CisjbGluZSAyNDMgInNjYW5uZXIubCIKK3JldHVybiBIT1NUOwogCVlZX0JSRUFLCiBjYXNlIDQ2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM2ICJzY2FubmVyLmwiCi1yZXR1cm4gTkVUTUFTSzsKKyNsaW5lIDI0NCAic2Nhbm5lci5sIgorcmV0dXJuIE5FVDsKIAlZWV9CUkVBSwogY2FzZSA0NzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIzNyAic2Nhbm5lci5sIgotcmV0dXJuIFBPUlQ7CisjbGluZSAyNDUgInNjYW5uZXIubCIKK3JldHVybiBORVRNQVNLOwogCVlZX0JSRUFLCiBjYXNlIDQ4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM4ICJzY2FubmVyLmwiCi1yZXR1cm4gUE9SVFJBTkdFOworI2xpbmUgMjQ2ICJzY2FubmVyLmwiCityZXR1cm4gUE9SVDsKIAlZWV9CUkVBSwogY2FzZSA0OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIzOSAic2Nhbm5lci5sIgotcmV0dXJuIFBST1RPOworI2xpbmUgMjQ3ICJzY2FubmVyLmwiCityZXR1cm4gUE9SVFJBTkdFOwogCVlZX0JSRUFLCiBjYXNlIDUwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjQwICJzY2FubmVyLmwiCisjbGluZSAyNDggInNjYW5uZXIubCIKK3JldHVybiBQUk9UTzsKKwlZWV9CUkVBSworY2FzZSA1MToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDI0OSAic2Nhbm5lci5sIgogewogI2lmZGVmIE5PX1BST1RPQ0hBSU4KIAkJICBicGZfZXJyb3IoIiVzIG5vdCBzdXBwb3J0ZWQiLCBwY2FwX3RleHQpOwpAQCAtMjk5OCwyOTMgKzMzMDMsMzc3IEBACiAjZW5kaWYKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDUxOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjQ4ICJzY2FubmVyLmwiCi1yZXR1cm4gR0FURVdBWTsKLQlZWV9CUkVBSwogY2FzZSA1MjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI1MCAic2Nhbm5lci5sIgotcmV0dXJuIExFU1M7CisjbGluZSAyNTcgInNjYW5uZXIubCIKK3JldHVybiBHQVRFV0FZOwogCVlZX0JSRUFLCiBjYXNlIDUzOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjUxICJzY2FubmVyLmwiCi1yZXR1cm4gR1JFQVRFUjsKKyNsaW5lIDI1OSAic2Nhbm5lci5sIgorcmV0dXJuIFRZUEU7CiAJWVlfQlJFQUsKIGNhc2UgNTQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTIgInNjYW5uZXIubCIKLXJldHVybiBDQllURTsKKyNsaW5lIDI2MCAic2Nhbm5lci5sIgorcmV0dXJuIFNVQlRZUEU7CiAJWVlfQlJFQUsKIGNhc2UgNTU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTMgInNjYW5uZXIubCIKLXJldHVybiBUS19CUk9BRENBU1Q7CisjbGluZSAyNjEgInNjYW5uZXIubCIKK3JldHVybiBESVI7CiAJWVlfQlJFQUsKIGNhc2UgNTY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTQgInNjYW5uZXIubCIKLXJldHVybiBUS19NVUxUSUNBU1Q7CisjbGluZSAyNjIgInNjYW5uZXIubCIKK3JldHVybiBBRERSMTsKIAlZWV9CUkVBSwogY2FzZSA1NzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI1NiAic2Nhbm5lci5sIgotcmV0dXJuIEFORDsKKyNsaW5lIDI2MyAic2Nhbm5lci5sIgorcmV0dXJuIEFERFIyOwogCVlZX0JSRUFLCiBjYXNlIDU4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjU3ICJzY2FubmVyLmwiCi1yZXR1cm4gT1I7CisjbGluZSAyNjQgInNjYW5uZXIubCIKK3JldHVybiBBRERSMzsKIAlZWV9CUkVBSwogY2FzZSA1OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI1OCAic2Nhbm5lci5sIgotcmV0dXJuICchJzsKKyNsaW5lIDI2NSAic2Nhbm5lci5sIgorcmV0dXJuIEFERFI0OwogCVlZX0JSRUFLCiBjYXNlIDYwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjYwICJzY2FubmVyLmwiCi1yZXR1cm4gTEVOOworI2xpbmUgMjY2ICJzY2FubmVyLmwiCityZXR1cm4gUkE7CiAJWVlfQlJFQUsKIGNhc2UgNjE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNjEgInNjYW5uZXIubCIKLXJldHVybiBJTkJPVU5EOworI2xpbmUgMjY3ICJzY2FubmVyLmwiCityZXR1cm4gVEE7CiAJWVlfQlJFQUsKIGNhc2UgNjI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNjIgInNjYW5uZXIubCIKLXJldHVybiBPVVRCT1VORDsKKyNsaW5lIDI2OSAic2Nhbm5lci5sIgorcmV0dXJuIExFU1M7CiAJWVlfQlJFQUsKIGNhc2UgNjM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNjQgInNjYW5uZXIubCIKLXJldHVybiBWTEFOOworI2xpbmUgMjcwICJzY2FubmVyLmwiCityZXR1cm4gR1JFQVRFUjsKIAlZWV9CUkVBSwogY2FzZSA2NDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2NSAic2Nhbm5lci5sIgotcmV0dXJuIE1QTFM7CisjbGluZSAyNzEgInNjYW5uZXIubCIKK3JldHVybiBDQllURTsKIAlZWV9CUkVBSwogY2FzZSA2NToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2NiAic2Nhbm5lci5sIgotcmV0dXJuIFBQUE9FRDsKKyNsaW5lIDI3MiAic2Nhbm5lci5sIgorcmV0dXJuIFRLX0JST0FEQ0FTVDsKIAlZWV9CUkVBSwogY2FzZSA2NjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2NyAic2Nhbm5lci5sIgotcmV0dXJuIFBQUE9FUzsKKyNsaW5lIDI3MyAic2Nhbm5lci5sIgorcmV0dXJuIFRLX01VTFRJQ0FTVDsKIAlZWV9CUkVBSwogY2FzZSA2NzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2OSAic2Nhbm5lci5sIgotcmV0dXJuIExBTkU7CisjbGluZSAyNzUgInNjYW5uZXIubCIKK3JldHVybiBBTkQ7CiAJWVlfQlJFQUsKIGNhc2UgNjg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzAgInNjYW5uZXIubCIKLXJldHVybiBMTEM7CisjbGluZSAyNzYgInNjYW5uZXIubCIKK3JldHVybiBPUjsKIAlZWV9CUkVBSwogY2FzZSA2OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3MSAic2Nhbm5lci5sIgotcmV0dXJuIE1FVEFDOworI2xpbmUgMjc3ICJzY2FubmVyLmwiCityZXR1cm4gJyEnOwogCVlZX0JSRUFLCiBjYXNlIDcwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjcyICJzY2FubmVyLmwiCi1yZXR1cm4gQkNDOworI2xpbmUgMjc5ICJzY2FubmVyLmwiCityZXR1cm4gTEVOOwogCVlZX0JSRUFLCiBjYXNlIDcxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjczICJzY2FubmVyLmwiCi1yZXR1cm4gT0FNOworI2xpbmUgMjgwICJzY2FubmVyLmwiCityZXR1cm4gSU5CT1VORDsKIAlZWV9CUkVBSwogY2FzZSA3MjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3NCAic2Nhbm5lci5sIgotcmV0dXJuIE9BTUY0OworI2xpbmUgMjgxICJzY2FubmVyLmwiCityZXR1cm4gT1VUQk9VTkQ7CiAJWVlfQlJFQUsKIGNhc2UgNzM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzUgInNjYW5uZXIubCIKLXJldHVybiBPQU1GNEVDOworI2xpbmUgMjgzICJzY2FubmVyLmwiCityZXR1cm4gVkxBTjsKIAlZWV9CUkVBSwogY2FzZSA3NDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3NiAic2Nhbm5lci5sIgotcmV0dXJuIE9BTUY0U0M7CisjbGluZSAyODQgInNjYW5uZXIubCIKK3JldHVybiBNUExTOwogCVlZX0JSRUFLCiBjYXNlIDc1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjc3ICJzY2FubmVyLmwiCi1yZXR1cm4gU0M7CisjbGluZSAyODUgInNjYW5uZXIubCIKK3JldHVybiBQUFBPRUQ7CiAJWVlfQlJFQUsKIGNhc2UgNzY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzggInNjYW5uZXIubCIKLXJldHVybiBJTE1JQzsKKyNsaW5lIDI4NiAic2Nhbm5lci5sIgorcmV0dXJuIFBQUE9FUzsKIAlZWV9CUkVBSwogY2FzZSA3NzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3OSAic2Nhbm5lci5sIgotcmV0dXJuIFZQSTsKKyNsaW5lIDI4OCAic2Nhbm5lci5sIgorcmV0dXJuIExBTkU7CiAJWVlfQlJFQUsKIGNhc2UgNzg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODAgInNjYW5uZXIubCIKLXJldHVybiBWQ0k7CisjbGluZSAyODkgInNjYW5uZXIubCIKK3JldHVybiBMTEM7CiAJWVlfQlJFQUsKIGNhc2UgNzk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODEgInNjYW5uZXIubCIKLXJldHVybiBDT05ORUNUTVNHOworI2xpbmUgMjkwICJzY2FubmVyLmwiCityZXR1cm4gTUVUQUM7CiAJWVlfQlJFQUsKIGNhc2UgODA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODIgInNjYW5uZXIubCIKLXJldHVybiBNRVRBQ09OTkVDVDsKKyNsaW5lIDI5MSAic2Nhbm5lci5sIgorcmV0dXJuIEJDQzsKIAlZWV9CUkVBSwogY2FzZSA4MToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4NCAic2Nhbm5lci5sIgotcmV0dXJuIFBGX0lGTkFNRTsKKyNsaW5lIDI5MiAic2Nhbm5lci5sIgorcmV0dXJuIE9BTTsKIAlZWV9CUkVBSwogY2FzZSA4MjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4NSAic2Nhbm5lci5sIgotcmV0dXJuIFBGX1JTRVQ7CisjbGluZSAyOTMgInNjYW5uZXIubCIKK3JldHVybiBPQU1GNDsKIAlZWV9CUkVBSwogY2FzZSA4MzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4NiAic2Nhbm5lci5sIgotcmV0dXJuIFBGX1JOUjsKKyNsaW5lIDI5NCAic2Nhbm5lci5sIgorcmV0dXJuIE9BTUY0RUM7CiAJWVlfQlJFQUsKIGNhc2UgODQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODcgInNjYW5uZXIubCIKLXJldHVybiBQRl9TUk5SOworI2xpbmUgMjk1ICJzY2FubmVyLmwiCityZXR1cm4gT0FNRjRTQzsKIAlZWV9CUkVBSwogY2FzZSA4NToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4OCAic2Nhbm5lci5sIgotcmV0dXJuIFBGX1JFQVNPTjsKKyNsaW5lIDI5NiAic2Nhbm5lci5sIgorcmV0dXJuIFNDOwogCVlZX0JSRUFLCiBjYXNlIDg2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjg5ICJzY2FubmVyLmwiCi1yZXR1cm4gUEZfQUNUSU9OOworI2xpbmUgMjk3ICJzY2FubmVyLmwiCityZXR1cm4gSUxNSUM7CiAJWVlfQlJFQUsKIGNhc2UgODc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyOTEgInNjYW5uZXIubCIKLXJldHVybiBGSVNVOworI2xpbmUgMjk4ICJzY2FubmVyLmwiCityZXR1cm4gVlBJOwogCVlZX0JSRUFLCiBjYXNlIDg4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjkyICJzY2FubmVyLmwiCi1yZXR1cm4gTFNTVTsKKyNsaW5lIDI5OSAic2Nhbm5lci5sIgorcmV0dXJuIFZDSTsKIAlZWV9CUkVBSwogY2FzZSA4OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI5MyAic2Nhbm5lci5sIgotcmV0dXJuIExTU1U7CisjbGluZSAzMDAgInNjYW5uZXIubCIKK3JldHVybiBDT05ORUNUTVNHOwogCVlZX0JSRUFLCiBjYXNlIDkwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjk0ICJzY2FubmVyLmwiCi1yZXR1cm4gTVNVOworI2xpbmUgMzAxICJzY2FubmVyLmwiCityZXR1cm4gTUVUQUNPTk5FQ1Q7CiAJWVlfQlJFQUsKIGNhc2UgOTE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyOTUgInNjYW5uZXIubCIKLXJldHVybiBTSU87CisjbGluZSAzMDMgInNjYW5uZXIubCIKK3JldHVybiBQRl9JRk5BTUU7CiAJWVlfQlJFQUsKIGNhc2UgOTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyOTYgInNjYW5uZXIubCIKLXJldHVybiBPUEM7CisjbGluZSAzMDQgInNjYW5uZXIubCIKK3JldHVybiBQRl9SU0VUOwogCVlZX0JSRUFLCiBjYXNlIDkzOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjk3ICJzY2FubmVyLmwiCi1yZXR1cm4gRFBDOworI2xpbmUgMzA1ICJzY2FubmVyLmwiCityZXR1cm4gUEZfUk5SOwogCVlZX0JSRUFLCiBjYXNlIDk0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjk4ICJzY2FubmVyLmwiCi1yZXR1cm4gU0xTOworI2xpbmUgMzA2ICJzY2FubmVyLmwiCityZXR1cm4gUEZfU1JOUjsKIAlZWV9CUkVBSwogY2FzZSA5NToKLS8qIHJ1bGUgOTUgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzAwICJzY2FubmVyLmwiCi07CisjbGluZSAzMDcgInNjYW5uZXIubCIKK3JldHVybiBQRl9SRUFTT047CiAJWVlfQlJFQUsKIGNhc2UgOTY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMDEgInNjYW5uZXIubCIKLXJldHVybiBwY2FwX3RleHRbMF07CisjbGluZSAzMDggInNjYW5uZXIubCIKK3JldHVybiBQRl9BQ1RJT047CiAJWVlfQlJFQUsKIGNhc2UgOTc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMDIgInNjYW5uZXIubCIKLXJldHVybiBHRVE7CisjbGluZSAzMTAgInNjYW5uZXIubCIKK3JldHVybiBGSVNVOwogCVlZX0JSRUFLCiBjYXNlIDk4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzAzICJzY2FubmVyLmwiCi1yZXR1cm4gTEVROworI2xpbmUgMzExICJzY2FubmVyLmwiCityZXR1cm4gTFNTVTsKIAlZWV9CUkVBSwogY2FzZSA5OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwNCAic2Nhbm5lci5sIgotcmV0dXJuIE5FUTsKKyNsaW5lIDMxMiAic2Nhbm5lci5sIgorcmV0dXJuIExTU1U7CiAJWVlfQlJFQUsKIGNhc2UgMTAwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzA1ICJzY2FubmVyLmwiCi1yZXR1cm4gJz0nOworI2xpbmUgMzEzICJzY2FubmVyLmwiCityZXR1cm4gTVNVOwogCVlZX0JSRUFLCiBjYXNlIDEwMToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwNiAic2Nhbm5lci5sIgotcmV0dXJuIExTSDsKKyNsaW5lIDMxNCAic2Nhbm5lci5sIgorcmV0dXJuIEhGSVNVOwogCVlZX0JSRUFLCiBjYXNlIDEwMjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwNyAic2Nhbm5lci5sIgotcmV0dXJuIFJTSDsKKyNsaW5lIDMxNSAic2Nhbm5lci5sIgorcmV0dXJuIEhMU1NVOwogCVlZX0JSRUFLCiBjYXNlIDEwMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwOCAic2Nhbm5lci5sIgoteyB5eWx2YWwuZSA9IHBjYXBfZXRoZXJfYXRvbigoKGNoYXIgKilwY2FwX3RleHQpKzEpOwotCQkJICByZXR1cm4gQUlEOyB9CisjbGluZSAzMTYgInNjYW5uZXIubCIKK3JldHVybiBITVNVOwogCVlZX0JSRUFLCiBjYXNlIDEwNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMxMCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IHN0b2koKGNoYXIgKilwY2FwX3RleHQpOyByZXR1cm4gTlVNOyB9CisjbGluZSAzMTcgInNjYW5uZXIubCIKK3JldHVybiBTSU87CiAJWVlfQlJFQUsKIGNhc2UgMTA1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzExICJzY2FubmVyLmwiCi17Ci0JCQl5eWx2YWwucyA9IHNkdXAoKGNoYXIgKilwY2FwX3RleHQpOyByZXR1cm4gSElEOyB9CisjbGluZSAzMTggInNjYW5uZXIubCIKK3JldHVybiBPUEM7CiAJWVlfQlJFQUsKIGNhc2UgMTA2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzEzICJzY2FubmVyLmwiCi17IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKChjaGFyICopcGNhcF90ZXh0KTsKLQkJCSAgcmV0dXJuIEVJRDsgfQorI2xpbmUgMzE5ICJzY2FubmVyLmwiCityZXR1cm4gRFBDOwogCVlZX0JSRUFLCiBjYXNlIDEwNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMxNSAic2Nhbm5lci5sIgorI2xpbmUgMzIwICJzY2FubmVyLmwiCityZXR1cm4gU0xTOworCVlZX0JSRUFLCitjYXNlIDEwODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMyMSAic2Nhbm5lci5sIgorcmV0dXJuIEhTSU87CisJWVlfQlJFQUsKK2Nhc2UgMTA5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzIyICJzY2FubmVyLmwiCityZXR1cm4gSE9QQzsKKwlZWV9CUkVBSworY2FzZSAxMTA6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMjMgInNjYW5uZXIubCIKK3JldHVybiBIRFBDOworCVlZX0JSRUFLCitjYXNlIDExMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMyNCAic2Nhbm5lci5sIgorcmV0dXJuIEhTTFM7CisJWVlfQlJFQUsKK2Nhc2UgMTEyOgorLyogcnVsZSAxMTIgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorI2xpbmUgMzI2ICJzY2FubmVyLmwiCis7CisJWVlfQlJFQUsKK2Nhc2UgMTEzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzI3ICJzY2FubmVyLmwiCityZXR1cm4gcGNhcF90ZXh0WzBdOworCVlZX0JSRUFLCitjYXNlIDExNDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMyOCAic2Nhbm5lci5sIgorcmV0dXJuIEdFUTsKKwlZWV9CUkVBSworY2FzZSAxMTU6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMjkgInNjYW5uZXIubCIKK3JldHVybiBMRVE7CisJWVlfQlJFQUsKK2Nhc2UgMTE2OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzMwICJzY2FubmVyLmwiCityZXR1cm4gTkVROworCVlZX0JSRUFLCitjYXNlIDExNzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMzMSAic2Nhbm5lci5sIgorcmV0dXJuICc9JzsKKwlZWV9CUkVBSworY2FzZSAxMTg6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzMzIgInNjYW5uZXIubCIKK3JldHVybiBMU0g7CisJWVlfQlJFQUsKK2Nhc2UgMTE5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzMzICJzY2FubmVyLmwiCityZXR1cm4gUlNIOworCVlZX0JSRUFLCitjYXNlIDEyMDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDMzNCAic2Nhbm5lci5sIgoreyB5eWx2YWwuZSA9IHBjYXBfZXRoZXJfYXRvbigoKGNoYXIgKilwY2FwX3RleHQpKzEpOworCQkJICBpZiAoeXlsdmFsLmUgPT0gTlVMTCkKKwkJCQlicGZfZXJyb3IoIm1hbGxvYyIpOworCQkJICByZXR1cm4gQUlEOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTIxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzM4ICJzY2FubmVyLmwiCit7IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKChjaGFyICopcGNhcF90ZXh0KTsKKwkJCSAgaWYgKHl5bHZhbC5lID09IE5VTEwpCisJCQkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKKwkJCSAgcmV0dXJuIEVJRDsgfQorCVlZX0JSRUFLCitjYXNlIDEyMjoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM0MiAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IHN0b2koKGNoYXIgKilwY2FwX3RleHQpOyByZXR1cm4gTlVNOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTIzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzQzICJzY2FubmVyLmwiCit7CisJCQl5eWx2YWwucyA9IHNkdXAoKGNoYXIgKilwY2FwX3RleHQpOyByZXR1cm4gSElEOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTI0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzQ1ICJzY2FubmVyLmwiCiB7CiAjaWZkZWYgSU5FVDYKIAkJCSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwpAQCAtMzI5NCw2ICszNjgzLDcgQEAKIAkJCSAgaWYgKGdldGFkZHJpbmZvKHBjYXBfdGV4dCwgTlVMTCwgJmhpbnRzLCAmcmVzKSkKIAkJCQlicGZfZXJyb3IoImJvZ3VzIElQdjYgYWRkcmVzcyAlcyIsIHBjYXBfdGV4dCk7CiAJCQkgIGVsc2UgeworCQkJCWZyZWVhZGRyaW5mbyhyZXMpOwogCQkJCXl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXBjYXBfdGV4dCk7IHJldHVybiBISUQ2OwogCQkJICB9CiAjZWxzZQpAQCAtMzMwMSwxNTkgKzM2OTEsMTU5IEBACiAjZW5kaWYgLypJTkVUNiovCiAJCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTA4OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzMwICJzY2FubmVyLmwiCi17IGJwZl9lcnJvcigiYm9ndXMgZXRoZXJuZXQgYWRkcmVzcyAlcyIsIHBjYXBfdGV4dCk7IH0KLQlZWV9CUkVBSwotY2FzZSAxMDk6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAzMzEgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMTEwOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzMyICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTsgcmV0dXJuIE5VTTsgfQotCVlZX0JSRUFLCi1jYXNlIDExMToKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDMzMyAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU07IH0KLQlZWV9CUkVBSwotY2FzZSAxMTI6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAzMzQgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAzOyByZXR1cm4gTlVNOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMTEzOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzM1ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gNDsgcmV0dXJuIE5VTTsgfQotCVlZX0JSRUFLCi1jYXNlIDExNDoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDMzNiAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDU7IHJldHVybiBOVU07IH0KLQlZWV9CUkVBSwotY2FzZSAxMTU6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAzMzcgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSA4OyByZXR1cm4gTlVNOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMTE2OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzM4ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gOTsgcmV0dXJuIE5VTTsgfQotCVlZX0JSRUFLCi1jYXNlIDExNzoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDMzOSAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDEwOyByZXR1cm4gTlVNOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMTE4OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzQwICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTE7IHJldHVybiBOVU07IH0KLQlZWV9CUkVBSwotY2FzZSAxMTk6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAzNDEgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxMjsgcmV0dXJuIE5VTTsgfQotCVlZX0JSRUFLCi1jYXNlIDEyMDoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDM0MiAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDEzOyByZXR1cm4gTlVNOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMTIxOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzQzICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTQ7IHJldHVybiBOVU07IH0KLQlZWV9CUkVBSwotY2FzZSAxMjI6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAzNDQgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxNTsgcmV0dXJuIE5VTTsgfQotCVlZX0JSRUFLCi1jYXNlIDEyMzoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDM0NSAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDE2OyByZXR1cm4gTlVNOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMTI0OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMzQ2ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTc7IHJldHVybiBOVU07IH0KLQlZWV9CUkVBSwogY2FzZSAxMjU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNDcgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxODsgcmV0dXJuIE5VTTsgfQorI2xpbmUgMzYxICJzY2FubmVyLmwiCit7IGJwZl9lcnJvcigiYm9ndXMgZXRoZXJuZXQgYWRkcmVzcyAlcyIsIHBjYXBfdGV4dCk7IH0KIAlZWV9CUkVBSwogY2FzZSAxMjY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNDggInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxMzsgcmV0dXJuIE5VTTsgfQorI2xpbmUgMzYyICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMDsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEyNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM0OSAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDB4MDE7IHJldHVybiBOVU07IH0KKyNsaW5lIDM2MyAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDE7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMjg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNTAgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAweDAyOyByZXR1cm4gTlVNOyB9CisjbGluZSAzNjQgInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTI5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzUxICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMHgwNDsgcmV0dXJuIE5VTTsgfQorI2xpbmUgMzY1ICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMzsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1MiAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDB4MDg7IHJldHVybiBOVU07IH0KKyNsaW5lIDM2NiAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDQ7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMzE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNTMgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAweDEwOyByZXR1cm4gTlVNOyB9CisjbGluZSAzNjcgInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSA1OyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTMyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzU0ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMHgyMDsgcmV0dXJuIE5VTTsgfQorI2xpbmUgMzY4ICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gODsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1NSAic2Nhbm5lci5sIgotewotCQkJIHl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXBjYXBfdGV4dCk7IHJldHVybiBJRDsgfQorI2xpbmUgMzY5ICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gOTsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1NyAic2Nhbm5lci5sIgoteyB5eWx2YWwucyA9IHNkdXAoKGNoYXIgKilwY2FwX3RleHQgKyAxKTsgcmV0dXJuIElEOyB9CisjbGluZSAzNzAgInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSAxMDsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzNToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1OCAic2Nhbm5lci5sIgotewotCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHRva2VuOiAlcyIsIHBjYXBfdGV4dCk7IH0KKyNsaW5lIDM3MSAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDExOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTM2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzYwICJzY2FubmVyLmwiCi17IGJwZl9lcnJvcigiaWxsZWdhbCBjaGFyICclYyciLCAqcGNhcF90ZXh0KTsgfQorI2xpbmUgMzcyICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMTI7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMzc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNjEgInNjYW5uZXIubCIKKyNsaW5lIDM3MyAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDEzOyByZXR1cm4gTlVNOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTM4OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzc0ICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMTQ7IHJldHVybiBOVU07IH0KKwlZWV9CUkVBSworY2FzZSAxMzk6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzNzUgInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSAxNTsgcmV0dXJuIE5VTTsgfQorCVlZX0JSRUFLCitjYXNlIDE0MDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM3NiAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDE2OyByZXR1cm4gTlVNOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTQxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzc3ICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMTc7IHJldHVybiBOVU07IH0KKwlZWV9CUkVBSworY2FzZSAxNDI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzNzggInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSAxODsgcmV0dXJuIE5VTTsgfQorCVlZX0JSRUFLCitjYXNlIDE0MzoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM3OSAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDEzOyByZXR1cm4gTlVNOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTQ0OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzgwICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMHgwMTsgcmV0dXJuIE5VTTsgfQorCVlZX0JSRUFLCitjYXNlIDE0NToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM4MSAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDB4MDI7IHJldHVybiBOVU07IH0KKwlZWV9CUkVBSworY2FzZSAxNDY6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzODIgInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSAweDA0OyByZXR1cm4gTlVNOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTQ3OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzgzICJzY2FubmVyLmwiCit7IHl5bHZhbC5pID0gMHgwODsgcmV0dXJuIE5VTTsgfQorCVlZX0JSRUFLCitjYXNlIDE0ODoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM4NCAic2Nhbm5lci5sIgoreyB5eWx2YWwuaSA9IDB4MTA7IHJldHVybiBOVU07IH0KKwlZWV9CUkVBSworY2FzZSAxNDk6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzODUgInNjYW5uZXIubCIKK3sgeXlsdmFsLmkgPSAweDIwOyByZXR1cm4gTlVNOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTUwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzg2ICJzY2FubmVyLmwiCit7CisJCQkgeXlsdmFsLnMgPSBzZHVwKChjaGFyICopcGNhcF90ZXh0KTsgcmV0dXJuIElEOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTUxOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzg4ICJzY2FubmVyLmwiCit7IHl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXBjYXBfdGV4dCArIDEpOyByZXR1cm4gSUQ7IH0KKwlZWV9CUkVBSworY2FzZSAxNTI6CitZWV9SVUxFX1NFVFVQCisjbGluZSAzODkgInNjYW5uZXIubCIKK3sKKwkJCWJwZl9lcnJvcigiaWxsZWdhbCB0b2tlbjogJXMiLCBwY2FwX3RleHQpOyB9CisJWVlfQlJFQUsKK2Nhc2UgMTUzOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMzkxICJzY2FubmVyLmwiCit7IGJwZl9lcnJvcigiaWxsZWdhbCBjaGFyICclYyciLCAqcGNhcF90ZXh0KTsgfQorCVlZX0JSRUFLCitjYXNlIDE1NDoKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDM5MiAic2Nhbm5lci5sIgogRUNITzsKIAlZWV9CUkVBSwotI2xpbmUgMzQ1NyAiPHN0ZG91dD4iCisjbGluZSAzODQ3ICJzY2FubmVyLmMiCiBjYXNlIFlZX1NUQVRFX0VPRihJTklUSUFMKToKIAl5eXRlcm1pbmF0ZSgpOwogCkBAIC0zNjg0LDcgKzQwNzQsNyBAQAogCiAJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLwogCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAotCQkJKHl5X25fY2hhcnMpLCBudW1fdG9fcmVhZCApOworCQkJKHl5X25fY2hhcnMpLCAoc2l6ZV90KSBudW1fdG9fcmVhZCApOwogCiAJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKIAkJfQpAQCAtMzcwOCw2ICs0MDk4LDE0IEBACiAJZWxzZQogCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOwogCisJaWYgKCh5eV9zaXplX3QpICgoeXlfbl9jaGFycykgKyBudW1iZXJfdG9fbW92ZSkgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplKSB7CisJCS8qIEV4dGVuZCB0aGUgYXJyYXkgYnkgNTAlLCBwbHVzIHRoZSBudW1iZXIgd2UgcmVhbGx5IG5lZWQuICovCisJCXl5X3NpemVfdCBuZXdfc2l6ZSA9ICh5eV9uX2NoYXJzKSArIG51bWJlcl90b19tb3ZlICsgKCh5eV9uX2NoYXJzKSA+PiAxKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgPSAoY2hhciAqKSBwY2FwX3JlYWxsb2MoKHZvaWQgKikgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYsbmV3X3NpemUgICk7CisJCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKSIgKTsKKwl9CisKIAkoeXlfbl9jaGFycykgKz0gbnVtYmVyX3RvX21vdmU7CiAJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKIAlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKQEAgLTM3MzcsNyArNDEzNSw3IEBACiAJCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKIAkJCXsKIAkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTMzMCApCisJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTQ1OSApCiAJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQl9CiAJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwpAQCAtMzc2NSw1MiArNDE2MywxNSBAQAogCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKIAkJewogCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTMzMCApCisJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSAxNDU5ICkKIAkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQl9CiAJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107Ci0JeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gMTMyOSk7CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gMTQ1OCk7CiAKIAlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7CiB9CiAKLSAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYywgcmVnaXN0ZXIgY2hhciAqIHl5X2JwICkKLXsKLQlyZWdpc3RlciBjaGFyICp5eV9jcDsKLSAgICAKLSAgICB5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKLQotCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHBjYXBfdGV4dCAqLwotCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOwotCi0JaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCi0JCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCi0JCS8qICsyIGZvciBFT0IgY2hhcnMuICovCi0JCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9ICh5eV9uX2NoYXJzKSArIDI7Ci0JCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbCi0JCQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgKyAyXTsKLQkJcmVnaXN0ZXIgY2hhciAqc291cmNlID0KLQkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdOwotCi0JCXdoaWxlICggc291cmNlID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKQotCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKLQotCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7Ci0JCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0KLQkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemU7Ci0KLQkJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCi0JCQlZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBwdXNoLWJhY2sgb3ZlcmZsb3ciICk7Ci0JCX0KLQotCSotLXl5X2NwID0gKGNoYXIpIGM7Ci0KLQkoeXl0ZXh0X3B0cikgPSB5eV9icDsKLQkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsKLQkoeXlfY19idWZfcCkgPSB5eV9jcDsKLX0KLQogI2lmbmRlZiBZWV9OT19JTlBVVAogI2lmZGVmIF9fY3BsdXNwbHVzCiAgICAgc3RhdGljIGludCB5eWlucHV0ICh2b2lkKQpAQCAtNDEyMyw3ICs0NDg0LDkgQEAKIAkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXBjYXBfYWxsb2MKIAkJCQkJCQkJKG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKIAkJCQkJCQkJKTsKLQkJCisJCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKKwkJCQkJCQkJICAKIAkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spLCAwLCBudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKIAkJCQkKIAkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOwpAQCAtNDE0MSw2ICs0NTA0LDggQEAKIAkJCQkJCQkJKCh5eV9idWZmZXJfc3RhY2spLAogCQkJCQkJCQludW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCiAJCQkJCQkJCSk7CisJCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKIAogCQkvKiB6ZXJvIG9ubHkgdGhlIG5ldyBzbG90cy4qLwogCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjaykgKyAoeXlfYnVmZmVyX3N0YWNrX21heCksIDAsIGdyb3dfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOwpAQCAtNDE4NSwyNiArNDU1MCwyNiBAQAogCiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGEgc3RyaW5nLiBUaGUgbmV4dCBjYWxsIHRvIHBjYXBfbGV4KCkgd2lsbAogICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBzdHIuCi0gKiBAcGFyYW0gc3RyIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHNjYW4KKyAqIEBwYXJhbSB5eXN0ciBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBzY2FuCiAgKiAKICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgogICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCiAgKiAgICAgICBwY2FwX19zY2FuX2J5dGVzKCkgaW5zdGVhZC4KICAqLwotWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eV9zdHIgKQorWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eXN0ciApCiB7CiAgICAgCi0JcmV0dXJuIHBjYXBfX3NjYW5fYnl0ZXMoeXlfc3RyLHN0cmxlbih5eV9zdHIpICk7CisJcmV0dXJuIHBjYXBfX3NjYW5fYnl0ZXMoeXlzdHIsc3RybGVuKHl5c3RyKSApOwogfQogCiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byBwY2FwX2xleCgpIHdpbGwKICAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCi0gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHNjYW4KLSAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGEgYnl0ZXMuCisgKiBAcGFyYW0geXlieXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gc2NhbgorICogQHBhcmFtIF95eWJ5dGVzX2xlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYSBieXRlcy4KICAqIAogICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCiAgKi8KLVlZX0JVRkZFUl9TVEFURSBwY2FwX19zY2FuX2J5dGVzICAoeXljb25zdCBjaGFyICogYnl0ZXMsIGludCAgbGVuICkKK1lZX0JVRkZFUl9TVEFURSBwY2FwX19zY2FuX2J5dGVzICAoeXljb25zdCBjaGFyICogeXlieXRlcywgaW50ICBfeXlieXRlc19sZW4gKQogewogCVlZX0JVRkZFUl9TVEFURSBiOwogCWNoYXIgKmJ1ZjsKQEAgLTQyMTIsMTUgKzQ1NzcsMTUgQEAKIAlpbnQgaTsKICAgICAKIAkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KLQluID0gbGVuICsgMjsKKwluID0gX3l5Ynl0ZXNfbGVuICsgMjsKIAlidWYgPSAoY2hhciAqKSBwY2FwX2FsbG9jKG4gICk7CiAJaWYgKCAhIGJ1ZiApCiAJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHBjYXBfX3NjYW5fYnl0ZXMoKSIgKTsKIAotCWZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQotCQlidWZbaV0gPSBieXRlc1tpXTsKKwlmb3IgKCBpID0gMDsgaSA8IF95eWJ5dGVzX2xlbjsgKytpICkKKwkJYnVmW2ldID0geXlieXRlc1tpXTsKIAotCWJ1ZltsZW5dID0gYnVmW2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwlidWZbX3l5Ynl0ZXNfbGVuXSA9IGJ1ZltfeXlieXRlc19sZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CiAKIAliID0gcGNhcF9fc2Nhbl9idWZmZXIoYnVmLG4gKTsKIAlpZiAoICEgYiApCkBAIC00MjYzLDc0ICs0NjI4LDEwIEBACiAKIC8qIEFjY2Vzc29yICBtZXRob2RzIChnZXQvc2V0IGZ1bmN0aW9ucykgdG8gc3RydWN0IG1lbWJlcnMuICovCiAKLS8qKiBHZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCi0gKiAKLSAqLwotaW50IHBjYXBfZ2V0X2xpbmVubyAgKHZvaWQpCi17Ci0gICAgICAgIAotICAgIHJldHVybiBwY2FwX2xpbmVubzsKLX0KLQotLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgotICogCi0gKi8KLUZJTEUgKnBjYXBfZ2V0X2luICAodm9pZCkKLXsKLSAgICAgICAgcmV0dXJuIHBjYXBfaW47Ci19Ci0KLS8qKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCi0gKiAKLSAqLwotRklMRSAqcGNhcF9nZXRfb3V0ICAodm9pZCkKLXsKLSAgICAgICAgcmV0dXJuIHBjYXBfb3V0OwotfQotCi0vKiogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uCi0gKiAKLSAqLwotaW50IHBjYXBfZ2V0X2xlbmcgICh2b2lkKQotewotICAgICAgICByZXR1cm4gcGNhcF9sZW5nOwotfQotCiAvKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgogICogCiAgKi8KIAotY2hhciAqcGNhcF9nZXRfdGV4dCAgKHZvaWQpCi17Ci0gICAgICAgIHJldHVybiBwY2FwX3RleHQ7Ci19Ci0KLS8qKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCi0gKiBAcGFyYW0gbGluZV9udW1iZXIKLSAqIAotICovCi12b2lkIHBjYXBfc2V0X2xpbmVubyAoaW50ICBsaW5lX251bWJlciApCi17Ci0gICAgCi0gICAgcGNhcF9saW5lbm8gPSBsaW5lX251bWJlcjsKLX0KLQotLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGRpc2NhcmQgdGhlIGN1cnJlbnQKLSAqIGlucHV0IGJ1ZmZlci4KLSAqIEBwYXJhbSBpbl9zdHIgQSByZWFkYWJsZSBzdHJlYW0uCi0gKiAKLSAqIEBzZWUgcGNhcF9fc3dpdGNoX3RvX2J1ZmZlcgotICovCi12b2lkIHBjYXBfc2V0X2luIChGSUxFICogIGluX3N0ciApCi17Ci0gICAgICAgIHBjYXBfaW4gPSBpbl9zdHIgOwotfQotCi12b2lkIHBjYXBfc2V0X291dCAoRklMRSAqICBvdXRfc3RyICkKLXsKLSAgICAgICAgcGNhcF9vdXQgPSBvdXRfc3RyIDsKLX0KLQogaW50IHBjYXBfZ2V0X2RlYnVnICAodm9pZCkKIHsKICAgICAgICAgcmV0dXJuIHBjYXBfX2ZsZXhfZGVidWc7CkBAIC00MzQxLDYgKzQ2NDIsMzQgQEAKICAgICAgICAgcGNhcF9fZmxleF9kZWJ1ZyA9IGJkZWJ1ZyA7CiB9CiAKK3N0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkKQoreworICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG5vbi1yZWVudHJhbnQgc2Nhbm5lci4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHBjYXBfbGV4X2Rlc3Ryb3koKSwgc28gZG9uJ3QgYWxsb2NhdGUgaGVyZS4KKyAgICAgKi8KKworICAgICh5eV9idWZmZXJfc3RhY2spID0gMDsKKyAgICAoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOworICAgICh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IDA7CisgICAgKHl5X2NfYnVmX3ApID0gKGNoYXIgKikgMDsKKyAgICAoeXlfaW5pdCkgPSAwOworICAgICh5eV9zdGFydCkgPSAwOworCisvKiBEZWZpbmVkIGluIG1haW4uYyAqLworI2lmZGVmIFlZX1NURElOSVQKKyAgICBwY2FwX2luID0gc3RkaW47CisgICAgcGNhcF9vdXQgPSBzdGRvdXQ7CisjZWxzZQorICAgIHBjYXBfaW4gPSAoRklMRSAqKSAwOworICAgIHBjYXBfb3V0ID0gKEZJTEUgKikgMDsKKyNlbmRpZgorCisgICAgLyogRm9yIGZ1dHVyZSByZWZlcmVuY2U6IFNldCBlcnJubyBvbiBlcnJvciwgc2luY2Ugd2UgYXJlIGNhbGxlZCBieQorICAgICAqIHBjYXBfbGV4X2luaXQoKQorICAgICAqLworICAgIHJldHVybiAwOworfQorCiAvKiBwY2FwX2xleF9kZXN0cm95IGlzIGZvciBib3RoIHJlZW50cmFudCBhbmQgbm9uLXJlZW50cmFudCBzY2FubmVycy4gKi8KIGludCBwY2FwX2xleF9kZXN0cm95ICAodm9pZCkKIHsKQEAgLTQzNTYsNiArNDY4NSwxMCBAQAogCXBjYXBfZnJlZSgoeXlfYnVmZmVyX3N0YWNrKSApOwogCSh5eV9idWZmZXJfc3RhY2spID0gTlVMTDsKIAorICAgIC8qIFJlc2V0IHRoZSBnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBpbiBhIG5vbi1yZWVudHJhbnQgc2Nhbm5lciBzbyB0aGUgbmV4dCB0aW1lCisgICAgICogcGNhcF9sZXgoKSBpcyBjYWxsZWQsIGluaXRpYWxpemF0aW9uIHdpbGwgb2NjdXIuICovCisgICAgeXlfaW5pdF9nbG9iYWxzKCApOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTQzNjcsNyArNDcwMCw3IEBACiBzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIqIHMxLCB5eWNvbnN0IGNoYXIgKiBzMiwgaW50IG4gKQogewogCXJlZ2lzdGVyIGludCBpOwotICAgIAlmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQogCQlzMVtpXSA9IHMyW2ldOwogfQogI2VuZGlmCkBAIC00Mzc2LDcgKzQ3MDksNyBAQAogc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogcyApCiB7CiAJcmVnaXN0ZXIgaW50IG47Ci0gICAgCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQorCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQogCQk7CiAKIAlyZXR1cm4gbjsKQEAgLTQ0MDcsMTkgKzQ3NDAsNyBAQAogCiAjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgogCi0jdW5kZWYgWVlfTkVXX0ZJTEUKLSN1bmRlZiBZWV9GTFVTSF9CVUZGRVIKLSN1bmRlZiB5eV9zZXRfYm9sCi0jdW5kZWYgeXlfbmV3X2J1ZmZlcgotI3VuZGVmIHl5X3NldF9pbnRlcmFjdGl2ZQotI3VuZGVmIHl5dGV4dF9wdHIKLSN1bmRlZiBZWV9ET19CRUZPUkVfQUNUSU9OCi0KLSNpZmRlZiBZWV9ERUNMX0lTX09VUlMKLSN1bmRlZiBZWV9ERUNMX0lTX09VUlMKLSN1bmRlZiBZWV9ERUNMCi0jZW5kaWYKLSNsaW5lIDM2MSAic2Nhbm5lci5sIgorI2xpbmUgMzkyICJzY2FubmVyLmwiCiAKIAogdm9pZApkaWZmIC0tZ2l0IGEvc2Nhbm5lci5oIGIvc2Nhbm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNGNhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY2FubmVyLmgKQEAgLTAsMCArMSw2IEBACisvKiBUaGlzIGlzIGdlbmVyYXRlZCBieSBydW5sZXguc2guICBEbyBub3QgZWRpdCBpdC4gKi8KKworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4KHZvaWQpCisjZW5kaWYgIAorWVlfREVDTDsKZGlmZiAtLWdpdCBhL3NjYW5uZXIubCBiL3NjYW5uZXIubAppbmRleCAwMWZhY2UxLi5kYWE1ZWFlIDEwMDY0NAotLS0gYS9zY2FubmVyLmwKKysrIGIvc2Nhbm5lci5sCkBAIC0yMiwxMyArMjIsMjcgQEAKIAogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvc2Nhbm5lci5sLHYgMS45OS4yLjkgMjAwNy8wNi8xMSAwOTo1MjowNSBndXkgRXhwICQgKExCTCkiOworICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3NjYW5uZXIubCx2IDEuMTEyIDIwMDgtMDItMDYgMTA6MjE6MzAgZ3V5IEV4cCAkIChMQkwpIjsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKwogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTQwLDcgKzU0LDcgQEAKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgogCiAjaWZkZWYgX19NSU5HVzMyX18KLSNpbmNsdWRlICJJUDZfbWlzYy5oIgorI2luY2x1ZGUgImlwNl9taXNjLmgiCiAjZW5kaWYKICNlbHNlIC8qIFdJTjMyICovCiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgkvKiBmb3IgInN0cnVjdCBzb2NrYWRkciIgaW4gInN0cnVjdCBhZGRyaW5mbyIgKi8KQEAgLTUyLDcgKzY2LDcgQEAKICNkZWZpbmUgQUlfTlVNRVJJQ0hPU1QgMHgwNAogI2VuZGlmCiAjZW5kaWYgLypJTkVUNiovCi0jaW5jbHVkZSA8cGNhcC1uYW1lZGIuaD4KKyNpbmNsdWRlIDxwY2FwL25hbWVkYi5oPgogI2luY2x1ZGUgInRva2RlZnMuaCIKIAogI2lmZGVmIEhBVkVfT1NfUFJPVE9fSApAQCAtNjMsMTAgKzc3LDExIEBACiBzdGF0aWMgaW5saW5lIGludCB4ZHRvaShpbnQpOwogCiAjaWZkZWYgRkxFWF9TQ0FOTkVSCisjZGVmaW5lIFlZX05PX0lOUFVUCiAjZGVmaW5lIFlZX05PX1VOUFVUCiBzdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluX2J1ZmZlcjsKICNlbHNlCi1zdGF0aWMgY2hhciAqaW5fYnVmZmVyOworc3RhdGljIGNvbnN0IGNoYXIgKmluX2J1ZmZlcjsKIAogI3VuZGVmIGdldGMKICNkZWZpbmUgZ2V0YyhmcCkgICgqaW5fYnVmZmVyID09IDAgPyBFT0YgOiAqaW5fYnVmZmVyKyspCkBAIC03OSw2ICs5NCw3IEBACiAKIE4JCShbMC05XSt8KDBYfDB4KVswLTlBLUZhLWZdKykKIEIJCShbMC05QS1GYS1mXVswLTlBLUZhLWZdPykKK0IyCQkoWzAtOUEtRmEtZl1bMC05QS1GYS1mXVswLTlBLUZhLWZdWzAtOUEtRmEtZl0pCiBXCQkoWzAtOUEtRmEtZl1bMC05QS1GYS1mXT9bMC05QS1GYS1mXT9bMC05QS1GYS1mXT8pCiAKICVhIDE4NDAwCkBAIC0xNjYsNiArMTgyLDEwIEBACiAKIFY2CQkoe1Y2ODB9fHtWNjcwfXx7VjY3MX18e1Y2NzJ9fHtWNjczfXx7VjY3NH18e1Y2NzV9fHtWNjc2fXx7VjY3N318e1Y2NjB9fHtWNjYxfXx7VjY2Mn18e1Y2NjN9fHtWNjY0fXx7VjY2NX18e1Y2NjZ9fHtWNjUwfXx7VjY1MX18e1Y2NTJ9fHtWNjUzfXx7VjY1NH18e1Y2NTV9fHtWNjQwfXx7VjY0MX18e1Y2NDJ9fHtWNjQzfXx7VjY0NH18e1Y2MzB9fHtWNjMxfXx7VjYzMn18e1Y2MzN9fHtWNjIwfXx7VjYyMX18e1Y2MjJ9fHtWNjEwfXx7VjYxMX18e1Y2MDB9fHtWNjYwNH18e1Y2NTA0fXx7VjY1MTR9fHtWNjUyNH18e1Y2NTM0fXx7VjY1NDR9fHtWNjU1NH18e1Y2NDA0fXx7VjY0MTR9fHtWNjQyNH18e1Y2NDM0fXx7VjY0NDR9fHtWNjMwNH18e1Y2MzE0fXx7VjYzMjR9fHtWNjMzNH18e1Y2MjA0fXx7VjYyMTR9fHtWNjIyNH18e1Y2MTA0fXx7VjYxMTR9fHtWNjAwNH0pCiAKK01BQwkJKHtCfTp7Qn06e0J9OntCfTp7Qn06e0J9fHtCfVwte0J9XC17Qn1cLXtCfVwte0J9XC17Qn18e0J9XC57Qn1cLntCfVwue0J9XC57Qn1cLntCfXx7QjJ9XC57QjJ9XC57QjJ9fHtCMn17M30pCisKKworCiAlJQogZHN0CQlyZXR1cm4gRFNUOwogc3JjCQlyZXR1cm4gU1JDOwpAQCAtMTgzLDIyICsyMDMsMTEgQEAKIGlncnAJCXJldHVybiBJR1JQOwogcGltCQlyZXR1cm4gUElNOwogdnJycAkJcmV0dXJuIFZSUlA7CitjYXJwCQlyZXR1cm4gQ0FSUDsKIHJhZGlvCQlyZXR1cm4gUkFESU87CiAKLWlwNgkJewotI2lmZGVmIElORVQ2Ci0JCXJldHVybiBJUFY2OwotI2Vsc2UKLQkJYnBmX2Vycm9yKCIlcyBub3Qgc3VwcG9ydGVkIiwgeXl0ZXh0KTsKLSNlbmRpZgotCQl9Ci1pY21wNgkJewotI2lmZGVmIElORVQ2Ci0JCXJldHVybiBJQ01QVjY7Ci0jZWxzZQotCQlicGZfZXJyb3IoIiVzIG5vdCBzdXBwb3J0ZWQiLCB5eXRleHQpOwotI2VuZGlmCi0JCX0KK2lwNgkJcmV0dXJuIElQVjY7CitpY21wNgkJcmV0dXJuIElDTVBWNjsKIGFoCQlyZXR1cm4gQUg7CiBlc3AJCXJldHVybiBFU1A7CiAKQEAgLTI0Nyw2ICsyNTYsMTYgQEAKIAogZ2F0ZXdheQkJcmV0dXJuIEdBVEVXQVk7CiAKK3R5cGUJCXJldHVybiBUWVBFOworc3VidHlwZQkJcmV0dXJuIFNVQlRZUEU7CitkaXJlY3Rpb258ZGlyCXJldHVybiBESVI7CithZGRyZXNzMXxhZGRyMQlyZXR1cm4gQUREUjE7CithZGRyZXNzMnxhZGRyMglyZXR1cm4gQUREUjI7CithZGRyZXNzM3xhZGRyMwlyZXR1cm4gQUREUjM7CithZGRyZXNzNHxhZGRyNAlyZXR1cm4gQUREUjQ7CityYQkJcmV0dXJuIFJBOwordGEJCXJldHVybiBUQTsKKwogbGVzcwkJcmV0dXJuIExFU1M7CiBncmVhdGVyCQlyZXR1cm4gR1JFQVRFUjsKIGJ5dGUJCXJldHVybiBDQllURTsKQEAgLTI5MiwxMCArMzExLDE3IEBACiBsc3N1CQlyZXR1cm4gTFNTVTsKIGxzdQkJcmV0dXJuIExTU1U7CiBtc3UJCXJldHVybiBNU1U7CitoZmlzdQkJcmV0dXJuIEhGSVNVOworaGxzc3UJCXJldHVybiBITFNTVTsKK2htc3UJCXJldHVybiBITVNVOwogc2lvCQlyZXR1cm4gU0lPOwogb3BjCQlyZXR1cm4gT1BDOwogZHBjCQlyZXR1cm4gRFBDOwogc2xzCQlyZXR1cm4gU0xTOworaHNpbwkJcmV0dXJuIEhTSU87Citob3BjCQlyZXR1cm4gSE9QQzsKK2hkcGMJCXJldHVybiBIRFBDOworaHNscwkJcmV0dXJuIEhTTFM7CiAKIFsgXHJcblx0XQkJOwogWytcLSovOlxbXF0hPD4oKSZ8PV0JcmV0dXJuIHl5dGV4dFswXTsKQEAgLTMwNiwxMiArMzMyLDE2IEBACiAiPDwiCQkJcmV0dXJuIExTSDsKICI+PiIJCQlyZXR1cm4gUlNIOwogJHtCfQkJCXsgeXlsdmFsLmUgPSBwY2FwX2V0aGVyX2F0b24oKChjaGFyICopeXl0ZXh0KSsxKTsKKwkJCSAgaWYgKHl5bHZhbC5lID09IE5VTEwpCisJCQkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKIAkJCSAgcmV0dXJuIEFJRDsgfQore01BQ30JCQl7IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKChjaGFyICopeXl0ZXh0KTsKKwkJCSAgaWYgKHl5bHZhbC5lID09IE5VTEwpCisJCQkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKKwkJCSAgcmV0dXJuIEVJRDsgfQoge059CQkJeyB5eWx2YWwuaSA9IHN0b2koKGNoYXIgKil5eXRleHQpOyByZXR1cm4gTlVNOyB9CiAoe059XC57Tn0pfCh7Tn1cLntOfVwue059KXwoe059XC57Tn1cLntOfVwue059KQl7CiAJCQl5eWx2YWwucyA9IHNkdXAoKGNoYXIgKil5eXRleHQpOyByZXR1cm4gSElEOyB9Ci17Qn06e0J9OntCfTp7Qn06e0J9OntCfSB7IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKChjaGFyICopeXl0ZXh0KTsKLQkJCSAgcmV0dXJuIEVJRDsgfQoge1Y2fQkJCXsKICNpZmRlZiBJTkVUNgogCQkJICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CkBAIC0zMjEsNiArMzUxLDcgQEAKIAkJCSAgaWYgKGdldGFkZHJpbmZvKHl5dGV4dCwgTlVMTCwgJmhpbnRzLCAmcmVzKSkKIAkJCQlicGZfZXJyb3IoImJvZ3VzIElQdjYgYWRkcmVzcyAlcyIsIHl5dGV4dCk7CiAJCQkgIGVsc2UgeworCQkJCWZyZWVhZGRyaW5mbyhyZXMpOwogCQkJCXl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBISUQ2OwogCQkJICB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvc2YtcGNhcC1uZy5jIGIvc2YtcGNhcC1uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzFmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZi1wY2FwLW5nLmMKQEAgLTAsMCArMSwxMjc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogc2YtcGNhcC1uZy5jIC0gcGNhcC1uZy1maWxlLWZvcm1hdC1zcGVjaWZpYyBjb2RlIGZyb20gc2F2ZWZpbGUuYworICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXIkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpbmNsdWRlICJwY2FwLWNvbW1vbi5oIgorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic2YtcGNhcC1uZy5oIgorCisvKgorICogQmxvY2sgdHlwZXMuCisgKi8KKworLyoKKyAqIENvbW1vbiBwYXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIGJsb2Nrcy4KKyAqLworc3RydWN0IGJsb2NrX2hlYWRlciB7CisJYnBmX3VfaW50MzIJYmxvY2tfdHlwZTsKKwlicGZfdV9pbnQzMgl0b3RhbF9sZW5ndGg7Cit9OworCisvKgorICogQ29tbW9uIHRyYWlsZXIgYXQgdGhlIGVuZCBvZiBhbGwgYmxvY2tzLgorICovCitzdHJ1Y3QgYmxvY2tfdHJhaWxlciB7CisJYnBmX3VfaW50MzIJdG90YWxfbGVuZ3RoOworfTsKKworLyoKKyAqIENvbW1vbiBvcHRpb25zLgorICovCisjZGVmaW5lIE9QVF9FTkRPRk9QVAkwCS8qIGVuZCBvZiBvcHRpb25zICovCisjZGVmaW5lIE9QVF9DT01NRU5UCTEJLyogY29tbWVudCBzdHJpbmcgKi8KKworLyoKKyAqIE9wdGlvbiBoZWFkZXIuCisgKi8KK3N0cnVjdCBvcHRpb25faGVhZGVyIHsKKwl1X3Nob3J0CQlvcHRpb25fY29kZTsKKwl1X3Nob3J0CQlvcHRpb25fbGVuZ3RoOworfTsKKworLyoKKyAqIFN0cnVjdHVyZXMgZm9yIHRoZSBwYXJ0IG9mIGVhY2ggYmxvY2sgdHlwZSBmb2xsb3dpbmcgdGhlIGNvbW1vbgorICogcGFydC4KKyAqLworCisvKgorICogU2VjdGlvbiBIZWFkZXIgQmxvY2suCisgKi8KKyNkZWZpbmUgQlRfU0hCCQkJMHgwQTBEMEQwQQorCitzdHJ1Y3Qgc2VjdGlvbl9oZWFkZXJfYmxvY2sgeworCWJwZl91X2ludDMyCWJ5dGVfb3JkZXJfbWFnaWM7CisJdV9zaG9ydAkJbWFqb3JfdmVyc2lvbjsKKwl1X3Nob3J0CQltaW5vcl92ZXJzaW9uOworCXVfaW50NjRfdAlzZWN0aW9uX2xlbmd0aDsKKwkvKiBmb2xsb3dlZCBieSBvcHRpb25zIGFuZCB0cmFpbGVyICovCit9OworCisvKgorICogQnl0ZS1vcmRlciBtYWdpYyB2YWx1ZS4KKyAqLworI2RlZmluZSBCWVRFX09SREVSX01BR0lDCTB4MUEyQjNDNEQKKworLyoKKyAqIEN1cnJlbnQgdmVyc2lvbiBudW1iZXIuICBJZiBtYWpvcl92ZXJzaW9uIGlzbid0IFBDQVBfTkdfVkVSU0lPTl9NQUpPUiwKKyAqIHRoYXQgbWVhbnMgdGhhdCB0aGlzIGNvZGUgY2FuJ3QgcmVhZCB0aGUgZmlsZS4KKyAqLworI2RlZmluZSBQQ0FQX05HX1ZFUlNJT05fTUFKT1IJMQorCisvKgorICogSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrLgorICovCisjZGVmaW5lIEJUX0lEQgkJCTB4MDAwMDAwMDEKKworc3RydWN0IGludGVyZmFjZV9kZXNjcmlwdGlvbl9ibG9jayB7CisJdV9zaG9ydAkJbGlua3R5cGU7CisJdV9zaG9ydAkJcmVzZXJ2ZWQ7CisJYnBmX3VfaW50MzIJc25hcGxlbjsKKwkvKiBmb2xsb3dlZCBieSBvcHRpb25zIGFuZCB0cmFpbGVyICovCit9OworCisvKgorICogT3B0aW9ucyBpbiB0aGUgSURCLgorICovCisjZGVmaW5lIElGX05BTUUJCTIJLyogaW50ZXJmYWNlIG5hbWUgc3RyaW5nICovCisjZGVmaW5lIElGX0RFU0NSSVBUSU9OCTMJLyogaW50ZXJmYWNlIGRlc2NyaXB0aW9uIHN0cmluZyAqLworI2RlZmluZSBJRl9JUFY0QUREUgk0CS8qIGludGVyZmFjZSdzIElQdjQgYWRkcmVzcyBhbmQgbmV0bWFzayAqLworI2RlZmluZSBJRl9JUFY2QUREUgk1CS8qIGludGVyZmFjZSdzIElQdjYgYWRkcmVzcyBhbmQgcHJlZml4IGxlbmd0aCAqLworI2RlZmluZSBJRl9NQUNBRERSCTYJLyogaW50ZXJmYWNlJ3MgTUFDIGFkZHJlc3MgKi8KKyNkZWZpbmUgSUZfRVVJQUREUgk3CS8qIGludGVyZmFjZSdzIEVVSSBhZGRyZXNzICovCisjZGVmaW5lIElGX1NQRUVECTgJLyogaW50ZXJmYWNlJ3Mgc3BlZWQsIGluIGJpdHMvcyAqLworI2RlZmluZSBJRl9UU1JFU09MCTkJLyogaW50ZXJmYWNlJ3MgdGltZSBzdGFtcCByZXNvbHV0aW9uICovCisjZGVmaW5lIElGX1RaT05FCTEwCS8qIGludGVyZmFjZSdzIHRpbWUgem9uZSAqLworI2RlZmluZSBJRl9GSUxURVIJMTEJLyogZmlsdGVyIHVzZWQgd2hlbiBjYXB0dXJpbmcgb24gaW50ZXJmYWNlICovCisjZGVmaW5lIElGX09TCQkxMgkvKiBzdHJpbmcgT1Mgb24gd2hpY2ggY2FwdHVyZSBvbiB0aGlzIGludGVyZmFjZSB3YXMgZG9uZSAqLworI2RlZmluZSBJRl9GQ1NMRU4JMTMJLyogRkNTIGxlbmd0aCBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgSUZfVFNPRkZTRVQJMTQJLyogdGltZSBzdGFtcCBvZmZzZXQgZm9yIHRoaXMgaW50ZXJmYWNlICovCisKKy8qCisgKiBFbmhhbmNlZCBQYWNrZXQgQmxvY2suCisgKi8KKyNkZWZpbmUgQlRfRVBCCQkJMHgwMDAwMDAwNgorCitzdHJ1Y3QgZW5oYW5jZWRfcGFja2V0X2Jsb2NrIHsKKwlicGZfdV9pbnQzMglpbnRlcmZhY2VfaWQ7CisJYnBmX3VfaW50MzIJdGltZXN0YW1wX2hpZ2g7CisJYnBmX3VfaW50MzIJdGltZXN0YW1wX2xvdzsKKwlicGZfdV9pbnQzMgljYXBsZW47CisJYnBmX3VfaW50MzIJbGVuOworCS8qIGZvbGxvd2VkIGJ5IHBhY2tldCBkYXRhLCBvcHRpb25zLCBhbmQgdHJhaWxlciAqLworfTsKKworLyoKKyAqIFNpbXBsZSBQYWNrZXQgQmxvY2suCisgKi8KKyNkZWZpbmUgQlRfU1BCCQkJMHgwMDAwMDAwMworCitzdHJ1Y3Qgc2ltcGxlX3BhY2tldF9ibG9jayB7CisJYnBmX3VfaW50MzIJbGVuOworCS8qIGZvbGxvd2VkIGJ5IHBhY2tldCBkYXRhIGFuZCB0cmFpbGVyICovCit9OworCisvKgorICogUGFja2V0IEJsb2NrLgorICovCisjZGVmaW5lIEJUX1BCCQkJMHgwMDAwMDAwMgorCitzdHJ1Y3QgcGFja2V0X2Jsb2NrIHsKKwl1X3Nob3J0CQlpbnRlcmZhY2VfaWQ7CisJdV9zaG9ydAkJZHJvcHNfY291bnQ7CisJYnBmX3VfaW50MzIJdGltZXN0YW1wX2hpZ2g7CisJYnBmX3VfaW50MzIJdGltZXN0YW1wX2xvdzsKKwlicGZfdV9pbnQzMgljYXBsZW47CisJYnBmX3VfaW50MzIJbGVuOworCS8qIGZvbGxvd2VkIGJ5IHBhY2tldCBkYXRhLCBvcHRpb25zLCBhbmQgdHJhaWxlciAqLworfTsKKworLyoKKyAqIEJsb2NrIGN1cnNvciAtIHVzZWQgd2hlbiBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhIGJsb2NrLgorICogQ29udGFpbnMgYSBwb2ludGVyIGludG8gdGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkIGFuZCBhIGNvdW50CisgKiBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIGJsb2NrLgorICovCitzdHJ1Y3QgYmxvY2tfY3Vyc29yIHsKKwl1X2NoYXIJCSpkYXRhOworCXNpemVfdAkJZGF0YV9yZW1haW5pbmc7CisJYnBmX3VfaW50MzIJYmxvY2tfdHlwZTsKK307CisKK3R5cGVkZWYgZW51bSB7CisJUEFTU19USFJPVUdILAorCVNDQUxFX1VQLAorCVNDQUxFX0RPV04KK30gdHN0YW1wX3NjYWxlX3R5cGVfdDsKKworLyoKKyAqIFBlci1pbnRlcmZhY2UgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBwY2FwX25nX2lmIHsKKwl1X2ludCB0c3Jlc29sOwkJCS8qIHRpbWUgc3RhbXAgcmVzb2x1dGlvbiAqLworCXVfaW50NjRfdCB0c29mZnNldDsJCS8qIHRpbWUgc3RhbXAgb2Zmc2V0ICovCisJdHN0YW1wX3NjYWxlX3R5cGVfdCBzY2FsZV90eXBlOwkvKiBob3cgdG8gc2NhbGUgKi8KK307CisKK3N0cnVjdCBwY2FwX25nX3NmIHsKKwl1X2ludCB1c2VyX3RzcmVzb2w7CQkvKiB0aW1lIHN0YW1wIHJlc29sdXRpb24gcmVxdWVzdGVkIGJ5IHRoZSB1c2VyICovCisJYnBmX3VfaW50MzIgaWZjb3VudDsJCS8qIG51bWJlciBvZiBpbnRlcmZhY2VzIHNlZW4gaW4gdGhpcyBjYXB0dXJlICovCisJYnBmX3VfaW50MzIgaWZhY2VzX3NpemU7CS8qIHNpemUgb2YgYXJyYXJ5IGJlbG93ICovCisJc3RydWN0IHBjYXBfbmdfaWYgKmlmYWNlczsJLyogYXJyYXkgb2YgaW50ZXJmYWNlIGluZm9ybWF0aW9uICovCit9OworCitzdGF0aWMgdm9pZCBwY2FwX25nX2NsZWFudXAocGNhcF90ICpwKTsKK3N0YXRpYyBpbnQgcGNhcF9uZ19uZXh0X3BhY2tldChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3BrdGhkciAqaGRyLAorICAgIHVfY2hhciAqKmRhdGEpOworCitzdGF0aWMgaW50CityZWFkX2J5dGVzKEZJTEUgKmZwLCB2b2lkICpidWYsIHNpemVfdCBieXRlc190b19yZWFkLCBpbnQgZmFpbF9vbl9lb2YsCisgICAgY2hhciAqZXJyYnVmKQoreworCXNpemVfdCBhbXRfcmVhZDsKKworCWFtdF9yZWFkID0gZnJlYWQoYnVmLCAxLCBieXRlc190b19yZWFkLCBmcCk7CisJaWYgKGFtdF9yZWFkICE9IGJ5dGVzX3RvX3JlYWQpIHsKKwkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYW10X3JlYWQgPT0gMCAmJiAhZmFpbF9vbl9lb2YpCisJCQkJcmV0dXJuICgwKTsJLyogRU9GICovCisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWx1IGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJ5dGVzX3RvX3JlYWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOworCQl9CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CityZWFkX2Jsb2NrKEZJTEUgKmZwLCBwY2FwX3QgKnAsIHN0cnVjdCBibG9ja19jdXJzb3IgKmN1cnNvciwgY2hhciAqZXJyYnVmKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJsb2NrX2hlYWRlciBiaGRyOworCisJc3RhdHVzID0gcmVhZF9ieXRlcyhmcCwgJmJoZHIsIHNpemVvZihiaGRyKSwgMCwgZXJyYnVmKTsKKwlpZiAoc3RhdHVzIDw9IDApCisJCXJldHVybiAoc3RhdHVzKTsJLyogZXJyb3Igb3IgRU9GICovCisKKwlpZiAocC0+c3dhcHBlZCkgeworCQliaGRyLmJsb2NrX3R5cGUgPSBTV0FQTE9ORyhiaGRyLmJsb2NrX3R5cGUpOworCQliaGRyLnRvdGFsX2xlbmd0aCA9IFNXQVBMT05HKGJoZHIudG90YWxfbGVuZ3RoKTsKKwl9CisKKwkvKgorCSAqIElzIHRoaXMgYmxvY2sgInRvbyBiaWciPworCSAqCisJICogV2UgY2hvb3NlIDE2TUIgYXMgInRvbyBiaWciLCBmb3Igbm93LCBzbyB0aGF0IHdlIGhhbmRsZQorCSAqICJyZWFzb25hYmx5IiBsYXJnZSBidWZmZXJzIGJ1dCBkb24ndCBjaGV3IHVwIGFsbCB0aGUKKwkgKiBtZW1vcnkgaWYgd2UgcmVhZCBhIG1hbGZvcm1lZCBmaWxlLgorCSAqLworCWlmIChiaGRyLnRvdGFsX2xlbmd0aCA+IDE2KjEwMjQqMTAyNCkgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAicGNhcC1uZyBibG9jayBzaXplICV1ID4gbWF4aW11bSAldSIsCisJCSAgICBiaGRyLnRvdGFsX2xlbmd0aCwgMTYqMTAyNCoxMDI0KTsKKwkJICAgIHJldHVybiAoLTEpOworCX0KKworCS8qCisJICogSXMgdGhpcyBibG9jayAidG9vIHNtYWxsIiAtIGkuZS4sIGlzIGl0IHNob3J0ZXIgdGhhbiBhIGJsb2NrCisJICogaGVhZGVyIHBsdXMgYSBibG9jayB0cmFpbGVyPworCSAqLworCWlmIChiaGRyLnRvdGFsX2xlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmxvY2tfaGVhZGVyKSArCisJICAgIHNpemVvZihzdHJ1Y3QgYmxvY2tfdHJhaWxlcikpIHsKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImJsb2NrIGluIHBjYXAtbmcgZHVtcCBmaWxlIGhhcyBhIGxlbmd0aCBvZiAldSA8ICVsdSIsCisJCSAgICBiaGRyLnRvdGFsX2xlbmd0aCwKKwkJICAgICh1bnNpZ25lZCBsb25nKShzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGJsb2NrX3RyYWlsZXIpKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qCisJICogSXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPworCSAqLworCWlmIChwLT5idWZzaXplIDwgYmhkci50b3RhbF9sZW5ndGgpIHsKKwkJLyoKKwkJICogTm8gLSBtYWtlIGl0IGJpZyBlbm91Z2guCisJCSAqLworCQlwLT5idWZmZXIgPSByZWFsbG9jKHAtPmJ1ZmZlciwgYmhkci50b3RhbF9sZW5ndGgpOworCQlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBzdHVmZiB3ZSd2ZSByZWFkIHRvIHRoZSBidWZmZXIsIGFuZCByZWFkIHRoZSByZXN0CisJICogb2YgdGhlIGJsb2NrLgorCSAqLworCW1lbWNweShwLT5idWZmZXIsICZiaGRyLCBzaXplb2YoYmhkcikpOworCWlmIChyZWFkX2J5dGVzKGZwLCBwLT5idWZmZXIgKyBzaXplb2YoYmhkciksCisJICAgIGJoZHIudG90YWxfbGVuZ3RoIC0gc2l6ZW9mKGJoZHIpLCAxLCBlcnJidWYpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgY3Vyc29yLgorCSAqLworCWN1cnNvci0+ZGF0YSA9IHAtPmJ1ZmZlciArIHNpemVvZihiaGRyKTsKKwljdXJzb3ItPmRhdGFfcmVtYWluaW5nID0gYmhkci50b3RhbF9sZW5ndGggLSBzaXplb2YoYmhkcikgLQorCSAgICBzaXplb2Yoc3RydWN0IGJsb2NrX3RyYWlsZXIpOworCWN1cnNvci0+YmxvY2tfdHlwZSA9IGJoZHIuYmxvY2tfdHlwZTsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZCAqCitnZXRfZnJvbV9ibG9ja19kYXRhKHN0cnVjdCBibG9ja19jdXJzb3IgKmN1cnNvciwgc2l6ZV90IGNodW5rX3NpemUsCisgICAgY2hhciAqZXJyYnVmKQoreworCXZvaWQgKmRhdGE7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGRhdGEgcmVtYWluaW5nIGluCisJICogdGhlIGJsb2NrIGRhdGEuCisJICovCisJaWYgKGN1cnNvci0+ZGF0YV9yZW1haW5pbmcgPCBjaHVua19zaXplKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJibG9jayBvZiB0eXBlICV1IGluIHBjYXAtbmcgZHVtcCBmaWxlIGlzIHRvbyBzaG9ydCIsCisJCSAgICBjdXJzb3ItPmJsb2NrX3R5cGUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogUmV0dXJuIHRoZSBjdXJyZW50IHBvaW50ZXIsIGFuZCBza2lwIHBhc3QgdGhlIGNodW5rLgorCSAqLworCWRhdGEgPSBjdXJzb3ItPmRhdGE7CisJY3Vyc29yLT5kYXRhICs9IGNodW5rX3NpemU7CisJY3Vyc29yLT5kYXRhX3JlbWFpbmluZyAtPSBjaHVua19zaXplOworCXJldHVybiAoZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uX2hlYWRlciAqCitnZXRfb3B0aGRyX2Zyb21fYmxvY2tfZGF0YShwY2FwX3QgKnAsIHN0cnVjdCBibG9ja19jdXJzb3IgKmN1cnNvciwgY2hhciAqZXJyYnVmKQoreworCXN0cnVjdCBvcHRpb25faGVhZGVyICpvcHRoZHI7CisKKwlvcHRoZHIgPSBnZXRfZnJvbV9ibG9ja19kYXRhKGN1cnNvciwgc2l6ZW9mKCpvcHRoZHIpLCBlcnJidWYpOworCWlmIChvcHRoZHIgPT0gTlVMTCkgeworCQkvKgorCQkgKiBPcHRpb24gaGVhZGVyIGlzIGN1dCBzaG9ydC4KKwkJICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBCeXRlLXN3YXAgaXQgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChwLT5zd2FwcGVkKSB7CisJCW9wdGhkci0+b3B0aW9uX2NvZGUgPSBTV0FQU0hPUlQob3B0aGRyLT5vcHRpb25fY29kZSk7CisJCW9wdGhkci0+b3B0aW9uX2xlbmd0aCA9IFNXQVBTSE9SVChvcHRoZHItPm9wdGlvbl9sZW5ndGgpOworCX0KKworCXJldHVybiAob3B0aGRyKTsKK30KKworc3RhdGljIHZvaWQgKgorZ2V0X29wdHZhbHVlX2Zyb21fYmxvY2tfZGF0YShzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsCisgICAgc3RydWN0IG9wdGlvbl9oZWFkZXIgKm9wdGhkciwgY2hhciAqZXJyYnVmKQoreworCXNpemVfdCBwYWRkZWRfb3B0aW9uX2xlbjsKKwl2b2lkICpvcHR2YWx1ZTsKKworCS8qIFBhZCBvcHRpb24gbGVuZ3RoIHRvIDQtYnl0ZSBib3VuZGFyeSAqLworCXBhZGRlZF9vcHRpb25fbGVuID0gb3B0aGRyLT5vcHRpb25fbGVuZ3RoOworCXBhZGRlZF9vcHRpb25fbGVuID0gKChwYWRkZWRfb3B0aW9uX2xlbiArIDMpLzQpKjQ7CisKKwlvcHR2YWx1ZSA9IGdldF9mcm9tX2Jsb2NrX2RhdGEoY3Vyc29yLCBwYWRkZWRfb3B0aW9uX2xlbiwgZXJyYnVmKTsKKwlpZiAob3B0dmFsdWUgPT0gTlVMTCkgeworCQkvKgorCQkgKiBPcHRpb24gdmFsdWUgaXMgY3V0IHNob3J0LgorCQkgKi8KKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlyZXR1cm4gKG9wdHZhbHVlKTsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19pZGJfb3B0aW9ucyhwY2FwX3QgKnAsIHN0cnVjdCBibG9ja19jdXJzb3IgKmN1cnNvciwgdV9pbnQgKnRzcmVzb2wsCisgICAgdV9pbnQ2NF90ICp0c29mZnNldCwgY2hhciAqZXJyYnVmKQoreworCXN0cnVjdCBvcHRpb25faGVhZGVyICpvcHRoZHI7CisJdm9pZCAqb3B0dmFsdWU7CisJaW50IHNhd190c3Jlc29sLCBzYXdfdHNvZmZzZXQ7CisJdV9jaGFyIHRzcmVzb2xfb3B0OworCXVfaW50IGk7CisKKwlzYXdfdHNyZXNvbCA9IDA7CisJc2F3X3Rzb2Zmc2V0ID0gMDsKKwl3aGlsZSAoY3Vyc29yLT5kYXRhX3JlbWFpbmluZyAhPSAwKSB7CisJCS8qCisJCSAqIEdldCB0aGUgb3B0aW9uIGhlYWRlci4KKwkJICovCisJCW9wdGhkciA9IGdldF9vcHRoZHJfZnJvbV9ibG9ja19kYXRhKHAsIGN1cnNvciwgZXJyYnVmKTsKKwkJaWYgKG9wdGhkciA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogT3B0aW9uIGhlYWRlciBpcyBjdXQgc2hvcnQuCisJCQkgKi8KKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJLyoKKwkJICogR2V0IG9wdGlvbiB2YWx1ZS4KKwkJICovCisJCW9wdHZhbHVlID0gZ2V0X29wdHZhbHVlX2Zyb21fYmxvY2tfZGF0YShjdXJzb3IsIG9wdGhkciwKKwkJICAgIGVycmJ1Zik7CisJCWlmIChvcHR2YWx1ZSA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogT3B0aW9uIHZhbHVlIGlzIGN1dCBzaG9ydC4KKwkJCSAqLworCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQlzd2l0Y2ggKG9wdGhkci0+b3B0aW9uX2NvZGUpIHsKKworCQljYXNlIE9QVF9FTkRPRk9QVDoKKwkJCWlmIChvcHRoZHItPm9wdGlvbl9sZW5ndGggIT0gMCkgeworCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBoYXMgb3B0X2VuZG9mb3B0IG9wdGlvbiB3aXRoIGxlbmd0aCAldSAhPSAwIiwKKwkJCQkgICAgb3B0aGRyLT5vcHRpb25fbGVuZ3RoKTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCWdvdG8gZG9uZTsKKworCQljYXNlIElGX1RTUkVTT0w6CisJCQlpZiAob3B0aGRyLT5vcHRpb25fbGVuZ3RoICE9IDEpIHsKKwkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2sgaGFzIGlmX3RzcmVzb2wgb3B0aW9uIHdpdGggbGVuZ3RoICV1ICE9IDEiLAorCQkJCSAgICBvcHRoZHItPm9wdGlvbl9sZW5ndGgpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJaWYgKHNhd190c3Jlc29sKSB7CisJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGhhcyBtb3JlIHRoYW4gb25lIGlmX3RzcmVzb2wgb3B0aW9uIik7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlzYXdfdHNyZXNvbCA9IDE7CisJCQl0c3Jlc29sX29wdCA9ICoodV9pbnQgKilvcHR2YWx1ZTsKKwkJCWlmICh0c3Jlc29sX29wdCAmIDB4ODApIHsKKwkJCQkvKgorCQkJCSAqIFJlc29sdXRpb24gaXMgbmVnYXRpdmUgcG93ZXIgb2YgMi4KKwkJCQkgKi8KKwkJCQkqdHNyZXNvbCA9IDEgPDwgKHRzcmVzb2xfb3B0ICYgMHg3Rik7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogUmVzb2x1dGlvbiBpcyBuZWdhdGl2ZSBwb3dlciBvZiAxMC4KKwkJCQkgKi8KKwkJCQkqdHNyZXNvbCA9IDE7CisJCQkJZm9yIChpID0gMDsgaSA8IHRzcmVzb2xfb3B0OyBpKyspCisJCQkJCSp0c3Jlc29sICo9IDEwOworCQkJfQorCQkJaWYgKCp0c3Jlc29sID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFJlc29sdXRpb24gaXMgdG9vIGhpZ2guCisJCQkJICovCisJCQkJaWYgKHRzcmVzb2xfb3B0ICYgMHg4MCkgeworCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGlmX3RzcmVzb2wgb3B0aW9uIHJlc29sdXRpb24gMl4tJXUgaXMgdG9vIGhpZ2giLAorCQkJCQkgICAgdHNyZXNvbF9vcHQgJiAweDdGKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGlmX3RzcmVzb2wgb3B0aW9uIHJlc29sdXRpb24gMTBeLSV1IGlzIHRvbyBoaWdoIiwKKwkJCQkJICAgIHRzcmVzb2xfb3B0KTsKKwkJCQl9CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElGX1RTT0ZGU0VUOgorCQkJaWYgKG9wdGhkci0+b3B0aW9uX2xlbmd0aCAhPSA4KSB7CisJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGhhcyBpZl90c29mZnNldCBvcHRpb24gd2l0aCBsZW5ndGggJXUgIT0gOCIsCisJCQkJICAgIG9wdGhkci0+b3B0aW9uX2xlbmd0aCk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlpZiAoc2F3X3Rzb2Zmc2V0KSB7CisJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGhhcyBtb3JlIHRoYW4gb25lIGlmX3Rzb2Zmc2V0IG9wdGlvbiIpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJc2F3X3Rzb2Zmc2V0ID0gMTsKKwkJCW1lbWNweSh0c29mZnNldCwgb3B0dmFsdWUsIHNpemVvZigqdHNvZmZzZXQpKTsKKwkJCWlmIChwLT5zd2FwcGVkKQorCQkJCSp0c29mZnNldCA9IFNXQVBMTCgqdHNvZmZzZXQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FkZF9pbnRlcmZhY2UocGNhcF90ICpwLCBzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsIGNoYXIgKmVycmJ1ZikKK3sKKwlzdHJ1Y3QgcGNhcF9uZ19zZiAqcHM7CisJdV9pbnQgdHNyZXNvbDsKKwl1X2ludDY0X3QgdHNvZmZzZXQ7CisKKwlwcyA9IHAtPnByaXY7CisKKwkvKgorCSAqIENvdW50IHRoaXMgaW50ZXJmYWNlLgorCSAqLworCXBzLT5pZmNvdW50Kys7CisKKwkvKgorCSAqIEdyb3cgdGhlIGFycmF5IG9mIHBlci1pbnRlcmZhY2UgaW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5LgorCSAqLworCWlmIChwcy0+aWZjb3VudCA+IHBzLT5pZmFjZXNfc2l6ZSkgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGdyb3cgdGhlIGFycmF5LgorCQkgKi8KKwkJaWYgKHBzLT5pZmFjZXMgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIEl0J3MgY3VycmVudGx5IGVtcHR5LgorCQkJICovCisJCQlwcy0+aWZhY2VzX3NpemUgPSAxOworCQkJcHMtPmlmYWNlcyA9IG1hbGxvYyhzaXplb2YgKHN0cnVjdCBwY2FwX25nX2lmKSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSXQncyBub3QgY3VycmVudGx5IGVtcHR5OyBkb3VibGUgaXRzIHNpemUuCisJCQkgKiAoUGVyaGFwcyBvdmVya2lsbCBvbmNlIHdlIGhhdmUgYSBsb3Qgb2YgaW50ZXJmYWNlcy4pCisJCQkgKi8KKwkJCXBzLT5pZmFjZXNfc2l6ZSAqPSAyOworCQkJcHMtPmlmYWNlcyA9IHJlYWxsb2MocHMtPmlmYWNlcywgcHMtPmlmYWNlc19zaXplICogc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikpOworCQl9CisJCWlmIChwcy0+aWZhY2VzID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBXZSByYW4gb3V0IG9mIG1lbW9yeS4KKwkJCSAqIEdpdmUgdXAuCisJCQkgKi8KKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAib3V0IG9mIG1lbW9yeSBmb3IgcGVyLWludGVyZmFjZSBpbmZvcm1hdGlvbiAoJXUgaW50ZXJmYWNlcykiLAorCQkJICAgIHBzLT5pZmNvdW50KTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHN0YW1wIHJlc29sdXRpb24gYW5kIG9mZnNldC4KKwkgKi8KKwl0c3Jlc29sID0gMTAwMDAwMDsJLyogbWljcm9zZWNvbmQgcmVzb2x1dGlvbiAqLworCXRzb2Zmc2V0ID0gMDsJCS8qIGFic29sdXRlIHRpbWVzdGFtcHMgKi8KKworCS8qCisJICogTm93IGxvb2sgZm9yIHZhcmlvdXMgdGltZSBzdGFtcCBvcHRpb25zLCBzbyB3ZSBrbm93CisJICogaG93IHRvIGludGVycHJldCB0aGUgdGltZSBzdGFtcHMgZm9yIHRoaXMgaW50ZXJmYWNlLgorCSAqLworCWlmIChwcm9jZXNzX2lkYl9vcHRpb25zKHAsIGN1cnNvciwgJnRzcmVzb2wsICZ0c29mZnNldCwgZXJyYnVmKSA9PSAtMSkKKwkJcmV0dXJuICgwKTsKKworCXBzLT5pZmFjZXNbcHMtPmlmY291bnQgLSAxXS50c3Jlc29sID0gdHNyZXNvbDsKKwlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0udHNvZmZzZXQgPSB0c29mZnNldDsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgc2NhbGluZyB1cCBvciBkb3duIG9yIG5vdAorCSAqIGF0IGFsbCBmb3IgdGhpcyBpbnRlcmZhY2UuCisJICovCisJc3dpdGNoIChwLT5vcHQudHN0YW1wX3ByZWNpc2lvbikgeworCisJY2FzZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk86CisJCWlmICh0c3Jlc29sID09IDEwMDAwMDApIHsKKwkJCS8qCisJCQkgKiBUaGUgcmVzb2x1dGlvbiBpcyAxIG1pY3Jvc2Vjb25kLAorCQkJICogc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBzY2FsaW5nLgorCQkJICovCisJCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFBBU1NfVEhST1VHSDsKKwkJfSBlbHNlIGlmICh0c3Jlc29sID4gMTAwMDAwMCkgeworCQkJLyoKKwkJCSAqIFRoZSByZXNvbHV0aW9uIGlzIGdyZWF0ZXIgdGhhbgorCQkJICogMSBtaWNyb3NlY29uZCwgc28gd2UgaGF2ZSB0bworCQkJICogc2NhbGUgdGhlIHRpbWVzdGFtcHMgZG93bi4KKwkJCSAqLworCQkJcHMtPmlmYWNlc1twcy0+aWZjb3VudCAtIDFdLnNjYWxlX3R5cGUgPSBTQ0FMRV9ET1dOOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSByZXNvbHV0aW9uIGlzIGxlc3MgdGhhbiAxCisJCQkgKiBtaWNyb3NlY29uZCwgc28gd2UgaGF2ZSB0byBzY2FsZQorCQkJICogdGhlIHRpbWVzdGFtcHMgdXAuCisJCQkgKi8KKwkJCXBzLT5pZmFjZXNbcHMtPmlmY291bnQgLSAxXS5zY2FsZV90eXBlID0gU0NBTEVfVVA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5POgorCQlpZiAodHNyZXNvbCA9PSAxMDAwMDAwMDAwKSB7CisJCQkvKgorCQkJICogVGhlIHJlc29sdXRpb24gaXMgMSBuYW5vc2Vjb25kLAorCQkJICogc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBzY2FsaW5nLgorCQkJICovCisJCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFBBU1NfVEhST1VHSDsKKwkJfSBlbHNlIGlmICh0c3Jlc29sID4gMTAwMDAwMDAwMCkgeworCQkJLyoKKwkJCSAqIFRoZSByZXNvbHV0aW9uIGlzIGdyZWF0ZXIgdGhhbgorCQkJICogMSBuYW5vc2Vjb25kLCBzbyB3ZSBoYXZlIHRvCisJCQkgKiBzY2FsZSB0aGUgdGltZXN0YW1wcyBkb3duLgorCQkJICovCisJCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFNDQUxFX0RPV047CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIHJlc29sdXRpb24gaXMgbGVzcyB0aGFuIDEKKwkJCSAqIG5hbm9zZWNvbmQsIHNvIHdlIGhhdmUgdG8gc2NhbGUKKwkJCSAqIHRoZSB0aW1lc3RhbXBzIHVwLgorCQkJICovCisJCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFNDQUxFX1VQOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgcGNhcC1uZyBzYXZlZmlsZSBhbmQsIGlmIGl0IGlzLCBleHRyYWN0IHRoZQorICogcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGVyLgorICovCitwY2FwX3QgKgorcGNhcF9uZ19jaGVja19oZWFkZXIoYnBmX3VfaW50MzIgbWFnaWMsIEZJTEUgKmZwLCB1X2ludCBwcmVjaXNpb24sIGNoYXIgKmVycmJ1ZiwKKyAgICBpbnQgKmVycikKK3sKKwlzaXplX3QgYW10X3JlYWQ7CisJYnBmX3VfaW50MzIgdG90YWxfbGVuZ3RoOworCWJwZl91X2ludDMyIGJ5dGVfb3JkZXJfbWFnaWM7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqYmhkcnA7CisJc3RydWN0IHNlY3Rpb25faGVhZGVyX2Jsb2NrICpzaGJwOworCXBjYXBfdCAqcDsKKwlpbnQgc3dhcHBlZCA9IDA7CisJc3RydWN0IHBjYXBfbmdfc2YgKnBzOworCWludCBzdGF0dXM7CisJc3RydWN0IGJsb2NrX2N1cnNvciBjdXJzb3I7CisJc3RydWN0IGludGVyZmFjZV9kZXNjcmlwdGlvbl9ibG9jayAqaWRicDsKKworCS8qCisJICogQXNzdW1lIG5vIHJlYWQgZXJyb3JzLgorCSAqLworCSplcnIgPSAwOworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBmaWxlIGFyZSB0aGUgYmxvY2sKKwkgKiB0eXBlIGZvciBhIHBjYXAtbmcgc2F2ZWZpbGUuIAorCSAqLworCWlmIChtYWdpYyAhPSBCVF9TSEIpIHsKKwkJLyoKKwkJICogWFhYIC0gY2hlY2sgd2hldGhlciB0aGlzIGxvb2tzIGxpa2Ugd2hhdCB0aGUgYmxvY2sKKwkJICogdHlwZSB3b3VsZCBiZSBhZnRlciBiZWluZyBtdW5nZWQgYnkgbWFwcGluZyBiZXR3ZWVuCisJCSAqIFVOKlggYW5kIERPUy9XaW5kb3dzIHRleHQgZmlsZSBmb3JtYXQgYW5kLCBpZiBpdAorCQkgKiBkb2VzLCBsb29rIGZvciB0aGUgYnl0ZS1vcmRlciBtYWdpYyBudW1iZXIgaW4KKwkJICogdGhlIGFwcHJvcHJpYXRlIHBsYWNlIGFuZCwgaWYgd2UgZmluZCBpdCwgcmVwb3J0CisJCSAqIHRoaXMgYXMgcG9zc2libHkgYmVpbmcgYSBwY2FwLW5nIGZpbGUgdHJhbnNmZXJyZWQKKwkJICogYmV0d2VlbiBVTipYIGFuZCBXaW5kb3dzIGluIHRleHQgZmlsZSBmb3JtYXQ/CisJCSAqLworCQlyZXR1cm4gKE5VTEwpOwkvKiBub3BlICovCisJfQorCisJLyoKKwkgKiBPSywgdGhleSBhcmUuICBIb3dldmVyLCB0aGF0J3MganVzdCBcblxyXHJcbiwgc28gaXQgY291bGQsCisJICogY29uY2VpdmFibHksIGJlIGFuIG9yZGluYXJ5IHRleHQgZmlsZS4KKwkgKgorCSAqIEl0IGNvdWxkIG5vdCwgaG93ZXZlciwgY29uY2VpdmFibHkgYmUgYW55IG90aGVyIHR5cGUgb2YKKwkgKiBjYXB0dXJlIGZpbGUsIHNvIHdlIGNhbiByZWFkIHRoZSByZXN0IG9mIHRoZSBwdXRhdGl2ZQorCSAqIFNlY3Rpb24gSGVhZGVyIEJsb2NrOyBwdXQgdGhlIGJsb2NrIHR5cGUgaW4gdGhlIGNvbW1vbgorCSAqIGhlYWRlciwgcmVhZCB0aGUgcmVzdCBvZiB0aGUgY29tbW9uIGhlYWRlciBhbmQgdGhlCisJICogZml4ZWQtbGVuZ3RoIHBvcnRpb24gb2YgdGhlIFNIQiwgYW5kIGxvb2sgZm9yIHRoZSBieXRlLW9yZGVyCisJICogbWFnaWMgdmFsdWUuCisJICovCisJYW10X3JlYWQgPSBmcmVhZCgmdG90YWxfbGVuZ3RoLCAxLCBzaXplb2YodG90YWxfbGVuZ3RoKSwgZnApOworCWlmIChhbXRfcmVhZCA8IHNpemVvZih0b3RhbF9sZW5ndGgpKSB7CisJCWlmIChmZXJyb3IoZnApKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJKmVyciA9IDE7CisJCQlyZXR1cm4gKE5VTEwpOwkvKiBmYWlsICovCisJCX0KKworCQkvKgorCQkgKiBQb3NzaWJseSBhIHdlaXJkIHNob3J0IHRleHQgZmlsZSwgc28ganVzdCBzYXkKKwkJICogIm5vdCBwY2FwLW5nIi4KKwkJICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCWFtdF9yZWFkID0gZnJlYWQoJmJ5dGVfb3JkZXJfbWFnaWMsIDEsIHNpemVvZihieXRlX29yZGVyX21hZ2ljKSwgZnApOworCWlmIChhbXRfcmVhZCA8IHNpemVvZihieXRlX29yZGVyX21hZ2ljKSkgeworCQlpZiAoZmVycm9yKGZwKSkgeworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJlcnJvciByZWFkaW5nIGR1bXAgZmlsZTogJXMiLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCSplcnIgPSAxOworCQkJcmV0dXJuIChOVUxMKTsJLyogZmFpbCAqLworCQl9CisKKwkJLyoKKwkJICogUG9zc2libHkgYSB3ZWlyZCBzaG9ydCB0ZXh0IGZpbGUsIHNvIGp1c3Qgc2F5CisJCSAqICJub3QgcGNhcC1uZyIuCisJCSAqLworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoYnl0ZV9vcmRlcl9tYWdpYyAhPSBCWVRFX09SREVSX01BR0lDKSB7CisJCWJ5dGVfb3JkZXJfbWFnaWMgPSBTV0FQTE9ORyhieXRlX29yZGVyX21hZ2ljKTsKKwkJaWYgKGJ5dGVfb3JkZXJfbWFnaWMgIT0gQllURV9PUkRFUl9NQUdJQykgeworCQkJLyoKKwkJCSAqIE5vdCBhIHBjYXAtbmcgZmlsZS4KKwkJCSAqLworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQlzd2FwcGVkID0gMTsKKwkJdG90YWxfbGVuZ3RoID0gU1dBUExPTkcodG90YWxfbGVuZ3RoKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBzYW5pdHkgb2YgdGhlIHRvdGFsIGxlbmd0aC4KKwkgKi8KKwlpZiAodG90YWxfbGVuZ3RoIDwgc2l6ZW9mKCpiaGRycCkgKyBzaXplb2YoKnNoYnApICsgc2l6ZW9mKHN0cnVjdCBibG9ja190cmFpbGVyKSkgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiU2VjdGlvbiBIZWFkZXIgQmxvY2sgaW4gcGNhcC1uZyBkdW1wIGZpbGUgaGFzIGEgbGVuZ3RoIG9mICV1IDwgJWx1IiwKKwkJICAgIHRvdGFsX2xlbmd0aCwKKwkJICAgICh1bnNpZ25lZCBsb25nKShzaXplb2YoKmJoZHJwKSArIHNpemVvZigqc2hicCkgKyBzaXplb2Yoc3RydWN0IGJsb2NrX3RyYWlsZXIpKSk7CisJCSplcnIgPSAxOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogT0ssIHRoaXMgaXMgYSBnb29kIHBjYXAtbmcgZmlsZS4KKwkgKiBBbGxvY2F0ZSBhIHBjYXBfdCBmb3IgaXQuCisJICovCisJcCA9IHBjYXBfb3Blbl9vZmZsaW5lX2NvbW1vbihlcnJidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfbmdfc2YpKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCS8qIEFsbG9jYXRpb24gZmFpbGVkLiAqLworCQkqZXJyID0gMTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJcC0+c3dhcHBlZCA9IHN3YXBwZWQ7CisJcHMgPSBwLT5wcml2OworCisJLyoKKwkgKiBXaGF0IHByZWNpc2lvbiBkb2VzIHRoZSB1c2VyIHdhbnQ/CisJICovCisJc3dpdGNoIChwcmVjaXNpb24pIHsKKworCWNhc2UgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPOgorCQlwcy0+dXNlcl90c3Jlc29sID0gMTAwMDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5POgorCQlwcy0+dXNlcl90c3Jlc29sID0gMTAwMDAwMDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAidW5rbm93biB0aW1lIHN0YW1wIHJlc29sdXRpb24gJXUiLCBwcmVjaXNpb24pOworCQlmcmVlKHApOworCQkqZXJyID0gMTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlwLT5vcHQudHN0YW1wX3ByZWNpc2lvbiA9IHByZWNpc2lvbjsKKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgaW50byB3aGljaCB0byByZWFkIGJsb2Nrcy4gIFdlIGRlZmF1bHQgdG8KKwkgKiB0aGUgbWF4aW11bSBvZjoKKwkgKgorCSAqCXRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIFNIQiBmb3Igd2hpY2ggd2UgcmVhZCB0aGUgaGVhZGVyOworCSAqCisJICoJMkssIHdoaWNoIHNob3VsZCBiZSBtb3JlIHRoYW4gbGFyZ2UgZW5vdWdoIGZvciBhbiBFbmhhbmNlZAorCSAqCVBhY2tldCBCbG9jayBjb250YWluaW5nIGEgZnVsbC1zaXplIEV0aGVybmV0IGZyYW1lLCBhbmQKKwkgKglsZWF2aW5nIHJvb20gZm9yIHNvbWUgb3B0aW9ucy4KKwkgKgorCSAqIElmIHdlIGZpbmQgYSBiaWdnZXIgYmxvY2ssIHdlIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlci4KKwkgKi8KKwlwLT5idWZzaXplID0gMjA0ODsKKwlpZiAocC0+YnVmc2l6ZSA8IHRvdGFsX2xlbmd0aCkKKwkJcC0+YnVmc2l6ZSA9IHRvdGFsX2xlbmd0aDsKKwlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSk7CisJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKKwkJZnJlZShwKTsKKwkJKmVyciA9IDE7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBzdHVmZiB3ZSd2ZSByZWFkIHRvIHRoZSBidWZmZXIsIGFuZCByZWFkIHRoZSByZXN0CisJICogb2YgdGhlIFNIQi4KKwkgKi8KKwliaGRycCA9IChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopcC0+YnVmZmVyOworCXNoYnAgPSAoc3RydWN0IHNlY3Rpb25faGVhZGVyX2Jsb2NrICopKHAtPmJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgYmxvY2tfaGVhZGVyKSk7CisJYmhkcnAtPmJsb2NrX3R5cGUgPSBtYWdpYzsKKwliaGRycC0+dG90YWxfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOworCXNoYnAtPmJ5dGVfb3JkZXJfbWFnaWMgPSBieXRlX29yZGVyX21hZ2ljOworCWlmIChyZWFkX2J5dGVzKGZwLAorCSAgICBwLT5idWZmZXIgKyAoc2l6ZW9mKG1hZ2ljKSArIHNpemVvZih0b3RhbF9sZW5ndGgpICsgc2l6ZW9mKGJ5dGVfb3JkZXJfbWFnaWMpKSwKKwkgICAgdG90YWxfbGVuZ3RoIC0gKHNpemVvZihtYWdpYykgKyBzaXplb2YodG90YWxfbGVuZ3RoKSArIHNpemVvZihieXRlX29yZGVyX21hZ2ljKSksCisJICAgIDEsIGVycmJ1ZikgPT0gLTEpCisJCWdvdG8gZmFpbDsKKworCWlmIChwLT5zd2FwcGVkKSB7CisJCS8qCisJCSAqIEJ5dGUtc3dhcCB0aGUgZmllbGRzIHdlJ3ZlIHJlYWQuCisJCSAqLworCQlzaGJwLT5tYWpvcl92ZXJzaW9uID0gU1dBUFNIT1JUKHNoYnAtPm1ham9yX3ZlcnNpb24pOworCQlzaGJwLT5taW5vcl92ZXJzaW9uID0gU1dBUFNIT1JUKHNoYnAtPm1pbm9yX3ZlcnNpb24pOworCisJCS8qCisJCSAqIFhYWCAtIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHNlY3Rpb24gbGVuZ3RoLgorCQkgKi8KKwl9CisJaWYgKHNoYnAtPm1ham9yX3ZlcnNpb24gIT0gUENBUF9OR19WRVJTSU9OX01BSk9SKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJ1bmtub3duIHBjYXAtbmcgc2F2ZWZpbGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgJXUiLAorCQkgICAgc2hicC0+bWFqb3JfdmVyc2lvbik7CisJCWdvdG8gZmFpbDsKKwl9CisJcC0+dmVyc2lvbl9tYWpvciA9IHNoYnAtPm1ham9yX3ZlcnNpb247CisJcC0+dmVyc2lvbl9taW5vciA9IHNoYnAtPm1pbm9yX3ZlcnNpb247CisKKwkvKgorCSAqIFNhdmUgdGhlIHRpbWUgc3RhbXAgcmVzb2x1dGlvbiB0aGUgdXNlciByZXF1ZXN0ZWQuCisJICovCisJcC0+b3B0LnRzdGFtcF9wcmVjaXNpb24gPSBwcmVjaXNpb247CisKKwkvKgorCSAqIE5vdyBzdGFydCBsb29raW5nIGZvciBhbiBJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2suCisJICovCisJZm9yICg7OykgeworCQkvKgorCQkgKiBSZWFkIHRoZSBuZXh0IGJsb2NrLgorCQkgKi8KKwkJc3RhdHVzID0gcmVhZF9ibG9jayhmcCwgcCwgJmN1cnNvciwgZXJyYnVmKTsKKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQkvKiBFT0YgLSBubyBJREIgaW4gdGhpcyBmaWxlICovCisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgInRoZSBjYXB0dXJlIGZpbGUgaGFzIG5vIEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9ja3MiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAoc3RhdHVzID09IC0xKQorCQkJZ290byBmYWlsOwkvKiBlcnJvciAqLworCQlzd2l0Y2ggKGN1cnNvci5ibG9ja190eXBlKSB7CisKKwkJY2FzZSBCVF9JREI6CisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24gb2YgdGhlCisJCQkgKiBJREIuCisJCQkgKi8KKwkJCWlkYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqaWRicCksCisJCQkgICAgZXJyYnVmKTsKKwkJCWlmIChpZGJwID09IE5VTEwpCisJCQkJZ290byBmYWlsOwkvKiBlcnJvciAqLworCisJCQkvKgorCQkJICogQnl0ZS1zd2FwIGl0IGlmIG5lY2Vzc2FyeS4KKwkJCSAqLworCQkJaWYgKHAtPnN3YXBwZWQpIHsKKwkJCQlpZGJwLT5saW5rdHlwZSA9IFNXQVBTSE9SVChpZGJwLT5saW5rdHlwZSk7CisJCQkJaWRicC0+c25hcGxlbiA9IFNXQVBMT05HKGlkYnAtPnNuYXBsZW4pOworCQkJfQorCisJCQkvKgorCQkJICogVHJ5IHRvIGFkZCB0aGlzIGludGVyZmFjZS4KKwkJCSAqLworCQkJaWYgKCFhZGRfaW50ZXJmYWNlKHAsICZjdXJzb3IsIGVycmJ1ZikpCisJCQkJZ290byBmYWlsOworCQkJZ290byBkb25lOworCisJCWNhc2UgQlRfRVBCOgorCQljYXNlIEJUX1NQQjoKKwkJY2FzZSBCVF9QQjoKKwkJCS8qCisJCQkgKiBTYXcgYSBwYWNrZXQgYmVmb3JlIHdlIHNhdyBhbnkgSURCcy4gIFRoYXQncworCQkJICogbm90IHZhbGlkLCBhcyB3ZSBkb24ndCBrbm93IHdoYXQgbGluay1sYXllcgorCQkJICogZW5jYXBzdWxhdGlvbiB0aGUgcGFja2V0IGhhcy4KKwkJCSAqLworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJ0aGUgY2FwdHVyZSBmaWxlIGhhcyBhIHBhY2tldCBibG9jayBiZWZvcmUgYW55IEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9ja3MiKTsKKwkJCWdvdG8gZmFpbDsKKworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIEp1c3QgaWdub3JlIGl0LgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlwLT50em9mZiA9IDA7CS8qIFhYWCAtIG5vdCB1c2VkIGluIHBjYXAgKi8KKwlwLT5zbmFwc2hvdCA9IGlkYnAtPnNuYXBsZW47CisJcC0+bGlua3R5cGUgPSBsaW5rdHlwZV90b19kbHQoaWRicC0+bGlua3R5cGUpOworCXAtPmxpbmt0eXBlX2V4dCA9IDA7CisKKwlwLT5uZXh0X3BhY2tldF9vcCA9IHBjYXBfbmdfbmV4dF9wYWNrZXQ7CisJcC0+Y2xlYW51cF9vcCA9IHBjYXBfbmdfY2xlYW51cDsKKworCXJldHVybiAocCk7CisKK2ZhaWw6CisJZnJlZShwcy0+aWZhY2VzKTsKKwlmcmVlKHAtPmJ1ZmZlcik7CisJZnJlZShwKTsKKwkqZXJyID0gMTsKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorcGNhcF9uZ19jbGVhbnVwKHBjYXBfdCAqcCkKK3sKKwlzdHJ1Y3QgcGNhcF9uZ19zZiAqcHMgPSBwLT5wcml2OworCisJZnJlZShwcy0+aWZhY2VzKTsKKwlzZl9jbGVhbnVwKHApOworfQorCisvKgorICogUmVhZCBhbmQgcmV0dXJuIHRoZSBuZXh0IHBhY2tldCBmcm9tIHRoZSBzYXZlZmlsZS4gIFJldHVybiB0aGUgaGVhZGVyCisgKiBpbiBoZHIgYW5kIGEgcG9pbnRlciB0byB0aGUgY29udGVudHMgaW4gZGF0YS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDEKKyAqIGlmIHRoZXJlIHdlcmUgbm8gbW9yZSBwYWNrZXRzLCBhbmQgLTEgb24gYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfbmdfbmV4dF9wYWNrZXQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICoqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNhcF9uZ19zZiAqcHMgPSBwLT5wcml2OworCXN0cnVjdCBibG9ja19jdXJzb3IgY3Vyc29yOworCWludCBzdGF0dXM7CisJc3RydWN0IGVuaGFuY2VkX3BhY2tldF9ibG9jayAqZXBicDsKKwlzdHJ1Y3Qgc2ltcGxlX3BhY2tldF9ibG9jayAqc3BicDsKKwlzdHJ1Y3QgcGFja2V0X2Jsb2NrICpwYnA7CisJYnBmX3VfaW50MzIgaW50ZXJmYWNlX2lkID0gMHhGRkZGRkZGRjsKKwlzdHJ1Y3QgaW50ZXJmYWNlX2Rlc2NyaXB0aW9uX2Jsb2NrICppZGJwOworCXN0cnVjdCBzZWN0aW9uX2hlYWRlcl9ibG9jayAqc2hicDsKKwlGSUxFICpmcCA9IHAtPnJmaWxlOworCXVfaW50NjRfdCB0LCBzZWMsIGZyYWM7CisKKwkvKgorCSAqIExvb2sgZm9yIGFuIEVuaGFuY2VkIFBhY2tldCBCbG9jaywgYSBTaW1wbGUgUGFja2V0IEJsb2NrLAorCSAqIG9yIGEgUGFja2V0IEJsb2NrLgorCSAqLworCWZvciAoOzspIHsKKwkJLyoKKwkJICogUmVhZCB0aGUgYmxvY2sgdHlwZSBhbmQgbGVuZ3RoOyB0aG9zZSBhcmUgY29tbW9uCisJCSAqIHRvIGFsbCBibG9ja3MuCisJCSAqLworCQlzdGF0dXMgPSByZWFkX2Jsb2NrKGZwLCBwLCAmY3Vyc29yLCBwLT5lcnJidWYpOworCQlpZiAoc3RhdHVzID09IDApCisJCQlyZXR1cm4gKDEpOwkvKiBFT0YgKi8KKwkJaWYgKHN0YXR1cyA9PSAtMSkKKwkJCXJldHVybiAoLTEpOwkvKiBlcnJvciAqLworCQlzd2l0Y2ggKGN1cnNvci5ibG9ja190eXBlKSB7CisKKwkJY2FzZSBCVF9FUEI6CisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24gb2YgdGhlCisJCQkgKiBFUEIuCisJCQkgKi8KKwkJCWVwYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqZXBicCksCisJCQkgICAgcC0+ZXJyYnVmKTsKKwkJCWlmIChlcGJwID09IE5VTEwpCisJCQkJcmV0dXJuICgtMSk7CS8qIGVycm9yICovCisKKwkJCS8qCisJCQkgKiBCeXRlLXN3YXAgaXQgaWYgbmVjZXNzYXJ5LgorCQkJICovCisJCQlpZiAocC0+c3dhcHBlZCkgeworCQkJCS8qIHRoZXNlIHdlcmUgd3JpdHRlbiBpbiBvcHBvc2l0ZSBieXRlIG9yZGVyICovCisJCQkJaW50ZXJmYWNlX2lkID0gU1dBUExPTkcoZXBicC0+aW50ZXJmYWNlX2lkKTsKKwkJCQloZHItPmNhcGxlbiA9IFNXQVBMT05HKGVwYnAtPmNhcGxlbik7CisJCQkJaGRyLT5sZW4gPSBTV0FQTE9ORyhlcGJwLT5sZW4pOworCQkJCXQgPSAoKHVfaW50NjRfdClTV0FQTE9ORyhlcGJwLT50aW1lc3RhbXBfaGlnaCkpIDw8IDMyIHwKKwkJCQkgICAgU1dBUExPTkcoZXBicC0+dGltZXN0YW1wX2xvdyk7CisJCQl9IGVsc2UgeworCQkJCWludGVyZmFjZV9pZCA9IGVwYnAtPmludGVyZmFjZV9pZDsKKwkJCQloZHItPmNhcGxlbiA9IGVwYnAtPmNhcGxlbjsKKwkJCQloZHItPmxlbiA9IGVwYnAtPmxlbjsKKwkJCQl0ID0gKCh1X2ludDY0X3QpZXBicC0+dGltZXN0YW1wX2hpZ2gpIDw8IDMyIHwKKwkJCQkgICAgZXBicC0+dGltZXN0YW1wX2xvdzsKKwkJCX0KKwkJCWdvdG8gZm91bmQ7CisJCQkKKwkJY2FzZSBCVF9TUEI6CisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24gb2YgdGhlCisJCQkgKiBTUEIuCisJCQkgKi8KKwkJCXNwYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqc3BicCksCisJCQkgICAgcC0+ZXJyYnVmKTsKKwkJCWlmIChzcGJwID09IE5VTEwpCisJCQkJcmV0dXJuICgtMSk7CS8qIGVycm9yICovCisKKwkJCS8qCisJCQkgKiBTUEIgcGFja2V0cyBhcmUgYXNzdW1lZCB0byBoYXZlIGFycml2ZWQgb24KKwkJCSAqIHRoZSBmaXJzdCBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCWludGVyZmFjZV9pZCA9IDA7CisKKwkJCS8qCisJCQkgKiBCeXRlLXN3YXAgaXQgaWYgbmVjZXNzYXJ5LgorCQkJICovCisJCQlpZiAocC0+c3dhcHBlZCkgeworCQkJCS8qIHRoZXNlIHdlcmUgd3JpdHRlbiBpbiBvcHBvc2l0ZSBieXRlIG9yZGVyICovCisJCQkJaGRyLT5sZW4gPSBTV0FQTE9ORyhzcGJwLT5sZW4pOworCQkJfSBlbHNlCisJCQkJaGRyLT5sZW4gPSBzcGJwLT5sZW47CisKKwkJCS8qCisJCQkgKiBUaGUgU1BCIGRvZXNuJ3QgZ2l2ZSB0aGUgY2FwdHVyZWQgbGVuZ3RoOworCQkJICogaXQncyB0aGUgbWluaW11bSBvZiB0aGUgc25hcHNob3QgbGVuZ3RoCisJCQkgKiBhbmQgdGhlIHBhY2tldCBsZW5ndGguCisJCQkgKi8KKwkJCWhkci0+Y2FwbGVuID0gaGRyLT5sZW47CisJCQlpZiAoaGRyLT5jYXBsZW4gPiBwLT5zbmFwc2hvdCkKKwkJCQloZHItPmNhcGxlbiA9IHAtPnNuYXBzaG90OworCQkJdCA9IDA7CS8qIG5vIHRpbWUgc3RhbXBzICovCisJCQlnb3RvIGZvdW5kOworCisJCWNhc2UgQlRfUEI6CisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24gb2YgdGhlCisJCQkgKiBQQi4KKwkJCSAqLworCQkJcGJwID0gZ2V0X2Zyb21fYmxvY2tfZGF0YSgmY3Vyc29yLCBzaXplb2YoKnBicCksCisJCQkgICAgcC0+ZXJyYnVmKTsKKwkJCWlmIChwYnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKC0xKTsJLyogZXJyb3IgKi8KKworCQkJLyoKKwkJCSAqIEJ5dGUtc3dhcCBpdCBpZiBuZWNlc3NhcnkuCisJCQkgKi8KKwkJCWlmIChwLT5zd2FwcGVkKSB7CisJCQkJLyogdGhlc2Ugd2VyZSB3cml0dGVuIGluIG9wcG9zaXRlIGJ5dGUgb3JkZXIgKi8KKwkJCQlpbnRlcmZhY2VfaWQgPSBTV0FQU0hPUlQocGJwLT5pbnRlcmZhY2VfaWQpOworCQkJCWhkci0+Y2FwbGVuID0gU1dBUExPTkcocGJwLT5jYXBsZW4pOworCQkJCWhkci0+bGVuID0gU1dBUExPTkcocGJwLT5sZW4pOworCQkJCXQgPSAoKHVfaW50NjRfdClTV0FQTE9ORyhwYnAtPnRpbWVzdGFtcF9oaWdoKSkgPDwgMzIgfAorCQkJCSAgICBTV0FQTE9ORyhwYnAtPnRpbWVzdGFtcF9sb3cpOworCQkJfSBlbHNlIHsKKwkJCQlpbnRlcmZhY2VfaWQgPSBwYnAtPmludGVyZmFjZV9pZDsKKwkJCQloZHItPmNhcGxlbiA9IHBicC0+Y2FwbGVuOworCQkJCWhkci0+bGVuID0gcGJwLT5sZW47CisJCQkJdCA9ICgodV9pbnQ2NF90KXBicC0+dGltZXN0YW1wX2hpZ2gpIDw8IDMyIHwKKwkJCQkgICAgcGJwLT50aW1lc3RhbXBfbG93OworCQkJfQorCQkJZ290byBmb3VuZDsKKworCQljYXNlIEJUX0lEQjoKKwkJCS8qCisJCQkgKiBJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2suICBHZXQgYSBwb2ludGVyCisJCQkgKiB0byBpdHMgZml4ZWQtbGVuZ3RoIHBvcnRpb24uCisJCQkgKi8KKwkJCWlkYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqaWRicCksCisJCQkgICAgcC0+ZXJyYnVmKTsKKwkJCWlmIChpZGJwID09IE5VTEwpCisJCQkJcmV0dXJuICgtMSk7CS8qIGVycm9yICovCisKKwkJCS8qCisJCQkgKiBCeXRlLXN3YXAgaXQgaWYgbmVjZXNzYXJ5LgorCQkJICovCisJCQlpZiAocC0+c3dhcHBlZCkgeworCQkJCWlkYnAtPmxpbmt0eXBlID0gU1dBUFNIT1JUKGlkYnAtPmxpbmt0eXBlKTsKKwkJCQlpZGJwLT5zbmFwbGVuID0gU1dBUExPTkcoaWRicC0+c25hcGxlbik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgbGluay1sYXllciB0eXBlIG9yIHNuYXBzaG90IGxlbmd0aAorCQkJICogZGlmZmVyIGZyb20gdGhlIG9uZXMgZm9yIHRoZSBmaXJzdCBJREIgd2UKKwkJCSAqIHNhdywgcXVpdC4KKwkJCSAqCisJCQkgKiBYWFggLSBqdXN0IGRpc2NhcmQgcGFja2V0cyBmcm9tIHRob3NlCisJCQkgKiBpbnRlcmZhY2VzPworCQkJICovCisJCQlpZiAocC0+bGlua3R5cGUgIT0gaWRicC0+bGlua3R5cGUpIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJhbiBpbnRlcmZhY2UgaGFzIGEgdHlwZSAldSBkaWZmZXJlbnQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgaW50ZXJmYWNlIiwKKwkJCQkgICAgaWRicC0+bGlua3R5cGUpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJaWYgKHAtPnNuYXBzaG90ICE9IGlkYnAtPnNuYXBsZW4pIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJhbiBpbnRlcmZhY2UgaGFzIGEgc25hcHNob3QgbGVuZ3RoICV1IGRpZmZlcmVudCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBpbnRlcmZhY2UiLAorCQkJCSAgICBpZGJwLT5zbmFwbGVuKTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRyeSB0byBhZGQgdGhpcyBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCWlmICghYWRkX2ludGVyZmFjZShwLCAmY3Vyc29yLCBwLT5lcnJidWYpKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVF9TSEI6CisJCQkvKgorCQkJICogU2VjdGlvbiBIZWFkZXIgQmxvY2suICBHZXQgYSBwb2ludGVyCisJCQkgKiB0byBpdHMgZml4ZWQtbGVuZ3RoIHBvcnRpb24uCisJCQkgKi8KKwkJCXNoYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqc2hicCksCisJCQkgICAgcC0+ZXJyYnVmKTsKKwkJCWlmIChzaGJwID09IE5VTEwpCisJCQkJcmV0dXJuICgtMSk7CS8qIGVycm9yICovCisKKwkJCS8qCisJCQkgKiBBc3N1bWUgdGhlIGJ5dGUgb3JkZXIgb2YgdGhpcyBzZWN0aW9uIGlzCisJCQkgKiB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorCQkJICogV2UnbGwgY2hlY2sgZm9yIHRoYXQgbGF0ZXIuCisJCQkgKi8KKwkJCWlmIChwLT5zd2FwcGVkKSB7CisJCQkJc2hicC0+Ynl0ZV9vcmRlcl9tYWdpYyA9CisJCQkJICAgIFNXQVBMT05HKHNoYnAtPmJ5dGVfb3JkZXJfbWFnaWMpOworCQkJCXNoYnAtPm1ham9yX3ZlcnNpb24gPQorCQkJCSAgICBTV0FQU0hPUlQoc2hicC0+bWFqb3JfdmVyc2lvbik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgdGhlIGJ5dGUgb3JkZXIgZG9lc24ndCBjaGFuZ2U7CisJCQkgKiBwY2FwX2lzX3N3YXBwZWQoKSBzaG91bGRuJ3QgY2hhbmdlIGl0cworCQkJICogcmV0dXJuIHZhbHVlIGluIHRoZSBtaWRkbGUgb2YgcmVhZGluZyBhIGNhcHR1cmUuCisJCQkgKi8KKwkJCXN3aXRjaCAoc2hicC0+Ynl0ZV9vcmRlcl9tYWdpYykgeworCisJCQljYXNlIEJZVEVfT1JERVJfTUFHSUM6CisJCQkJLyoKKwkJCQkgKiBPSy4KKwkJCQkgKi8KKwkJCQlicmVhazsKKworCQkJY2FzZSBTV0FQTE9ORyhCWVRFX09SREVSX01BR0lDKToKKwkJCQkvKgorCQkJCSAqIEJ5dGUgb3JkZXIgY2hhbmdlcy4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJ0aGUgZmlsZSBoYXMgc2VjdGlvbnMgd2l0aCBkaWZmZXJlbnQgYnl0ZSBvcmRlcnMiKTsKKwkJCQlyZXR1cm4gKC0xKTsKKworCQkJZGVmYXVsdDoKKwkJCQkvKgorCQkJCSAqIE5vdCBhIHZhbGlkIFNIQi4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJ0aGUgZmlsZSBoYXMgYSBzZWN0aW9uIHdpdGggYSBiYWQgYnl0ZSBvcmRlciBtYWdpYyBmaWVsZCIpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoZSBtYWpvciB2ZXJzaW9uIGlzIHRoZSB2ZXJzaW9uCisJCQkgKiB3ZSBoYW5kbGUuCisJCQkgKi8KKwkJCWlmIChzaGJwLT5tYWpvcl92ZXJzaW9uICE9IFBDQVBfTkdfVkVSU0lPTl9NQUpPUikgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgInVua25vd24gcGNhcC1uZyBzYXZlZmlsZSBtYWpvciB2ZXJzaW9uIG51bWJlciAldSIsCisJCQkJICAgIHNoYnAtPm1ham9yX3ZlcnNpb24pOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCisJCQkvKgorCQkJICogUmVzZXQgdGhlIGludGVyZmFjZSBjb3VudDsgdGhpcyBzZWN0aW9uIHNob3VsZAorCQkJICogaGF2ZSBpdHMgb3duIHNldCBvZiBJREJzLiAgSWYgYW55IG9mIHRoZW0KKwkJCSAqIGRvbid0IGhhdmUgdGhlIHNhbWUgaW50ZXJmYWNlIHR5cGUsIHNuYXBzaG90CisJCQkgKiBsZW5ndGgsIG9yIHJlc29sdXRpb24gYXMgdGhlIGZpcnN0IGludGVyZmFjZQorCQkJICogd2Ugc2F3LCB3ZSdsbCBmYWlsLiAgKEFuZCBpZiB3ZSBkb24ndCBzZWUKKwkJCSAqIGFueSBJREJzLCB3ZSdsbCBmYWlsIHdoZW4gd2Ugc2VlIGEgcGFja2V0CisJCQkgKiBibG9jay4pCisJCQkgKi8KKwkJCXBzLT5pZmNvdW50ID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogTm90IGEgcGFja2V0IGJsb2NrLCBJREIsIG9yIFNIQjsgaWdub3JlIGl0LgorCQkJICovCisJCQlicmVhazsKKwkJfQkJIAorCX0KKworZm91bmQ6CisJLyoKKwkgKiBJcyB0aGUgaW50ZXJmYWNlIElEIGFuIGludGVyZmFjZSB3ZSBrbm93PworCSAqLworCWlmIChpbnRlcmZhY2VfaWQgPj0gcHMtPmlmY291bnQpIHsKKwkJLyoKKwkJICogWWVzLiAgRmFpbC4KKwkJICovCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJhIHBhY2tldCBhcnJpdmVkIG9uIGludGVyZmFjZSAldSwgYnV0IHRoZXJlJ3Mgbm8gSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGZvciB0aGF0IGludGVyZmFjZSIsCisJCSAgICBpbnRlcmZhY2VfaWQpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIENvbnZlcnQgdGhlIHRpbWUgc3RhbXAgdG8gYSBzdHJ1Y3QgdGltZXZhbC4KKwkgKi8KKwlzZWMgPSB0IC8gcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnRzcmVzb2wgKyBwcy0+aWZhY2VzW2ludGVyZmFjZV9pZF0udHNvZmZzZXQ7CisJZnJhYyA9IHQgJSBwcy0+aWZhY2VzW2ludGVyZmFjZV9pZF0udHNyZXNvbDsKKwlzd2l0Y2ggKHBzLT5pZmFjZXNbaW50ZXJmYWNlX2lkXS5zY2FsZV90eXBlKSB7CisKKwljYXNlIFBBU1NfVEhST1VHSDoKKwkJLyoKKwkJICogVGhlIGludGVyZmFjZSByZXNvbHV0aW9uIGlzIHdoYXQgdGhlIHVzZXIgd2FudHMsCisJCSAqIHNvIHdlJ3JlIGRvbmUuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgU0NBTEVfVVA6CisJCS8qCisJCSAqIFRoZSBpbnRlcmZhY2UgcmVzb2x1dGlvbiBpcyBsZXNzIHRoYW4gd2hhdCB0aGUgdXNlcgorCQkgKiB3YW50czsgc2NhbGUgdXAgdG8gdGhhdCByZXNvbHV0aW9uLgorCQkgKgorCQkgKiBYWFggLSBpZiBwcy0+aWZhY2VzW2ludGVyZmFjZV9pZF0udHNyZXNvbCBpcyBhIHBvd2VyCisJCSAqIG9mIDEwLCB3ZSBjb3VsZCBqdXN0IG11bHRpcGx5IGJ5IHRoZSBxdW90aWVudCBvZgorCQkgKiBwcy0+aWZhY2VzW2ludGVyZmFjZV9pZF0udHNyZXNvbCBhbmQgcHMtPnVzZXJfdHNyZXNvbCwKKwkJICogYXMgd2Uga25vdyB0aGF0J3MgYW4gaW50ZWdlci4gIFRoYXQgcnVucyBsZXNzIHJpc2sgb2YKKwkJICogb3ZlcmZsb3cuCisJCSAqCisJCSAqIElzIHRoZXJlIHNvbWV0aGluZyBjbGV2ZXIgd2UgY291bGQgZG8gaWYKKwkJICogcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnRzcmVzb2wgaXMgYSBwb3dlciBvZiAyPworCQkgKi8KKwkJZnJhYyAqPSBwcy0+aWZhY2VzW2ludGVyZmFjZV9pZF0udHNyZXNvbDsKKwkJZnJhYyAvPSBwcy0+dXNlcl90c3Jlc29sOworCQlicmVhazsKKworCWNhc2UgU0NBTEVfRE9XTjoKKwkJLyoKKwkJICogVGhlIGludGVyZmFjZSByZXNvbHV0aW9uIGlzIGdyZWF0ZXIgdGhhbiB3aGF0IHRoZSB1c2VyCisJCSAqIHdhbnRzOyBzY2FsZSBkb3duIHRvIHRoYXQgcmVzb2x1dGlvbi4KKwkJICoKKwkJICogWFhYIC0gaWYgcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnRzcmVzb2wgaXMgYSBwb3dlcgorCQkgKiBvZiAxMCwgd2UgY291bGQganVzdCBkaXZpZGUgYnkgdGhlIHF1b3RpZW50IG9mCisJCSAqIHBzLT51c2VyX3RzcmVzb2wgYW5kIHBzLT5pZmFjZXNbaW50ZXJmYWNlX2lkXS50c3Jlc29sLAorCQkgKiBhcyB3ZSBrbm93IHRoYXQncyBhbiBpbnRlZ2VyLiAgVGhhdCBydW5zIGxlc3MgcmlzayBvZgorCQkgKiBvdmVyZmxvdy4KKwkJICoKKwkJICogSXMgdGhlcmUgc29tZXRoaW5nIGNsZXZlciB3ZSBjb3VsZCBkbyBpZgorCQkgKiBwcy0+aWZhY2VzW2ludGVyZmFjZV9pZF0udHNyZXNvbCBpcyBhIHBvd2VyIG9mIDI/CisJCSAqLworCQlmcmFjICo9IHBzLT51c2VyX3RzcmVzb2w7CisJCWZyYWMgLz0gcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnRzcmVzb2w7CisJCWJyZWFrOworCX0KKwloZHItPnRzLnR2X3NlYyA9IHNlYzsKKwloZHItPnRzLnR2X3VzZWMgPSBmcmFjOworCisJLyoKKwkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQgZGF0YS4KKwkgKi8KKwkqZGF0YSA9IGdldF9mcm9tX2Jsb2NrX2RhdGEoJmN1cnNvciwgaGRyLT5jYXBsZW4sIHAtPmVycmJ1Zik7CisJaWYgKCpkYXRhID09IE5VTEwpCisJCXJldHVybiAoLTEpOworCisJaWYgKHAtPnN3YXBwZWQpCisJCXN3YXBfcHNldWRvX2hlYWRlcnMocC0+bGlua3R5cGUsIGhkciwgKmRhdGEpOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL3NmLXBjYXAtbmcuaCBiL3NmLXBjYXAtbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzkzNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2YtcGNhcC1uZy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBzZi1wY2FwLW5nLmggLSBwY2FwLW5nLWZpbGUtZm9ybWF0LXNwZWNpZmljIHJvdXRpbmVzCisgKgorICogVXNlZCB0byByZWFkIHBjYXAtbmcgc2F2ZWZpbGVzLgorICovCisKKyNpZm5kZWYgc2ZfcGNhcF9uZ19oCisjZGVmaW5lCXNmX3BjYXBfbmdfaAorCitleHRlcm4gcGNhcF90ICpwY2FwX25nX2NoZWNrX2hlYWRlcihicGZfdV9pbnQzMiBtYWdpYywgRklMRSAqZnAsCisgICAgdV9pbnQgcHJlY2lzaW9uLCBjaGFyICplcnJidWYsIGludCAqZXJyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZi1wY2FwLmMgYi9zZi1wY2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5ODEzMQotLS0gL2Rldi9udWxsCisrKyBiL3NmLXBjYXAuYwpAQCAtMCwwICsxLDczMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIHNmLXBjYXAuYyAtIGxpYnBjYXAtZmlsZS1mb3JtYXQtc3BlY2lmaWMgY29kZSBmcm9tIHNhdmVmaWxlLmMKKyAqCUV4dHJhY3Rpb24vY3JlYXRpb24gYnkgSmVmZnJleSBNb2d1bCwgREVDV1JMCisgKglNb2RpZmllZCBieSBTdGV2ZSBNY0Nhbm5lLCBMQkwuCisgKgorICogVXNlZCB0byBzYXZlIHRoZSByZWNlaXZlZCBwYWNrZXQgaGVhZGVycywgYWZ0ZXIgZmlsdGVyaW5nLCB0bworICogYSBmaWxlLCBhbmQgdGhlbiByZWFkIHRoZW0gbGF0ZXIuCisgKiBUaGUgZmlyc3QgcmVjb3JkIGluIHRoZSBmaWxlIGNvbnRhaW5zIHNhdmVkIHZhbHVlcyBmb3IgdGhlIG1hY2hpbmUKKyAqIGRlcGVuZGVudCB2YWx1ZXMgc28gd2UgY2FuIHByaW50IHRoZSBkdW1wIGZpbGUgb24gYW55IGFyY2hpdGVjdHVyZS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAicGNhcC1jb21tb24uaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNmLXBjYXAuaCIKKworLyoKKyAqIFNldHRpbmcgT19CSU5BUlkgb24gRE9TL1dpbmRvd3MgaXMgYSBiaXQgdHJpY2t5CisgKi8KKyNpZiBkZWZpbmVkKFdJTjMyKQorICAjZGVmaW5lIFNFVF9CSU5NT0RFKGYpICBfc2V0bW9kZShfZmlsZW5vKGYpLCBfT19CSU5BUlkpCisjZWxpZiBkZWZpbmVkKE1TRE9TKQorICAjaWYgZGVmaW5lZChfX0hJR0hDX18pCisgICNkZWZpbmUgU0VUX0JJTk1PREUoZikgIHNldG1vZGUoZiwgT19CSU5BUlkpCisgICNlbHNlCisgICNkZWZpbmUgU0VUX0JJTk1PREUoZikgIHNldG1vZGUoZmlsZW5vKGYpLCBPX0JJTkFSWSkKKyAgI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIFN0YW5kYXJkIGxpYnBjYXAgZm9ybWF0LgorICovCisjZGVmaW5lIFRDUERVTVBfTUFHSUMJCTB4YTFiMmMzZDQKKworLyoKKyAqIEFsZXhleSBLdXpuZXR6b3YncyBtb2RpZmllZCBsaWJwY2FwIGZvcm1hdC4KKyAqLworI2RlZmluZSBLVVpORVRaT1ZfVENQRFVNUF9NQUdJQwkweGExYjJjZDM0CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgRnJhbmNpc2NvIE1lc3F1aXRhIDxmcmFuY2lzY28ubWVzcXVpdGFAcmFkaW9tb3ZlbC5wdD4KKyAqIGZvciBhbm90aGVyIG1vZGlmaWVkIGZvcm1hdC4KKyAqLworI2RlZmluZSBGTUVTUVVJVEFfVENQRFVNUF9NQUdJQwkweGExYjIzNGNkCisKKy8qCisgKiBOYXZ0ZWwgQ29tbXVuY2F0aW9ucycgZm9ybWF0LCB3aXRoIG5hbm9zZWNvbmQgdGltZXN0YW1wcywKKyAqIGFzIHBlciBhIHJlcXVlc3QgZnJvbSBEdW1hcyBId2FuZyA8ZHVtYXMuaHdhbmdAbmF2dGVsY29tLmNvbT4uCisgKi8KKyNkZWZpbmUgTkFWVEVMX1RDUERVTVBfTUFHSUMJMHhhMTJiM2M0ZAorCisvKgorICogTm9ybWFsIGxpYnBjYXAgZm9ybWF0LCBleGNlcHQgZm9yIHNlY29uZHMvbmFub3NlY29uZHMgdGltZXN0YW1wcywKKyAqIGFzIHBlciBhIHJlcXVlc3QgYnkgVWxmIExhbXBpbmcgPHVsZi5sYW1waW5nQHdlYi5kZT4KKyAqLworI2RlZmluZSBOU0VDX1RDUERVTVBfTUFHSUMJMHhhMWIyM2M0ZAorCisvKgorICogTWVjaGFuaXNtIGZvciBzdG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY2FwdHVyZSBpbiB0aGUgdXBwZXIKKyAqIDYgYml0cyBvZiBhIGxpbmt0eXBlIHZhbHVlIGluIGEgY2FwdHVyZSBmaWxlLgorICoKKyAqIExUX0xJTktUWVBFX0VYVCh4KSBleHRyYWN0cyB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgZm9yIGEgdmFsdWUgZGVzY3JpYmluZyB0aGUgbGluay1sYXllcgorICogdmFsdWUuICBMVF9MSU5LVFlQRSh4KSBleHRyYWN0cyB0aGF0IHZhbHVlLgorICovCisjZGVmaW5lIExUX0xJTktUWVBFKHgpCQkoKHgpICYgMHgwM0ZGRkZGRikKKyNkZWZpbmUgTFRfTElOS1RZUEVfRVhUKHgpCSgoeCkgJiAweEZDMDAwMDAwKQorCitzdGF0aWMgaW50IHBjYXBfbmV4dF9wYWNrZXQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICoqZGF0YXApOworCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciByZWFkaW5nIHBjYXAgc2F2ZWZpbGVzLgorICovCit0eXBlZGVmIGVudW0geworCU5PVF9TV0FQUEVELAorCVNXQVBQRUQsCisJTUFZQkVfU1dBUFBFRAorfSBzd2FwcGVkX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlQQVNTX1RIUk9VR0gsCisJU0NBTEVfVVAsCisJU0NBTEVfRE9XTgorfSB0c3RhbXBfc2NhbGVfdHlwZV90OworCitzdHJ1Y3QgcGNhcF9zZiB7CisJc2l6ZV90IGhkcnNpemU7CisJc3dhcHBlZF90eXBlX3QgbGVuZ3Roc19zd2FwcGVkOworCXRzdGFtcF9zY2FsZV90eXBlX3Qgc2NhbGVfdHlwZTsKK307CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBwY2FwIHNhdmVmaWxlIGFuZCwgaWYgaXQgaXMsIGV4dHJhY3QgdGhlCisgKiByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoZWFkZXIuCisgKi8KK3BjYXBfdCAqCitwY2FwX2NoZWNrX2hlYWRlcihicGZfdV9pbnQzMiBtYWdpYywgRklMRSAqZnAsIHVfaW50IHByZWNpc2lvbiwgY2hhciAqZXJyYnVmLAorICAgIGludCAqZXJyKQoreworCXN0cnVjdCBwY2FwX2ZpbGVfaGVhZGVyIGhkcjsKKwlzaXplX3QgYW10X3JlYWQ7CisJcGNhcF90ICpwOworCWludCBzd2FwcGVkID0gMDsKKwlzdHJ1Y3QgcGNhcF9zZiAqcHM7CisKKwkvKgorCSAqIEFzc3VtZSBubyByZWFkIGVycm9ycy4KKwkgKi8KKwkqZXJyID0gMDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgZmlsZSBhcmUgdGhlIG1hZ2ljCisJICogbnVtYmVyIGZvciBhIHBjYXAgc2F2ZWZpbGUsIG9yIGZvciBhIGJ5dGUtc3dhcHBlZCBwY2FwCisJICogc2F2ZWZpbGUuCisJICovCisJaWYgKG1hZ2ljICE9IFRDUERVTVBfTUFHSUMgJiYgbWFnaWMgIT0gS1VaTkVUWk9WX1RDUERVTVBfTUFHSUMgJiYKKwkgICAgbWFnaWMgIT0gTlNFQ19UQ1BEVU1QX01BR0lDKSB7CisJCW1hZ2ljID0gU1dBUExPTkcobWFnaWMpOworCQlpZiAobWFnaWMgIT0gVENQRFVNUF9NQUdJQyAmJiBtYWdpYyAhPSBLVVpORVRaT1ZfVENQRFVNUF9NQUdJQyAmJgorCQkgICAgbWFnaWMgIT0gTlNFQ19UQ1BEVU1QX01BR0lDKQorCQkJcmV0dXJuIChOVUxMKTsJLyogbm9wZSAqLworCQlzd2FwcGVkID0gMTsKKwl9CisKKwkvKgorCSAqIFRoZXkgYXJlLiAgUHV0IHRoZSBtYWdpYyBudW1iZXIgaW4gdGhlIGhlYWRlciwgYW5kIHJlYWQKKwkgKiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLgorCSAqLworCWhkci5tYWdpYyA9IG1hZ2ljOworCWFtdF9yZWFkID0gZnJlYWQoKChjaGFyICopJmhkcikgKyBzaXplb2YgaGRyLm1hZ2ljLCAxLAorCSAgICBzaXplb2YoaGRyKSAtIHNpemVvZihoZHIubWFnaWMpLCBmcCk7CisJaWYgKGFtdF9yZWFkICE9IHNpemVvZihoZHIpIC0gc2l6ZW9mKGhkci5tYWdpYykpIHsKKwkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWx1IGZpbGUgaGVhZGVyIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemVvZihoZHIpLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKKwkJfQorCQkqZXJyID0gMTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIElmIGl0J3MgYSBieXRlLXN3YXBwZWQgY2FwdHVyZSBmaWxlLCBieXRlLXN3YXAgdGhlIGhlYWRlci4KKwkgKi8KKwlpZiAoc3dhcHBlZCkgeworCQloZHIudmVyc2lvbl9tYWpvciA9IFNXQVBTSE9SVChoZHIudmVyc2lvbl9tYWpvcik7CisJCWhkci52ZXJzaW9uX21pbm9yID0gU1dBUFNIT1JUKGhkci52ZXJzaW9uX21pbm9yKTsKKwkJaGRyLnRoaXN6b25lID0gU1dBUExPTkcoaGRyLnRoaXN6b25lKTsKKwkJaGRyLnNpZ2ZpZ3MgPSBTV0FQTE9ORyhoZHIuc2lnZmlncyk7CisJCWhkci5zbmFwbGVuID0gU1dBUExPTkcoaGRyLnNuYXBsZW4pOworCQloZHIubGlua3R5cGUgPSBTV0FQTE9ORyhoZHIubGlua3R5cGUpOworCX0KKworCWlmIChoZHIudmVyc2lvbl9tYWpvciA8IFBDQVBfVkVSU0lPTl9NQUpPUikgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiYXJjaGFpYyBwY2FwIHNhdmVmaWxlIGZvcm1hdCIpOworCQkqZXJyID0gMTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIE9LLCB0aGlzIGlzIGEgZ29vZCBwY2FwIGZpbGUuCisJICogQWxsb2NhdGUgYSBwY2FwX3QgZm9yIGl0LgorCSAqLworCXAgPSBwY2FwX29wZW5fb2ZmbGluZV9jb21tb24oZXJyYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3NmKSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0aW9uIGZhaWxlZC4gKi8KKwkJKmVyciA9IDE7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXAtPnN3YXBwZWQgPSBzd2FwcGVkOworCXAtPnZlcnNpb25fbWFqb3IgPSBoZHIudmVyc2lvbl9tYWpvcjsKKwlwLT52ZXJzaW9uX21pbm9yID0gaGRyLnZlcnNpb25fbWlub3I7CisJcC0+dHpvZmYgPSBoZHIudGhpc3pvbmU7CisJcC0+c25hcHNob3QgPSBoZHIuc25hcGxlbjsKKwlwLT5saW5rdHlwZSA9IGxpbmt0eXBlX3RvX2RsdChMVF9MSU5LVFlQRShoZHIubGlua3R5cGUpKTsKKwlwLT5saW5rdHlwZV9leHQgPSBMVF9MSU5LVFlQRV9FWFQoaGRyLmxpbmt0eXBlKTsKKworCXAtPm5leHRfcGFja2V0X29wID0gcGNhcF9uZXh0X3BhY2tldDsKKworCXBzID0gcC0+cHJpdjsKKworCXAtPm9wdC50c3RhbXBfcHJlY2lzaW9uID0gcHJlY2lzaW9uOworCisJLyoKKwkgKiBXaWxsIHdlIG5lZWQgdG8gc2NhbGUgdGhlIHRpbWVzdGFtcHMgdG8gbWF0Y2ggd2hhdCB0aGUKKwkgKiB1c2VyIHdhbnRzPworCSAqLworCXN3aXRjaCAocHJlY2lzaW9uKSB7CisKKwljYXNlIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTzoKKwkJaWYgKG1hZ2ljID09IE5TRUNfVENQRFVNUF9NQUdJQykgeworCQkJLyoKKwkJCSAqIFRoZSBmaWxlIGhhcyBuYW5vc2Vjb25kcywgdGhlIHVzZXIKKwkJCSAqIHdhbnRzIG1pY3Jvc2Vjb25kczsgc2NhbGUgdGhlCisJCQkgKiBwcmVjaXNpb24gZG93bi4KKwkJCSAqLworCQkJcHMtPnNjYWxlX3R5cGUgPSBTQ0FMRV9ET1dOOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBmaWxlIGhhcyBtaWNyb3NlY29uZHMsIHRoZQorCQkJICogdXNlciB3YW50cyBtaWNyb3NlY29uZHM7IG5vdGhpbmcgdG8gZG8uCisJCQkgKi8KKwkJCXBzLT5zY2FsZV90eXBlID0gUEFTU19USFJPVUdIOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTzoKKwkJaWYgKG1hZ2ljID09IE5TRUNfVENQRFVNUF9NQUdJQykgeworCQkJLyoKKwkJCSAqIFRoZSBmaWxlIGhhcyBuYW5vc2Vjb25kcywgdGhlCisJCQkgKiB1c2VyIHdhbnRzIG5hbm9zZWNvbmRzOyBub3RoaW5nIHRvIGRvLgorCQkJICovCisJCQlwcy0+c2NhbGVfdHlwZSA9IFBBU1NfVEhST1VHSDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgZmlsZSBoYXMgbWljcm9vc2Vjb25kcywgdGhlIHVzZXIKKwkJCSAqIHdhbnRzIG5hbm9zZWNvbmRzOyBzY2FsZSB0aGUKKwkJCSAqIHByZWNpc2lvbiB1cC4KKwkJCSAqLworCQkJcHMtPnNjYWxlX3R5cGUgPSBTQ0FMRV9VUDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJ1bmtub3duIHRpbWUgc3RhbXAgcmVzb2x1dGlvbiAldSIsIHByZWNpc2lvbik7CisJCWZyZWUocCk7CisJCSplcnIgPSAxOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogV2UgaW50ZXJjaGFuZ2VkIHRoZSBjYXBsZW4gYW5kIGxlbiBmaWVsZHMgYXQgdmVyc2lvbiAyLjMsCisJICogaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGJwZiBoZWFkZXIgbGF5b3V0LiAgQnV0IHVuZm9ydHVuYXRlbHkKKwkgKiBzb21lIGZpbGVzIHdlcmUgd3JpdHRlbiB3aXRoIHZlcnNpb24gMi4zIGluIHRoZWlyIGhlYWRlcnMKKwkgKiBidXQgd2l0aG91dCB0aGUgaW50ZXJjaGFuZ2VkIGZpZWxkcy4KKwkgKgorCSAqIEluIGFkZGl0aW9uLCBERy9VWCB0Y3BkdW1wIHdyaXRlcyBvdXQgZmlsZXMgd2l0aCBhIHZlcnNpb24KKwkgKiBudW1iZXIgb2YgNTQzLjAsIGFuZCB3aXRoIHRoZSBjYXBsZW4gYW5kIGxlbiBmaWVsZHMgaW4gdGhlCisJICogcHJlLTIuMyBvcmRlci4KKwkgKi8KKwlzd2l0Y2ggKGhkci52ZXJzaW9uX21ham9yKSB7CisKKwljYXNlIDI6CisJCWlmIChoZHIudmVyc2lvbl9taW5vciA8IDMpCisJCQlwcy0+bGVuZ3Roc19zd2FwcGVkID0gU1dBUFBFRDsKKwkJZWxzZSBpZiAoaGRyLnZlcnNpb25fbWlub3IgPT0gMykKKwkJCXBzLT5sZW5ndGhzX3N3YXBwZWQgPSBNQVlCRV9TV0FQUEVEOworCQllbHNlCisJCQlwcy0+bGVuZ3Roc19zd2FwcGVkID0gTk9UX1NXQVBQRUQ7CisJCWJyZWFrOworCisJY2FzZSA1NDM6CisJCXBzLT5sZW5ndGhzX3N3YXBwZWQgPSBTV0FQUEVEOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXBzLT5sZW5ndGhzX3N3YXBwZWQgPSBOT1RfU1dBUFBFRDsKKwkJYnJlYWs7CisJfQorCisJaWYgKG1hZ2ljID09IEtVWk5FVFpPVl9UQ1BEVU1QX01BR0lDKSB7CisJCS8qCisJCSAqIFhYWCAtIHRoZSBwYXRjaCB0aGF0J3MgaW4gc29tZSB2ZXJzaW9ucyBvZiBsaWJwY2FwCisJCSAqIGNoYW5nZXMgdGhlIHBhY2tldCBoZWFkZXIgYnV0IG5vdCB0aGUgbWFnaWMgbnVtYmVyLAorCQkgKiBhbmQgc29tZSBvdGhlciB2ZXJzaW9ucyB3aXRoIHRoaXMgbWFnaWMgbnVtYmVyIGhhdmUKKwkJICogc29tZSBleHRyYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHBhY2tldCBoZWFkZXI7CisJCSAqIHdlJ2QgaGF2ZSB0byB1c2Ugc29tZSBoYWNrc15IXkheSF5IXkhoZXVyaXN0aWNzIHRvCisJCSAqIGRldGVjdCB0aG9zZSB2YXJpYW50cy4KKwkJICoKKwkJICogRXRoZXJlYWwgZG9lcyB0aGF0LCBidXQgaXQgZG9lcyBzbyBieSB0cnlpbmcgdG8gcmVhZAorCQkgKiB0aGUgZmlyc3QgdHdvIHBhY2tldHMgb2YgdGhlIGZpbGUgd2l0aCBlYWNoIG9mIHRoZQorCQkgKiByZWNvcmQgaGVhZGVyIGZvcm1hdHMuICBUaGF0IGN1cnJlbnRseSBtZWFucyBpdCBzZWVrcworCQkgKiBiYWNrd2FyZHMgYW5kIHJldHJpZXMgdGhlIHJlYWRzLCB3aGljaCBkb2Vzbid0IHdvcmsKKwkJICogb24gcGlwZXMuICBXZSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZCBmcm9tIGEgcGlwZSwgc28KKwkJICogdGhhdCBzdHJhdGVneSB3b24ndCB3b3JrOyB3ZSdkIGhhdmUgdG8gYnVmZmVyIHNvbWUKKwkJICogZGF0YSBvdXJzZWx2ZXMgYW5kIHJlYWQgZnJvbSB0aGF0IGJ1ZmZlciBpbiBvcmRlciB0bworCQkgKiBtYWtlIHRoYXQgd29yay4KKwkJICovCisJCXBzLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBwY2FwX3NmX3BhdGNoZWRfcGt0aGRyKTsKKworCQlpZiAocC0+bGlua3R5cGUgPT0gRExUX0VOMTBNQikgeworCQkJLyoKKwkJCSAqIFRoaXMgY2FwdHVyZSBtaWdodCBoYXZlIGJlZW4gZG9uZSBpbiByYXcgbW9kZQorCQkJICogb3IgY29va2VkIG1vZGUuCisJCQkgKgorCQkJICogSWYgaXQgd2FzIGRvbmUgaW4gY29va2VkIG1vZGUsIHAtPnNuYXBzaG90IHdhcworCQkJICogcGFzc2VkIHRvIHJlY3Zmcm9tKCkgYXMgdGhlIGJ1ZmZlciBzaXplLCBtZWFuaW5nCisJCQkgKiB0aGF0IHRoZSBtb3N0IHBhY2tldCBkYXRhIHRoYXQgd291bGQgYmUgY29waWVkCisJCQkgKiB3b3VsZCBiZSBwLT5zbmFwc2hvdC4gIEhvd2V2ZXIsIGEgZmFrZWQgRXRoZXJuZXQKKwkJCSAqIGhlYWRlciB3b3VsZCB0aGVuIGhhdmUgYmVlbiBhZGRlZCB0byBpdCwgc28gdGhlCisJCQkgKiBtb3N0IGRhdGEgdGhhdCB3b3VsZCBiZSBpbiBhIHBhY2tldCBpbiB0aGUgZmlsZQorCQkJICogd291bGQgYmUgcC0+c25hcHNob3QgKyAxNC4KKwkJCSAqCisJCQkgKiBXZSBjYW4ndCBlYXNpbHkgdGVsbCB3aGV0aGVyIHRoZSBjYXB0dXJlIHdhcyBkb25lCisJCQkgKiBpbiByYXcgbW9kZSBvciBjb29rZWQgbW9kZSwgc28gd2UnbGwgYXNzdW1lIGl0IHdhcworCQkJICogY29va2VkIG1vZGUsIGFuZCBhZGQgMTQgdG8gdGhlIHNuYXBzaG90IGxlbmd0aC4KKwkJCSAqIFRoYXQgbWVhbnMgdGhhdCwgZm9yIGEgcmF3IGNhcHR1cmUsIHRoZSBzbmFwc2hvdAorCQkJICogbGVuZ3RoIHdpbGwgYmUgbWlzbGVhZGluZyBpZiB5b3UgdXNlIGl0IHRvIGZpZ3VyZQorCQkJICogb3V0IHdoeSBhIGNhcHR1cmUgZG9lc24ndCBoYXZlIGFsbCB0aGUgcGFja2V0IGRhdGEsCisJCQkgKiBidXQgdGhlcmUncyBub3QgbXVjaCB3ZSBjYW4gZG8gdG8gYXZvaWQgdGhhdC4KKwkJCSAqLworCQkJcC0+c25hcHNob3QgKz0gMTQ7CisJCX0KKwl9IGVsc2UKKwkJcHMtPmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IHBjYXBfc2ZfcGt0aGRyKTsKKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBwYWNrZXQgZGF0YS4KKwkgKi8KKwlwLT5idWZzaXplID0gcC0+c25hcHNob3Q7CisJaWYgKHAtPmJ1ZnNpemUgPD0gMCkgeworCQkvKgorCQkgKiBCb2d1cyBzbmFwc2hvdCBsZW5ndGg7IHVzZSA2NEtpQiBhcyBhIGZhbGxiYWNrLgorCQkgKi8KKwkJcC0+YnVmc2l6ZSA9IDY1NTM2OworCX0KKwlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSk7CisJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKKwkJZnJlZShwKTsKKwkJKmVyciA9IDE7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJcC0+Y2xlYW51cF9vcCA9IHNmX2NsZWFudXA7CisKKwlyZXR1cm4gKHApOworfQorCisvKgorICogUmVhZCBhbmQgcmV0dXJuIHRoZSBuZXh0IHBhY2tldCBmcm9tIHRoZSBzYXZlZmlsZS4gIFJldHVybiB0aGUgaGVhZGVyCisgKiBpbiBoZHIgYW5kIGEgcG9pbnRlciB0byB0aGUgY29udGVudHMgaW4gZGF0YS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDEKKyAqIGlmIHRoZXJlIHdlcmUgbm8gbW9yZSBwYWNrZXRzLCBhbmQgLTEgb24gYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfbmV4dF9wYWNrZXQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICoqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNhcF9zZiAqcHMgPSBwLT5wcml2OworCXN0cnVjdCBwY2FwX3NmX3BhdGNoZWRfcGt0aGRyIHNmX2hkcjsKKwlGSUxFICpmcCA9IHAtPnJmaWxlOworCXNpemVfdCBhbXRfcmVhZDsKKwlicGZfdV9pbnQzMiB0OworCisJLyoKKwkgKiBSZWFkIHRoZSBwYWNrZXQgaGVhZGVyOyB0aGUgc3RydWN0dXJlIHdlIHVzZSBhcyBhIGJ1ZmZlcgorCSAqIGlzIHRoZSBsb25nZXIgc3RydWN0dXJlIGZvciBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIHBhdGNoZWQKKwkgKiBsaWJwY2FwLCBidXQgaWYgdGhlIGZpbGUgaGFzIHRoZSBtYWdpYyBudW1iZXIgZm9yIGFuCisJICogdW5wYXRjaGVkIGxpYnBjYXAgd2Ugb25seSByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgdGhlIHJlZ3VsYXIKKwkgKiBoZWFkZXIgaGFzLgorCSAqLworCWFtdF9yZWFkID0gZnJlYWQoJnNmX2hkciwgMSwgcHMtPmhkcnNpemUsIGZwKTsKKwlpZiAoYW10X3JlYWQgIT0gcHMtPmhkcnNpemUpIHsKKwkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhbXRfcmVhZCAhPSAwKSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAidHJ1bmNhdGVkIGR1bXAgZmlsZTsgdHJpZWQgdG8gcmVhZCAlbHUgaGVhZGVyIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZylwcy0+aGRyc2l6ZSwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJLyogRU9GICovCisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisJaWYgKHAtPnN3YXBwZWQpIHsKKwkJLyogdGhlc2Ugd2VyZSB3cml0dGVuIGluIG9wcG9zaXRlIGJ5dGUgb3JkZXIgKi8KKwkJaGRyLT5jYXBsZW4gPSBTV0FQTE9ORyhzZl9oZHIuY2FwbGVuKTsKKwkJaGRyLT5sZW4gPSBTV0FQTE9ORyhzZl9oZHIubGVuKTsKKwkJaGRyLT50cy50dl9zZWMgPSBTV0FQTE9ORyhzZl9oZHIudHMudHZfc2VjKTsKKwkJaGRyLT50cy50dl91c2VjID0gU1dBUExPTkcoc2ZfaGRyLnRzLnR2X3VzZWMpOworCX0gZWxzZSB7CisJCWhkci0+Y2FwbGVuID0gc2ZfaGRyLmNhcGxlbjsKKwkJaGRyLT5sZW4gPSBzZl9oZHIubGVuOworCQloZHItPnRzLnR2X3NlYyA9IHNmX2hkci50cy50dl9zZWM7CisJCWhkci0+dHMudHZfdXNlYyA9IHNmX2hkci50cy50dl91c2VjOworCX0KKworCXN3aXRjaCAocHMtPnNjYWxlX3R5cGUpIHsKKworCWNhc2UgUEFTU19USFJPVUdIOgorCQkvKgorCQkgKiBKdXN0IHBhc3MgdGhlIHRpbWUgc3RhbXAgdGhyb3VnaC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTQ0FMRV9VUDoKKwkJLyoKKwkJICogRmlsZSBoYXMgbWljcm9zZWNvbmRzLCB1c2VyIHdhbnRzIG5hbm9zZWNvbmRzOyBjb252ZXJ0CisJCSAqIGl0LgorCQkgKi8KKwkJaGRyLT50cy50dl91c2VjID0gaGRyLT50cy50dl91c2VjICogMTAwMDsKKwkJYnJlYWs7CisKKwljYXNlIFNDQUxFX0RPV046CisJCS8qCisJCSAqIEZpbGUgaGFzIG5hbm9zZWNvbmRzLCB1c2VyIHdhbnRzIG1pY3Jvc2Vjb25kczsgY29udmVydAorCQkgKiBpdC4KKwkJICovCisJCWhkci0+dHMudHZfdXNlYyA9IGhkci0+dHMudHZfdXNlYyAvIDEwMDA7CisJCWJyZWFrOworCX0KKworCS8qIFN3YXAgdGhlIGNhcGxlbiBhbmQgbGVuIGZpZWxkcywgaWYgbmVjZXNzYXJ5LiAqLworCXN3aXRjaCAocHMtPmxlbmd0aHNfc3dhcHBlZCkgeworCisJY2FzZSBOT1RfU1dBUFBFRDoKKwkJYnJlYWs7CisKKwljYXNlIE1BWUJFX1NXQVBQRUQ6CisJCWlmIChoZHItPmNhcGxlbiA8PSBoZHItPmxlbikgeworCQkJLyoKKwkJCSAqIFRoZSBjYXB0dXJlZCBsZW5ndGggaXMgPD0gdGhlIGFjdHVhbCBsZW5ndGgsCisJCQkgKiBzbyBwcmVzdW1hYmx5IHRoZXkgd2VyZW4ndCBzd2FwcGVkLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCisJY2FzZSBTV0FQUEVEOgorCQl0ID0gaGRyLT5jYXBsZW47CisJCWhkci0+Y2FwbGVuID0gaGRyLT5sZW47CisJCWhkci0+bGVuID0gdDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGhkci0+Y2FwbGVuID4gcC0+YnVmc2l6ZSkgeworCQkvKgorCQkgKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIFNvbGFyaXMgMi4zIHN5c3RlbXMgdHJpcHBpbmcKKwkJICogb3ZlciB0aGUgQlVGTU9EIHByb2JsZW0gYW5kIG5vdCBzZXR0aW5nIHRoZSBzbmFwc2hvdAorCQkgKiBjb3JyZWN0bHkgaW4gdGhlIHNhdmVmaWxlIGhlYWRlci4gIElmIHRoZSBjYXBsZW4gaXNuJ3QKKwkJICogZ3Jvc3NseSB3cm9uZywgdHJ5IHRvIHNhbHZhZ2UuCisJCSAqLworCQlzdGF0aWMgdV9jaGFyICp0cCA9IE5VTEw7CisJCXN0YXRpYyBzaXplX3QgdHNpemUgPSAwOworCisJCWlmIChoZHItPmNhcGxlbiA+IDY1NTM1KSB7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImJvZ3VzIHNhdmVmaWxlIGhlYWRlciIpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQlpZiAodHNpemUgPCBoZHItPmNhcGxlbikgeworCQkJdHNpemUgPSAoKGhkci0+Y2FwbGVuICsgMTAyMykgLyAxMDI0KSAqIDEwMjQ7CisJCQlpZiAodHAgIT0gTlVMTCkKKwkJCQlmcmVlKCh1X2NoYXIgKil0cCk7CisJCQl0cCA9ICh1X2NoYXIgKiltYWxsb2ModHNpemUpOworCQkJaWYgKHRwID09IE5VTEwpIHsKKwkJCQl0c2l6ZSA9IDA7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiQlVGTU9EIGhhY2sgbWFsbG9jIik7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCX0KKwkJYW10X3JlYWQgPSBmcmVhZCgoY2hhciAqKXRwLCAxLCBoZHItPmNhcGxlbiwgZnApOworCQlpZiAoYW10X3JlYWQgIT0gaGRyLT5jYXBsZW4pIHsKKwkJCWlmIChmZXJyb3IoZnApKSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICV1IGNhcHR1cmVkIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAorCQkJCSAgICBoZHItPmNhcGxlbiwgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOworCQkJfQorCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJLyoKKwkJICogV2UgY2FuIG9ubHkga2VlcCB1cCB0byBwLT5idWZzaXplIGJ5dGVzLiAgU2luY2UKKwkJICogY2FwbGVuID4gcC0+YnVmc2l6ZSBpcyBleGFjdGx5IGhvdyB3ZSBnb3QgaGVyZSwKKwkJICogd2Uga25vdyB3ZSBjYW4gb25seSBrZWVwIHRoZSBmaXJzdCBwLT5idWZzaXplIGJ5dGVzCisJCSAqIGFuZCBtdXN0IGRyb3AgdGhlIHJlbWFpbmRlci4gIEFkanVzdCBjYXBsZW4gYWNjb3JkaW5nbHksCisJCSAqIHNvIHdlIGRvbid0IGdldCBjb25mdXNlZCBsYXRlciBhcyB0byBob3cgbWFueSBieXRlcyB3ZQorCQkgKiBoYXZlIHRvIHBsYXkgd2l0aC4KKwkJICovCisJCWhkci0+Y2FwbGVuID0gcC0+YnVmc2l6ZTsKKwkJbWVtY3B5KHAtPmJ1ZmZlciwgKGNoYXIgKil0cCwgcC0+YnVmc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCB0aGUgcGFja2V0IGl0c2VsZiAqLworCQlhbXRfcmVhZCA9IGZyZWFkKHAtPmJ1ZmZlciwgMSwgaGRyLT5jYXBsZW4sIGZwKTsKKwkJaWYgKGFtdF9yZWFkICE9IGhkci0+Y2FwbGVuKSB7CisJCQlpZiAoZmVycm9yKGZwKSkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAidHJ1bmNhdGVkIGR1bXAgZmlsZTsgdHJpZWQgdG8gcmVhZCAldSBjYXB0dXJlZCBieXRlcywgb25seSBnb3QgJWx1IiwKKwkJCQkgICAgaGRyLT5jYXBsZW4sICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKKwkJCX0KKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCSpkYXRhID0gcC0+YnVmZmVyOworCisJaWYgKHAtPnN3YXBwZWQpCisJCXN3YXBfcHNldWRvX2hlYWRlcnMocC0+bGlua3R5cGUsIGhkciwgKmRhdGEpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc2Zfd3JpdGVfaGVhZGVyKHBjYXBfdCAqcCwgRklMRSAqZnAsIGludCBsaW5rdHlwZSwgaW50IHRoaXN6b25lLCBpbnQgc25hcGxlbikKK3sKKwlzdHJ1Y3QgcGNhcF9maWxlX2hlYWRlciBoZHI7CisKKwloZHIubWFnaWMgPSBwLT5vcHQudHN0YW1wX3ByZWNpc2lvbiA9PSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTyA/IE5TRUNfVENQRFVNUF9NQUdJQyA6IFRDUERVTVBfTUFHSUM7CisJaGRyLnZlcnNpb25fbWFqb3IgPSBQQ0FQX1ZFUlNJT05fTUFKT1I7CisJaGRyLnZlcnNpb25fbWlub3IgPSBQQ0FQX1ZFUlNJT05fTUlOT1I7CisKKwloZHIudGhpc3pvbmUgPSB0aGlzem9uZTsKKwloZHIuc25hcGxlbiA9IHNuYXBsZW47CisJaGRyLnNpZ2ZpZ3MgPSAwOworCWhkci5saW5rdHlwZSA9IGxpbmt0eXBlOworCisJaWYgKGZ3cml0ZSgoY2hhciAqKSZoZHIsIHNpemVvZihoZHIpLCAxLCBmcCkgIT0gMSkKKwkJcmV0dXJuICgtMSk7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogT3V0cHV0IGEgcGFja2V0IHRvIHRoZSBpbml0aWFsaXplZCBkdW1wIGZpbGUuCisgKi8KK3ZvaWQKK3BjYXBfZHVtcCh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpzcCkKK3sKKwlyZWdpc3RlciBGSUxFICpmOworCXN0cnVjdCBwY2FwX3NmX3BrdGhkciBzZl9oZHI7CisKKwlmID0gKEZJTEUgKil1c2VyOworCXNmX2hkci50cy50dl9zZWMgID0gaC0+dHMudHZfc2VjOworCXNmX2hkci50cy50dl91c2VjID0gaC0+dHMudHZfdXNlYzsKKwlzZl9oZHIuY2FwbGVuICAgICA9IGgtPmNhcGxlbjsKKwlzZl9oZHIubGVuICAgICAgICA9IGgtPmxlbjsKKwkvKiBYWFggd2Ugc2hvdWxkIGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzICovCisJKHZvaWQpZndyaXRlKCZzZl9oZHIsIHNpemVvZihzZl9oZHIpLCAxLCBmKTsKKwkodm9pZClmd3JpdGUoc3AsIGgtPmNhcGxlbiwgMSwgZik7Cit9CisKK3N0YXRpYyBwY2FwX2R1bXBlcl90ICoKK3BjYXBfc2V0dXBfZHVtcChwY2FwX3QgKnAsIGludCBsaW5rdHlwZSwgRklMRSAqZiwgY29uc3QgY2hhciAqZm5hbWUpCit7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE1TRE9TKQorCS8qCisJICogSWYgd2UncmUgd3JpdGluZyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LCBwdXQgaXQgaW4gYmluYXJ5CisJICogbW9kZSwgYXMgc2F2ZWZpbGVzIGFyZSBiaW5hcnkgZmlsZXMuCisJICoKKwkgKiBPdGhlcndpc2UsIHdlIHR1cm4gb2ZmIGJ1ZmZlcmluZy4KKwkgKiBYWFggLSB3aHk/ICBBbmQgd2h5IG5vdCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0PworCSAqLworCWlmIChmID09IHN0ZG91dCkKKwkJU0VUX0JJTk1PREUoZik7CisJZWxzZQorCQlzZXRidWYoZiwgTlVMTCk7CisjZW5kaWYKKwlpZiAoc2Zfd3JpdGVfaGVhZGVyKHAsIGYsIGxpbmt0eXBlLCBwLT50em9mZiwgcC0+c25hcHNob3QpID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHdyaXRlIHRvICVzOiAlcyIsCisJCSAgICBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlpZiAoZiAhPSBzdGRvdXQpCisJCQkodm9pZClmY2xvc2UoZik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXJldHVybiAoKHBjYXBfZHVtcGVyX3QgKilmKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgc28gdGhhdCBzZl93cml0ZSgpIHdpbGwgb3V0cHV0IHRvIHRoZSBmaWxlIG5hbWVkICdmbmFtZScuCisgKi8KK3BjYXBfZHVtcGVyX3QgKgorcGNhcF9kdW1wX29wZW4ocGNhcF90ICpwLCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwlGSUxFICpmOworCWludCBsaW5rdHlwZTsKKworCS8qCisJICogSWYgdGhpcyBwY2FwX3QgaGFzbid0IGJlZW4gYWN0aXZhdGVkLCBpdCBkb2Vzbid0IGhhdmUgYQorCSAqIGxpbmstbGF5ZXIgdHlwZSwgc28gd2UgY2FuJ3QgdXNlIGl0LgorCSAqLworCWlmICghcC0+YWN0aXZhdGVkKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogbm90LXlldC1hY3RpdmF0ZWQgcGNhcF90IHBhc3NlZCB0byBwY2FwX2R1bXBfb3BlbiIsCisJCSAgICBmbmFtZSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCWxpbmt0eXBlID0gZGx0X3RvX2xpbmt0eXBlKHAtPmxpbmt0eXBlKTsKKwlpZiAobGlua3R5cGUgPT0gLTEpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBsaW5rLWxheWVyIHR5cGUgJWQgaXNuJ3Qgc3VwcG9ydGVkIGluIHNhdmVmaWxlcyIsCisJCSAgICBmbmFtZSwgcC0+bGlua3R5cGUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlsaW5rdHlwZSB8PSBwLT5saW5rdHlwZV9leHQ7CisKKwlpZiAoZm5hbWVbMF0gPT0gJy0nICYmIGZuYW1lWzFdID09ICdcMCcpIHsKKwkJZiA9IHN0ZG91dDsKKwkJZm5hbWUgPSAic3RhbmRhcmQgb3V0cHV0IjsKKwl9IGVsc2UgeworI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKKwkJZiA9IGZvcGVuKGZuYW1lLCAidyIpOworI2Vsc2UKKwkJZiA9IGZvcGVuKGZuYW1lLCAid2IiKTsKKyNlbmRpZgorCQlpZiAoZiA9PSBOVUxMKSB7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLAorCQkJICAgIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJfQorCXJldHVybiAocGNhcF9zZXR1cF9kdW1wKHAsIGxpbmt0eXBlLCBmLCBmbmFtZSkpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBzbyB0aGF0IHNmX3dyaXRlKCkgd2lsbCBvdXRwdXQgdG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAqLworcGNhcF9kdW1wZXJfdCAqCitwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICpwLCBGSUxFICpmKQorewkKKwlpbnQgbGlua3R5cGU7CisKKwlsaW5rdHlwZSA9IGRsdF90b19saW5rdHlwZShwLT5saW5rdHlwZSk7CisJaWYgKGxpbmt0eXBlID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJzdHJlYW06IGxpbmstbGF5ZXIgdHlwZSAlZCBpc24ndCBzdXBwb3J0ZWQgaW4gc2F2ZWZpbGVzIiwKKwkJICAgIHAtPmxpbmt0eXBlKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJbGlua3R5cGUgfD0gcC0+bGlua3R5cGVfZXh0OworCisJcmV0dXJuIChwY2FwX3NldHVwX2R1bXAocCwgbGlua3R5cGUsIGYsICJzdHJlYW0iKSk7Cit9CisKK0ZJTEUgKgorcGNhcF9kdW1wX2ZpbGUocGNhcF9kdW1wZXJfdCAqcCkKK3sKKwlyZXR1cm4gKChGSUxFICopcCk7Cit9CisKK2xvbmcKK3BjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICpwKQoreworCXJldHVybiAoZnRlbGwoKEZJTEUgKilwKSk7Cit9CisKK2ludAorcGNhcF9kdW1wX2ZsdXNoKHBjYXBfZHVtcGVyX3QgKnApCit7CisKKwlpZiAoZmZsdXNoKChGSUxFICopcCkgPT0gRU9GKQorCQlyZXR1cm4gKC0xKTsKKwllbHNlCisJCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3BjYXBfZHVtcF9jbG9zZShwY2FwX2R1bXBlcl90ICpwKQoreworCisjaWZkZWYgbm90eWV0CisJaWYgKGZlcnJvcigoRklMRSAqKXApKQorCQlyZXR1cm4tYW4tZXJyb3I7CisJLyogWFhYIHNob3VsZCBjaGVjayByZXR1cm4gZnJvbSBmY2xvc2UoKSB0b28gKi8KKyNlbmRpZgorCSh2b2lkKWZjbG9zZSgoRklMRSAqKXApOworfQpkaWZmIC0tZ2l0IGEvc2YtcGNhcC5oIGIvc2YtcGNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzdlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZi1wY2FwLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIHNmLXBjYXAuaCAtIGxpYnBjYXAtZmlsZS1mb3JtYXQtc3BlY2lmaWMgcm91dGluZXMKKyAqCUV4dHJhY3Rpb24vY3JlYXRpb24gYnkgSmVmZnJleSBNb2d1bCwgREVDV1JMCisgKglNb2RpZmllZCBieSBTdGV2ZSBNY0Nhbm5lLCBMQkwuCisgKgorICogVXNlZCB0byBzYXZlIHRoZSByZWNlaXZlZCBwYWNrZXQgaGVhZGVycywgYWZ0ZXIgZmlsdGVyaW5nLCB0bworICogYSBmaWxlLCBhbmQgdGhlbiByZWFkIHRoZW0gbGF0ZXIuCisgKiBUaGUgZmlyc3QgcmVjb3JkIGluIHRoZSBmaWxlIGNvbnRhaW5zIHNhdmVkIHZhbHVlcyBmb3IgdGhlIG1hY2hpbmUKKyAqIGRlcGVuZGVudCB2YWx1ZXMgc28gd2UgY2FuIHByaW50IHRoZSBkdW1wIGZpbGUgb24gYW55IGFyY2hpdGVjdHVyZS4KKyAqLworCisjaWZuZGVmIHNmX3BjYXBfaAorI2RlZmluZQlzZl9wY2FwX2gKKworZXh0ZXJuIHBjYXBfdCAqcGNhcF9jaGVja19oZWFkZXIoYnBmX3VfaW50MzIgbWFnaWMsIEZJTEUgKmZwLAorICAgIHVfaW50IHByZWNpc2lvbiwgY2hhciAqZXJyYnVmLCBpbnQgKmVycik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3VuYXRtcG9zLmggYi9zdW5hdG1wb3MuaAppbmRleCA3NTM4YjJhLi45MTYwMTdmIDEwMDY0NAotLS0gYS9zdW5hdG1wb3MuaAorKysgYi9zdW5hdG1wb3MuaApAQCAtMjksNyArMjksNyBAQAogICogQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3N1bmF0bXBvcy5oLHYgMS4xIDIwMDIvMDcvMTEgMDk6MDY6NDcgZ3V5IEV4cCAkIChMQkwpCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3N1bmF0bXBvcy5oLHYgMS4xIDIwMDItMDctMTEgMDk6MDY6NDcgZ3V5IEV4cCAkIChMQkwpCiAgKi8KIAogLyogU3VuQVRNIGhlYWRlciBmb3IgQVRNIHBhY2tldCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsdGVydGVzdC5jIGIvdGVzdHMvZmlsdGVydGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmQxZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWx0ZXJ0ZXN0LmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdIF9VXyA9CisgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmlsdGVydGVzdC5jLHYgMS4yIDIwMDUtMDgtMDggMTc6NTA6MTMgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmbmRlZiBIQVZFX19fQVRUUklCVVRFX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisKK3N0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7CisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4sIGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworCitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBpbnQgb3B0ZXJyOworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworLyoKKyAqIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgc28gdGhhdAorICogd2UgZ2V0IGFsbCB0aGUgYnl0ZXMgc3BlY2lmaWVkIGJ5IHRoZSBzaXplIHdlIGdldCBmcm9tICJmc3RhdCgpIi4KKyAqIE9uIFVOSVgsIHRoYXQncyBub3QgbmVjZXNzYXJ5LiAgT19CSU5BUlkgaXMgZGVmaW5lZCBvbiBXaW5kb3dzOworICogd2UgZGVmaW5lIGl0IGFzIDAgaWYgaXQncyBub3QgZGVmaW5lZCwgc28gaXQgZG9lcyBub3RoaW5nLgorICovCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZCTAKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqCityZWFkX2luZmlsZShjaGFyICpmbmFtZSkKK3sKKwlyZWdpc3RlciBpbnQgaSwgZmQsIGNjOworCXJlZ2lzdGVyIGNoYXIgKmNwOworCXN0cnVjdCBzdGF0IGJ1ZjsKKworCWZkID0gb3BlbihmbmFtZSwgT19SRE9OTFl8T19CSU5BUlkpOworCWlmIChmZCA8IDApCisJCWVycm9yKCJjYW4ndCBvcGVuICVzOiAlcyIsIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisKKwlpZiAoZnN0YXQoZmQsICZidWYpIDwgMCkKKwkJZXJyb3IoImNhbid0IHN0YXQgJXM6ICVzIiwgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKworCWNwID0gbWFsbG9jKCh1X2ludClidWYuc3Rfc2l6ZSArIDEpOworCWlmIChjcCA9PSBOVUxMKQorCQllcnJvcigibWFsbG9jKCVkKSBmb3IgJXM6ICVzIiwgKHVfaW50KWJ1Zi5zdF9zaXplICsgMSwKKwkJCWZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJY2MgPSByZWFkKGZkLCBjcCwgKHVfaW50KWJ1Zi5zdF9zaXplKTsKKwlpZiAoY2MgPCAwKQorCQllcnJvcigicmVhZCAlczogJXMiLCBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCWlmIChjYyAhPSBidWYuc3Rfc2l6ZSkKKwkJZXJyb3IoInNob3J0IHJlYWQgJXMgKCVkICE9ICVkKSIsIGZuYW1lLCBjYywgKGludClidWYuc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7CisJLyogcmVwbGFjZSAiIyBjb21tZW50IiB3aXRoIHNwYWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjYzsgaSsrKSB7CisJCWlmIChjcFtpXSA9PSAnIycpCisJCQl3aGlsZSAoaSA8IGNjICYmIGNwW2ldICE9ICdcbicpCisJCQkJY3BbaSsrXSA9ICcgJzsKKwl9CisJY3BbY2NdID0gJ1wwJzsKKwlyZXR1cm4gKGNwKTsKK30KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlleGl0KDEpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIENvcHkgYXJnIHZlY3RvciBpbnRvIGEgbmV3IGJ1ZmZlciwgY29uY2F0ZW5hdGluZyBhcmd1bWVudHMgd2l0aCBzcGFjZXMuCisgKi8KK3N0YXRpYyBjaGFyICoKK2NvcHlfYXJndihyZWdpc3RlciBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBjaGFyICoqcDsKKwlyZWdpc3RlciB1X2ludCBsZW4gPSAwOworCWNoYXIgKmJ1ZjsKKwljaGFyICpzcmMsICpkc3Q7CisKKwlwID0gYXJndjsKKwlpZiAoKnAgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKnApCisJCWxlbiArPSBzdHJsZW4oKnArKykgKyAxOworCisJYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWVycm9yKCJjb3B5X2FyZ3Y6IG1hbGxvYyIpOworCisJcCA9IGFyZ3Y7CisJZHN0ID0gYnVmOworCXdoaWxlICgoc3JjID0gKnArKykgIT0gTlVMTCkgeworCQl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJCTsKKwkJZHN0Wy0xXSA9ICcgJzsKKwl9CisJZHN0Wy0xXSA9ICdcMCc7CisKKwlyZXR1cm4gYnVmOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmNwOworCWludCBvcDsKKwlpbnQgZGZsYWc7CisJY2hhciAqaW5maWxlOworCWludCBPZmxhZzsKKwlsb25nIHNuYXBsZW47CisJaW50IGRsdDsKKwlicGZfdV9pbnQzMiBuZXRtYXNrID0gUENBUF9ORVRNQVNLX1VOS05PV047CisJY2hhciAqY21kYnVmOworCXBjYXBfdCAqcGQ7CisJc3RydWN0IGJwZl9wcm9ncmFtIGZjb2RlOworCisjaWZkZWYgV0lOMzIKKwlpZih3c29ja2luaXQoKSAhPSAwKSByZXR1cm4gMTsKKyNlbmRpZiAvKiBXSU4zMiAqLworCisJZGZsYWcgPSAxOworCWluZmlsZSA9IE5VTEw7CisJT2ZsYWcgPSAxOworCXNuYXBsZW4gPSA2ODsKKyAgCisJaWYgKChjcCA9IHN0cnJjaHIoYXJndlswXSwgJy8nKSkgIT0gTlVMTCkKKwkJcHJvZ3JhbV9uYW1lID0gY3AgKyAxOworCWVsc2UKKwkJcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKworCW9wdGVyciA9IDA7CisJd2hpbGUgKChvcCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZEY6bTpPczoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcCkgeworCisJCWNhc2UgJ2QnOgorCQkJKytkZmxhZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0YnOgorCQkJaW5maWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnTyc6CisJCQlPZmxhZyA9IDA7CisJCQlicmVhazsKKworCQljYXNlICdtJzogeworCQkJaW5fYWRkcl90IGFkZHI7CisKKwkJCWFkZHIgPSBpbmV0X2FkZHIob3B0YXJnKTsKKwkJCWlmIChhZGRyID09IElOQUREUl9OT05FKQorCQkJCWVycm9yKCJpbnZhbGlkIG5ldG1hc2sgJXMiLCBvcHRhcmcpOworCQkJbmV0bWFzayA9IGFkZHI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgJ3MnOiB7CisJCQljaGFyICplbmQ7CisKKwkJCXNuYXBsZW4gPSBzdHJ0b2wob3B0YXJnLCAmZW5kLCAwKTsKKwkJCWlmIChvcHRhcmcgPT0gZW5kIHx8ICplbmQgIT0gJ1wwJworCQkJICAgIHx8IHNuYXBsZW4gPCAwIHx8IHNuYXBsZW4gPiA2NTUzNSkKKwkJCQllcnJvcigiaW52YWxpZCBzbmFwbGVuICVzIiwgb3B0YXJnKTsKKwkJCWVsc2UgaWYgKHNuYXBsZW4gPT0gMCkKKwkJCQlzbmFwbGVuID0gNjU1MzU7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJfQorCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCXVzYWdlKCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwlkbHQgPSBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKGFyZ3Zbb3B0aW5kXSk7CisJaWYgKGRsdCA8IDApCisJCWVycm9yKCJpbnZhbGlkIGRhdGEgbGluayB0eXBlICVzIiwgYXJndltvcHRpbmRdKTsKKwkKKwlpZiAoaW5maWxlKQorCQljbWRidWYgPSByZWFkX2luZmlsZShpbmZpbGUpOworCWVsc2UKKwkJY21kYnVmID0gY29weV9hcmd2KCZhcmd2W29wdGluZCsxXSk7CisKKwlwZCA9IHBjYXBfb3Blbl9kZWFkKGRsdCwgc25hcGxlbik7CisJaWYgKHBkID09IE5VTEwpCisJCWVycm9yKCJDYW4ndCBvcGVuIGZha2UgcGNhcF90Iik7CisKKwlpZiAocGNhcF9jb21waWxlKHBkLCAmZmNvZGUsIGNtZGJ1ZiwgT2ZsYWcsIG5ldG1hc2spIDwgMCkKKwkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKKwlicGZfZHVtcCgmZmNvZGUsIGRmbGFnKTsKKwlwY2FwX2Nsb3NlKHBkKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzLCB3aXRoICVzXG4iLCBwcm9ncmFtX25hbWUsCisJICAgIHBjYXBfbGliX3ZlcnNpb24oKSk7CisJKHZvaWQpZnByaW50ZihzdGRlcnIsCisJICAgICJVc2FnZTogJXMgWy1kT10gWyAtRiBmaWxlIF0gWyAtbSBuZXRtYXNrXSBbIC1zIHNuYXBsZW4gXSBkbHQgWyBleHByZXNzaW9uIF1cbiIsCisJICAgIHByb2dyYW1fbmFtZSk7CisJZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jIGIvdGVzdHMvZmluZGFsbGRldnN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3Yzk1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jCkBAIC0wLDAgKzEsMTMxIEBACisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpbmNsdWRlIDxwY2FwLmg+CisKK3N0YXRpYyB2b2lkIGlmcHJpbnQocGNhcF9pZl90ICpkKTsKK3N0YXRpYyBjaGFyICppcHRvcyhicGZfdV9pbnQzMiBpbik7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgcGNhcF9pZl90ICphbGxkZXZzOworICBwY2FwX2lmX3QgKmQ7CisgIGNoYXIgKnM7CisgIGJwZl91X2ludDMyIG5ldCwgbWFzazsKKyAgCisgIGNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkUrMV07CisgIGlmIChwY2FwX2ZpbmRhbGxkZXZzKCZhbGxkZXZzLCBlcnJidWYpID09IC0xKQorICB7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHBjYXBfZmluZGFsbGRldnM6ICVzXG4iLGVycmJ1Zik7CisgICAgZXhpdCgxKTsKKyAgfQorICBmb3IoZD1hbGxkZXZzO2Q7ZD1kLT5uZXh0KQorICB7CisgICAgaWZwcmludChkKTsKKyAgfQorCisgIGlmICggKHMgPSBwY2FwX2xvb2t1cGRldihlcnJidWYpKSA9PSBOVUxMKQorICB7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHBjYXBfbG9va3VwZGV2OiAlc1xuIixlcnJidWYpOworICB9CisgIGVsc2UKKyAgeworICAgIHByaW50ZigiUHJlZmVycmVkIGRldmljZSBuYW1lOiAlc1xuIixzKTsKKyAgfQorCisgIGlmIChwY2FwX2xvb2t1cG5ldChzLCAmbmV0LCAmbWFzaywgZXJyYnVmKSA8IDApCisgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gcGNhcF9sb29rdXBuZXQ6ICVzXG4iLGVycmJ1Zik7CisgIH0KKyAgZWxzZQorICB7CisgICAgcHJpbnRmKCJQcmVmZXJyZWQgZGV2aWNlIGlzIG9uIG5ldHdvcms6ICVzLyVzXG4iLGlwdG9zKG5ldCksIGlwdG9zKG1hc2spKTsKKyAgfQorICAKKyAgZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQgaWZwcmludChwY2FwX2lmX3QgKmQpCit7CisgIHBjYXBfYWRkcl90ICphOworI2lmZGVmIElORVQ2CisgIGNoYXIgbnRvcF9idWZbSU5FVDZfQUREUlNUUkxFTl07CisjZW5kaWYKKworICBwcmludGYoIiVzXG4iLGQtPm5hbWUpOworICBpZiAoZC0+ZGVzY3JpcHRpb24pCisgICAgcHJpbnRmKCJcdERlc2NyaXB0aW9uOiAlc1xuIixkLT5kZXNjcmlwdGlvbik7CisgIHByaW50ZigiXHRMb29wYmFjazogJXNcbiIsKGQtPmZsYWdzICYgUENBUF9JRl9MT09QQkFDSyk/InllcyI6Im5vIik7CisKKyAgZm9yKGE9ZC0+YWRkcmVzc2VzO2E7YT1hLT5uZXh0KSB7CisgICAgc3dpdGNoKGEtPmFkZHItPnNhX2ZhbWlseSkKKyAgICB7CisgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHByaW50ZigiXHRBZGRyZXNzIEZhbWlseTogQUZfSU5FVFxuIik7CisgICAgICAgIGlmIChhLT5hZGRyKQorICAgICAgICAgIHByaW50ZigiXHRcdEFkZHJlc3M6ICVzXG4iLAorICAgICAgICAgICAgaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopKGEtPmFkZHIpKS0+c2luX2FkZHIpKTsKKyAgICAgICAgaWYgKGEtPm5ldG1hc2spCisgICAgICAgICAgcHJpbnRmKCJcdFx0TmV0bWFzazogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoYS0+bmV0bWFzaykpLT5zaW5fYWRkcikpOworICAgICAgICBpZiAoYS0+YnJvYWRhZGRyKQorICAgICAgICAgIHByaW50ZigiXHRcdEJyb2FkY2FzdCBBZGRyZXNzOiAlc1xuIiwKKyAgICAgICAgICAgIGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhLT5icm9hZGFkZHIpKS0+c2luX2FkZHIpKTsKKyAgICAgICAgaWYgKGEtPmRzdGFkZHIpCisgICAgICAgICAgcHJpbnRmKCJcdFx0RGVzdGluYXRpb24gQWRkcmVzczogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoYS0+ZHN0YWRkcikpLT5zaW5fYWRkcikpOworICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNgorICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgcHJpbnRmKCJcdEFkZHJlc3MgRmFtaWx5OiBBRl9JTkVUNlxuIik7CisgICAgICAgIGlmIChhLT5hZGRyKQorICAgICAgICAgIHByaW50ZigiXHRcdEFkZHJlc3M6ICVzXG4iLAorICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LAorICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGEtPmFkZHIpKS0+c2luNl9hZGRyLnM2X2FkZHIsCisgICAgICAgICAgICAgICBudG9wX2J1Ziwgc2l6ZW9mIG50b3BfYnVmKSk7CisgICAgICAgIGlmIChhLT5uZXRtYXNrKQorICAgICAgICAgIHByaW50ZigiXHRcdE5ldG1hc2s6ICVzXG4iLAorICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LAorICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikoYS0+bmV0bWFzaykpLT5zaW42X2FkZHIuczZfYWRkciwKKyAgICAgICAgICAgICAgIG50b3BfYnVmLCBzaXplb2YgbnRvcF9idWYpKTsKKyAgICAgICAgaWYgKGEtPmJyb2FkYWRkcikKKyAgICAgICAgICBwcmludGYoIlx0XHRCcm9hZGNhc3QgQWRkcmVzczogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsCisgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKShhLT5icm9hZGFkZHIpKS0+c2luNl9hZGRyLnM2X2FkZHIsCisgICAgICAgICAgICAgICBudG9wX2J1Ziwgc2l6ZW9mIG50b3BfYnVmKSk7CisgICAgICAgIGlmIChhLT5kc3RhZGRyKQorICAgICAgICAgIHByaW50ZigiXHRcdERlc3RpbmF0aW9uIEFkZHJlc3M6ICVzXG4iLAorICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LAorICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikoYS0+ZHN0YWRkcikpLT5zaW42X2FkZHIuczZfYWRkciwKKyAgICAgICAgICAgICAgIG50b3BfYnVmLCBzaXplb2YgbnRvcF9idWYpKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiXHRBZGRyZXNzIEZhbWlseTogVW5rbm93biAoJWQpXG4iLCBhLT5hZGRyLT5zYV9mYW1pbHkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcHJpbnRmKCJcbiIpOworfQorCisvKiBGcm9tIHRjcHRyYWNlcm91dGUgKi8KKyNkZWZpbmUgSVBUT1NCVUZGRVJTCTEyCitzdGF0aWMgY2hhciAqaXB0b3MoYnBmX3VfaW50MzIgaW4pCit7CisJc3RhdGljIGNoYXIgb3V0cHV0W0lQVE9TQlVGRkVSU11bMyo0KzMrMV07CisJc3RhdGljIHNob3J0IHdoaWNoOworCXVfY2hhciAqcDsKKworCXAgPSAodV9jaGFyICopJmluOworCXdoaWNoID0gKHdoaWNoICsgMSA9PSBJUFRPU0JVRkZFUlMgPyAwIDogd2hpY2ggKyAxKTsKKwlzcHJpbnRmKG91dHB1dFt3aGljaF0sICIlZC4lZC4lZC4lZCIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworCXJldHVybiBvdXRwdXRbd2hpY2hdOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbm9uYmxvY2t0ZXN0LmMgYi90ZXN0cy9ub25ibG9ja3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE2YmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbm9uYmxvY2t0ZXN0LmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdID0KKyAgICAiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDBcblwKK1RoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8cG9sbC5oPgorCitjaGFyICpwcm9ncmFtX25hbWU7CisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgdm9pZCBjb3VudG1lKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3N0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKTsKK3N0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIGNoYXIgKmNvcHlfYXJndihjaGFyICoqKTsKKworc3RhdGljIHBjYXBfdCAqcGQ7CisKK2V4dGVybiBpbnQgb3B0aW5kOworZXh0ZXJuIGludCBvcHRlcnI7CitleHRlcm4gY2hhciAqb3B0YXJnOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJlZ2lzdGVyIGludCBvcDsKKwlicGZfdV9pbnQzMiBsb2NhbG5ldCwgbmV0bWFzazsKKwlyZWdpc3RlciBjaGFyICpjcCwgKmNtZGJ1ZiwgKmRldmljZTsKKwlzdHJ1Y3QgYnBmX3Byb2dyYW0gZmNvZGU7CisJY2hhciBlYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworCWludCBzdGF0dXM7CisJaW50IHBhY2tldF9jb3VudDsKKworCWRldmljZSA9IE5VTEw7CisJaWYgKChjcCA9IHN0cnJjaHIoYXJndlswXSwgJy8nKSkgIT0gTlVMTCkKKwkJcHJvZ3JhbV9uYW1lID0gY3AgKyAxOworCWVsc2UKKwkJcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKworCW9wdGVyciA9IDA7CisJd2hpbGUgKChvcCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaToiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcCkgeworCisJCWNhc2UgJ2knOgorCQkJZGV2aWNlID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisKKwlpZiAoZGV2aWNlID09IE5VTEwpIHsKKwkJZGV2aWNlID0gcGNhcF9sb29rdXBkZXYoZWJ1Zik7CisJCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJCWVycm9yKCIlcyIsIGVidWYpOworCX0KKwkqZWJ1ZiA9ICdcMCc7CisJcGQgPSBwY2FwX29wZW5fbGl2ZShkZXZpY2UsIDY1NTM1LCAwLCAxMDAwLCBlYnVmKTsKKwlpZiAocGQgPT0gTlVMTCkKKwkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJZWxzZSBpZiAoKmVidWYpCisJCXdhcm5pbmcoIiVzIiwgZWJ1Zik7CisJaWYgKHBjYXBfbG9va3VwbmV0KGRldmljZSwgJmxvY2FsbmV0LCAmbmV0bWFzaywgZWJ1ZikgPCAwKSB7CisJCWxvY2FsbmV0ID0gMDsKKwkJbmV0bWFzayA9IDA7CisJCXdhcm5pbmcoIiVzIiwgZWJ1Zik7CisJfQorCWNtZGJ1ZiA9IGNvcHlfYXJndigmYXJndltvcHRpbmRdKTsKKworCWlmIChwY2FwX2NvbXBpbGUocGQsICZmY29kZSwgY21kYnVmLCAxLCBuZXRtYXNrKSA8IDApCisJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisKKwlpZiAocGNhcF9zZXRmaWx0ZXIocGQsICZmY29kZSkgPCAwKQorCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOworCWlmIChwY2FwX3NldG5vbmJsb2NrKHBkLCAxLCBlYnVmKSA9PSAtMSkKKwkJZXJyb3IoInBjYXBfc2V0bm9uYmxvY2sgZmFpbGVkOiAlcyIsIGVidWYpOworCXByaW50ZigiTGlzdGVuaW5nIG9uICVzXG4iLCBkZXZpY2UpOworCWZvciAoOzspIHsKKwkJcGFja2V0X2NvdW50ID0gMDsKKwkJc3RhdHVzID0gcGNhcF9kaXNwYXRjaChwZCwgLTEsIGNvdW50bWUsCisJCSAgICAodV9jaGFyICopJnBhY2tldF9jb3VudCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJcHJpbnRmKCIlZCBwYWNrZXRzIHNlZW4sICVkIHBhY2tldHMgY291bnRlZCBhZnRlciBwY2FwX2Rpc3BhdGNoIHJldHVybnNcbiIsCisJCQkgICAgc3RhdHVzLCBwYWNrZXRfY291bnQpOworCQl9CisJfQorCWlmIChzdGF0dXMgPT0gLTIpIHsKKwkJLyoKKwkJICogV2UgZ290IGludGVycnVwdGVkLCBzbyBwZXJoYXBzIHdlIGRpZG4ndAorCQkgKiBtYW5hZ2UgdG8gZmluaXNoIGEgbGluZSB3ZSB3ZXJlIHByaW50aW5nLgorCQkgKiBQcmludCBhbiBleHRyYSBuZXdsaW5lLCBqdXN0IGluIGNhc2UuCisJCSAqLworCQlwdXRjaGFyKCdcbicpOworCX0KKwkodm9pZClmZmx1c2goc3Rkb3V0KTsKKwlpZiAoc3RhdHVzID09IC0xKSB7CisJCS8qCisJCSAqIEVycm9yLiAgUmVwb3J0IGl0LgorCQkgKi8KKwkJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogcGNhcF9sb29wOiAlc1xuIiwKKwkJICAgIHByb2dyYW1fbmFtZSwgcGNhcF9nZXRlcnIocGQpKTsKKwl9CisJcGNhcF9jbG9zZShwZCk7CisJZXhpdChzdGF0dXMgPT0gLTEgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3VudG1lKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnNwKQoreworCWludCAqY291bnRlcnAgPSAoaW50ICopdXNlcjsKKworCSgqY291bnRlcnApKys7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFsgLXNwdG4gXSBbIC1pIGludGVyZmFjZSBdIFtleHByZXNzaW9uXVxuIiwKKwkgICAgcHJvZ3JhbV9uYW1lKTsKKwlleGl0KDEpOworfQorCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJKHZvaWQpdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmICgqZm10KSB7CisJCWZtdCArPSBzdHJsZW4oZm10KTsKKwkJaWYgKGZtdFstMV0gIT0gJ1xuJykKKwkJCSh2b2lkKWZwdXRjKCdcbicsIHN0ZGVycik7CisJfQorCWV4aXQoMSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAord2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogV0FSTklORzogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9Cit9CisKKy8qCisgKiBDb3B5IGFyZyB2ZWN0b3IgaW50byBhIG5ldyBidWZmZXIsIGNvbmNhdGVuYXRpbmcgYXJndW1lbnRzIHdpdGggc3BhY2VzLgorICovCitzdGF0aWMgY2hhciAqCitjb3B5X2FyZ3YocmVnaXN0ZXIgY2hhciAqKmFyZ3YpCit7CisJcmVnaXN0ZXIgY2hhciAqKnA7CisJcmVnaXN0ZXIgdV9pbnQgbGVuID0gMDsKKwljaGFyICpidWY7CisJY2hhciAqc3JjLCAqZHN0OworCisJcCA9IGFyZ3Y7CisJaWYgKCpwID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKCpwKQorCQlsZW4gKz0gc3RybGVuKCpwKyspICsgMTsKKworCWJ1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQllcnJvcigiY29weV9hcmd2OiBtYWxsb2MiKTsKKworCXAgPSBhcmd2OworCWRzdCA9IGJ1ZjsKKwl3aGlsZSAoKHNyYyA9ICpwKyspICE9IE5VTEwpIHsKKwkJd2hpbGUgKCgqZHN0KysgPSAqc3JjKyspICE9ICdcMCcpCisJCQk7CisJCWRzdFstMV0gPSAnICc7CisJfQorCWRzdFstMV0gPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29wZW50ZXN0LmMgYi90ZXN0cy9vcGVudGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTE1MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcGVudGVzdC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CisgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CisjZW5kaWYKKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgTUFYSU1VTV9TTkFQTEVOCQk2NTUzNQorCitzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOworCisvKiBGb3J3YXJkcyAqLworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3N0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKTsKK3N0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pOworCitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBpbnQgb3B0ZXJyOworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBpbnQgb3A7CisJcmVnaXN0ZXIgY2hhciAqY3AsICpkZXZpY2U7CisJaW50IGRvcmZtb24sIGRvcHJvbWlzYywgc25hcGxlbiwgdXNlYWN0aXZhdGUsIGJ1ZnNpemU7CisJY2hhciBlYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworCXBjYXBfdCAqcGQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkZXZpY2UgPSBOVUxMOworCWRvcmZtb24gPSAwOworCWRvcHJvbWlzYyA9IDA7CisJc25hcGxlbiA9IE1BWElNVU1fU05BUExFTjsKKwlidWZzaXplID0gMDsKKwl1c2VhY3RpdmF0ZSA9IDA7CisJaWYgKChjcCA9IHN0cnJjaHIoYXJndlswXSwgJy8nKSkgIT0gTlVMTCkKKwkJcHJvZ3JhbV9uYW1lID0gY3AgKyAxOworCWVsc2UKKwkJcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKworCW9wdGVyciA9IDA7CisJd2hpbGUgKChvcCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaTpJcHM6YUI6IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3ApIHsKKworCQljYXNlICdpJzoKKwkJCWRldmljZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0knOgorCQkJZG9yZm1vbiA9IDE7CisJCQl1c2VhY3RpdmF0ZSA9IDE7CS8qIHJlcXVpcmVkIGZvciByZm1vbiAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAncCc6CisJCQlkb3Byb21pc2MgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAncyc6IHsKKwkJCWNoYXIgKmVuZDsKKworCQkJc25hcGxlbiA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDApOworCQkJaWYgKG9wdGFyZyA9PSBlbmQgfHwgKmVuZCAhPSAnXDAnCisJCQkgICAgfHwgc25hcGxlbiA8IDAgfHwgc25hcGxlbiA+IE1BWElNVU1fU05BUExFTikKKwkJCQllcnJvcigiaW52YWxpZCBzbmFwbGVuICVzIiwgb3B0YXJnKTsKKwkJCWVsc2UgaWYgKHNuYXBsZW4gPT0gMCkKKwkJCQlzbmFwbGVuID0gTUFYSU1VTV9TTkFQTEVOOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlICdCJzoKKwkJCWJ1ZnNpemUgPSBhdG9pKG9wdGFyZykqMTAyNDsKKwkJCWlmIChidWZzaXplIDw9IDApCisJCQkJZXJyb3IoImludmFsaWQgcGFja2V0IGJ1ZmZlciBzaXplICVzIiwgb3B0YXJnKTsKKwkJCXVzZWFjdGl2YXRlID0gMTsJLyogcmVxdWlyZWQgZm9yIGJ1ZnNpemUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgJ2EnOgorCQkJdXNlYWN0aXZhdGUgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisKKwlpZiAodXNlYWN0aXZhdGUpIHsKKwkJcGQgPSBwY2FwX2NyZWF0ZShkZXZpY2UsIGVidWYpOworCQlpZiAocGQgPT0gTlVMTCkKKwkJCWVycm9yKCIlcyIsIGVidWYpOworCQlzdGF0dXMgPSBwY2FwX3NldF9zbmFwbGVuKHBkLCBzbmFwbGVuKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJZXJyb3IoIiVzOiBwY2FwX3NldF9zbmFwbGVuIGZhaWxlZDogJXMiLAorCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJaWYgKGRvcHJvbWlzYykgeworCQkJc3RhdHVzID0gcGNhcF9zZXRfcHJvbWlzYyhwZCwgMSk7CisJCQlpZiAoc3RhdHVzICE9IDApCisJCQkJZXJyb3IoIiVzOiBwY2FwX3NldF9wcm9taXNjIGZhaWxlZDogJXMiLAorCQkJCSAgICBkZXZpY2UsIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJCX0KKwkJaWYgKGRvcmZtb24pIHsKKwkJCXN0YXR1cyA9IHBjYXBfc2V0X3JmbW9uKHBkLCAxKTsKKwkJCWlmIChzdGF0dXMgIT0gMCkKKwkJCQllcnJvcigiJXM6IHBjYXBfc2V0X3JmbW9uIGZhaWxlZDogJXMiLAorCQkJCSAgICBkZXZpY2UsIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJCX0KKwkJc3RhdHVzID0gcGNhcF9zZXRfdGltZW91dChwZCwgMTAwMCk7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCWVycm9yKCIlczogcGNhcF9zZXRfdGltZW91dCBmYWlsZWQ6ICVzIiwKKwkJCSAgICBkZXZpY2UsIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJCWlmIChidWZzaXplICE9IDApIHsKKwkJCXN0YXR1cyA9IHBjYXBfc2V0X2J1ZmZlcl9zaXplKHBkLCBidWZzaXplKTsKKwkJCWlmIChzdGF0dXMgIT0gMCkKKwkJCQllcnJvcigiJXM6IHBjYXBfc2V0X2J1ZmZlcl9zaXplIGZhaWxlZDogJXMiLAorCQkJCSAgICBkZXZpY2UsIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJCX0KKwkJc3RhdHVzID0gcGNhcF9hY3RpdmF0ZShwZCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQkvKgorCQkJICogcGNhcF9hY3RpdmF0ZSgpIGZhaWxlZC4KKwkJCSAqLworCQkJZXJyb3IoIiVzOiAlc1xuKCVzKSIsIGRldmljZSwKKwkJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cyksIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzID4gMCkgeworCQkJLyoKKwkJCSAqIHBjYXBfYWN0aXZhdGUoKSBzdWNjZWVkZWQsIGJ1dCBpdCdzIHdhcm5pbmcgdXMKKwkJCSAqIG9mIGEgcHJvYmxlbSBpdCBoYWQuCisJCQkgKi8KKwkJCXdhcm5pbmcoIiVzOiAlc1xuKCVzKSIsIGRldmljZSwKKwkJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cyksIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCX0KKwl9IGVsc2UgeworCQkqZWJ1ZiA9ICdcMCc7CisJCXBkID0gcGNhcF9vcGVuX2xpdmUoZGV2aWNlLCA2NTUzNSwgMCwgMTAwMCwgZWJ1Zik7CisJCWlmIChwZCA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJCWVsc2UgaWYgKCplYnVmKQorCQkJd2FybmluZygiJXMiLCBlYnVmKTsKKwl9CisJcGNhcF9jbG9zZShwZCk7CisJZXhpdChzdGF0dXMgPCAwID8gMSA6IDApOworfQorCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkgICAgIlVzYWdlOiAlcyBbIC1JcGEgXSBbIC1pIGludGVyZmFjZSBdIFsgLXMgc25hcGxlbiBdIFsgLUIgYnVmc2l6ZSBdXG4iLAorCSAgICBwcm9ncmFtX25hbWUpOworCWV4aXQoMSk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCitlcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9CisJZXhpdCgxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCit3YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBXQVJOSU5HOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BjYXBfY29tcGlsZV90ZXN0LmMgYi90ZXN0cy9wY2FwX2NvbXBpbGVfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGFkNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wY2FwX2NvbXBpbGVfdGVzdC5jCkBAIC0wLDAgKzEsMTEgQEAKKyAgIHBjYXAgPSBwY2FwX29wZW5fZGVhZChsaW5rLCBzbmFwbGVuKTsgCisgICAvKiB0b2RvOiBob29rIHRvZ2V0aGVyIGFyZ3YgdG8gYSBzaW5nbGUgc3RyaW5nICovIAorICAgcHJvZyA9IGFyZ3ZbMF07IAorICAgaWYgKHBjYXBfY29tcGlsZShwY2FwLCAmcCwgcHJvZywgb3B0aW1pemUsIDApIDwgMCkgeyAKKyAgICAgIGZwcmludGYoc3RkZXJyLCBwY2FwX2dldGVycihwY2FwKSk7IAorICAgICAgZXhpdCgxKTsgCisgICB9IAorICAgYnBmX2R1bXAoJnAsIG9wdGlvbik7IAorICAgcGNhcF9mcmVlY29kZSgmcCk7IAorICAgcGNhcF9jbG9zZShwY2FwKTsgCisgCmRpZmYgLS1naXQgYS90ZXN0cy9yZWFjdGl2YXRldGVzdC5jIGIvdGVzdHMvcmVhY3RpdmF0ZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDMxYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVhY3RpdmF0ZXRlc3QuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CisgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CisjZW5kaWYKKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBGb3J3YXJkcyAqLworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pOworCitpbnQKK21haW4odm9pZCkKK3sKKwljaGFyIGVidWZbUENBUF9FUlJCVUZfU0laRV07CisJcGNhcF90ICpwZDsKKwlpbnQgc3RhdHVzID0gMDsKKworCXBkID0gcGNhcF9vcGVuX2xpdmUoImxvMCIsIDY1NTM1LCAwLCAxMDAwLCBlYnVmKTsKKwlpZiAocGQgPT0gTlVMTCkgeworCQlwZCA9IHBjYXBfb3Blbl9saXZlKCJsbyIsIDY1NTM1LCAwLCAxMDAwLCBlYnVmKTsKKwkJaWYgKHBkID09IE5VTEwpIHsKKwkJCWVycm9yKCJOZWl0aGVyIGxvMCBub3IgbG8gY291bGQgYmUgb3BlbmVkOiAlcyIsCisJCQkgICAgZWJ1Zik7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KKwlzdGF0dXMgPSBwY2FwX2FjdGl2YXRlKHBkKTsKKwlpZiAoc3RhdHVzICE9IFBDQVBfRVJST1JfQUNUSVZBVEVEKSB7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCWVycm9yKCJwY2FwX2FjdGl2YXRlKCkgb2Ygb3BlbmVkIHBjYXBfdCBzdWNjZWVkZWQiKTsKKwkJZWxzZSBpZiAoc3RhdHVzID09IFBDQVBfRVJST1IpCisJCQllcnJvcigicGNhcF9hY3RpdmF0ZSgpIG9mIG9wZW5lZCBwY2FwX3QgZmFpbGVkIHdpdGggJXMsIG5vdCBQQ0FQX0VSUk9SX0FDVElWQVRFRCIsCisJCQkgICAgcGNhcF9nZXRlcnIocGQpKTsKKwkJZWxzZQorCQkJZXJyb3IoInBjYXBfYWN0aXZhdGUoKSBvZiBvcGVuZWQgcGNhcF90IGZhaWxlZCB3aXRoICVzLCBub3QgUENBUF9FUlJPUl9BQ1RJVkFURUQiLAorCQkJICAgIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAicmVhY3RpdmF0ZXRlc3Q6ICIpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlleGl0KDEpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbHBvbGx0ZXN0LmMgYi90ZXN0cy9zZWxwb2xsdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NGZiNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zZWxwb2xsdGVzdC5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CisgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CisjZW5kaWYKKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKworY2hhciAqcHJvZ3JhbV9uYW1lOworCisvKiBGb3J3YXJkcyAqLworc3RhdGljIHZvaWQgY291bnRtZSh1X2NoYXIgKiwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitzdGF0aWMgdm9pZCBlcnJvcihjb25zdCBjaGFyICosIC4uLik7CitzdGF0aWMgdm9pZCB3YXJuaW5nKGNvbnN0IGNoYXIgKiwgLi4uKTsKK3N0YXRpYyBjaGFyICpjb3B5X2FyZ3YoY2hhciAqKik7CisKK3N0YXRpYyBwY2FwX3QgKnBkOworCitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBpbnQgb3B0ZXJyOworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBpbnQgb3A7CisJYnBmX3VfaW50MzIgbG9jYWxuZXQsIG5ldG1hc2s7CisJcmVnaXN0ZXIgY2hhciAqY3AsICpjbWRidWYsICpkZXZpY2U7CisJaW50IGRvc2VsZWN0LCBkb3BvbGwsIGRvdGltZW91dCwgZG9ub25ibG9jazsKKwlzdHJ1Y3QgYnBmX3Byb2dyYW0gZmNvZGU7CisJY2hhciBlYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworCWludCBzZWxlY3RhYmxlX2ZkOworCWludCBzdGF0dXM7CisJaW50IHBhY2tldF9jb3VudDsKKworCWRldmljZSA9IE5VTEw7CisJZG9zZWxlY3QgPSAwOworCWRvcG9sbCA9IDA7CisJZG90aW1lb3V0ID0gMDsKKwlkb25vbmJsb2NrID0gMDsKKwlpZiAoKGNwID0gc3RycmNocihhcmd2WzBdLCAnLycpKSAhPSBOVUxMKQorCQlwcm9ncmFtX25hbWUgPSBjcCArIDE7CisJZWxzZQorCQlwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworCisJb3B0ZXJyID0gMDsKKwl3aGlsZSAoKG9wID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpOnNwdG4iKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcCkgeworCisJCWNhc2UgJ2knOgorCQkJZGV2aWNlID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAncyc6CisJCQlkb3NlbGVjdCA9IDE7CisJCQlicmVhazsKKworCQljYXNlICdwJzoKKwkJCWRvcG9sbCA9IDE7CisJCQlicmVhazsKKworCQljYXNlICd0JzoKKwkJCWRvdGltZW91dCA9IDE7CisJCQlicmVhazsKKworCQljYXNlICduJzoKKwkJCWRvbm9uYmxvY2sgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisKKwlpZiAoZG9zZWxlY3QgJiYgZG9wb2xsKSB7CisJCWZwcmludGYoc3RkZXJyLCAic2VscG9sbHRlc3Q6IGNob29zZSBzZWxlY3QgKC1zKSBvciBwb2xsICgtcCksIGJ1dCBub3QgYm90aFxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoZG90aW1lb3V0ICYmICFkb3NlbGVjdCAmJiAhZG9wb2xsKSB7CisJCWZwcmludGYoc3RkZXJyLCAic2VscG9sbHRlc3Q6IHRpbWVvdXQgKC10KSByZXF1aXJlcyBzZWxlY3QgKC1zKSBvciBwb2xsICgtcClcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGRldmljZSA9PSBOVUxMKSB7CisJCWRldmljZSA9IHBjYXBfbG9va3VwZGV2KGVidWYpOworCQlpZiAoZGV2aWNlID09IE5VTEwpCisJCQllcnJvcigiJXMiLCBlYnVmKTsKKwl9CisJKmVidWYgPSAnXDAnOworCXBkID0gcGNhcF9vcGVuX2xpdmUoZGV2aWNlLCA2NTUzNSwgMCwgMTAwMCwgZWJ1Zik7CisJaWYgKHBkID09IE5VTEwpCisJCWVycm9yKCIlcyIsIGVidWYpOworCWVsc2UgaWYgKCplYnVmKQorCQl3YXJuaW5nKCIlcyIsIGVidWYpOworCWlmIChwY2FwX2xvb2t1cG5ldChkZXZpY2UsICZsb2NhbG5ldCwgJm5ldG1hc2ssIGVidWYpIDwgMCkgeworCQlsb2NhbG5ldCA9IDA7CisJCW5ldG1hc2sgPSAwOworCQl3YXJuaW5nKCIlcyIsIGVidWYpOworCX0KKwljbWRidWYgPSBjb3B5X2FyZ3YoJmFyZ3Zbb3B0aW5kXSk7CisKKwlpZiAocGNhcF9jb21waWxlKHBkLCAmZmNvZGUsIGNtZGJ1ZiwgMSwgbmV0bWFzaykgPCAwKQorCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOworCisJaWYgKHBjYXBfc2V0ZmlsdGVyKHBkLCAmZmNvZGUpIDwgMCkKKwkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKKwlpZiAocGNhcF9nZXRfc2VsZWN0YWJsZV9mZChwZCkgPT0gLTEpCisJCWVycm9yKCJwY2FwX2dldF9zZWxlY3RhYmxlX2ZkKCkgZmFpbHMiKTsKKwlpZiAoZG9ub25ibG9jaykgeworCQlpZiAocGNhcF9zZXRub25ibG9jayhwZCwgMSwgZWJ1ZikgPT0gLTEpCisJCQllcnJvcigicGNhcF9zZXRub25ibG9jayBmYWlsZWQ6ICVzIiwgZWJ1Zik7CisJfQorCXNlbGVjdGFibGVfZmQgPSBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkKHBkKTsKKwlwcmludGYoIkxpc3RlbmluZyBvbiAlc1xuIiwgZGV2aWNlKTsKKwlpZiAoZG9zZWxlY3QpIHsKKwkJZm9yICg7OykgeworCQkJZmRfc2V0IHNldHJlYWQsIHNldGV4Y2VwdDsKKwkJCXN0cnVjdCB0aW1ldmFsIHNlbHRpbWVvdXQ7CisKKwkJCUZEX1pFUk8oJnNldHJlYWQpOworCQkJRkRfU0VUKHNlbGVjdGFibGVfZmQsICZzZXRyZWFkKTsKKwkJCUZEX1pFUk8oJnNldGV4Y2VwdCk7CisJCQlGRF9TRVQoc2VsZWN0YWJsZV9mZCwgJnNldGV4Y2VwdCk7CisJCQlpZiAoZG90aW1lb3V0KSB7CisJCQkJc2VsdGltZW91dC50dl9zZWMgPSAwOworCQkJCXNlbHRpbWVvdXQudHZfdXNlYyA9IDEwMDA7CisJCQkJc3RhdHVzID0gc2VsZWN0KHNlbGVjdGFibGVfZmQgKyAxLCAmc2V0cmVhZCwKKwkJCQkgICAgTlVMTCwgJnNldGV4Y2VwdCwgJnNlbHRpbWVvdXQpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSBzZWxlY3Qoc2VsZWN0YWJsZV9mZCArIDEsICZzZXRyZWFkLAorCQkJCSAgICBOVUxMLCAmc2V0ZXhjZXB0LCBOVUxMKTsKKwkJCX0KKwkJCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJCQlwcmludGYoIlNlbGVjdCByZXR1cm5zIGVycm9yICglcylcbiIsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzdGF0dXMgPT0gMCkKKwkJCQkJcHJpbnRmKCJTZWxlY3QgdGltZWQgb3V0OiAiKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiU2VsZWN0IHJldHVybmVkIGEgZGVzY3JpcHRvcjogIik7CisJCQkJaWYgKEZEX0lTU0VUKHNlbGVjdGFibGVfZmQsICZzZXRyZWFkKSkKKwkJCQkJcHJpbnRmKCJyZWFkYWJsZSwgIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIm5vdCByZWFkYWJsZSwgIik7CisJCQkJaWYgKEZEX0lTU0VUKHNlbGVjdGFibGVfZmQsICZzZXRleGNlcHQpKQorCQkJCQlwcmludGYoImV4Y2VwdGlvbmFsIGNvbmRpdGlvblxuIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIm5vIGV4Y2VwdGlvbmFsIGNvbmRpdGlvblxuIik7CisJCQkJcGFja2V0X2NvdW50ID0gMDsKKwkJCQlzdGF0dXMgPSBwY2FwX2Rpc3BhdGNoKHBkLCAtMSwgY291bnRtZSwKKwkJCQkgICAgKHVfY2hhciAqKSZwYWNrZXRfY291bnQpOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsKKwkJCQlwcmludGYoIiVkIHBhY2tldHMgc2VlbiwgJWQgcGFja2V0cyBjb3VudGVkIGFmdGVyIHNlbGVjdCByZXR1cm5zXG4iLAorCQkJCSAgICBzdGF0dXMsIHBhY2tldF9jb3VudCk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRvcG9sbCkgeworCQlmb3IgKDs7KSB7CisJCQlzdHJ1Y3QgcG9sbGZkIGZkOworCQkJaW50IHBvbGx0aW1lb3V0OworCisJCQlmZC5mZCA9IHNlbGVjdGFibGVfZmQ7CisJCQlmZC5ldmVudHMgPSBQT0xMSU47CisJCQlpZiAoZG90aW1lb3V0KQorCQkJCXBvbGx0aW1lb3V0ID0gMTsKKwkJCWVsc2UKKwkJCQlwb2xsdGltZW91dCA9IC0xOworCQkJc3RhdHVzID0gcG9sbCgmZmQsIDEsIHBvbGx0aW1lb3V0KTsKKwkJCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJCQlwcmludGYoIlBvbGwgcmV0dXJucyBlcnJvciAoJXMpXG4iLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc3RhdHVzID09IDApCisJCQkJCXByaW50ZigiUG9sbCB0aW1lZCBvdXRcbiIpOworCQkJCWVsc2UgeworCQkJCQlwcmludGYoIlBvbGwgcmV0dXJuZWQgYSBkZXNjcmlwdG9yOiAiKTsKKwkJCQkJaWYgKGZkLnJldmVudHMgJiBQT0xMSU4pCisJCQkJCQlwcmludGYoInJlYWRhYmxlLCAiKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRmKCJub3QgcmVhZGFibGUsICIpOworCQkJCQlpZiAoZmQucmV2ZW50cyAmIFBPTExFUlIpCisJCQkJCQlwcmludGYoImV4Y2VwdGlvbmFsIGNvbmRpdGlvbiwgIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50Zigibm8gZXhjZXB0aW9uYWwgY29uZGl0aW9uLCAiKTsKKwkJCQkJaWYgKGZkLnJldmVudHMgJiBQT0xMSFVQKQorCQkJCQkJcHJpbnRmKCJkaXNjb25uZWN0LCAiKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRmKCJubyBkaXNjb25uZWN0LCAiKTsKKwkJCQkJaWYgKGZkLnJldmVudHMgJiBQT0xMTlZBTCkKKwkJCQkJCXByaW50ZigiaW52YWxpZFxuIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50Zigibm90IGludmFsaWRcbiIpOworCQkJCX0KKwkJCQlwYWNrZXRfY291bnQgPSAwOworCQkJCXN0YXR1cyA9IHBjYXBfZGlzcGF0Y2gocGQsIC0xLCBjb3VudG1lLAorCQkJCSAgICAodV9jaGFyICopJnBhY2tldF9jb3VudCk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJCXByaW50ZigiJWQgcGFja2V0cyBzZWVuLCAlZCBwYWNrZXRzIGNvdW50ZWQgYWZ0ZXIgcG9sbCByZXR1cm5zXG4iLAorCQkJCSAgICBzdGF0dXMsIHBhY2tldF9jb3VudCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKDs7KSB7CisJCQlwYWNrZXRfY291bnQgPSAwOworCQkJc3RhdHVzID0gcGNhcF9kaXNwYXRjaChwZCwgLTEsIGNvdW50bWUsCisJCQkgICAgKHVfY2hhciAqKSZwYWNrZXRfY291bnQpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlwcmludGYoIiVkIHBhY2tldHMgc2VlbiwgJWQgcGFja2V0cyBjb3VudGVkIGFmdGVyIHBjYXBfZGlzcGF0Y2ggcmV0dXJuc1xuIiwKKwkJCSAgICBzdGF0dXMsIHBhY2tldF9jb3VudCk7CisJCX0KKwl9CisJaWYgKHN0YXR1cyA9PSAtMikgeworCQkvKgorCQkgKiBXZSBnb3QgaW50ZXJydXB0ZWQsIHNvIHBlcmhhcHMgd2UgZGlkbid0CisJCSAqIG1hbmFnZSB0byBmaW5pc2ggYSBsaW5lIHdlIHdlcmUgcHJpbnRpbmcuCisJCSAqIFByaW50IGFuIGV4dHJhIG5ld2xpbmUsIGp1c3QgaW4gY2FzZS4KKwkJICovCisJCXB1dGNoYXIoJ1xuJyk7CisJfQorCSh2b2lkKWZmbHVzaChzdGRvdXQpOworCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJLyoKKwkJICogRXJyb3IuICBSZXBvcnQgaXQuCisJCSAqLworCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBwY2FwX2xvb3A6ICVzXG4iLAorCQkgICAgcHJvZ3JhbV9uYW1lLCBwY2FwX2dldGVycihwZCkpOworCX0KKwlwY2FwX2Nsb3NlKHBkKTsKKwlleGl0KHN0YXR1cyA9PSAtMSA/IDEgOiAwKTsKK30KKworc3RhdGljIHZvaWQKK2NvdW50bWUodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqc3ApCit7CisJaW50ICpjb3VudGVycCA9IChpbnQgKil1c2VyOworCisJKCpjb3VudGVycCkrKzsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJKHZvaWQpZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWyAtc3B0biBdIFsgLWkgaW50ZXJmYWNlIF0gW2V4cHJlc3Npb25dXG4iLAorCSAgICBwcm9ncmFtX25hbWUpOworCWV4aXQoMSk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCitlcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9CisJZXhpdCgxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCit3YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBXQVJOSU5HOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KK30KKworLyoKKyAqIENvcHkgYXJnIHZlY3RvciBpbnRvIGEgbmV3IGJ1ZmZlciwgY29uY2F0ZW5hdGluZyBhcmd1bWVudHMgd2l0aCBzcGFjZXMuCisgKi8KK3N0YXRpYyBjaGFyICoKK2NvcHlfYXJndihyZWdpc3RlciBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBjaGFyICoqcDsKKwlyZWdpc3RlciB1X2ludCBsZW4gPSAwOworCWNoYXIgKmJ1ZjsKKwljaGFyICpzcmMsICpkc3Q7CisKKwlwID0gYXJndjsKKwlpZiAoKnAgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKnApCisJCWxlbiArPSBzdHJsZW4oKnArKykgKyAxOworCisJYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWVycm9yKCJjb3B5X2FyZ3Y6IG1hbGxvYyIpOworCisJcCA9IGFyZ3Y7CisJZHN0ID0gYnVmOworCXdoaWxlICgoc3JjID0gKnArKykgIT0gTlVMTCkgeworCQl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJCTsKKwkJZHN0Wy0xXSA9ICcgJzsKKwl9CisJZHN0Wy0xXSA9ICdcMCc7CisKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdmFsZ3JpbmR0ZXN0LmMgYi90ZXN0cy92YWxncmluZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ1NGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdmFsZ3JpbmR0ZXN0LmMKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdIF9VXyA9CisgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmlsdGVydGVzdC5jLHYgMS4yIDIwMDUtMDgtMDggMTc6NTA6MTMgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKQorLyogQlNELWZsYXZvcmVkIE9TIC0gdXNlIEJQRiAqLworI2RlZmluZSBVU0VfQlBGCisjZWxpZiBkZWZpbmVkKGxpbnV4KQorLyogTGludXggLSB1c2Ugc29ja2V0IGZpbHRlcnMgKi8KKyNkZWZpbmUgVVNFX1NPQ0tFVF9GSUxURVJTCisjZWxzZQorI2Vycm9yICJVbmtub3duIHBsYXRmb3JtIG9yIHBsYXRmb3JtIHRoYXQgZG9lc24ndCBzdXBwb3J0IFZhbGdyaW5kIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9CUEYpCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXQvYnBmLmg+CisKKy8qCisgKiBNYWtlICJwY2FwLmgiIG5vdCBpbmNsdWRlICJwY2FwL2JwZi5oIjsgd2UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgdGhlCisgKiBuYXRpdmUgT1MgdmVyc2lvbiwgYXMgd2UncmUgZ29pbmcgdG8gYmUgZG9pbmcgb3VyIG93biBpb2N0bHMgdG8KKyAqIG1ha2Ugc3VyZSB0aGF0LCBpbiB0aGUgdW5pbml0aWFsaXplZC1kYXRhIHRlc3RzLCB0aGUgZmlsdGVycyBhcmVuJ3QKKyAqIGNoZWNrZWQgYnkgbGlicGNhcCBiZWZvcmUgYmVpbmcgaGFuZGVkIHRvIEJQRi4KKyAqLworI2RlZmluZSBQQ0FQX0RPTlRfSU5DTFVERV9QQ0FQX0JQRl9ICisKKyNlbGlmIGRlZmluZWQoVVNFX1NPQ0tFVF9GSUxURVJTKQorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2lmbmRlZiBIQVZFX19fQVRUUklCVVRFX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisKK3N0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7CisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4sIGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworc3RhdGljIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICosIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworZXh0ZXJuIGludCBvcHRpbmQ7CitleHRlcm4gaW50IG9wdGVycjsKK2V4dGVybiBjaGFyICpvcHRhcmc7CisKKy8qCisgKiBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUsIHNvIHRoYXQKKyAqIHdlIGdldCBhbGwgdGhlIGJ5dGVzIHNwZWNpZmllZCBieSB0aGUgc2l6ZSB3ZSBnZXQgZnJvbSAiZnN0YXQoKSIuCisgKiBPbiBVTklYLCB0aGF0J3Mgbm90IG5lY2Vzc2FyeS4gIE9fQklOQVJZIGlzIGRlZmluZWQgb24gV2luZG93czsKKyAqIHdlIGRlZmluZSBpdCBhcyAwIGlmIGl0J3Mgbm90IGRlZmluZWQsIHNvIGl0IGRvZXMgbm90aGluZy4KKyAqLworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWQkwCisjZW5kaWYKKworc3RhdGljIGNoYXIgKgorcmVhZF9pbmZpbGUoY2hhciAqZm5hbWUpCit7CisJcmVnaXN0ZXIgaW50IGksIGZkLCBjYzsKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlzdHJ1Y3Qgc3RhdCBidWY7CisKKwlmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKKwlpZiAoZmQgPCAwKQorCQllcnJvcigiY2FuJ3Qgb3BlbiAlczogJXMiLCBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCisJaWYgKGZzdGF0KGZkLCAmYnVmKSA8IDApCisJCWVycm9yKCJjYW4ndCBzdGF0ICVzOiAlcyIsIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisKKwljcCA9IG1hbGxvYygodV9pbnQpYnVmLnN0X3NpemUgKyAxKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZXJyb3IoIm1hbGxvYyglZCkgZm9yICVzOiAlcyIsICh1X2ludClidWYuc3Rfc2l6ZSArIDEsCisJCQlmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCWNjID0gcmVhZChmZCwgY3AsICh1X2ludClidWYuc3Rfc2l6ZSk7CisJaWYgKGNjIDwgMCkKKwkJZXJyb3IoInJlYWQgJXM6ICVzIiwgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoY2MgIT0gYnVmLnN0X3NpemUpCisJCWVycm9yKCJzaG9ydCByZWFkICVzICglZCAhPSAlZCkiLCBmbmFtZSwgY2MsIChpbnQpYnVmLnN0X3NpemUpOworCisJY2xvc2UoZmQpOworCS8qIHJlcGxhY2UgIiMgY29tbWVudCIgd2l0aCBzcGFjZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2M7IGkrKykgeworCQlpZiAoY3BbaV0gPT0gJyMnKQorCQkJd2hpbGUgKGkgPCBjYyAmJiBjcFtpXSAhPSAnXG4nKQorCQkJCWNwW2krK10gPSAnICc7CisJfQorCWNwW2NjXSA9ICdcMCc7CisJcmV0dXJuIChjcCk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCitlcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9CisJZXhpdCgxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCit3YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBXQVJOSU5HOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KK30KKworLyoKKyAqIENvcHkgYXJnIHZlY3RvciBpbnRvIGEgbmV3IGJ1ZmZlciwgY29uY2F0ZW5hdGluZyBhcmd1bWVudHMgd2l0aCBzcGFjZXMuCisgKi8KK3N0YXRpYyBjaGFyICoKK2NvcHlfYXJndihyZWdpc3RlciBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBjaGFyICoqcDsKKwlyZWdpc3RlciB1X2ludCBsZW4gPSAwOworCWNoYXIgKmJ1ZjsKKwljaGFyICpzcmMsICpkc3Q7CisKKwlwID0gYXJndjsKKwlpZiAoKnAgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKnApCisJCWxlbiArPSBzdHJsZW4oKnArKykgKyAxOworCisJYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWVycm9yKCJjb3B5X2FyZ3Y6IG1hbGxvYyIpOworCisJcCA9IGFyZ3Y7CisJZHN0ID0gYnVmOworCXdoaWxlICgoc3JjID0gKnArKykgIT0gTlVMTCkgeworCQl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJCTsKKwkJZHN0Wy0xXSA9ICcgJzsKKwl9CisJZHN0Wy0xXSA9ICdcMCc7CisKKwlyZXR1cm4gYnVmOworfQorCisjZGVmaW5lIElOU05fQ09VTlQJMTcKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpjcCwgKmRldmljZTsKKwlpbnQgb3A7CisJaW50IGRvcmZtb24sIHVzZWFjdGl2YXRlOworCWNoYXIgZWJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKwljaGFyICppbmZpbGU7CisJY2hhciAqY21kYnVmOworCXBjYXBfdCAqcGQ7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IHBjYXBfZmQ7CisjaWYgZGVmaW5lZChVU0VfQlBGKQorCXN0cnVjdCBicGZfcHJvZ3JhbSBiYWRfZmNvZGU7CisJc3RydWN0IGJwZl9pbnNuIHVuaW5pdGlhbGl6ZWRbSU5TTl9DT1VOVF07CisjZWxpZiBkZWZpbmVkKFVTRV9TT0NLRVRfRklMVEVSUykKKwlzdHJ1Y3Qgc29ja19mcHJvZyBiYWRfZmNvZGU7CisJc3RydWN0IHNvY2tfZmlsdGVyIHVuaW5pdGlhbGl6ZWRbSU5TTl9DT1VOVF07CisjZW5kaWYKKwlzdHJ1Y3QgYnBmX3Byb2dyYW0gZmNvZGU7CisKKwlkZXZpY2UgPSBOVUxMOworCWRvcmZtb24gPSAwOworCXVzZWFjdGl2YXRlID0gMDsKKwlpbmZpbGUgPSBOVUxMOworICAKKwlpZiAoKGNwID0gc3RycmNocihhcmd2WzBdLCAnLycpKSAhPSBOVUxMKQorCQlwcm9ncmFtX25hbWUgPSBjcCArIDE7CisJZWxzZQorCQlwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworCisJb3B0ZXJyID0gMDsKKwl3aGlsZSAoKG9wID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhRjppOkkiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcCkgeworCisJCWNhc2UgJ2EnOgorCQkJdXNlYWN0aXZhdGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRic6CisJCQlpbmZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdpJzoKKwkJCWRldmljZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0knOgorCQkJZG9yZm1vbiA9IDE7CisJCQl1c2VhY3RpdmF0ZSA9IDE7CS8qIHJlcXVpcmVkIGZvciByZm1vbiAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisKKwlpZiAoZGV2aWNlID09IE5VTEwpIHsKKwkJLyoKKwkJICogTm8gaW50ZXJmYWNlIHNwZWNpZmllZDsgZ2V0IHdoYXRldmVyIHBjYXBfbG9va3VwZGV2KCkKKwkJICogZmluZHMuCisJCSAqLworCQlkZXZpY2UgPSBwY2FwX2xvb2t1cGRldihlYnVmKTsKKwkJaWYgKGRldmljZSA9PSBOVUxMKSB7CisJCQllcnJvcigiY291bGRuJ3QgZmluZCBpbnRlcmZhY2UgdG8gdXNlOiAlcyIsCisJCQkgICAgZWJ1Zik7CisJCX0KKwl9CisKKwlpZiAoaW5maWxlICE9IE5VTEwpIHsKKwkJLyoKKwkJICogRmlsdGVyIHNwZWNpZmllZCB3aXRoICItRiIgYW5kIGEgZmlsZSBjb250YWluaW5nCisJCSAqIGEgZmlsdGVyLgorCQkgKi8KKwkJY21kYnVmID0gcmVhZF9pbmZpbGUoaW5maWxlKTsKKwl9IGVsc2UgeworCQlpZiAob3B0aW5kIDwgYXJnYykgeworCQkJLyoKKwkJCSAqIEZpbHRlciBzcGVjaWZpZWQgd2l0aCBhcmd1bWVudHMgb24gdGhlCisJCQkgKiBjb21tYW5kIGxpbmUuCisJCQkgKi8KKwkJCWNtZGJ1ZiA9IGNvcHlfYXJndigmYXJndltvcHRpbmQrMV0pOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vIGZpbHRlciBzcGVjaWZpZWQ7IHVzZSBhbiBlbXB0eSBzdHJpbmcsIHdoaWNoCisJCQkgKiBjb21waWxlcyB0byBhbiAiYWNjZXB0IGFsbCIgZmlsdGVyLgorCQkJICovCisJCQljbWRidWYgPSAiIjsKKwkJfQorCX0KKworCWlmICh1c2VhY3RpdmF0ZSkgeworCQlwZCA9IHBjYXBfY3JlYXRlKGRldmljZSwgZWJ1Zik7CisJCWlmIChwZCA9PSBOVUxMKQorCQkJZXJyb3IoIiVzOiBwY2FwX2NyZWF0ZSgpIGZhaWxlZDogJXMiLCBkZXZpY2UsIGVidWYpOworCQlzdGF0dXMgPSBwY2FwX3NldF9zbmFwbGVuKHBkLCA2NTUzNSk7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCWVycm9yKCIlczogcGNhcF9zZXRfc25hcGxlbiBmYWlsZWQ6ICVzIiwKKwkJCSAgICBkZXZpY2UsIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJCXN0YXR1cyA9IHBjYXBfc2V0X3Byb21pc2MocGQsIDEpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQllcnJvcigiJXM6IHBjYXBfc2V0X3Byb21pc2MgZmFpbGVkOiAlcyIsCisJCQkgICAgZGV2aWNlLCBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cykpOworCQlpZiAoZG9yZm1vbikgeworCQkJc3RhdHVzID0gcGNhcF9zZXRfcmZtb24ocGQsIDEpOworCQkJaWYgKHN0YXR1cyAhPSAwKQorCQkJCWVycm9yKCIlczogcGNhcF9zZXRfcmZtb24gZmFpbGVkOiAlcyIsCisJCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJfQorCQlzdGF0dXMgPSBwY2FwX3NldF90aW1lb3V0KHBkLCAxMDAwKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJZXJyb3IoIiVzOiBwY2FwX3NldF90aW1lb3V0IGZhaWxlZDogJXMiLAorCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJc3RhdHVzID0gcGNhcF9hY3RpdmF0ZShwZCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQkvKgorCQkJICogcGNhcF9hY3RpdmF0ZSgpIGZhaWxlZC4KKwkJCSAqLworCQkJZXJyb3IoIiVzOiAlc1xuKCVzKSIsIGRldmljZSwKKwkJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cyksIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzID4gMCkgeworCQkJLyoKKwkJCSAqIHBjYXBfYWN0aXZhdGUoKSBzdWNjZWVkZWQsIGJ1dCBpdCdzIHdhcm5pbmcgdXMKKwkJCSAqIG9mIGEgcHJvYmxlbSBpdCBoYWQuCisJCQkgKi8KKwkJCXdhcm5pbmcoIiVzOiAlc1xuKCVzKSIsIGRldmljZSwKKwkJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cyksIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCX0KKwl9IGVsc2UgeworCQkqZWJ1ZiA9ICdcMCc7CisJCXBkID0gcGNhcF9vcGVuX2xpdmUoZGV2aWNlLCA2NTUzNSwgMSwgMTAwMCwgZWJ1Zik7CisJCWlmIChwZCA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJCWVsc2UgaWYgKCplYnVmKQorCQkJd2FybmluZygiJXMiLCBlYnVmKTsKKwl9CisKKwlwY2FwX2ZkID0gcGNhcF9maWxlbm8ocGQpOworCisJLyoKKwkgKiBUcnkgc2V0dGluZyBhIGZpbHRlciB3aXRoIGFuIHVuaW5pdGlhbGl6ZWQgYnBmX3Byb2dyYW0KKwkgKiBzdHJ1Y3R1cmUuICBUaGlzIHNob3VsZCBjYXVzZSB2YWxncmluZCB0byByZXBvcnQgYQorCSAqIHByb2JsZW0uCisJICoKKwkgKiBXZSBkb24ndCBjaGVjayBmb3IgZXJyb3JzLCBiZWNhdXNlIGl0IGNvdWxkIGdldCBhbgorCSAqIGVycm9yIGR1ZSB0byBhIGJhZCBwb2ludGVyIG9yIGNvdW50LgorCSAqLworI2lmIGRlZmluZWQoVVNFX0JQRikKKwlpb2N0bChwY2FwX2ZkLCBCSU9DU0VURiwgJmJhZF9mY29kZSk7CisjZWxpZiBkZWZpbmVkKFVTRV9TT0NLRVRfRklMVEVSUykKKwlzZXRzb2Nrb3B0KHBjYXBfZmQsIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9GSUxURVIsICZiYWRfZmNvZGUsCisJICAgIHNpemVvZihiYWRfZmNvZGUpKTsKKyNlbmRpZgorCisJLyoKKwkgKiBUcnkgc2V0dGluZyBhIGZpbHRlciB3aXRoIGFuIGluaXRpYWxpemVkIGJwZl9wcm9ncmFtCisJICogc3RydWN0dXJlIHRoYXQgcG9pbnRzIHRvIGFuIHVuaW5pdGlhbGl6ZWQgcHJvZ3JhbS4KKwkgKiBUaGF0IHNob3VsZCBhbHNvIGNhdXNlIHZhbGdyaW5kIHRvIHJlcG9ydCBhIHByb2JsZW0uCisJICoKKwkgKiBXZSBkb24ndCBjaGVjayBmb3IgZXJyb3JzLCBiZWNhdXNlIGl0IGNvdWxkIGdldCBhbgorCSAqIGVycm9yIGR1ZSB0byBhIGJhZCBwb2ludGVyIG9yIGNvdW50LgorCSAqLworI2lmIGRlZmluZWQoVVNFX0JQRikKKwliYWRfZmNvZGUuYmZfbGVuID0gSU5TTl9DT1VOVDsKKwliYWRfZmNvZGUuYmZfaW5zbnMgPSB1bmluaXRpYWxpemVkOworCWlvY3RsKHBjYXBfZmQsIEJJT0NTRVRGLCAmYmFkX2Zjb2RlKTsKKyNlbGlmIGRlZmluZWQoVVNFX1NPQ0tFVF9GSUxURVJTKQorCWJhZF9mY29kZS5sZW4gPSBJTlNOX0NPVU5UOworCWJhZF9mY29kZS5maWx0ZXIgPSB1bmluaXRpYWxpemVkOworCXNldHNvY2tvcHQocGNhcF9mZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmJhZF9mY29kZSwKKwkgICAgc2l6ZW9mKGJhZF9mY29kZSkpOworI2VuZGlmCisKKwkvKgorCSAqIE5vdyBjb21waWxlIGEgZmlsdGVyIGFuZCBzZXQgdGhlIGZpbHRlciB3aXRoIHRoYXQuCisJICogVGhhdCBzaG91bGQgKm5vdCogY2F1c2UgdmFsZ3JpbmQgdG8gcmVwb3J0IGEKKwkgKiBwcm9ibGVtLgorCSAqLworCWlmIChwY2FwX2NvbXBpbGUocGQsICZmY29kZSwgY21kYnVmLCAxLCAwKSA8IDApCisJCWVycm9yKCJjYW4ndCBjb21waWxlIGZpbHRlcjogJXMiLCBwY2FwX2dldGVycihwZCkpOworCWlmIChwY2FwX3NldGZpbHRlcihwZCwgJmZjb2RlKSA8IDApCisJCWVycm9yKCJjYW4ndCBzZXQgZmlsdGVyOiAlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisKKwlwY2FwX2Nsb3NlKHBkKTsKKwlleGl0KHN0YXR1cyA8IDAgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMsIHdpdGggJXNcbiIsIHByb2dyYW1fbmFtZSwKKwkgICAgcGNhcF9saWJfdmVyc2lvbigpKTsKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkgICAgIlVzYWdlOiAlcyBbLWFJXSBbIC1GIGZpbGUgXSBbIC1JIGludGVyZmFjZSBdIFsgZXhwcmVzc2lvbiBdXG4iLAorCSAgICBwcm9ncmFtX25hbWUpOworCWV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS90b2tkZWZzLmggYi90b2tkZWZzLmgKaW5kZXggM2VmNmM1NS4uNzU2NzFkMyAxMDA2NDQKLS0tIGEvdG9rZGVmcy5oCisrKyBiL3Rva2RlZnMuaApAQCAtMSwyNyArMSwzNSBAQAotLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuMS4gICovCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi41LiAgKi8KIAotLyogU2tlbGV0b24gcGFyc2VyIGZvciBZYWNjLWxpa2UgcGFyc2luZyB3aXRoIEJpc29uLAotICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLyogQmlzb24gaW50ZXJmYWNlIGZvciBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisgICAKKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCisgICAKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KIAotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKKyAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCisgICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKKyAgIHBhcnNlciBnZW5lcmF0b3IgdXNpbmcgdGhlIHNrZWxldG9uIG9yIGEgbW9kaWZpZWQgdmVyc2lvbiB0aGVyZW9mCisgICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCisgICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCisgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKKyAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KKyAgIAorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgorICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLworCiAKIC8qIFRva2Vucy4gICovCiAjaWZuZGVmIFlZVE9LRU5UWVBFCkBAIC01Myw4MyArNjEsMTAwIEBACiAgICAgIElHUlAgPSAyNzksCiAgICAgIFBJTSA9IDI4MCwKICAgICAgVlJSUCA9IDI4MSwKLSAgICAgQVRBTEsgPSAyODIsCi0gICAgIEFBUlAgPSAyODMsCi0gICAgIERFQ05FVCA9IDI4NCwKLSAgICAgTEFUID0gMjg1LAotICAgICBTQ0EgPSAyODYsCi0gICAgIE1PUFJDID0gMjg3LAotICAgICBNT1BETCA9IDI4OCwKLSAgICAgVEtfQlJPQURDQVNUID0gMjg5LAotICAgICBUS19NVUxUSUNBU1QgPSAyOTAsCi0gICAgIE5VTSA9IDI5MSwKLSAgICAgSU5CT1VORCA9IDI5MiwKLSAgICAgT1VUQk9VTkQgPSAyOTMsCi0gICAgIFBGX0lGTkFNRSA9IDI5NCwKLSAgICAgUEZfUlNFVCA9IDI5NSwKLSAgICAgUEZfUk5SID0gMjk2LAotICAgICBQRl9TUk5SID0gMjk3LAotICAgICBQRl9SRUFTT04gPSAyOTgsCi0gICAgIFBGX0FDVElPTiA9IDI5OSwKLSAgICAgTElOSyA9IDMwMCwKLSAgICAgR0VRID0gMzAxLAotICAgICBMRVEgPSAzMDIsCi0gICAgIE5FUSA9IDMwMywKLSAgICAgSUQgPSAzMDQsCi0gICAgIEVJRCA9IDMwNSwKLSAgICAgSElEID0gMzA2LAotICAgICBISUQ2ID0gMzA3LAotICAgICBBSUQgPSAzMDgsCi0gICAgIExTSCA9IDMwOSwKLSAgICAgUlNIID0gMzEwLAotICAgICBMRU4gPSAzMTEsCi0gICAgIElQVjYgPSAzMTIsCi0gICAgIElDTVBWNiA9IDMxMywKLSAgICAgQUggPSAzMTQsCi0gICAgIEVTUCA9IDMxNSwKLSAgICAgVkxBTiA9IDMxNiwKLSAgICAgTVBMUyA9IDMxNywKLSAgICAgUFBQT0VEID0gMzE4LAotICAgICBQUFBPRVMgPSAzMTksCi0gICAgIElTTyA9IDMyMCwKLSAgICAgRVNJUyA9IDMyMSwKLSAgICAgQ0xOUCA9IDMyMiwKLSAgICAgSVNJUyA9IDMyMywKLSAgICAgTDEgPSAzMjQsCi0gICAgIEwyID0gMzI1LAotICAgICBJSUggPSAzMjYsCi0gICAgIExTUCA9IDMyNywKLSAgICAgU05QID0gMzI4LAotICAgICBDU05QID0gMzI5LAotICAgICBQU05QID0gMzMwLAotICAgICBTVFAgPSAzMzEsCi0gICAgIElQWCA9IDMzMiwKLSAgICAgTkVUQkVVSSA9IDMzMywKLSAgICAgTEFORSA9IDMzNCwKLSAgICAgTExDID0gMzM1LAotICAgICBNRVRBQyA9IDMzNiwKLSAgICAgQkNDID0gMzM3LAotICAgICBTQyA9IDMzOCwKLSAgICAgSUxNSUMgPSAzMzksCi0gICAgIE9BTUY0RUMgPSAzNDAsCi0gICAgIE9BTUY0U0MgPSAzNDEsCi0gICAgIE9BTSA9IDM0MiwKLSAgICAgT0FNRjQgPSAzNDMsCi0gICAgIENPTk5FQ1RNU0cgPSAzNDQsCi0gICAgIE1FVEFDT05ORUNUID0gMzQ1LAotICAgICBWUEkgPSAzNDYsCi0gICAgIFZDSSA9IDM0NywKLSAgICAgUkFESU8gPSAzNDgsCi0gICAgIEZJU1UgPSAzNDksCi0gICAgIExTU1UgPSAzNTAsCi0gICAgIE1TVSA9IDM1MSwKLSAgICAgU0lPID0gMzUyLAotICAgICBPUEMgPSAzNTMsCi0gICAgIERQQyA9IDM1NCwKLSAgICAgU0xTID0gMzU1LAotICAgICBBTkQgPSAzNTYsCi0gICAgIE9SID0gMzU3LAotICAgICBVTUlOVVMgPSAzNTgKKyAgICAgQ0FSUCA9IDI4MiwKKyAgICAgQVRBTEsgPSAyODMsCisgICAgIEFBUlAgPSAyODQsCisgICAgIERFQ05FVCA9IDI4NSwKKyAgICAgTEFUID0gMjg2LAorICAgICBTQ0EgPSAyODcsCisgICAgIE1PUFJDID0gMjg4LAorICAgICBNT1BETCA9IDI4OSwKKyAgICAgVEtfQlJPQURDQVNUID0gMjkwLAorICAgICBUS19NVUxUSUNBU1QgPSAyOTEsCisgICAgIE5VTSA9IDI5MiwKKyAgICAgSU5CT1VORCA9IDI5MywKKyAgICAgT1VUQk9VTkQgPSAyOTQsCisgICAgIFBGX0lGTkFNRSA9IDI5NSwKKyAgICAgUEZfUlNFVCA9IDI5NiwKKyAgICAgUEZfUk5SID0gMjk3LAorICAgICBQRl9TUk5SID0gMjk4LAorICAgICBQRl9SRUFTT04gPSAyOTksCisgICAgIFBGX0FDVElPTiA9IDMwMCwKKyAgICAgVFlQRSA9IDMwMSwKKyAgICAgU1VCVFlQRSA9IDMwMiwKKyAgICAgRElSID0gMzAzLAorICAgICBBRERSMSA9IDMwNCwKKyAgICAgQUREUjIgPSAzMDUsCisgICAgIEFERFIzID0gMzA2LAorICAgICBBRERSNCA9IDMwNywKKyAgICAgUkEgPSAzMDgsCisgICAgIFRBID0gMzA5LAorICAgICBMSU5LID0gMzEwLAorICAgICBHRVEgPSAzMTEsCisgICAgIExFUSA9IDMxMiwKKyAgICAgTkVRID0gMzEzLAorICAgICBJRCA9IDMxNCwKKyAgICAgRUlEID0gMzE1LAorICAgICBISUQgPSAzMTYsCisgICAgIEhJRDYgPSAzMTcsCisgICAgIEFJRCA9IDMxOCwKKyAgICAgTFNIID0gMzE5LAorICAgICBSU0ggPSAzMjAsCisgICAgIExFTiA9IDMyMSwKKyAgICAgSVBWNiA9IDMyMiwKKyAgICAgSUNNUFY2ID0gMzIzLAorICAgICBBSCA9IDMyNCwKKyAgICAgRVNQID0gMzI1LAorICAgICBWTEFOID0gMzI2LAorICAgICBNUExTID0gMzI3LAorICAgICBQUFBPRUQgPSAzMjgsCisgICAgIFBQUE9FUyA9IDMyOSwKKyAgICAgSVNPID0gMzMwLAorICAgICBFU0lTID0gMzMxLAorICAgICBDTE5QID0gMzMyLAorICAgICBJU0lTID0gMzMzLAorICAgICBMMSA9IDMzNCwKKyAgICAgTDIgPSAzMzUsCisgICAgIElJSCA9IDMzNiwKKyAgICAgTFNQID0gMzM3LAorICAgICBTTlAgPSAzMzgsCisgICAgIENTTlAgPSAzMzksCisgICAgIFBTTlAgPSAzNDAsCisgICAgIFNUUCA9IDM0MSwKKyAgICAgSVBYID0gMzQyLAorICAgICBORVRCRVVJID0gMzQzLAorICAgICBMQU5FID0gMzQ0LAorICAgICBMTEMgPSAzNDUsCisgICAgIE1FVEFDID0gMzQ2LAorICAgICBCQ0MgPSAzNDcsCisgICAgIFNDID0gMzQ4LAorICAgICBJTE1JQyA9IDM0OSwKKyAgICAgT0FNRjRFQyA9IDM1MCwKKyAgICAgT0FNRjRTQyA9IDM1MSwKKyAgICAgT0FNID0gMzUyLAorICAgICBPQU1GNCA9IDM1MywKKyAgICAgQ09OTkVDVE1TRyA9IDM1NCwKKyAgICAgTUVUQUNPTk5FQ1QgPSAzNTUsCisgICAgIFZQSSA9IDM1NiwKKyAgICAgVkNJID0gMzU3LAorICAgICBSQURJTyA9IDM1OCwKKyAgICAgRklTVSA9IDM1OSwKKyAgICAgTFNTVSA9IDM2MCwKKyAgICAgTVNVID0gMzYxLAorICAgICBIRklTVSA9IDM2MiwKKyAgICAgSExTU1UgPSAzNjMsCisgICAgIEhNU1UgPSAzNjQsCisgICAgIFNJTyA9IDM2NSwKKyAgICAgT1BDID0gMzY2LAorICAgICBEUEMgPSAzNjcsCisgICAgIFNMUyA9IDM2OCwKKyAgICAgSFNJTyA9IDM2OSwKKyAgICAgSE9QQyA9IDM3MCwKKyAgICAgSERQQyA9IDM3MSwKKyAgICAgSFNMUyA9IDM3MiwKKyAgICAgQU5EID0gMzczLAorICAgICBPUiA9IDM3NCwKKyAgICAgVU1JTlVTID0gMzc1CiAgICB9OwogI2VuZGlmCiAvKiBUb2tlbnMuICAqLwpAQCAtMTU3LDkwICsxODIsMTExIEBACiAjZGVmaW5lIElHUlAgMjc5CiAjZGVmaW5lIFBJTSAyODAKICNkZWZpbmUgVlJSUCAyODEKLSNkZWZpbmUgQVRBTEsgMjgyCi0jZGVmaW5lIEFBUlAgMjgzCi0jZGVmaW5lIERFQ05FVCAyODQKLSNkZWZpbmUgTEFUIDI4NQotI2RlZmluZSBTQ0EgMjg2Ci0jZGVmaW5lIE1PUFJDIDI4NwotI2RlZmluZSBNT1BETCAyODgKLSNkZWZpbmUgVEtfQlJPQURDQVNUIDI4OQotI2RlZmluZSBUS19NVUxUSUNBU1QgMjkwCi0jZGVmaW5lIE5VTSAyOTEKLSNkZWZpbmUgSU5CT1VORCAyOTIKLSNkZWZpbmUgT1VUQk9VTkQgMjkzCi0jZGVmaW5lIFBGX0lGTkFNRSAyOTQKLSNkZWZpbmUgUEZfUlNFVCAyOTUKLSNkZWZpbmUgUEZfUk5SIDI5NgotI2RlZmluZSBQRl9TUk5SIDI5NwotI2RlZmluZSBQRl9SRUFTT04gMjk4Ci0jZGVmaW5lIFBGX0FDVElPTiAyOTkKLSNkZWZpbmUgTElOSyAzMDAKLSNkZWZpbmUgR0VRIDMwMQotI2RlZmluZSBMRVEgMzAyCi0jZGVmaW5lIE5FUSAzMDMKLSNkZWZpbmUgSUQgMzA0Ci0jZGVmaW5lIEVJRCAzMDUKLSNkZWZpbmUgSElEIDMwNgotI2RlZmluZSBISUQ2IDMwNwotI2RlZmluZSBBSUQgMzA4Ci0jZGVmaW5lIExTSCAzMDkKLSNkZWZpbmUgUlNIIDMxMAotI2RlZmluZSBMRU4gMzExCi0jZGVmaW5lIElQVjYgMzEyCi0jZGVmaW5lIElDTVBWNiAzMTMKLSNkZWZpbmUgQUggMzE0Ci0jZGVmaW5lIEVTUCAzMTUKLSNkZWZpbmUgVkxBTiAzMTYKLSNkZWZpbmUgTVBMUyAzMTcKLSNkZWZpbmUgUFBQT0VEIDMxOAotI2RlZmluZSBQUFBPRVMgMzE5Ci0jZGVmaW5lIElTTyAzMjAKLSNkZWZpbmUgRVNJUyAzMjEKLSNkZWZpbmUgQ0xOUCAzMjIKLSNkZWZpbmUgSVNJUyAzMjMKLSNkZWZpbmUgTDEgMzI0Ci0jZGVmaW5lIEwyIDMyNQotI2RlZmluZSBJSUggMzI2Ci0jZGVmaW5lIExTUCAzMjcKLSNkZWZpbmUgU05QIDMyOAotI2RlZmluZSBDU05QIDMyOQotI2RlZmluZSBQU05QIDMzMAotI2RlZmluZSBTVFAgMzMxCi0jZGVmaW5lIElQWCAzMzIKLSNkZWZpbmUgTkVUQkVVSSAzMzMKLSNkZWZpbmUgTEFORSAzMzQKLSNkZWZpbmUgTExDIDMzNQotI2RlZmluZSBNRVRBQyAzMzYKLSNkZWZpbmUgQkNDIDMzNwotI2RlZmluZSBTQyAzMzgKLSNkZWZpbmUgSUxNSUMgMzM5Ci0jZGVmaW5lIE9BTUY0RUMgMzQwCi0jZGVmaW5lIE9BTUY0U0MgMzQxCi0jZGVmaW5lIE9BTSAzNDIKLSNkZWZpbmUgT0FNRjQgMzQzCi0jZGVmaW5lIENPTk5FQ1RNU0cgMzQ0Ci0jZGVmaW5lIE1FVEFDT05ORUNUIDM0NQotI2RlZmluZSBWUEkgMzQ2Ci0jZGVmaW5lIFZDSSAzNDcKLSNkZWZpbmUgUkFESU8gMzQ4Ci0jZGVmaW5lIEZJU1UgMzQ5Ci0jZGVmaW5lIExTU1UgMzUwCi0jZGVmaW5lIE1TVSAzNTEKLSNkZWZpbmUgU0lPIDM1MgotI2RlZmluZSBPUEMgMzUzCi0jZGVmaW5lIERQQyAzNTQKLSNkZWZpbmUgU0xTIDM1NQotI2RlZmluZSBBTkQgMzU2Ci0jZGVmaW5lIE9SIDM1NwotI2RlZmluZSBVTUlOVVMgMzU4CisjZGVmaW5lIENBUlAgMjgyCisjZGVmaW5lIEFUQUxLIDI4MworI2RlZmluZSBBQVJQIDI4NAorI2RlZmluZSBERUNORVQgMjg1CisjZGVmaW5lIExBVCAyODYKKyNkZWZpbmUgU0NBIDI4NworI2RlZmluZSBNT1BSQyAyODgKKyNkZWZpbmUgTU9QREwgMjg5CisjZGVmaW5lIFRLX0JST0FEQ0FTVCAyOTAKKyNkZWZpbmUgVEtfTVVMVElDQVNUIDI5MQorI2RlZmluZSBOVU0gMjkyCisjZGVmaW5lIElOQk9VTkQgMjkzCisjZGVmaW5lIE9VVEJPVU5EIDI5NAorI2RlZmluZSBQRl9JRk5BTUUgMjk1CisjZGVmaW5lIFBGX1JTRVQgMjk2CisjZGVmaW5lIFBGX1JOUiAyOTcKKyNkZWZpbmUgUEZfU1JOUiAyOTgKKyNkZWZpbmUgUEZfUkVBU09OIDI5OQorI2RlZmluZSBQRl9BQ1RJT04gMzAwCisjZGVmaW5lIFRZUEUgMzAxCisjZGVmaW5lIFNVQlRZUEUgMzAyCisjZGVmaW5lIERJUiAzMDMKKyNkZWZpbmUgQUREUjEgMzA0CisjZGVmaW5lIEFERFIyIDMwNQorI2RlZmluZSBBRERSMyAzMDYKKyNkZWZpbmUgQUREUjQgMzA3CisjZGVmaW5lIFJBIDMwOAorI2RlZmluZSBUQSAzMDkKKyNkZWZpbmUgTElOSyAzMTAKKyNkZWZpbmUgR0VRIDMxMQorI2RlZmluZSBMRVEgMzEyCisjZGVmaW5lIE5FUSAzMTMKKyNkZWZpbmUgSUQgMzE0CisjZGVmaW5lIEVJRCAzMTUKKyNkZWZpbmUgSElEIDMxNgorI2RlZmluZSBISUQ2IDMxNworI2RlZmluZSBBSUQgMzE4CisjZGVmaW5lIExTSCAzMTkKKyNkZWZpbmUgUlNIIDMyMAorI2RlZmluZSBMRU4gMzIxCisjZGVmaW5lIElQVjYgMzIyCisjZGVmaW5lIElDTVBWNiAzMjMKKyNkZWZpbmUgQUggMzI0CisjZGVmaW5lIEVTUCAzMjUKKyNkZWZpbmUgVkxBTiAzMjYKKyNkZWZpbmUgTVBMUyAzMjcKKyNkZWZpbmUgUFBQT0VEIDMyOAorI2RlZmluZSBQUFBPRVMgMzI5CisjZGVmaW5lIElTTyAzMzAKKyNkZWZpbmUgRVNJUyAzMzEKKyNkZWZpbmUgQ0xOUCAzMzIKKyNkZWZpbmUgSVNJUyAzMzMKKyNkZWZpbmUgTDEgMzM0CisjZGVmaW5lIEwyIDMzNQorI2RlZmluZSBJSUggMzM2CisjZGVmaW5lIExTUCAzMzcKKyNkZWZpbmUgU05QIDMzOAorI2RlZmluZSBDU05QIDMzOQorI2RlZmluZSBQU05QIDM0MAorI2RlZmluZSBTVFAgMzQxCisjZGVmaW5lIElQWCAzNDIKKyNkZWZpbmUgTkVUQkVVSSAzNDMKKyNkZWZpbmUgTEFORSAzNDQKKyNkZWZpbmUgTExDIDM0NQorI2RlZmluZSBNRVRBQyAzNDYKKyNkZWZpbmUgQkNDIDM0NworI2RlZmluZSBTQyAzNDgKKyNkZWZpbmUgSUxNSUMgMzQ5CisjZGVmaW5lIE9BTUY0RUMgMzUwCisjZGVmaW5lIE9BTUY0U0MgMzUxCisjZGVmaW5lIE9BTSAzNTIKKyNkZWZpbmUgT0FNRjQgMzUzCisjZGVmaW5lIENPTk5FQ1RNU0cgMzU0CisjZGVmaW5lIE1FVEFDT05ORUNUIDM1NQorI2RlZmluZSBWUEkgMzU2CisjZGVmaW5lIFZDSSAzNTcKKyNkZWZpbmUgUkFESU8gMzU4CisjZGVmaW5lIEZJU1UgMzU5CisjZGVmaW5lIExTU1UgMzYwCisjZGVmaW5lIE1TVSAzNjEKKyNkZWZpbmUgSEZJU1UgMzYyCisjZGVmaW5lIEhMU1NVIDM2MworI2RlZmluZSBITVNVIDM2NAorI2RlZmluZSBTSU8gMzY1CisjZGVmaW5lIE9QQyAzNjYKKyNkZWZpbmUgRFBDIDM2NworI2RlZmluZSBTTFMgMzY4CisjZGVmaW5lIEhTSU8gMzY5CisjZGVmaW5lIEhPUEMgMzcwCisjZGVmaW5lIEhEUEMgMzcxCisjZGVmaW5lIEhTTFMgMzcyCisjZGVmaW5lIEFORCAzNzMKKyNkZWZpbmUgT1IgMzc0CisjZGVmaW5lIFVNSU5VUyAzNzUKIAogCiAKIAotI2lmICEgZGVmaW5lZCAoWVlTVFlQRSkgJiYgISBkZWZpbmVkIChZWVNUWVBFX0lTX0RFQ0xBUkVEKQotI2xpbmUgMTM4ICJncmFtbWFyLnkiCi10eXBlZGVmIHVuaW9uIFlZU1RZUEUgeworI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECit0eXBlZGVmIHVuaW9uIFlZU1RZUEUKK3sKKworLyogTGluZSAyMDY4IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI0MiAiZ3JhbW1hci55IgorCiAJaW50IGk7CiAJYnBmX3VfaW50MzIgaDsKIAl1X2NoYXIgKmU7CkBAIC0yNTQsMTUgKzMwMCwxNyBAQAogCQlzdHJ1Y3QgYmxvY2sgKmI7CiAJfSBibGs7CiAJc3RydWN0IGJsb2NrICpyYmxrOworCisKKworLyogTGluZSAyMDY4IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMwOCAieS50YWIuaCIKIH0gWVlTVFlQRTsKLS8qIExpbmUgMTQ0NyBvZiB5YWNjLmMuICAqLwotI2xpbmUgMjYwICJ5LnRhYi5oIgorIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKICMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KICMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQotIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKICNlbmRpZgogCiBleHRlcm4gWVlTVFlQRSBwY2FwX2x2YWw7CiAKIAotCmRpZmYgLS1naXQgYS92ZXJzaW9uLmMgYi92ZXJzaW9uLmMKaW5kZXggNTk1M2JjZC4uNzk1YmYxZSAxMDA2NDQKLS0tIGEvdmVyc2lvbi5jCisrKyBiL3ZlcnNpb24uYwpAQCAtMSArMSBAQAotY2hhciBwY2FwX3ZlcnNpb25bXSA9ICIwLjkuOCI7CitjaGFyIHBjYXBfdmVyc2lvbltdID0gIjEuNS4yIjsKZGlmZiAtLWdpdCBhL3ZlcnNpb24uaCBiL3ZlcnNpb24uaAppbmRleCAyZmEwMmI2Li4yOWM4MWRhIDEwMDY0NAotLS0gYS92ZXJzaW9uLmgKKysrIGIvdmVyc2lvbi5oCkBAIC0xICsxIEBACi1zdGF0aWMgY29uc3QgY2hhciBwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSAibGlicGNhcCB2ZXJzaW9uIDAuOS44IjsKK3N0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICJsaWJwY2FwIHZlcnNpb24gMS41LjIiOwpkaWZmIC0tZ2l0IGEvd2xhbl9maWx0ZXJpbmcucGF0Y2ggYi93bGFuX2ZpbHRlcmluZy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNzQ1YS4uMDAwMDAwMAotLS0gYS93bGFuX2ZpbHRlcmluZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0tLS0gZ2VuY29kZS5jLmN2cwkyMDA3LTA2LTE0IDEzOjU0OjEyLjAwMDAwMDAwMCAtMDcwMAotKysrIGdlbmNvZGUuYwkyMDA3LTA2LTE0IDEzOjU2OjI3LjUzMTI1MDAwMCAtMDcwMAotQEAgLTI0LDYgKzI0LDggQEAKLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZ2VuY29kZS5jLHYgMS4yMjEuMi41MSAyMDA3LzA2LzE0IDIwOjU0OjEyIGdpYW5sdWNhIEV4cCAkIChMQkwpIjsKLSAjZW5kaWYKLSAKLSsjZGVmaW5lIEVOQUJMRV9XTEFOX0ZJTFRFUklOR19QQVRDSAotKwotICNpZmRlZiBIQVZFX0NPTkZJR19ICi0gI2luY2x1ZGUgImNvbmZpZy5oIgotICNlbmRpZgotQEAgLTE0NCw3ICsxNDYsOCBAQAotIAlPUl9ORVQsCQkvKiByZWxhdGl2ZSB0byB0aGUgbmV0d29yay1sYXllciBoZWFkZXIgKi8KLSAJT1JfTkVUX05PU05BUCwJLyogcmVsYXRpdmUgdG8gdGhlIG5ldHdvcmstbGF5ZXIgaGVhZGVyLCB3aXRoIG5vIFNOQVAgaGVhZGVyIGF0IHRoZSBsaW5rIGxheWVyICovCi0gCU9SX1RSQU5fSVBWNCwJLyogcmVsYXRpdmUgdG8gdGhlIHRyYW5zcG9ydC1sYXllciBoZWFkZXIsIHdpdGggSVB2NCBuZXR3b3JrIGxheWVyICovCi0tCU9SX1RSQU5fSVBWNgkvKiByZWxhdGl2ZSB0byB0aGUgdHJhbnNwb3J0LWxheWVyIGhlYWRlciwgd2l0aCBJUHY2IG5ldHdvcmsgbGF5ZXIgKi8KLSsJT1JfVFJBTl9JUFY2LAkvKiByZWxhdGl2ZSB0byB0aGUgdHJhbnNwb3J0LWxheWVyIGhlYWRlciwgd2l0aCBJUHY2IG5ldHdvcmsgbGF5ZXIgKi8KLSsJT1JfTElOS19BRlRFUl9XSVJFTEVTU19IRFIgLyogQWZ0ZXIgdGhlIDgwMi4xMSB2YXJpYWJsZSBsZW5ndGggaGVhZGVyICovCi0gfTsKLSAKLSAvKgotQEAgLTE5OSw2ICsyMDIsNyBAQAotIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9saW5rdHlwZShpbnQpOwotIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9zbmFwKGJwZl91X2ludDMyLCBicGZfdV9pbnQzMiwgdV9pbnQpOwotIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9sbGNfbGlua3R5cGUoaW50KTsKLStzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fODAyXzExX2xsY19saW5rdHlwZShpbnQpOwotIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0b3AoYnBmX3VfaW50MzIsIGJwZl91X2ludDMyLCBpbnQsIGludCwgdV9pbnQsIHVfaW50KTsKLSAjaWZkZWYgSU5FVDYKLSBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faG9zdG9wNihzdHJ1Y3QgaW42X2FkZHIgKiwgc3RydWN0IGluNl9hZGRyICosIGludCwgaW50LCB1X2ludCwgdV9pbnQpOwotQEAgLTI0Miw2ICsyNDYsNyBAQAotIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKnhmZXJfdG9fYShzdHJ1Y3QgYXJ0aCAqKTsKLSBzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbWFjX211bHRpY2FzdChpbnQpOwotIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9sZW4oaW50LCBpbnQpOwotK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSgpOwotIAotIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wcGlfZGx0X2NoZWNrKCk7Ci0gc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX21zZ19hYmJyZXYoaW50IHR5cGUpOwotQEAgLTEzNDUsNiArMTM1MCwxMzggQEAKLSAJcmV0dXJuIHM7Ci0gfQotIAotKy8qCi0rICogTG9hZCBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGFmdGVyIHRoZSA4MDIuMTEKLSsgKiBoZWFkZXIsIGkuZS4gTExDX1NOQVAuCi0rICogVGhlIGxpbmstbGF5ZXIgaGVhZGVyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgYmVnaW4gYXQgdGhlIGJlZ2lubmluZwotKyAqIG9mIHRoZSBwYWNrZXQgZGF0YTsgdGhlcmUgbWlnaHQgYmUgYSB2YXJpYWJsZS1sZW5ndGggcHJlZml4IGNvbnRhaW5pbmcKLSsgKiByYWRpbyBpbmZvcm1hdGlvbi4KLSsgKi8KLStzdGF0aWMgc3RydWN0IHNsaXN0ICoKLStnZW5fbG9hZF9sbF9hZnRlcl84MDJfMTFfcmVsKG9mZnNldCwgc2l6ZSkKLSsJdV9pbnQgb2Zmc2V0LCBzaXplOwotK3sKLSsJc3RydWN0IHNsaXN0ICpzLCAqc19sb2FkX2ZjOwotKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3FvczsKLSsJc3RydWN0IHNsaXN0ICpzX2xvYWQ7Ci0rCXN0cnVjdCBzbGlzdCAqc19sZF9hXzI7Ci0rCXN0cnVjdCBzbGlzdCAqc19hZGRfYV94OwotKwlzdHJ1Y3Qgc2xpc3QgKnNfYV90b194OwotKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X2RhdGFfZnJhbWVfMTsKLSsJc3RydWN0IHNsaXN0ICpzanNldF9kYXRhX2ZyYW1lXzI7Ci0rCXN0cnVjdCBzbGlzdCAqc19sb2FkX3hfMDsJCi0rCi0rCS8qCi0rCSAqIFRoaXMgY29kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvcHRpbWl6ZXIsIGFzCi0rCSAqIHdlIGFyZSBnZW5lcmF0aW5nIGptcCBpbnN0cnVjdGlvbnMgd2l0aGluIGEgbm9ybWFsCi0rCSAqIHNsaXN0IG9mIGluc3RydWN0aW9ucwotKwkgKgotKwkgKi8KLSsJbm9fb3B0aW1pemUgPSAxOwotKwkKLSsJcyA9IGdlbl9sbHByZWZpeGxlbigpOwotKwotKwkvKgotKwkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUgWCByZWdpc3RlcgotKwkgKiBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyCi0rCSAqIGhlYWRlci4KLSsJICoKLSsJICogT3RoZXJ3aXNlLCB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyCi0rCSAqIGhlYWRlciBpcyAib2ZmX2xsIi4KLSsJICovCi0rCWlmIChzICE9IE5VTEwpIHsKLSsJCS8qCi0rCQkgKiBUaGVyZSdzIGEgdmFyaWFibGUtbGVuZ3RoIHByZWZpeCBwcmVjZWRpbmcgdGhlCi0rCQkgKiBsaW5rLWxheWVyIGhlYWRlci4gICJzIiBwb2ludHMgdG8gYSBsaXN0IG9mIHN0YXRlbWVudHMKLSsJCSAqIHRoYXQgcHV0IHRoZSBsZW5ndGggb2YgdGhhdCBwcmVmaXggaW50byB0aGUgWCByZWdpc3Rlci4KLSsJCSAqIGRvIGFuIGluZGlyZWN0IGxvYWQsIHRvIHVzZSB0aGUgWCByZWdpc3RlciBhcyBhbiBvZmZzZXQuCi0rCQkgKi8KLSsKLSsJCS8qCi0rCQkgKiBMb2FkIHRoZSBGcmFtZSBDb250cm9sIGZpZWxkCi0rCQkgKi8KLSsJCXNfbG9hZF9mYyA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKLSsJCXNfbG9hZF9mYy0+cy5rID0gMDsKLSsJfSBlbHNlIHsKLSsJCS8qCi0rCQkgKiBUaGVyZSBpcyBubyB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUKLSsJCSAqIGxpbmstbGF5ZXIgaGVhZGVyOyBhZGQgaW4gb2ZmX2xsLCB3aGljaCwgaWYgdGhlcmUncwotKwkJICogYSBmaXhlZC1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUgbGluay1sYXllciBoZWFkZXIsCi0rCQkgKiBpcyB0aGUgbGVuZ3RoIG9mIHRoYXQgaGVhZGVyLgotKwkJICovCi0rCi0rCQkvKgotKwkJICogV2UgbmVlZCB0byBsb2FkIHRoZSBGcmFtZSBjb250cm9sIGRpcmVjdGx5LCBhbmQKLSsJCSAqIHRoZW4gbG9hZCBYIHdpdGggYSBmYWtlIDAsIGkuZS4gdGhlIGxlbmd0aCBvZiB0aGUgCi0rCQkgKiBub24tZXhpc3RpbmcgcHJlcGVuZGVkIGhlYWRlcgotKwkJICovCi0rCi0rCQkvKgotKwkJICogVE9ETyBHVjogSSdtIG5vdCBzdXJlIGlmIDAgaXMgdGhlIHJpZ2h0IGNvbnN0YW50IGluIHRoaXMKLSsJCSAqIGNhc2UuIElmIHRoZSBsaW5rIGxheWVyIGhhcyBhIGZpeGVkIGxlbmd0aCBwcmVwZW5kZWQgaGVhZGVyLAotKwkJICogdGhhdCBzaG91bGQgYmUgdGhlIHZhbHVlIHRoYXQgd2UgcHV0IGhlcmUKLSsJCSAqLwotKwotKwkJLyogTG9hZCAwIGludG8gWCAqLwotKwkJc19sb2FkX3hfMCA9IG5ld19zdG10KEJQRl9MRFh8QlBGX0lNTSk7Ci0rCQlzX2xvYWRfeF8wLT5zLmsgPSAwOwotKwotKwkJLyoKLSsJCSAqIFRPRE8gR1Y6IEknbSBub3Qgc3VyZSBpZiAwIGlzIHRoZSByaWdodCBjb25zdGFudCBpbiB0aGlzCi0rCQkgKiBjYXNlLiBJZiB0aGUgbGluayBsYXllciBoYXMgYSBmaXhlZCBsZW5ndGggcHJlcGVuZGVkIGhlYWRlciwKLSsJCSAqIHRoYXQgc2hvdWxkIGJlIHRoZSB2YWx1ZSB0aGF0IHdlIHB1dCBoZXJlCi0rCQkgKi8KLSsKLSsJCS8qCi0rCQkgKiBsb2FkIHRoZSBGcmFtZSBDb250cm9sIHdpdGggYWJzb2x1dGUgYWNjZXNzCi0rCQkgKi8KLSsJCXNfbG9hZF9mYyA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfEJQRl9CKTsKLSsJCXNfbG9hZF9mYy0+cy5rID0gMDsKLSsJCXMgPSBzX2xvYWRfeF8wOwotKwl9Ci0rCi0rCS8qCi0rCSAqIEdlbmVyYXRlIHRoZSBjb21tb24gaW5zdHJ1Y3Rpb25zIHRvIGNoZWNrIGlmIGl0J3MgYSBkYXRhIGZyYW1lCi0rCSAqIGFuZCBpZiBzbyBjb21wdXRlIHRoZSA4MDIuMTEgaGVhZGVyIGxlbmd0aAotKwkgKi8KLSsJc2pzZXRfZGF0YV9mcmFtZV8xID0gbmV3X3N0bXQoSk1QKEJQRl9KU0VUKSk7CS8vIGIzIHNob3VsZCBiZSAxCi0rCXNqc2V0X2RhdGFfZnJhbWVfMS0+cy5rID0gMHg4OwotKwkJCi0rCXNqc2V0X2RhdGFfZnJhbWVfMiA9IG5ld19zdG10KEpNUChCUEZfSlNFVCkpOwkvLyBiMiBzaG91bGQgYmUgMAotKwlzanNldF9kYXRhX2ZyYW1lXzItPnMuayA9IDB4MDQ7Ci0rCi0rCXNqc2V0X3FvcyA9IG5ld19zdG10KEpNUChCUEZfSlNFVCkpOwotKwlzanNldF9xb3MtPnMuayA9IDB4ODA7IC8vUU9TIGJpdAotKwkJCi0rCXNfbGRfYV8yID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTU0pOwotKwlzX2xkX2FfMi0+cy5rID0gMjsKLSsKLSsJc19hZGRfYV94ID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9YKTsKLSsJc19hX3RvX3ggPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKLSsKLSsJc19sb2FkID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8c2l6ZSk7Ci0rCXNfbG9hZC0+cy5rID0gb2Zmc2V0OwotKwotKwlzanNldF9kYXRhX2ZyYW1lXzEtPnMuanQgPSBzanNldF9kYXRhX2ZyYW1lXzI7Ci0rCXNqc2V0X2RhdGFfZnJhbWVfMS0+cy5qZiA9IHNfbG9hZDsKLSsJCQotKwlzanNldF9kYXRhX2ZyYW1lXzItPnMuanQgPSBzX2xvYWQ7Ci0rCXNqc2V0X2RhdGFfZnJhbWVfMi0+cy5qZiA9IHNqc2V0X3FvczsKLSsJCQotKwlzanNldF9xb3MtPnMuanQgPSBzX2xkX2FfMjsKLSsJc2pzZXRfcW9zLT5zLmpmID0gc19sb2FkOwotKwotKwlzYXBwZW5kKHMsIHNfbG9hZF9mYyk7Ci0rCXNhcHBlbmQoc19sb2FkX2ZjLCBzanNldF9kYXRhX2ZyYW1lXzEpOwotKwlzYXBwZW5kKHNqc2V0X2RhdGFfZnJhbWVfMSwgc2pzZXRfZGF0YV9mcmFtZV8yKTsKLSsJc2FwcGVuZChzanNldF9kYXRhX2ZyYW1lXzIsIHNqc2V0X3Fvcyk7Ci0rCXNhcHBlbmQoc2pzZXRfcW9zLCBzX2xkX2FfMik7Ci0rCXNhcHBlbmQoc19sZF9hXzIsIHNfYWRkX2FfeCk7Ci0rCXNhcHBlbmQoc19hZGRfYV94LHNfYV90b194KTsKLSsJc2FwcGVuZChzX2FfdG9feCwgc19sb2FkKTsKLSsJCi0rCXJldHVybiBzOwotK30KLSAKLSAvKgotICAqIExvYWQgYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyLgotQEAgLTEzNjcsNiArMTUwNCwyMiBAQAotIAkJcyA9IGdlbl9sb2FkX2xscmVsKG9mZnNldCwgc2l6ZSk7Ci0gCQlicmVhazsKLSAKLSsjaWZkZWYgRU5BQkxFX1dMQU5fRklMVEVSSU5HX1BBVENICi0rCi0rCWNhc2UgT1JfTElOS19BRlRFUl9XSVJFTEVTU19IRFI6Ci0rCQlpZiAobGlua3R5cGUgIT0gRExUX0lFRUU4MDJfMTFfUkFESU8gCi0rCQkJJiYgbGlua3R5cGUgIT0gRExUX1BQSSAKLSsJCQkmJiBsaW5rdHlwZSAhPSBETFRfSUVFRTgwMl8xMSAKLSsJCQkmJiBsaW5rdHlwZSAhPSBETFRfUFJJU01fSEVBREVSCi0rCQkJJiYgbGlua3R5cGUgIT0gRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTKQotKwkJewotKwkJCWFib3J0KCk7Ci0rCQkJcmV0dXJuIE5VTEw7Ci0rCQl9Ci0rCQlzID0gZ2VuX2xvYWRfbGxfYWZ0ZXJfODAyXzExX3JlbChvZmZzZXQgKyAyNCwgc2l6ZSk7Ci0rCQlicmVhazsKLSsjZW5kaWYgLyogRU5BQkxFX1dMQU5fRklMVEVSSU5HX1BBVENIICovCi0rCi0gCWNhc2UgT1JfTkVUOgotIAkJcyA9IGdlbl9sb2FkX2xscmVsKG9mZl9ubCArIG9mZnNldCwgc2l6ZSk7Ci0gCQlicmVhazsKLUBAIC0yMTYzLDExICsyMzE2LDE3IEBACi0gCQlicmVhazsKLSAKLSAJY2FzZSBETFRfUFBJOgotKwljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgotKwljYXNlIERMVF9JRUVFODAyXzExOgotKyNpZmRlZiBFTkFCTEVfV0xBTl9GSUxURVJJTkdfUEFUQ0gKLSsJCXJldHVybiBnZW5fODAyXzExX2xsY19saW5rdHlwZShwcm90byk7Ci0rCQkvKk5PVFJFQUNIRUQqLwotKwkJYnJlYWs7Ci0rI2VuZGlmIC8qIEVOQUJMRV9XTEFOX0ZJTFRFUklOR19QQVRDSCAqLwotKwotIAljYXNlIERMVF9GRERJOgotIAljYXNlIERMVF9JRUVFODAyOgotLQljYXNlIERMVF9JRUVFODAyXzExOgotIAljYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKLS0JY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKLSAJY2FzZSBETFRfUFJJU01fSEVBREVSOgotIAljYXNlIERMVF9BVE1fUkZDMTQ4MzoKLSAJY2FzZSBETFRfQVRNX0NMSVA6Ci1AQCAtMjcxMSw2ICsyODcwLDExMyBAQAotIAl9Ci0gfQotIAotKy8qCi0rICogR2VuZXJhdGUgY29kZSB0byBtYXRjaCBhIHBhcnRpY3VsYXIgcGFja2V0IHR5cGUsIGZvciBsaW5rLWxheWVyIHR5cGVzCi0rICogdXNpbmcgODAyLjIgTExDIGhlYWRlcnMuCi0rICoKLSsgKiBUaGlzIGlzICpOT1QqIHVzZWQgZm9yIEV0aGVybmV0OyAiZ2VuX2V0aGVyX2xpbmt0eXBlKCkiIGlzIHVzZWQKLSsgKiBmb3IgdGhhdCAtIGl0IGhhbmRsZXMgdGhlIEQvSS9YIEV0aGVybmV0IHZzLiA4MDIuMys4MDIuMiBpc3N1ZXMuCi0rICoKLSsgKiAicHJvdG8iIGlzIGFuIEV0aGVybmV0IHR5cGUgdmFsdWUsIGlmID4gRVRIRVJNVFUsIG9yIGFuIExMQyBTQVAKLSsgKiB2YWx1ZSwgaWYgPD0gRVRIRVJNVFUuICBXZSB1c2UgdGhhdCB0byBkZXRlcm1pbmUgd2hldGhlciB0bwotKyAqIG1hdGNoIHRoZSBEU0FQIG9yIGJvdGggRFNBUCBhbmQgTFNBUCBvciB0byBjaGVjayB0aGUgT1VJIGFuZAotKyAqIHByb3RvY29sIElEIGluIGEgU05BUCBoZWFkZXIuCi0rICovCi0rc3RhdGljIHN0cnVjdCBibG9jayAqCi0rZ2VuXzgwMl8xMV9sbGNfbGlua3R5cGUocHJvdG8pCi0rCWludCBwcm90bzsKLSt7Ci0rCXN0cnVjdCBibG9jayAqYl9jaGVja19kYXRhX2ZyYW1lOwotKwlzdHJ1Y3QgYmxvY2sgKmJfY2hlY2tfbGlua3R5cGU7Ci0rCi0rCWJfY2hlY2tfZGF0YV9mcmFtZSA9IGdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSgpOwotKwotKwkvKgotKwkgKiBYWFggLSBnZW5lcmF0ZSB0aGUgY29kZSB0aGF0IGRpc2NhcmRzIG5vbiBkYXRhIGZyYW1lcwotKwkgKi8KLSsJc3dpdGNoIChwcm90bykgewotKwotKwljYXNlIExMQ1NBUF9JUDoKLSsJY2FzZSBMTENTQVBfSVNPTlM6Ci0rCWNhc2UgTExDU0FQX05FVEJFVUk6Ci0rCQkvKgotKwkJICogWFhYIC0gc2hvdWxkIHdlIGNoZWNrIGJvdGggdGhlIERTQVAgYW5kIHRoZQotKwkJICogU1NBUCwgbGlrZSB0aGlzLCBvciBzaG91bGQgd2UgY2hlY2sganVzdCB0aGUKLSsJCSAqIERTQVAsIGFzIHdlIGRvIGZvciBvdGhlciB0eXBlcyA8PSBFVEhFUk1UVQotKwkJICogKGkuZS4sIG90aGVyIFNBUCB2YWx1ZXMpPwotKwkJICovCi0rCQliX2NoZWNrX2xpbmt0eXBlID0gZ2VuX2NtcChPUl9MSU5LX0FGVEVSX1dJUkVMRVNTX0hEUiwgMCwgQlBGX0gsIChicGZfdV9pbnQzMikKLSsJCQkgICAgICgocHJvdG8gPDwgOCkgfCBwcm90bykpOwotKwkJYnJlYWs7Ci0rCi0rCWNhc2UgTExDU0FQX0lQWDoKLSsJCS8qCi0rCQkgKiBYWFggLSBhcmUgdGhlcmUgZXZlciBTTkFQIGZyYW1lcyBmb3IgSVBYIG9uCi0rCQkgKiBub24tRXRoZXJuZXQgODAyLnggbmV0d29ya3M/Ci0rCQkgKi8KLSsJCWJfY2hlY2tfbGlua3R5cGUgPSBnZW5fY21wKE9SX0xJTktfQUZURVJfV0lSRUxFU1NfSERSLCAwLCBCUEZfQiwKLSsJCSAgICAoYnBmX2ludDMyKUxMQ1NBUF9JUFgpOwotKwotKwkJYnJlYWs7Ci0rCi0rI2lmIDAKLSsJY2FzZSBFVEhFUlRZUEVfQVRBTEs6Ci0rCQkvKgotKwkJICogODAyLjItZW5jYXBzdWxhdGVkIEVUSEVSVFlQRV9BVEFMSyBwYWNrZXRzIGFyZQotKwkJICogU05BUCBwYWNrZXRzIHdpdGggYW4gb3JnYW5pemF0aW9uIGNvZGUgb2YKLSsJCSAqIDB4MDgwMDA3IChBcHBsZSwgZm9yIEFwcGxldGFsaykgYW5kIGEgcHJvdG9jb2wKLSsJCSAqIHR5cGUgb2YgRVRIRVJUWVBFX0FUQUxLIChBcHBsZXRhbGspLgotKwkJICoKLSsJCSAqIFhYWCAtIGNoZWNrIGZvciBhbiBvcmdhbml6YXRpb24gY29kZSBvZgotKwkJICogZW5jYXBzdWxhdGVkIEV0aGVybmV0IGFzIHdlbGw/Ci0rCQkgKi8KLSsJCXJldHVybiBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLLCBvZmZfbGlua3R5cGUpOwotKyNlbmRpZgotKwlkZWZhdWx0OgotKwkJLyoKLSsJCSAqIFhYWCAtIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yIElQWCA4MDIuMwotKwkJICogaGVyZSwgYnV0IHNob3VsZCB3ZSBjaGVjayBmb3IgdGhlIElQWCBFdGhlcnR5cGU/Ci0rCQkgKi8KLSsJCWlmIChwcm90byA8PSBFVEhFUk1UVSkgewotKwkJCS8qCi0rCQkJICogVGhpcyBpcyBhbiBMTEMgU0FQIHZhbHVlLCBzbyBjaGVjawotKwkJCSAqIHRoZSBEU0FQLgotKwkJCSAqLwotKwkJCWJfY2hlY2tfbGlua3R5cGUgPSBnZW5fY21wKE9SX0xJTktfQUZURVJfV0lSRUxFU1NfSERSLCAwLCBCUEZfQiwKLSsJCQkgICAgKGJwZl9pbnQzMilwcm90byk7Ci0rCQl9IGVsc2UgewotKwkJCS8qCi0rCQkJICogVGhpcyBpcyBhbiBFdGhlcm5ldCB0eXBlOyB3ZSBhc3N1bWUgdGhhdCBpdCdzCi0rCQkJICogdW5saWtlbHkgdGhhdCBpdCdsbCBhcHBlYXIgaW4gdGhlIHJpZ2h0IHBsYWNlCi0rCQkJICogYXQgcmFuZG9tLCBhbmQgdGhlcmVmb3JlIGNoZWNrIG9ubHkgdGhlCi0rCQkJICogbG9jYXRpb24gdGhhdCB3b3VsZCBob2xkIHRoZSBFdGhlcm5ldCB0eXBlCi0rCQkJICogaW4gYSBTTkFQIGZyYW1lIHdpdGggYW4gb3JnYW5pemF0aW9uIGNvZGUgb2YKLSsJCQkgKiAweDAwMDAwMCAoZW5jYXBzdWxhdGVkIEV0aGVybmV0KS4KLSsJCQkgKgotKwkJCSAqIFhYWCAtIGlmIHdlIHdlcmUgdG8gY2hlY2sgZm9yIHRoZSBTTkFQIERTQVAgYW5kCi0rCQkJICogTFNBUCwgYXMgcGVyIFhYWCwgYW5kIHdlcmUgYWxzbyB0byBjaGVjayBmb3IgYW4KLSsJCQkgKiBvcmdhbml6YXRpb24gY29kZSBvZiAweDAwMDAwMCAoZW5jYXBzdWxhdGVkCi0rCQkJICogRXRoZXJuZXQpLCB3ZSdkIGRvCi0rCQkJICoKLSsJCQkgKglyZXR1cm4gZ2VuX3NuYXAoMHgwMDAwMDAsIHByb3RvLAotKwkJCSAqCSAgICBvZmZfbGlua3R5cGUpOwotKwkJCSAqCi0rCQkJICogaGVyZTsgZm9yIG5vdywgd2UgZG9uJ3QsIGFzIHBlciB0aGUgYWJvdmUuCi0rCQkJICogSSBkb24ndCBrbm93IHdoZXRoZXIgaXQncyB3b3J0aCB0aGUgZXh0cmEgQ1BVCi0rCQkJICogdGltZSB0byBkbyB0aGUgcmlnaHQgY2hlY2sgb3Igbm90LgotKwkJCSAqLwotKwkJCWJfY2hlY2tfbGlua3R5cGUgPSBnZW5fY21wKE9SX0xJTktfQUZURVJfV0lSRUxFU1NfSERSLCAwKzYsIEJQRl9ILAotKwkJCSAgICAoYnBmX2ludDMyKXByb3RvKTsKLSsJCX0KLSsJfQotKwotKwlnZW5fYW5kKGJfY2hlY2tfZGF0YV9mcmFtZSwgYl9jaGVja19saW5rdHlwZSk7Ci0rCXJldHVybiBiX2NoZWNrX2xpbmt0eXBlOwotKwotK30KLSsKLSsKLSsKLSBzdGF0aWMgc3RydWN0IGJsb2NrICoKLSBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIGRpciwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpCi0gCWJwZl91X2ludDMyIGFkZHI7Ci1AQCAtMjkyNSw2ICszMTkxLDE3IEBACi0gCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjAsICpiMSwgKmIyOwotIAlyZWdpc3RlciBzdHJ1Y3Qgc2xpc3QgKnM7Ci0gCi0rI2lmZGVmIEVOQUJMRV9XTEFOX0ZJTFRFUklOR19QQVRDSAotKwkvKgotKwkgKiBUT0RPIEdWIDIwMDcwNjEzCi0rCSAqIFdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgb3B0aW1pemVyIGJlY2F1c2UgdGhlIG9wdGltaXplciBpcyBidWdneQotKwkgKiBhbmQgd2lwZXMgb3V0IHNvbWUgTEQgaW5zdHJ1Y3Rpb25zIGdlbmVyYXRlZCBieSB0aGUgYmVsb3cKLSsJICogY29kZSB0byB2YWxpZGF0ZSB0aGUgRnJhbWUgQ29udHJvbCBiaXRzCi0rCSAqCi0rCSAqLwotKwlub19vcHRpbWl6ZSA9IDE7Ci0rI2VuZGlmIC8qIEVOQUJMRV9XTEFOX0ZJTFRFUklOR19QQVRDSCAqLwotKwotIAlzd2l0Y2ggKGRpcikgewotIAljYXNlIFFfU1JDOgotIAkJLyoKLUBAIC00NzEzLDYgKzQ5OTAsMzIgQEAKLSAjZW5kaWYKLSB9Ci0gCi0rc3RhdGljIHN0cnVjdCBibG9jayAqCi0rZ2VuX2NoZWNrXzgwMl8xMV9kYXRhX2ZyYW1lKCkKLSt7Ci0rCXN0cnVjdCBzbGlzdCAqczsKLSsJc3RydWN0IGJsb2NrICpiMCwgKmIxOwotKwkvKgotKwkqIE5vdyBjaGVjayBmb3IgYSBkYXRhIGZyYW1lLgotKwkqIEkuZSwgY2hlY2sgImxpbmtbMF0gJiAweDA4Ii4KLSsJKi8KLSsJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOwotKwliMCA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKLSsJYjAtPnMuayA9IDB4MDg7Ci0rCWIwLT5zdG10cyA9IHM7Ci0rCQotKwlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7Ci0rCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOwotKwliMS0+cy5rID0gMHgwNDsKLSsJYjEtPnN0bXRzID0gczsKLSsJZ2VuX25vdChiMSk7Ci0rCQotKwotKwlnZW5fYW5kKGIxLCBiMCk7Ci0rCi0rCXJldHVybiBiMDsKLSt9Ci0rCi0gCi0gLyoKLSAgKiBHZW5lcmF0ZSBjb2RlIHRoYXQgY2hlY2tzIHdoZXRoZXIgdGhlIHBhY2tldCBpcyBhIHBhY2tldCBmb3IgcHJvdG9jb2wK